static bool TryParseReportDescriptor(IntPtr device, out ReportDescriptors.Parser.ReportDescriptorParser parser, out byte[] reportDescriptor)
{
parser = null; reportDescriptor = null;
string devnode = NativeMethods.udev_device_get_devnode(device);
if (null == devnode) { return false; }
int handle = NativeMethods.retry(() => NativeMethods.open
(devnode, NativeMethods.oflag.NONBLOCK));
if (handle < 0) { return false; }
try
{
uint descsize;
if (NativeMethods.ioctl(handle, NativeMethods.HIDIOCGRDESCSIZE, out descsize) < 0) { return false; }
if (descsize > NativeMethods.HID_MAX_DESCRIPTOR_SIZE) { return false; }
var desc = new NativeMethods.hidraw_report_descriptor() { size = descsize };
if (NativeMethods.ioctl(handle, NativeMethods.HIDIOCGRDESC, ref desc) < 0) { return false; }
Array.Resize(ref desc.value, (int)descsize);
parser = new ReportDescriptors.Parser.ReportDescriptorParser();
parser.Parse(desc.value); reportDescriptor = desc.value; return true;
}
finally
{
NativeMethods.retry(() => NativeMethods.close(handle));
}
}