Mercurial > hg > vboxdotnet
annotate InteropCodeGen/XidlParser.cs @ 6:e640ca67b819
Added extended COM interop code generator for interfaces and proxies
author | Ivo Smits |
---|---|
date | Fri, 06 May 2011 04:02:43 +0200 |
parents | |
children |
rev | line source |
---|---|
6
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
1 using System; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
2 using System.Xml.XPath; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
3 using System.IO; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
4 using System.Collections.Generic; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
5 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
6 namespace VBoxSDK { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
7 public class XidlParser { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
8 public LibraryInfo Library { get; private set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
9 public TypeInfo UnknownType { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
10 public InterfaceInfo BaseInterfaceType { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
11 public InterfaceInfo ErrorInterfaceType { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
12 enum ParameterType { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
13 In, |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
14 Out, |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
15 Reference, |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
16 Return, |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
17 Param, |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
18 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
19 public Dictionary<String, TypeInfo> Types = new Dictionary<string, TypeInfo>(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
20 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
21 void AddInterfaceTypes(params String[] names) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
22 foreach (String name in names) Types.Add(name, new InterfaceTypeInfo(name)); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
23 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
24 void AddEnumTypes(params String[] names) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
25 foreach (String name in names) Types.Add(name, new ValueTypeInfo(name)); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
26 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
27 void InitTypes() { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
28 Types.Add("short", new ValueTypeInfo(typeof(Int32))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
29 Types.Add("unsigned short", new ValueTypeInfo(typeof(UInt16))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
30 Types.Add("unsigned long", new ValueTypeInfo(typeof(UInt32))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
31 Types.Add("long long", new ValueTypeInfo(typeof(Int64))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
32 Types.Add("long", new ValueTypeInfo(typeof(Int32))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
33 Types.Add("octet", new ValueTypeInfo(typeof(Byte))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
34 Types.Add("unsigned long long", new ValueTypeInfo(typeof(UInt32))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
35 //Types.Add("boolean", new TypeInfo("Boolean", "MarshalAs(UnmanagedType.Bool)")); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
36 Types.Add("boolean", new ValueTypeInfo(typeof(Int32))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
37 //Types.Add("wstring", new ValueTypeInfo("String", "MarshalAs(UnmanagedType.LPWStr)")); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
38 //Types.Add("uuid", new TypeInfo("Guid", true, "MarshalAs(UnmanagedType.LPStruct)")); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
39 //Types.Add("uuid", new ValueTypeInfo("Guid", "MarshalAs(UnmanagedType.LPStruct)")); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
40 Types.Add("wstring", new StringTypeInfo()); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
41 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
42 Types.Add("$unknown", new ValueTypeInfo(typeof(IntPtr))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
43 AddInterfaceTypes("IMachine", "ISession", "IVirtualBox", "IHost", "IConsole", "ISystemProperties"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
44 AddInterfaceTypes("IProgress", "IDisplay", "IMouse", "IKeyboard", "IFramebuffer", "IFramebufferOverlay"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
45 AddInterfaceTypes("IMachineDebugger", "IVirtualBoxErrorInfo", "IEventSource", "IEventListener", "IEventContext"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
46 AddInterfaceTypes("IConsoleCallback", "IEvent", "IBandwidthControl", "IVRDEServerInfo", "IAdditionsFacility"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
47 AddInterfaceTypes("IExtPackPlugIn", "IExtPackFile", "IExtPack", "IBIOSSettings", "IVFSExplorer", "IUSBController"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
48 AddInterfaceTypes("IStorageController", "IVRDPServer", "ISnapshot", "INATEngine", "IUSBDeviceFilter"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
49 AddInterfaceTypes("IMediumAttachment", "IUSBDevice", "IParallelPort", "ISerialPort", "INetworkAdapter"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
50 AddInterfaceTypes("IMedium", "IGuestOSType", "ISharedFolder", "IPerformanceCollector", "IDHCPServer"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
51 AddInterfaceTypes("IAppliance", "IVirtualBoxCallback", "IPerformanceMetric", "IMediumFormat", "IHostUSBDevice"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
52 AddInterfaceTypes("IHostNetworkInterface", "IHostUSBDeviceFilter", "IRemoteDisplayInfo", "IGuest"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
53 AddInterfaceTypes("IVirtualSystemDescription", "IAudioAdapter", "IExtPackManager", "IVRDEServer"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
54 AddInterfaceTypes("IPciDeviceAttachment", "IBandwidthGroup"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
55 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
56 AddEnumTypes("LockType", "MediumVariant", "AccessMode", "NATProtocol", "FirmwareType", "StorageControllerType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
57 AddEnumTypes("StorageBus", "SessionType", "SessionState", "USBDeviceState", "USBDeviceFilterAction", "Scope"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
58 AddEnumTypes("AudioControllerType", "AudioDriverType", "VRDPAuthType", "MachineState", "NetworkAdapterType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
59 AddEnumTypes("NetworkAttachmentType", "PortMode", "DeviceType", "MediumState", "VFSType", "MediumType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
60 AddEnumTypes("HostNetworkInterfaceType", "DeviceActivity", "HostNetworkInterfaceMediumType", "HostNetworkInterfaceStatus"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
61 AddEnumTypes("ProcessorFeature", "BIOSBootMenuMode", "VirtualSystemDescriptionType", "VirtualSystemDescriptionValueType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
62 AddEnumTypes("KeyboardHidType", "ClipboardMode", "PointingHidType", "CPUPropertyType", "HWVirtExPropertyType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
63 AddEnumTypes("ChipsetType", "FaultToleranceState", "BandwidthGroupType", "ExecuteProcessStatus", "VBoxEventType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
64 AddEnumTypes("GuestMonitorChangedEventType", "AuthType", "NetworkAdapterPromiscModePolicy", "AdditionsRunLevelType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
65 AddEnumTypes("AdditionsFacilityStatus", "AdditionsFacilityType", "AdditionsFacilityClass", "CleanupMode", "DataType"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
66 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
67 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
68 public XidlParser() { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
69 Library = new LibraryInfo(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
70 UnknownType = new ValueTypeInfo("IntPtr"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
71 Library.Interfaces.Add("IUnknown", new InterfaceInfo("IUnknown", new Guid("00000000-0000-0000-C000-000000000046"))); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
72 Library.Interfaces.Add("IErrorInfo", new InterfaceInfo("IErrorInfo", new Guid("00000000-0000-0000-C000-000000000046"), Library.Interfaces["IUnknown"])); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
73 Library.Interfaces.Add("IDispatch", new InterfaceInfo("IDispatch", new Guid("00020400-0000-0000-C000-000000000046"), Library.Interfaces["IUnknown"])); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
74 BaseInterfaceType = Library.Interfaces["IUnknown"]; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
75 ErrorInterfaceType = Library.Interfaces["IErrorInfo"]; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
76 InitTypes(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
77 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
78 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
79 public void Parse(XPathNavigator nav) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
80 //XPathDocument doc = new XPathDocument("VirtualBox.xidl"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
81 //XPathNavigator nav = doc.CreateNavigator(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
82 nav = nav.SelectSingleNode("/idl/library"); //[@name='VirtualBox'] |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
83 foreach (XPathNavigator intf in nav.Select("interface")) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
84 ProcessInterface(intf, nav); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
85 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
86 foreach (XPathNavigator intf in nav.Select("enum")) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
87 ProcessEnum(intf); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
88 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
89 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
90 void ProcessEnum(XPathNavigator nav) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
91 String typeName = nav.SelectSingleNode("@name").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
92 EnumInfo typeInfo = new EnumInfo(typeName); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
93 foreach (XPathNavigator member in nav.SelectChildren(XPathNodeType.Element)) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
94 switch (member.Name) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
95 case "desc": break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
96 case "const": { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
97 String numberString = member.SelectSingleNode("@value").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
98 Int32 number = 0; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
99 if (numberString.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
100 number = Int32.Parse(numberString.Substring(2), System.Globalization.NumberStyles.HexNumber); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
101 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
102 number = Int32.Parse(numberString); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
103 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
104 typeInfo.Values.Add(member.SelectSingleNode("@name").Value, number); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
105 } break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
106 default: |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
107 Console.Error.WriteLine("Unknown member type {0}", member.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
108 break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
109 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
110 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
111 Library.Enums.Add(typeName, typeInfo); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
112 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
113 void ProcessInterface(XPathNavigator nav, XPathNavigator parentNav) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
114 String typeName = nav.SelectSingleNode("@name").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
115 String typeIid = nav.SelectSingleNode("@uuid").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
116 XPathItem item = nav.SelectSingleNode("@extends"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
117 InterfaceInfo typeExtends = null; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
118 if (item != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
119 switch (item.Value) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
120 case "$unknown": typeExtends = BaseInterfaceType; break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
121 case "$errorinfo": typeExtends = ErrorInterfaceType; break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
122 default: typeExtends = Library.Interfaces[item.Value]; break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
123 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
124 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
125 InterfaceInfo typeInfo = new InterfaceInfo(typeName, new Guid(typeIid), typeExtends); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
126 foreach (XPathNavigator member in nav.SelectChildren(XPathNodeType.Element)) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
127 switch (member.Name) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
128 case "desc": break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
129 case "attribute": { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
130 String mName = member.SelectSingleNode("@name").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
131 item = member.SelectSingleNode("@readonly"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
132 Boolean mReadOnly = item == null ? false : item.Value == "yes"; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
133 item = member.SelectSingleNode("@writeonly"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
134 Boolean mWriteOnly = item == null ? false : item.Value == "yes"; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
135 mName = mName.Substring(0, 1).ToUpper() + mName.Substring(1); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
136 PropertyInfo mInfo = new PropertyInfo(mName, GetTypeDeclaration(member), !mWriteOnly, !mReadOnly); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
137 typeInfo.Members.Add(mInfo); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
138 } break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
139 case "method": { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
140 String mName = member.SelectSingleNode("@name").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
141 XPathNodeIterator mParamReturn = member.Select("param[@dir='return']"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
142 bool mReturn = false; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
143 TypeInfo mReturnType = null; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
144 if (mParamReturn == null || mParamReturn.Count != 1) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
145 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
146 mParamReturn.MoveNext(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
147 mReturn = true; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
148 mReturnType = GetTypeDeclaration(mParamReturn.Current); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
149 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
150 mName = mName.Substring(0, 1).ToUpper() + mName.Substring(1); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
151 MethodInfo mInfo = new MethodInfo(mName, mReturnType); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
152 foreach (XPathNavigator mParam in member.Select("param")) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
153 String pDir = mParam.SelectSingleNode("@dir").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
154 if (pDir == "return" && mReturn) continue; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
155 ParameterType pt = pDir == "out" ? ParameterType.Out : ParameterType.In; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
156 TypeInfo mType = GetTypeDeclaration(mParam, ref pt); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
157 mInfo.Parameters.Add(new MethodParameterInfo(mParam.SelectSingleNode("@name").Value, mType, pDir != "out", pt == ParameterType.Reference, pDir == "out")); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
158 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
159 typeInfo.Members.Add(mInfo); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
160 } break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
161 default: |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
162 Console.Error.WriteLine("Unknown member type {0}", member.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
163 break; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
164 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
165 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
166 Library.Interfaces.Add(typeName, typeInfo); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
167 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
168 private TypeInfo GetTypeDeclaration(XPathNavigator nav) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
169 ParameterType paramType = ParameterType.Param; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
170 return GetTypeDeclaration(nav, ref paramType); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
171 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
172 private TypeInfo GetTypeDeclaration(XPathNavigator nav, ref ParameterType paramType) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
173 String mType = nav.SelectSingleNode("@type").Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
174 XPathItem item; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
175 item = nav.SelectSingleNode("@mod"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
176 String mMod = item == null ? null : item.Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
177 item = nav.SelectSingleNode("@safearray"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
178 Boolean pArray = item == null ? false : item.Value == "yes"; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
179 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
180 TypeInfo t; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
181 if (!Types.TryGetValue(mType, out t)) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
182 t = null; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
183 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
184 if (mMod == "ptr") { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
185 if (paramType == ParameterType.In) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
186 paramType = ParameterType.Reference; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
187 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
188 t = new ValueTypeInfo(typeof(IntPtr)); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
189 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
190 } else if (mMod == "string") { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
191 t = Types["wstring"]; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
192 } else if (mMod != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
193 Console.Error.WriteLine("Type modifier {0} is not supported", mMod); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
194 t = UnknownType; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
195 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
196 if (t == null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
197 Console.Error.WriteLine("Type {0} is not supported", mType); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
198 t = UnknownType; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
199 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
200 if (pArray) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
201 Console.Error.WriteLine("Array type not supported"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
202 t = null; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
203 t = UnknownType; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
204 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
205 return t; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
206 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
207 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
208 } |