--- /dev/null
+#include <wx/wx.h>
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOCFPlugIn.h>
+#include <IOKit/hid/IOHIDLib.h>
+#include <IOKit/hid/IOHIDKeys.h>
+#include <Kernel/IOKit/hidsystem/IOHIDUsageTables.h>
+
+#include <mach/mach.h>
+
+//Utility wrapper around CFArray
+class wxCFArray
+{
+public:
+ wxCFArray(CFTypeRef pData) : pArray((CFArrayRef) pData) {}
+ CFTypeRef operator [] (const int& nIndex) {return CFArrayGetValueAtIndex(pArray, nIndex); }
+ int Count() {return CFArrayGetCount(pArray);}
+private:
+ CFArrayRef pArray;
+};
+
+//
+// A wrapper around OS X HID Manager procedures.
+// The tutorial "Working With HID Class Device Interfaces" Is
+// Quite good, as is the sample program associated with it
+// (Depite the author's protests!).
+class wxHIDDevice
+{
+public:
+ wxHIDDevice() : m_ppDevice(NULL), m_ppQueue(NULL), m_pCookies(NULL) {}
+ //kHIDPage_GenericDesktop
+ //kHIDUsage_GD_Joystick,kHIDUsage_GD_Mouse,kHIDUsage_GD_Keyboard
+ bool Create (const int& nClass = -1, const int& nType = -1);
+
+ inline void AddCookie(CFTypeRef Data, const int& i);
+ inline void AddCookieInQueue(CFTypeRef Data, const int& i);
+ inline void InitCookies(const size_t& dwSize, bool bQueue = false);
+
+ //Must be implemented by derived classes
+ //builds the cookie array -
+ //first call InitCookies to initialize the cookie
+ //array, then AddCookie to add a cookie at a certain point in an array
+ virtual void BuildCookies(wxCFArray& Array) = 0;
+
+ //checks to see whether the cookie at index nIndex is active (element value != 0)
+ bool IsActive(const int& nIndex);
+
+ //closes the device and cleans the queue and cookies
+ virtual ~wxHIDDevice();
+private:
+ IOHIDDeviceInterface** m_ppDevice; //this, essentially
+ IOHIDQueueInterface** m_ppQueue; //queue (if we want one)
+ IOHIDElementCookie* m_pCookies; //cookies
+
+ const char* m_szName; //(product) name
+ mach_port_t m_pPort;
+};
+
+class wxHIDKeyboard : public wxHIDDevice
+{
+public:
+ bool Create();
+ virtual void BuildCookies(wxCFArray& Array);
+};
\ No newline at end of file