21
|
1 ???using System; |
|
2 using System.Collections.Generic; |
|
3 using System.Globalization; |
|
4 using System.Text.RegularExpressions; |
|
5 using UCIS.HWLib.Windows.Devices; |
|
6 using UCIS.USBLib.Internal.Windows; |
|
7 |
|
8 namespace UCIS.USBLib.Communication { |
|
9 public abstract class WindowsUsbDeviceRegistry { |
|
10 public DeviceNode DeviceNode { get; private set; } |
|
11 |
|
12 // Parsed out of the device ID |
|
13 private bool mIsDeviceIDParsed; |
|
14 private byte mInterfaceID; |
|
15 private ushort mVid; |
|
16 private ushort mPid; |
|
17 private ushort mRevision; |
|
18 |
|
19 private IDictionary<string, object> mDeviceProperties; |
|
20 |
|
21 public String DevicePath { get; private set; } |
|
22 public String DeviceID { get; private set; } |
|
23 public String SymbolicName { get { return DevicePath; } } |
|
24 |
|
25 private static Regex RegHardwareID = null; |
|
26 |
|
27 protected WindowsUsbDeviceRegistry(DeviceNode device, String interfacepath) { |
|
28 DeviceNode = device; |
|
29 DeviceID = device.DeviceID; |
|
30 DevicePath = interfacepath; |
|
31 } |
|
32 |
|
33 public IDictionary<string, object> DeviceProperties { |
|
34 get { |
|
35 if (mDeviceProperties == null) mDeviceProperties = SetupApi.GetSPDRPProperties(DeviceNode); |
|
36 return mDeviceProperties; |
|
37 } |
|
38 } |
|
39 |
|
40 private void parseDeviceID() { |
|
41 if (mIsDeviceIDParsed) return; |
|
42 if (RegHardwareID == null) { |
|
43 RegexOptions OPTIONS = RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace | RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase; |
|
44 string PATTERN = "(Vid_(?<Vid>[0-9A-F]{1,4}))|(Pid_(?<Pid>[0-9A-F]{1,4}))|(Rev_(?<Rev>[0-9]{1,4}))|(MI_(?<MI>[0-9A-F]{1,2}))"; |
|
45 RegHardwareID = new Regex(PATTERN, OPTIONS); |
|
46 } |
|
47 String[] HardwareIDs = DeviceNode.GetPropertyStringArray(CMRDP.HARDWAREID); |
|
48 String HardwareID = null; |
|
49 if (HardwareIDs == null || HardwareIDs.Length < 1 || HardwareIDs[0].Length == 0) { |
|
50 HardwareID = DeviceID; |
|
51 } else { |
|
52 HardwareID = HardwareIDs[0]; |
|
53 } |
|
54 foreach (Match match in RegHardwareID.Matches(HardwareID)) { |
|
55 Group group = match.Groups["Vid"]; |
|
56 if (group.Success) ushort.TryParse(group.Value, NumberStyles.HexNumber, null, out mVid); |
|
57 group = match.Groups["Pid"]; |
|
58 if (group.Success) ushort.TryParse(group.Value, NumberStyles.HexNumber, null, out mPid); |
|
59 group = match.Groups["Rev"]; |
|
60 if (group.Success) ushort.TryParse(group.Value, NumberStyles.Integer, null, out mRevision); |
|
61 group = match.Groups["MI"]; |
|
62 if (group.Success) Byte.TryParse(group.Value, NumberStyles.HexNumber, null, out mInterfaceID); |
|
63 } |
|
64 mIsDeviceIDParsed = true; |
|
65 } |
|
66 public int Vid { |
|
67 get { |
|
68 parseDeviceID(); |
|
69 return mVid; |
|
70 } |
|
71 } |
|
72 public int Pid { |
|
73 get { |
|
74 parseDeviceID(); |
|
75 return mPid; |
|
76 } |
|
77 } |
|
78 public byte InterfaceID { |
|
79 get { |
|
80 parseDeviceID(); |
|
81 return (byte)mInterfaceID; |
|
82 } |
|
83 } |
|
84 |
|
85 public string Name { get { return DeviceNode.GetPropertyString(CMRDP.DEVICEDESC); } } |
|
86 public string Manufacturer { get { return DeviceNode.GetPropertyString(CMRDP.MFG); } } |
|
87 public string FullName { |
|
88 get { |
|
89 String desc = Name; |
|
90 String mfg = Manufacturer; |
|
91 if (mfg == null) return desc; |
|
92 if (desc == null) return mfg; |
|
93 return mfg + " - " + desc; |
|
94 } |
|
95 } |
|
96 } |
|
97 } |