// creates a queue for a device, creates and opens device interface if required static IOReturn HIDCreateQueue( IOHIDDeviceRef inIOHIDDeviceRef ) { IOReturn result = kIOReturnSuccess; if ( inIOHIDDeviceRef ) { assert( IOHIDDeviceGetTypeID() == CFGetTypeID( inIOHIDDeviceRef ) ); // do we already have a queue? IOHIDQueueRef tIOHIDQueueRef = IOHIDDevice_GetQueue( inIOHIDDeviceRef ); if ( tIOHIDQueueRef ) { // (yes) assert( IOHIDQueueGetTypeID() == CFGetTypeID( tIOHIDQueueRef ) ); } else { tIOHIDQueueRef = IOHIDQueueCreate( kCFAllocatorDefault, inIOHIDDeviceRef, kDeviceQueueSize, kIOHIDOptionsTypeNone ); if ( tIOHIDQueueRef ) { // did that work HIDReportErrorNum( "Failed to create queue via create", result ); } else { result = kIOReturnSuccess; } } } else { HIDReportErrorNum( "HID device ref does not exist for queue creation", result ); } return result; } /* HIDCreateQueue */
IOHIDQueueRef IOHIDDevice_GetQueue(IOHIDDeviceRef inIOHIDDeviceRef) { IOHIDQueueRef result = 0; (void) IOHIDDevice_GetPtrProperty(inIOHIDDeviceRef, CFSTR(kIOHIDDevice_QueueKey), (void *) &result); if ( result ) { assert( IOHIDQueueGetTypeID() == CFGetTypeID(result) ); } return (result); } // IOHIDDevice_GetQueue