| 651 | } |
| 652 | |
| 653 | static struct hid_device_info *create_device_info(IOHIDDeviceRef device) |
| 654 | { |
| 655 | const int32_t primary_usage_page = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); |
| 656 | const int32_t primary_usage = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); |
| 657 | |
| 658 | /* Primary should always be first, to match previous behavior. */ |
| 659 | struct hid_device_info *root = create_device_info_with_usage(device, primary_usage_page, primary_usage); |
| 660 | struct hid_device_info *cur = root; |
| 661 | |
| 662 | if (!root) |
| 663 | return NULL; |
| 664 | |
| 665 | CFArrayRef usage_pairs = get_usage_pairs(device); |
| 666 | |
| 667 | if (usage_pairs != NULL) { |
| 668 | struct hid_device_info *next = NULL; |
| 669 | for (CFIndex i = 0; i < CFArrayGetCount(usage_pairs); i++) { |
| 670 | CFTypeRef dict = CFArrayGetValueAtIndex(usage_pairs, i); |
| 671 | if (CFGetTypeID(dict) != CFDictionaryGetTypeID()) { |
| 672 | continue; |
| 673 | } |
| 674 | |
| 675 | CFTypeRef usage_page_ref, usage_ref; |
| 676 | int32_t usage_page, usage; |
| 677 | |
| 678 | if (!CFDictionaryGetValueIfPresent((CFDictionaryRef)dict, CFSTR(kIOHIDDeviceUsagePageKey), &usage_page_ref) || |
| 679 | !CFDictionaryGetValueIfPresent((CFDictionaryRef)dict, CFSTR(kIOHIDDeviceUsageKey), &usage_ref) || |
| 680 | CFGetTypeID(usage_page_ref) != CFNumberGetTypeID() || |
| 681 | CFGetTypeID(usage_ref) != CFNumberGetTypeID() || |
| 682 | !CFNumberGetValue((CFNumberRef)usage_page_ref, kCFNumberSInt32Type, &usage_page) || |
| 683 | !CFNumberGetValue((CFNumberRef)usage_ref, kCFNumberSInt32Type, &usage)) { |
| 684 | continue; |
| 685 | } |
| 686 | if (usage_page == primary_usage_page && usage == primary_usage) |
| 687 | continue; /* Already added. */ |
| 688 | |
| 689 | next = create_device_info_with_usage(device, usage_page, usage); |
| 690 | cur->next = next; |
| 691 | if (next != NULL) { |
| 692 | cur = next; |
| 693 | } |
| 694 | } |
| 695 | } |
| 696 | |
| 697 | return root; |
| 698 | } |
| 699 | |
| 700 | struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) |
| 701 | { |
no test coverage detected