This commit is contained in:
Juan Andres Andrango 2014-05-24 19:28:49 +00:00
commit 915bcb81cc

View File

@ -316,8 +316,10 @@ void _glfwInitJoysticks(void)
while ((ioHIDDeviceObject = IOIteratorNext(objectIterator))) while ((ioHIDDeviceObject = IOIteratorNext(objectIterator)))
{ {
CFMutableDictionaryRef propsRef = NULL; CFMutableDictionaryRef propsRef = NULL;
CFTypeRef valueRef = NULL; CFTypeRef valueRef = NULL;
kern_return_t result; kern_return_t result;
IOCFPlugInInterface** ppPlugInInterface = NULL; IOCFPlugInInterface** ppPlugInInterface = NULL;
@ -332,12 +334,14 @@ void _glfwInitJoysticks(void)
kCFAllocatorDefault, kCFAllocatorDefault,
kNilOptions); kNilOptions);
if (result != kIOReturnSuccess) if (result != kIOReturnSuccess) continue;
continue;
CFRetain(propsRef);
valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDPrimaryUsagePageKey)); valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDPrimaryUsagePageKey));
if (valueRef) if (valueRef)
{ {
CFRetain(valueRef);
CFNumberGetValue(valueRef, kCFNumberLongType, &usagePage); CFNumberGetValue(valueRef, kCFNumberLongType, &usagePage);
if (usagePage != kHIDPage_GenericDesktop) if (usagePage != kHIDPage_GenericDesktop)
{ {
@ -346,13 +350,13 @@ void _glfwInitJoysticks(void)
CFRelease(propsRef); CFRelease(propsRef);
continue; continue;
} }
CFRelease(valueRef); CFRelease(valueRef);
} }
valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDPrimaryUsageKey)); valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDPrimaryUsageKey));
if (valueRef) if (valueRef)
{ {
CFRetain(valueRef);
CFNumberGetValue(valueRef, kCFNumberLongType, &usage); CFNumberGetValue(valueRef, kCFNumberLongType, &usage);
if ((usage != kHIDUsage_GD_Joystick && if ((usage != kHIDUsage_GD_Joystick &&
@ -364,7 +368,6 @@ void _glfwInitJoysticks(void)
CFRelease(propsRef); CFRelease(propsRef);
continue; continue;
} }
CFRelease(valueRef); CFRelease(valueRef);
} }
@ -377,24 +380,14 @@ void _glfwInitJoysticks(void)
&ppPlugInInterface, &ppPlugInInterface,
&score); &score);
if (kIOReturnSuccess != result) if (kIOReturnSuccess != result) return;
{
CFRelease(valueRef);
CFRelease(propsRef);
return;
}
plugInResult = (*ppPlugInInterface)->QueryInterface( plugInResult = (*ppPlugInInterface)->QueryInterface(
ppPlugInInterface, ppPlugInInterface,
CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID), CFUUIDGetUUIDBytes(kIOHIDDeviceInterfaceID),
(void *) &(joystick->interface)); (void *) &(joystick->interface));
if (plugInResult != S_OK) if (plugInResult != S_OK) return;
{
CFRelease(valueRef);
CFRelease(propsRef);
return;
}
(*ppPlugInInterface)->Release(ppPlugInInterface); (*ppPlugInInterface)->Release(ppPlugInInterface);
@ -408,6 +401,7 @@ void _glfwInitJoysticks(void)
valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDProductKey)); valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDProductKey));
if (valueRef) if (valueRef)
{ {
CFRetain(valueRef);
CFStringGetCString(valueRef, CFStringGetCString(valueRef,
joystick->name, joystick->name,
sizeof(joystick->name), sizeof(joystick->name),
@ -420,7 +414,7 @@ void _glfwInitJoysticks(void)
joystick->hatElements = CFArrayCreateMutable(NULL, 0, NULL); joystick->hatElements = CFArrayCreateMutable(NULL, 0, NULL);
valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDElementKey)); valueRef = CFDictionaryGetValue(propsRef, CFSTR(kIOHIDElementKey));
if (CFGetTypeID(valueRef) == CFArrayGetTypeID()) if (valueRef && (CFGetTypeID(valueRef) == CFArrayGetTypeID()))
{ {
CFRange range = { 0, CFArrayGetCount(valueRef) }; CFRange range = { 0, CFArrayGetCount(valueRef) };
CFArrayApplyFunction(valueRef, CFArrayApplyFunction(valueRef,