Hi Ken,
So I wanted to try to hew as close to the behavior of debugstr_cf as possible since that is the output that the user sees already in trace logs. Here's how I decided handle each case:
static CFStringRef copy_device_name(IOHIDDeviceRef device)
{
CFTypeRef ref;
CFStringRef name = NULL;
if(device)
{
assert(IOHIDDeviceGetTypeID() == CFGetTypeID(device));
ref = IOHIDDeviceGetProperty(device, CFSTR(kIOHIDProductKey));
if (ref && CFStringGetTypeID() == CFGetTypeID(ref))
name = CFStringCreateCopy(kCFAllocatorDefault,ref);
else if (ref)
name = CFCopyDescription(ref);
else
name = CFStringCreateCopy(kCFAllocatorDefault,CFSTR("(null)"));
}
else
ERR("Invalid Device requested %p\n",device);
return name;
}
static CFComparisonResult device_name_comparator(IOHIDDeviceRef device1, IOHIDDeviceRef device2)
{
CFStringRef name1 = copy_device_name(device1), name2 = copy_device_name(device2);
CFComparisonResult result = CFStringCompare(name1, name2, (kCFCompareForcedOrdering | kCFCompareNumerically));
if(name1)
CFRelease(name1);
if(name2)
CFRelease(name2);
return result;
}
What do you think?
Cheers,
David