aboutsummaryrefslogtreecommitdiff
path: root/HID_Utilities_Source/ImmrHIDUtilAddOn.c
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2010-01-28 00:37:54 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2010-01-28 00:37:54 +0000
commit6b2aa4a4a7816d604ee63c974131c03fed9a4b7c (patch)
treef2e8041327aba32123e3c45acf746a523943d188 /HID_Utilities_Source/ImmrHIDUtilAddOn.c
parentd97ac3564e559040da3b87635352da0cea75ab5e (diff)
first working version of hidio+HIDUtilities build on Mac OS X using autotools, still needs work
svn path=/trunk/externals/io/hidio/; revision=13107
Diffstat (limited to 'HID_Utilities_Source/ImmrHIDUtilAddOn.c')
-rw-r--r--HID_Utilities_Source/ImmrHIDUtilAddOn.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/HID_Utilities_Source/ImmrHIDUtilAddOn.c b/HID_Utilities_Source/ImmrHIDUtilAddOn.c
new file mode 100644
index 0000000..6d2cbaf
--- /dev/null
+++ b/HID_Utilities_Source/ImmrHIDUtilAddOn.c
@@ -0,0 +1,95 @@
+/*
+ * ImmrHIDUtilAddOn.c
+ * UseFFAPIFromHIDUtilities
+ *
+ * Created by rlacroix on Wed Oct 16 2002.
+ * Copyright (c) 2002 Immersion Corporation. All rights reserved.
+ *
+ */
+
+#include <mach/mach.h>
+#include <mach/mach_error.h>
+
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOCFPlugIn.h>
+#include <IOKit/hid/IOHIDLib.h>
+#include <IOKit/hid/IOHIDUsageTables.h>
+
+#include "HID_Utilities_External.h"
+#include "ImmrHIDUtilAddOn.h"
+
+//---------------------------------------------------------------------------------
+//
+// AllocateHIDObjectFromRecDevice()
+//
+// returns:
+// NULL, or acceptable io_object_t
+//
+//---------------------------------------------------------------------------------
+io_service_t AllocateHIDObjectFromRecDevice( pRecDevice pDevice )
+{
+ CFMutableDictionaryRef matchingDict;
+ UInt32 locationID = pDevice->locID;
+ CFNumberRef refUsage = NULL;
+ mach_port_t masterPort = NULL;
+ IOReturn result = kIOReturnSuccess;
+ io_service_t hidDevice = NULL;
+
+ do // while( 0 )
+ {
+ result = IOMasterPort (bootstrap_port, &masterPort);
+ if( result != kIOReturnSuccess )
+ {
+ break;
+ }
+
+ // Set up the matching criteria for the devices we're interested in.
+ // We are interested in instances of class IOHIDDevice.
+ // matchingDict is consumed below (in IOServiceGetMatchingService)
+ // so we have no leak here.
+ //
+ matchingDict = IOServiceMatching(kIOHIDDeviceKey);
+ if (!matchingDict)
+ {
+ break;
+ }
+
+ // Add a key for locationID to our matching dictionary. This works for matching to
+ // IOHIDDevices, so we will only look for a device attached to that particular port
+ // on the machine.
+ //
+ refUsage = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &locationID);
+ CFDictionaryAddValue( matchingDict,
+ CFSTR(kIOHIDLocationIDKey),
+ refUsage);
+ CFRelease(refUsage);
+
+ // IOServiceGetMatchingService assumes that we already know that there is only one device
+ // that matches. This way we don't have to do the whole iteration dance to look at each
+ // device that matches. This is a new API in 10.2
+ //
+ hidDevice = IOServiceGetMatchingService( masterPort, matchingDict);
+ }
+ while( 0 );
+
+ // Free master port if we created one.
+ //
+ if (masterPort)
+ mach_port_deallocate(mach_task_self(), masterPort);
+
+ return hidDevice;
+}
+
+//---------------------------------------------------------------------------------
+//
+// FreeHIDObject()
+//
+//---------------------------------------------------------------------------------
+bool FreeHIDObject( io_service_t hidDevice )
+{
+ kern_return_t kr;
+
+ kr = IOObjectRelease(hidDevice);
+
+ return( kIOReturnSuccess == kr );
+} \ No newline at end of file