| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- #region License
- /* Copyright 2012-2013 James F. Bellinger <http://www.zer7.com/software/hidsharp>
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
- #endregion
- using System;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- namespace HidSharp.Platform.MacOS
- {
- static class NativeMethods
- {
- const string CoreFoundation = "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation";
- const string CoreServices = "/System/Library/Frameworks/CoreServices.framework/CoreServices";
- const string IOKit = "/System/Library/Frameworks/IOKit.framework/IOKit";
- public static readonly IntPtr kCFRunLoopDefaultMode = CFStringCreateWithCharacters("kCFRunLoopDefaultMode");
- public static readonly IntPtr kIOHIDVendorIDKey = CFStringCreateWithCharacters("VendorID");
- public static readonly IntPtr kIOHIDProductIDKey = CFStringCreateWithCharacters("ProductID");
- public static readonly IntPtr kIOHIDVersionNumberKey = CFStringCreateWithCharacters("VersionNumber");
- public static readonly IntPtr kIOHIDManufacturerKey = CFStringCreateWithCharacters("Manufacturer");
- public static readonly IntPtr kIOHIDProductKey = CFStringCreateWithCharacters("Product");
- public static readonly IntPtr kIOHIDSerialNumberKey = CFStringCreateWithCharacters("SerialNumber");
- public static readonly IntPtr kIOHIDLocationIDKey = CFStringCreateWithCharacters("LocationID");
- public static readonly IntPtr kIOHIDMaxInputReportSizeKey = CFStringCreateWithCharacters("MaxInputReportSize");
- public static readonly IntPtr kIOHIDMaxOutputReportSizeKey = CFStringCreateWithCharacters("MaxOutputReportSize");
- public static readonly IntPtr kIOHIDMaxFeatureReportSizeKey = CFStringCreateWithCharacters("MaxFeatureReportSize");
- public delegate void IOHIDCallback(IntPtr context, IOReturn result, IntPtr sender);
- public delegate void IOHIDDeviceCallback(IntPtr context, IOReturn result, IntPtr sender, IntPtr device);
- public delegate void IOHIDReportCallback(IntPtr context, IOReturn result, IntPtr sender,
- IOHIDReportType type, uint reportID, IntPtr report, IntPtr reportLength);
- public enum OSErr : short
- {
- noErr = 0,
- gestaltUnknownErr = -5550,
- gestaltUndefSelectorErr = -5551,
- gestaltDupSelectorErr = -5552,
- gestaltLocationErr = -5553
- }
- public enum OSType : uint
- {
- gestaltSystemVersion = (byte)'s' << 24 | (byte)'y' << 16 | (byte)'s' << 8 | (byte)'v' << 0,
- gestaltSystemVersionMajor = (byte)'s' << 24 | (byte)'y' << 16 | (byte)'s' << 8 | (byte)'1' << 0,
- gestaltSystemVersionMinor = (byte)'s' << 24 | (byte)'y' << 16 | (byte)'s' << 8 | (byte)'2' << 0,
- gestaltSystemVersionBugFix = (byte)'s' << 24 | (byte)'y' << 16 | (byte)'s' << 8 | (byte)'3' << 0
- }
- public enum IOOptionBits
- {
- None = 0
- }
- public enum IOHIDReportType
- {
- Input = 0,
- Output,
- Feature
- }
- public enum IOReturn
- {
- Success = 0
- }
- public struct io_string_t
- {
- [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)]
- public byte[] Value;
- public override bool Equals(object obj)
- {
- return obj is io_string_t && this == (io_string_t)obj;
- }
- public override int GetHashCode()
- {
- return Value.Length >= 1 ? Value[0] : -1;
- }
- public override string ToString()
- {
- return Encoding.UTF8.GetString(Value.TakeWhile(ch => ch != 0).ToArray());
- }
- public static bool operator ==(io_string_t io1, io_string_t io2)
- {
- return io1.Value.SequenceEqual(io2.Value);
- }
- public static bool operator !=(io_string_t io1, io_string_t io2)
- {
- return !(io1 == io2);
- }
- }
- public enum CFNumberType
- {
- Int = 9
- }
- public struct CFRange
- {
- public IntPtr Start, Length;
- }
- public struct IOObject : IDisposable
- {
- public int Handle { get; set; }
- public bool IsSet { get { return Handle != 0; } }
- void IDisposable.Dispose()
- {
- if (IsSet) { IOObjectRelease(Handle); Handle = 0; }
- }
- public static implicit operator int(IOObject self)
- {
- return self.Handle;
- }
- }
- public struct CFType : IDisposable
- {
- public IntPtr Handle { get; set; }
- public bool IsSet { get { return Handle != IntPtr.Zero; } }
- void IDisposable.Dispose()
- {
- if (IsSet) { CFRelease(Handle); Handle = IntPtr.Zero; }
- }
- public static implicit operator IntPtr(CFType self)
- {
- return self.Handle;
- }
- }
- public static CFType ToCFType(this IntPtr handle)
- {
- return new CFType() { Handle = handle };
- }
- public static IOObject ToIOObject(this int handle)
- {
- return new IOObject() { Handle = handle };
- }
- [DllImport(CoreServices)]
- public static extern OSErr Gestalt(OSType selector, out IntPtr response);
-
- [DllImport(CoreFoundation)]
- public static extern uint CFGetTypeID(IntPtr type);
-
- [DllImport(CoreFoundation)]
- public static extern uint CFNumberGetTypeID();
-
- [DllImport(CoreFoundation)]
- public static extern uint CFStringGetTypeID();
-
- [DllImport(CoreFoundation)]
- public static extern IntPtr CFDictionaryCreateMutable(IntPtr allocator, IntPtr capacity,
- IntPtr keyCallbacks, IntPtr valueCallbacks);
- public static IntPtr CFDictionaryCreateMutable()
- {
- return CFDictionaryCreateMutable(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
- }
-
- [DllImport(CoreFoundation)]
- public static extern void CFDictionarySetValue(IntPtr dict, IntPtr key, IntPtr value);
-
- [DllImport(CoreFoundation)]
- public static extern IntPtr CFNumberCreate(IntPtr allocator, CFNumberType type, ref int value);
- public static IntPtr CFNumberCreate(int value)
- {
- return CFNumberCreate(IntPtr.Zero, CFNumberType.Int, ref value);
- }
- [DllImport(CoreFoundation)]
- [return: MarshalAs(UnmanagedType.I1)]
- public static extern bool CFNumberGetValue(IntPtr number, CFNumberType type, out int value);
- public static int? CFNumberGetValue(IntPtr number)
- {
- int value;
- return number != IntPtr.Zero && CFGetTypeID(number) == CFNumberGetTypeID() &&
- CFNumberGetValue(number, CFNumberType.Int, out value) ? (int?)value : null;
- }
- [DllImport(CoreFoundation, CharSet=CharSet.Unicode)]
- public static extern IntPtr CFStringCreateWithCharacters(IntPtr allocator, char[] buffer, IntPtr length);
- public static IntPtr CFStringCreateWithCharacters(string str)
- {
- return CFStringCreateWithCharacters(IntPtr.Zero, str.ToCharArray(), (IntPtr)str.Length);
- }
- [DllImport(CoreFoundation, CharSet=CharSet.Unicode)]
- public static extern void CFStringGetCharacters(IntPtr str, CFRange range, char[] buffer);
- public static string CFStringGetCharacters(IntPtr str)
- {
- if (str == IntPtr.Zero || CFGetTypeID(str) != CFStringGetTypeID()) { return null; }
- char[] buffer = new char[(int)CFStringGetLength(str)];
- CFStringGetCharacters(str, new CFRange() { Start = (IntPtr)0, Length = (IntPtr)buffer.Length }, buffer);
- return new string(buffer);
- }
- [DllImport(CoreFoundation)]
- public static extern IntPtr CFStringGetLength(IntPtr str);
- [DllImport(CoreFoundation)]
- public static extern void CFRunLoopRun();
- [DllImport(CoreFoundation)]
- public static extern IntPtr CFRunLoopGetCurrent();
- [DllImport(CoreFoundation)]
- public static extern void CFRunLoopStop(IntPtr runLoop);
- [DllImport(CoreFoundation)]
- public static extern void CFRelease(IntPtr obj);
- [DllImport(CoreFoundation)]
- public static extern void CFRetain(IntPtr obj);
- [DllImport(CoreFoundation)]
- public static extern IntPtr CFSetGetCount(IntPtr set);
- [DllImport(CoreFoundation)]
- public static extern void CFSetGetValues(IntPtr set, IntPtr[] values);
- [DllImport(IOKit)]
- public static extern IntPtr IOHIDDeviceCreate(IntPtr allocator, int service);
- [DllImport(IOKit)]
- public static extern IOReturn IOHIDDeviceOpen(IntPtr device, IOOptionBits options = IOOptionBits.None);
- [DllImport(IOKit)]
- public static extern void IOHIDDeviceRegisterInputReportCallback(IntPtr device, IntPtr report, IntPtr reportLength,
- IOHIDReportCallback callback, IntPtr context);
- [DllImport(IOKit)]
- public static extern void IOHIDDeviceRegisterRemovalCallback(IntPtr device, IOHIDCallback callback, IntPtr context);
- [DllImport(IOKit)]
- public static extern IOReturn IOHIDDeviceGetReport(IntPtr device, IOHIDReportType type, IntPtr reportID, IntPtr report, ref IntPtr reportLength);
- [DllImport(IOKit)]
- public static extern IOReturn IOHIDDeviceSetReport(IntPtr device, IOHIDReportType type, IntPtr reportID, IntPtr report, IntPtr reportLength);
- [DllImport(IOKit)]
- public static extern void IOHIDDeviceScheduleWithRunLoop(IntPtr device, IntPtr runLoop, IntPtr runLoopMode);
- [DllImport(IOKit)]
- public static extern void IOHIDDeviceUnscheduleFromRunLoop(IntPtr device, IntPtr runLoop, IntPtr runLoopMode);
- [DllImport(IOKit)]
- public static extern IOReturn IOHIDDeviceClose(IntPtr device, IOOptionBits options = IOOptionBits.None);
- [DllImport(IOKit)]
- public static extern int IOIteratorNext(int iterator);
- [DllImport(IOKit)]
- public static extern IOReturn IOObjectRetain(int @object);
- [DllImport(IOKit)]
- public static extern IOReturn IOObjectRelease(int @object);
- [DllImport(IOKit)]
- public static extern IntPtr IORegistryEntryCreateCFProperty(int entry, IntPtr strKey, IntPtr allocator, IOOptionBits options = IOOptionBits.None);
- public static int? IORegistryEntryGetCFProperty_Int(int entry, IntPtr strKey)
- {
- using (var property = IORegistryEntryCreateCFProperty(entry, strKey, IntPtr.Zero).ToCFType())
- {
- return CFNumberGetValue(property);
- }
- }
- public static string IORegistryEntryGetCFProperty_String(int entry, IntPtr strKey)
- {
- using (var property = IORegistryEntryCreateCFProperty(entry, strKey, IntPtr.Zero).ToCFType())
- {
- return CFStringGetCharacters(property);
- }
- }
- [DllImport(IOKit)]
- public static extern int IORegistryEntryFromPath(int masterPort, ref io_string_t path);
- [DllImport(IOKit)] // plane = IOService
- public static extern IOReturn IORegistryEntryGetPath(int entry, [MarshalAs(UnmanagedType.LPStr)] string plane, out io_string_t path);
- [DllImport(IOKit)]
- public static extern IOReturn IOServiceGetMatchingServices(int masterPort, IntPtr matching, out int iterator);
- [DllImport(IOKit)] // name = IOHIDDevice
- public static extern IntPtr IOServiceMatching([MarshalAs(UnmanagedType.LPStr)] string name);
- }
- }
|