altosuilib: Wait for product data while scanning
[fw/altos] / libaltos / libaltos.c
index a1f1ee4c4c1a95da7958efb26e2ed000615a4600..97b7b3f9bba44037206e409362824131c833bec9 100644 (file)
@@ -675,7 +675,7 @@ bt_func(str2ba, int, -1, (const char *str, bdaddr_t *ba), (str, ba))
 #define str2ba altos_str2ba
 
 bt_func(hci_read_remote_name, int, -1, (int sock, const bdaddr_t *ba, int len, char *name, int timeout), (sock, ba, len, name, timeout))
-#define hci_read_remote altos_hci_read_remote
+#define hci_read_remote_name altos_hci_read_remote_name
 
 bt_func(hci_open_dev, int, -1, (int dev_id), (dev_id))
 #define hci_open_dev altos_hci_open_dev
@@ -1121,6 +1121,8 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
        HRESULT         result;
        DWORD           friendlyname_type;
        DWORD           friendlyname_len;
+       char            instanceid[1024];
+       DWORD           instanceid_len;
 
        dev_info_data.cbSize = sizeof (SP_DEVINFO_DATA);
        while(SetupDiEnumDeviceInfo(list->dev_info, list->index,
@@ -1141,6 +1143,7 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
                        pid = 0x6015;
                        serial = 0;
                } else {
+                       vid = pid = serial = 0;
                        /* Fetch symbolic name for this device and parse out
                         * the vid/pid/serial info */
                        symbolic_len = sizeof(symbolic);
@@ -1148,16 +1151,34 @@ altos_list_next(struct altos_list *list, struct altos_device *device)
                                                 symbolic, &symbolic_len);
                        if (result != 0) {
                                altos_set_last_windows_error();
+                       } else {
+                               sscanf((char *) symbolic + sizeof("\\??\\USB#VID_") - 1,
+                                      "%04X", &vid);
+                               sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_") - 1,
+                                      "%04X", &pid);
+                               sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_XXXX#") - 1,
+                                      "%d", &serial);
+                       }
+                       if (vid == 0 || pid == 0 || serial == 0) {
+                               if (SetupDiGetDeviceInstanceId(list->dev_info,
+                                                              &dev_info_data,
+                                                              instanceid,
+                                                              sizeof (instanceid),
+                                                              &instanceid_len)) {
+                                       sscanf((char *) instanceid + sizeof("USB\\VID_") - 1,
+                                              "%04X", &vid);
+                                       sscanf((char *) instanceid + sizeof("USB\\VID_XXXX&PID_") - 1,
+                                              "%04X", &pid);
+                                       sscanf((char *) instanceid + sizeof("USB\\VID_XXXX&PID_XXXX\\") - 1,
+                                              "%d", &serial);
+                               } else {
+                                       altos_set_last_windows_error();
+                               }
+                       }
+                       if (vid == 0 || pid == 0 || serial == 0) {
                                RegCloseKey(dev_key);
                                continue;
                        }
-                       vid = pid = serial = 0;
-                       sscanf((char *) symbolic + sizeof("\\??\\USB#VID_") - 1,
-                              "%04X", &vid);
-                       sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_") - 1,
-                              "%04X", &pid);
-                       sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_XXXX#") - 1,
-                              "%d", &serial);
                }
 
                /* Fetch the com port name */