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 

On Sun, Jul 17, 2016 at 8:20 PM, DavidL <david.dljunk@gmail.com> wrote:
Right-o! I was wondering what the CFRelease was doing in the debugstr_cf function. :)

Cheers,
David

On Sun, Jul 17, 2016 at 2:11 PM, Ken Thomases <ken@codeweavers.com> wrote:
On Jul 17, 2016, at 4:08 PM, Ken Thomases <ken@codeweavers.com> wrote:
>
> On Jul 16, 2016, at 3:15 AM, David Lawrie <david.dljunk@gmail.com> wrote:
>>
>> +static CFStringRef get_device_name(IOHIDDeviceRef device)
>> +{
>> +    CFTypeRef ref;
>> +    CFStringRef name = CFSTR("Default Name");
>
> You can probably do better for a fallback.  For example, you can format the vendor ID and product ID into a string.  For an extreme take on this, see the Copy_DeviceName() function in Apple's HID Calibrator sample code:
> https://developer.apple.com/library/mac/samplecode/HID_Calibrator/Listings/HID_Calibrator_IOHIDDeviceWindowCtrl_m.html

Oh, and for the case where device is NULL, it's fine to return NULL.  It should never happen and, if it does, we want a crash to figure out why and fix things in a better manner, rather than papering over it with a bogus value.

-Ken