diff InteropCodeGen/gendotnet.cs @ 2:f1deea9c97a0

Cleaned up the interop code generator, added wrapper application to initialize kernel driver and run mono
author Ivo Smits
date Wed, 04 May 2011 16:10:08 +0200
parents e1ec7bf71313
children 64226294e26b
line wrap: on
line diff
--- a/InteropCodeGen/gendotnet.cs	Wed May 04 01:06:22 2011 +0200
+++ b/InteropCodeGen/gendotnet.cs	Wed May 04 16:10:08 2011 +0200
@@ -15,29 +15,16 @@
 	class TypeInfo {
 		public String Name { get; private set; }
 		public String[] Attributes { get; private set; }
-		//public Boolean InputOnly { get; private set; }
-		public String Members { get; set; }
 
 		public TypeInfo(String name, params String[] attributes) {
 			this.Name = name;
 			this.Attributes = attributes;
 		}
-		/*public TypeInfo(String name, bool inputOnly, params String[] attributes)
-			: this(name, attributes) {
-			this.InputOnly = inputOnly;
-		}*/
-		/*public static TypeInfo CreateInterfaceWithMembers(String name, String members) {
-			TypeInfo ret = new TypeInfo(name, "MarshalAs(UnmanagedType.Interface)");
-			ret.Members = members;
-			return ret;
-		}*/
-		//Todo: if attribute mod="string"/"ptr" ...
 		public void WriteDeclaration(TextWriter o, ParameterType vartype) {
 			WriteAttributes(o, vartype);
 			o.Write(Name);
 		}
 		public void WriteAttributes(TextWriter o, ParameterType vartype) {
-			//if (InputOnly && vartype != ParameterType.In) {
 			foreach (String attribute in Attributes) {
 				o.Write("[");
 				if (vartype == ParameterType.Return) o.Write("return: ");
@@ -50,6 +37,12 @@
 		}
 	}
 	static Dictionary<String, TypeInfo> Types = new Dictionary<string, TypeInfo>();
+	static void AddInterfaceTypes(params String[] names) {
+		foreach (String name in names) Types.Add(name, new TypeInfo(name, "MarshalAs(UnmanagedType.Interface)"));
+	}
+	static void AddEnumTypes(params String[] names) {
+		foreach (String name in names) Types.Add(name, new TypeInfo(name));
+	}
 	static void InitTypes() {
 		Types.Add("short", new TypeInfo("Int16"));
 		Types.Add("unsigned short", new TypeInfo("UInt16"));
@@ -63,119 +56,31 @@
 		Types.Add("wstring", new TypeInfo("String", "MarshalAs(UnmanagedType.LPWStr)"));
 		//Types.Add("uuid", new TypeInfo("Guid", true, "MarshalAs(UnmanagedType.LPStruct)"));
 		Types.Add("uuid", new TypeInfo("Guid", "MarshalAs(UnmanagedType.LPStruct)"));
-
-		Types.Add("IMachine", new TypeInfo("IMachine", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("ISession", new TypeInfo("ISession", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IVirtualBox", new TypeInfo("IVirtualBox", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IHost", new TypeInfo("IHost", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IConsole", new TypeInfo("IConsole", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("ISystemProperties", new TypeInfo("ISystemProperties", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IProgress", new TypeInfo("IProgress", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IDisplay", new TypeInfo("IDisplay", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IMouse", new TypeInfo("IMouse", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IKeyboard", new TypeInfo("IKeyboard", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IFramebuffer", new TypeInfo("IFramebuffer", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IFramebufferOverlay", new TypeInfo("IFramebufferOverlay", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IMachineDebugger", new TypeInfo("IMachineDebugger", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IVirtualBoxErrorInfo", new TypeInfo("IVirtualBoxErrorInfo", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IEventSource", new TypeInfo("IEventSource", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IEventListener", new TypeInfo("IEventListener", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IEventContext", new TypeInfo("IEventContext", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IConsoleCallback", new TypeInfo("IConsoleCallback", "MarshalAs(UnmanagedType.Interface)"));
-		Types.Add("IEvent", new TypeInfo("IEvent", "MarshalAs(UnmanagedType.Interface)"));
+		Types.Add("$unknown", new TypeInfo("IntPtr"));
 
-		Types.Add("LockType", new TypeInfo("LockType"));
-		Types.Add("MediumVariant", new TypeInfo("MediumVariant"));
-		Types.Add("AccessMode", new TypeInfo("AccessMode"));
-		Types.Add("NATProtocol", new TypeInfo("NATProtocol"));
-		Types.Add("FirmwareType", new TypeInfo("FirmwareType"));
-		Types.Add("StorageControllerType", new TypeInfo("StorageControllerType"));
-		Types.Add("StorageBus", new TypeInfo("StorageBus"));
-		Types.Add("SessionType", new TypeInfo("SessionType"));
-		Types.Add("SessionState", new TypeInfo("SessionState"));
-		Types.Add("USBDeviceState", new TypeInfo("USBDeviceState"));
-		Types.Add("USBDeviceFilterAction", new TypeInfo("USBDeviceFilterAction"));
-		Types.Add("AudioControllerType", new TypeInfo("AudioControllerType"));
-		Types.Add("AudioDriverType", new TypeInfo("AudioDriverType"));
-		Types.Add("VRDPAuthType", new TypeInfo("VRDPAuthType"));
-		Types.Add("MachineState", new TypeInfo("MachineState"));
-		Types.Add("NetworkAdapterType", new TypeInfo("NetworkAdapterType"));
-		Types.Add("NetworkAttachmentType", new TypeInfo("NetworkAttachmentType"));
-		Types.Add("PortMode", new TypeInfo("PortMode"));
-		Types.Add("DeviceType", new TypeInfo("DeviceType"));
-		Types.Add("MediumState", new TypeInfo("MediumState"));
-		Types.Add("MediumType", new TypeInfo("MediumType"));
-		Types.Add("HostNetworkInterfaceType", new TypeInfo("HostNetworkInterfaceType"));
-		Types.Add("DeviceActivity", new TypeInfo("DeviceActivity"));
-		Types.Add("HostNetworkInterfaceMediumType", new TypeInfo("HostNetworkInterfaceMediumType"));
-		Types.Add("HostNetworkInterfaceStatus", new TypeInfo("HostNetworkInterfaceStatus"));
-		Types.Add("ProcessorFeature", new TypeInfo("ProcessorFeature"));
-		Types.Add("VFSType", new TypeInfo("VFSType"));
-		Types.Add("BIOSBootMenuMode", new TypeInfo("BIOSBootMenuMode"));
-		Types.Add("VirtualSystemDescriptionType", new TypeInfo("VirtualSystemDescriptionType"));
-		Types.Add("VirtualSystemDescriptionValueType", new TypeInfo("VirtualSystemDescriptionValueType"));
-		Types.Add("KeyboardHidType", new TypeInfo("KeyboardHidType"));
-		Types.Add("ClipboardMode", new TypeInfo("ClipboardMode"));
-		Types.Add("PointingHidType", new TypeInfo("PointingHidType"));
-		Types.Add("CPUPropertyType", new TypeInfo("CPUPropertyType"));
-		Types.Add("HWVirtExPropertyType", new TypeInfo("HWVirtExPropertyType"));
-		Types.Add("Scope", new TypeInfo("Scope"));
-		Types.Add("ChipsetType", new TypeInfo("ChipsetType"));
-		Types.Add("FaultToleranceState", new TypeInfo("FaultToleranceState"));
-		Types.Add("BandwidthGroupType", new TypeInfo("BandwidthGroupType"));
-		Types.Add("VBoxEventType", new TypeInfo("VBoxEventType"));
-		Types.Add("GuestMonitorChangedEventType", new TypeInfo("GuestMonitorChangedEventType"));
-		Types.Add("AuthType", new TypeInfo("AuthType"));
-		Types.Add("NetworkAdapterPromiscModePolicy", new TypeInfo("NetworkAdapterPromiscModePolicy"));
-		Types.Add("ExecuteProcessStatus", new TypeInfo("ExecuteProcessStatus"));
-		Types.Add("AdditionsRunLevelType", new TypeInfo("AdditionsRunLevelType"));
-		Types.Add("AdditionsFacilityStatus", new TypeInfo("AdditionsFacilityStatus"));
-		Types.Add("AdditionsFacilityType", new TypeInfo("AdditionsFacilityType"));
-		Types.Add("AdditionsFacilityClass", new TypeInfo("AdditionsFacilityClass"));
-		Types.Add("CleanupMode", new TypeInfo("CleanupMode"));
-		Types.Add("DataType", new TypeInfo("DataType"));
-
-		Types.Add("IBandwidthControl", new TypeInfo("IntPtr"));
-		Types.Add("IVRDEServerInfo", new TypeInfo("IntPtr"));
-		Types.Add("IAdditionsFacility", new TypeInfo("IntPtr"));
-		Types.Add("IExtPackPlugIn", new TypeInfo("IntPtr"));
-		Types.Add("IExtPackFile", new TypeInfo("IntPtr"));
-		Types.Add("IExtPack", new TypeInfo("IntPtr"));
-		Types.Add("IBIOSSettings", new TypeInfo("IntPtr"));
-		Types.Add("IVFSExplorer", new TypeInfo("IntPtr"));
-		Types.Add("IUSBController", new TypeInfo("IntPtr"));
-		Types.Add("IStorageController", new TypeInfo("IntPtr"));
-		Types.Add("IVRDPServer", new TypeInfo("IntPtr"));
-		Types.Add("ISnapshot", new TypeInfo("IntPtr"));
-		Types.Add("INATEngine", new TypeInfo("IntPtr"));
-		Types.Add("IUSBDeviceFilter", new TypeInfo("IntPtr"));
-		Types.Add("IMediumAttachment", new TypeInfo("IntPtr"));
-		Types.Add("IUSBDevice", new TypeInfo("IntPtr"));
-		Types.Add("IParallelPort", new TypeInfo("IntPtr"));
-		Types.Add("ISerialPort", new TypeInfo("IntPtr"));
-		Types.Add("INetworkAdapter", new TypeInfo("IntPtr"));
-		Types.Add("IMedium", new TypeInfo("IntPtr"));
-		Types.Add("IGuestOSType", new TypeInfo("IntPtr"));
-		Types.Add("ISharedFolder", new TypeInfo("IntPtr"));
-		Types.Add("IPerformanceCollector", new TypeInfo("IntPtr"));
-		Types.Add("IDHCPServer", new TypeInfo("IntPtr"));
-		Types.Add("IAppliance", new TypeInfo("IntPtr"));
-		Types.Add("IVirtualBoxCallback", new TypeInfo("IntPtr"));
-		Types.Add("IPerformanceMetric", new TypeInfo("IntPtr"));
-		Types.Add("IMediumFormat", new TypeInfo("IntPtr"));
-		Types.Add("IHostUSBDevice", new TypeInfo("IntPtr"));
-		Types.Add("IHostNetworkInterface", new TypeInfo("IntPtr"));
-		Types.Add("IHostUSBDeviceFilter", new TypeInfo("IntPtr"));
-		Types.Add("IRemoteDisplayInfo", new TypeInfo("IntPtr"));
-		Types.Add("IGuest", new TypeInfo("IntPtr"));
-		Types.Add("IVirtualSystemDescription", new TypeInfo("IntPtr"));
-		Types.Add("IAudioAdapter", new TypeInfo("IntPtr"));
-		Types.Add("IExtPackManager", new TypeInfo("IntPtr"));
-		Types.Add("IVRDEServer", new TypeInfo("IntPtr"));
-		Types.Add("IPciDeviceAttachment", new TypeInfo("IntPtr"));
-		Types.Add("IBandwidthGroup", new TypeInfo("IntPtr"));
-
-		Types.Add("$unknown", new TypeInfo("IntPtr"));
+		AddInterfaceTypes("IMachine", "ISession", "IVirtualBox", "IHost", "IConsole", "ISystemProperties");
+		AddInterfaceTypes("IProgress", "IDisplay", "IMouse", "IKeyboard", "IFramebuffer", "IFramebufferOverlay");
+		AddInterfaceTypes("IMachineDebugger", "IVirtualBoxErrorInfo", "IEventSource", "IEventListener", "IEventContext");
+		AddInterfaceTypes("IConsoleCallback", "IEvent", "IBandwidthControl", "IVRDEServerInfo", "IAdditionsFacility");
+		AddInterfaceTypes("IExtPackPlugIn", "IExtPackFile", "IExtPack", "IBIOSSettings", "IVFSExplorer", "IUSBController");
+		AddInterfaceTypes("IStorageController", "IVRDPServer", "ISnapshot", "INATEngine", "IUSBDeviceFilter");
+		AddInterfaceTypes("IMediumAttachment", "IUSBDevice", "IParallelPort", "ISerialPort", "INetworkAdapter");
+		AddInterfaceTypes("IMedium", "IGuestOSType", "ISharedFolder", "IPerformanceCollector", "IDHCPServer");
+		AddInterfaceTypes("IAppliance", "IVirtualBoxCallback", "IPerformanceMetric", "IMediumFormat", "IHostUSBDevice");
+		AddInterfaceTypes("IHostNetworkInterface", "IHostUSBDeviceFilter", "IRemoteDisplayInfo", "IGuest");
+		AddInterfaceTypes("IVirtualSystemDescription", "IAudioAdapter", "IExtPackManager", "IVRDEServer");
+		AddInterfaceTypes("IPciDeviceAttachment", "IBandwidthGroup");
+	
+		AddEnumTypes("LockType", "MediumVariant", "AccessMode", "NATProtocol", "FirmwareType", "StorageControllerType");
+		AddEnumTypes("StorageBus", "SessionType", "SessionState", "USBDeviceState", "USBDeviceFilterAction");
+		AddEnumTypes("AudioControllerType", "AudioDriverType", "VRDPAuthType", "MachineState", "NetworkAdapterType");
+		AddEnumTypes("NetworkAttachmentType", "PortMode", "DeviceType", "MediumState", "VFSType", "MediumType");
+		AddEnumTypes("HostNetworkInterfaceType", "DeviceActivity", "HostNetworkInterfaceMediumType", "HostNetworkInterfaceStatus");
+		AddEnumTypes("ProcessorFeature", "BIOSBootMenuMode", "VirtualSystemDescriptionType", "VirtualSystemDescriptionValueType");
+		AddEnumTypes("KeyboardHidType", "ClipboardMode", "PointingHidType", "CPUPropertyType", "HWVirtExPropertyType");
+		AddEnumTypes("ChipsetType", "FaultToleranceState", "BandwidthGroupType", "ExecuteProcessStatus", "VBoxEventType");
+		AddEnumTypes("GuestMonitorChangedEventType", "AuthType", "NetworkAdapterPromiscModePolicy", "AdditionsRunLevelType");
+		AddEnumTypes("AdditionsFacilityStatus", "AdditionsFacilityType", "AdditionsFacilityClass", "CleanupMode", "DataType");
 	}
 	static void Main(string[] args) {
 		InitTypes();
@@ -243,27 +148,10 @@
 					break;
 				case "attribute": {
 						String mName = member.SelectSingleNode("@name").Value;
-						//String mType = member.SelectSingleNode("@type").Value;
 						item = member.SelectSingleNode("@readonly");
 						Boolean mReadOnly = item == null ? false : item.Value == "yes";
-						//item = member.SelectSingleNode("@mod");
-						//String mMod = item == null ? null : item.Value;
 						mName = mName.Substring(0, 1).ToUpper() + mName.Substring(1);
 						oattribute.Write("\t");
-						/*TypeInfo t;
-						if (mMod == "ptr") {
-							t = new TypeInfo("IntPtr");
-						} else if (mMod == "string") {
-							t = new TypeInfo("String", "MarshalAs(UnmanagedType.LPWStr)");
-						} else if (mMod == null) {
-							if (!Types.TryGetValue(mType, out t)) {
-								Console.Error.WriteLine("Type {0} is not supported", mType);
-								t = new TypeInfo("void");
-							}
-						} else {
-							Console.Error.WriteLine("Type modifier {0} is not supported", mMod);
-							t = new TypeInfo("void");
-						}*/
 						TypeInfo t = GetTypeDeclaration(member);
 						oattribute.Write(t.Name);
 						oattribute.Write(" ");
@@ -290,15 +178,7 @@
 						} else {
 							mParamReturn.MoveNext();
 							mReturn = true;
-							TypeInfo t = GetTypeDeclaration(mParamReturn.Current);
-							/*String mType = mParamReturn.Current.SelectSingleNode("@type").Value;
-							TypeInfo t;
-							if (!Types.TryGetValue(mType, out t)) {
-								Console.Error.WriteLine("Type {0} is not supported", mType);
-								t = new TypeInfo("void");
-								mReturn = false;
-							}*/
-							t.WriteDeclaration(omethod, ParameterType.Return);
+							WriteTypeDeclaration(omethod, mParamReturn.Current, ParameterType.Return);
 						}
 						mName = mName.Substring(0, 1).ToUpper() + mName.Substring(1);
 						omethod.Write(" ");
@@ -310,10 +190,6 @@
 							while (true) {
 								XPathNavigator mParam = mParams.Current;
 								String pDir = mParam.SelectSingleNode("@dir").Value;
-								//item = mParam.SelectSingleNode("@safearray");
-								//Boolean pArray = item == null ? false : item.Value == "yes";
-								//item = mParam.SelectSingleNode("@mod");
-								//String pMod = item == null ? null : item.Value;
 								if (pDir == "return" && mReturn) {
 									if (mParams.MoveNext()) {
 										continue;
@@ -330,31 +206,7 @@
 								} else {
 									omethod.Write(", ");
 								}
-								ParameterType pt = ParameterType.In;
-								if (pDir == "out") pt = ParameterType.Out;
-								TypeInfo t = GetTypeDeclaration(mParam, ref pt);
-								t.WriteDeclaration(omethod, pt);
-								/*if (pArray) {
-									omethod.Write("[MarshalAs(UnmanagedType.SafeArray)] ");
-									if (pDir == "out") omethod.Write("out ");
-									else omethod.Write("ref ");
-									omethod.Write("System.Array");
-								} else {
-									String pType = mParam.SelectSingleNode("@type").Value;
-									TypeInfo t;
-									if (!Types.TryGetValue(pType, out t)) {
-										Console.Error.WriteLine("Type {0} is not supported", pType);
-										t = new TypeInfo("IntPtr");
-										mReturn = false;
-									}
-									if (pMod == "ptr") {
-										t.WriteDeclaration(omethod, ParameterType.Reference);
-									} else if (pDir == "out") {
-										t.WriteDeclaration(omethod, ParameterType.Out);
-									} else {
-										t.WriteDeclaration(omethod, ParameterType.In);
-									}
-								}*/
+								WriteTypeDeclaration(omethod, mParam, pDir == "out" ? ParameterType.Out : ParameterType.In);
 								omethod.Write(" p");
 								omethod.Write(mParam.SelectSingleNode("@name").Value);
 								if (!mParams.MoveNext()) break;
@@ -373,6 +225,10 @@
 		ParameterType pt = ParameterType.Param;
 		return GetTypeDeclaration(nav, ref pt);
 	}
+	private static void WriteTypeDeclaration(TextWriter o, XPathNavigator nav, ParameterType paramType) {
+		TypeInfo t = GetTypeDeclaration(nav, ref paramType);
+		t.WriteDeclaration(o, paramType);
+	}
 	private static TypeInfo GetTypeDeclaration(XPathNavigator nav, ref ParameterType paramType) {
 		String mType = nav.SelectSingleNode("@type").Value;
 		XPathItem item;