示例#1
0
static int
is_hid_service_enabled(const HANDLE hRadio, BLUETOOTH_DEVICE_INFO *device_info)
{
    /* retrieve number of installed services */
    DWORD num_services = 0;
    DWORD result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, NULL);
    if (result != ERROR_SUCCESS) {
        /* NOTE: Sometimes we get ERROR_MORE_DATA, sometimes we do not.
         *       The number of services seems to be correct in any case, so
         *       we will just ignore this.
         */
        if (result != ERROR_MORE_DATA) {
            WINPAIR_DEBUG("Failed to count installed services");
            return 0;
        }
    }

    if (num_services == 0) {
        return 0;
    }

    /* retrieve actual list of installed services */
    GUID *service_list = (GUID *) calloc(num_services, sizeof(GUID));
    if (!service_list) {
        return 0;
    }
    result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, service_list);
    if (result != ERROR_SUCCESS) {
        WINPAIR_DEBUG("Failed to enumerate installed services");
        return 0;
    }

    /* check if the HID service is part of that list */
    unsigned int i;
    int found = 0;
    GUID service = HumanInterfaceDeviceServiceClass_UUID;
    for (i = 0; i < num_services; i++) {
        if (IsEqualGUID(&service_list[i], &service)) {
            found = 1;
            break;
        }
    }

    free(service_list);

    return found;
}
static bool
is_hid_service_enabled(const HANDLE hRadio, BLUETOOTH_DEVICE_INFO *device_info)
{
    DWORD num_services = 0;
    GUID *service_list= nullptr;
    bool success = true;

    // retrieve number of installed services
    {
        DWORD result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, NULL);    

        if (result != ERROR_SUCCESS) 
        {
            /* NOTE: Sometimes we get ERROR_MORE_DATA, sometimes we do not.
             *       The number of services seems to be correct in any case, so
             *       we will just ignore this.
             */
            if (result != ERROR_MORE_DATA) 
            {
                SERVER_MT_LOG_ERROR("AsyncBluetoothPairDeviceRequest") << "Failed to count installed services";
                success= false;
            }
        }

        if (success && num_services == 0) 
        {
            success= false;
        }
    }

    // retrieve actual list of installed services 
    if (success)
    {
        service_list = (GUID *)calloc(num_services, sizeof(GUID));
        if (!service_list) 
        {
            success= false;
        }
    }

    if (success)
    {
        DWORD result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, service_list);

        if (result != ERROR_SUCCESS) 
        {
            SERVER_MT_LOG_ERROR("AsyncBluetoothPairDeviceRequest") << "Failed to enumerate installed services";
            return 0;
        }
    }

    // check if the HID service is part of that list
    if (success)
    {
        GUID service = HumanInterfaceDeviceServiceClass_UUID;

        success= false;
        for (unsigned int i = 0; i < num_services; i++) 
        {
            if (IsEqualGUID(service_list[i], service)) 
            {
                success = true;
                break;
            }
        }
    }

    if (service_list != nullptr)
    {
        free(service_list);
    }

    return success;
}
示例#3
0
// Scan local network for visible remote devices
static VALUE bt_devices_scan(VALUE self)
{
    WORD wVersionRequested = 0x202;
    HANDLE hRadio;
    BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) };

    HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio( &btfrp, &hRadio );

    VALUE devices_array = rb_ary_new();
    if ( NULL != hFind )
    {
        do
        {
            BLUETOOTH_DEVICE_INFO_STRUCT deviceInfo;

            deviceInfo.dwSize = sizeof(deviceInfo);

            BLUETOOTH_DEVICE_SEARCH_PARAMS deviceSearchParams;

            memset(&deviceSearchParams, 0, sizeof(deviceSearchParams));

            deviceSearchParams.dwSize = sizeof(deviceSearchParams);

            deviceSearchParams.fReturnAuthenticated = true;
            deviceSearchParams.fReturnRemembered = false;
            deviceSearchParams.fReturnUnknown = true;
            deviceSearchParams.fReturnConnected = true;
            deviceSearchParams.fIssueInquiry = true;
            deviceSearchParams.cTimeoutMultiplier = 1;

            deviceSearchParams.hRadio = hRadio;

            HANDLE hDeviceFind = BluetoothFindFirstDevice(&deviceSearchParams, &deviceInfo);

            if (NULL != hDeviceFind)
            {
                do
                {
                    BYTE *rgBytes = deviceInfo.Address.rgBytes;
                    //BluetoothDisplayDeviceProperties(0, &deviceInfo);
                    char addr[19] = { 0 };
                    char name[248] = { 0 };
                    wcstombs(name, deviceInfo.szName, sizeof(name));

                    snprintf(addr, sizeof(addr), "%02x:%02x:%02x:%02x:%02x:%02x",
                             rgBytes[5],
                             rgBytes[4],
                             rgBytes[3],
                             rgBytes[2],
                             rgBytes[1],
                             rgBytes[0]);

                    VALUE bt_dev = bt_device_new(bt_device_class,
                                                 rb_str_new2(name),
                                                 rb_str_new2(addr));
                    rb_ary_push(devices_array, bt_dev);
                }
                while(BluetoothFindNextDevice(hDeviceFind, &deviceInfo));

                BluetoothFindDeviceClose(hDeviceFind);
            }

            GUID guidServices[10];

            DWORD numServices = sizeof(guidServices);

            DWORD result = BluetoothEnumerateInstalledServices(hRadio, &deviceInfo, &numServices, guidServices);

            CloseHandle( hRadio );
        } while( BluetoothFindNextRadio( hFind, &hRadio ) );

        BluetoothFindRadioClose( hFind );
    }

    return devices_array;

}