HidSharp.Platform.Linux.LinuxHidDevice.TryParseReportDescriptor C# (CSharp) Method

TryParseReportDescriptor() static private method

static private TryParseReportDescriptor ( IntPtr device, ReportDescriptors &parser, byte &reportDescriptor ) : bool
device System.IntPtr
parser ReportDescriptors
reportDescriptor byte
return bool
        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));
            }
        }