annotate InteropCodeGen/XidlParser.cs @ 7:a7650e26195f default tip

Added support for generating Com Callable Wrappers
author Ivo Smits
date Fri, 06 May 2011 08:12:43 +0200
parents e640ca67b819
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }