# HG changeset patch
# User StephaneLenclud
# Date 1423993809 -3600
# Node ID 08c70af8af84956d23bee33f1cd3738aee08abc4
# Parent  7647691aa2090ba719fca3f7abfe6c54aed8efd8
HidDevice consolidating contruction.

diff -r 7647691aa209 -r 08c70af8af84 HidDevice.cs
--- a/HidDevice.cs	Sun Feb 15 00:04:28 2015 +0100
+++ b/HidDevice.cs	Sun Feb 15 10:50:09 2015 +0100
@@ -29,6 +29,34 @@
         /// <param name="hRawInputDevice">Device Handle as provided by RAWINPUTHEADER.hDevice, typically accessed as rawinput.header.hDevice</param>
         public HidDevice(IntPtr hRawInputDevice)
         {
+            //Try construct and rollback if needed
+            try
+            {
+                Construct(hRawInputDevice);
+            }
+            catch (System.Exception ex)
+            {
+                //Just rollback and propagate
+                Dispose();
+                throw ex;
+            }
+        }
+
+
+        /// <summary>
+        /// Make sure dispose is called even if the user forgot about it.
+        /// </summary>
+        ~HidDevice()
+        {
+            Dispose();
+        }
+
+        /// <summary>
+        /// Private constructor.
+        /// </summary>
+        /// <param name="hRawInputDevice"></param>
+        private void Construct(IntPtr hRawInputDevice)
+        {
             PreParsedData = IntPtr.Zero;
             //Fetch various information defining the given HID device
             Name = Win32.Utils.RawInput.GetDeviceName(hRawInputDevice);
@@ -37,67 +65,56 @@
             PreParsedData = Win32.Utils.RawInput.GetPreParsedData(hRawInputDevice);
             if (PreParsedData == IntPtr.Zero)
             {
-                throw new Exception("HidDevice: GetPreParsedData failed!");
+                throw new Exception("HidDevice: GetPreParsedData failed: " + Marshal.GetLastWin32Error().ToString());
             }
 
             //Fetch device info
             iInfo = new RID_DEVICE_INFO();
             if (!Win32.Utils.RawInput.GetDeviceInfo(hRawInputDevice, ref iInfo))
             {
-                throw new Exception("HidDevice: GetDeviceInfo failed!");
+                throw new Exception("HidDevice: GetDeviceInfo failed: " + Marshal.GetLastWin32Error().ToString());
             }
-                
+
             //Open our device from the device name/path
-            SafeFileHandle handle=Win32.Function.CreateFile(Name,
+            SafeFileHandle handle = Win32.Function.CreateFile(Name,
                 Win32.FileAccess.NONE,
-                Win32.FileShare.FILE_SHARE_READ|Win32.FileShare.FILE_SHARE_WRITE,
+                Win32.FileShare.FILE_SHARE_READ | Win32.FileShare.FILE_SHARE_WRITE,
                 IntPtr.Zero,
                 Win32.CreationDisposition.OPEN_EXISTING,
                 Win32.FileFlagsAttributes.FILE_FLAG_OVERLAPPED,
                 IntPtr.Zero
                 );
 
-            //TODO: should we throw instead?
+            //Check if CreateFile worked
             if (handle.IsInvalid)
             {
-                Debug.WriteLine("Failed to CreateFile from device name " + Marshal.GetLastWin32Error().ToString());
+                throw new Exception("HidDevice: CreateFile failed: " + Marshal.GetLastWin32Error().ToString());
             }
-            else
+
+            //Get manufacturer string
+            StringBuilder manufacturerString = new StringBuilder(256);
+            if (Win32.Function.HidD_GetManufacturerString(handle, manufacturerString, manufacturerString.Capacity))
             {
-                //Get manufacturer string
-                StringBuilder manufacturerString = new StringBuilder(256);
-                if (Win32.Function.HidD_GetManufacturerString(handle, manufacturerString, manufacturerString.Capacity))
-                {
-                    Manufacturer = manufacturerString.ToString();                    
-                }
+                Manufacturer = manufacturerString.ToString();
+            }
 
-                //Get product string
-                StringBuilder productString = new StringBuilder(256);
-                if (Win32.Function.HidD_GetProductString(handle, productString, productString.Capacity))
-                {
-                    Product = productString.ToString();                    
-                }
+            //Get product string
+            StringBuilder productString = new StringBuilder(256);
+            if (Win32.Function.HidD_GetProductString(handle, productString, productString.Capacity))
+            {
+                Product = productString.ToString();
+            }
 
-                //Get attributes
-                Win32.HIDD_ATTRIBUTES attributes=new Win32.HIDD_ATTRIBUTES();
-                if (Win32.Function.HidD_GetAttributes(handle, ref attributes))
-                {
-                    VendorId = attributes.VendorID;
-                    ProductId = attributes.ProductID;
-                    Version = attributes.VersionNumber;
-                }
+            //Get attributes
+            Win32.HIDD_ATTRIBUTES attributes = new Win32.HIDD_ATTRIBUTES();
+            if (Win32.Function.HidD_GetAttributes(handle, ref attributes))
+            {
+                VendorId = attributes.VendorID;
+                ProductId = attributes.ProductID;
+                Version = attributes.VersionNumber;
+            }
 
-                handle.Close();
-            }
-        }
-
-
-        /// <summary>
-        /// Make sure dispose is called even if the user forgot about it.
-        /// </summary>
-        ~HidDevice()
-        {
-            Dispose();
+            handle.Close();
         }
 
         /// <summary>