# HG changeset patch # User Ivo Smits # Date 1304463583 -7200 # Node ID e1ec7bf713139afb72e9ea7092d65e74c578b740 Initial commit diff -r 000000000000 -r e1ec7bf71313 InteropCodeGen/InteropCodeGen.csproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/InteropCodeGen/InteropCodeGen.csproj Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,49 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {9C96A3C0-1673-457A-BF8D-CB97B44533A3} + Exe + Properties + VBoxSDK + VBoxSDK + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 InteropCodeGen/Properties/AssemblyInfo.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/InteropCodeGen/Properties/AssemblyInfo.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("VBoxSDK")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("VBoxSDK")] +[assembly: AssemblyCopyright("Copyright © 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fd486bf3-6c0d-457c-aeee-69f138d6eef9")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff -r 000000000000 -r e1ec7bf71313 InteropCodeGen/gendotnet.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/InteropCodeGen/gendotnet.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,407 @@ +//+reference System.dll +//+reference System.Xml.dll +using System; +using System.Xml.XPath; +using System.IO; +using System.Collections.Generic; +class Program { + enum ParameterType { + In, + Out, + Reference, + Return, + Param, + } + 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: "); + else if (vartype == ParameterType.Param) o.Write("param: "); + o.Write(attribute); + o.Write("] "); + } + if (vartype == ParameterType.Out) o.Write("out "); + else if (vartype == ParameterType.Reference) o.Write("ref "); + } + } + static Dictionary Types = new Dictionary(); + static void InitTypes() { + Types.Add("short", new TypeInfo("Int16")); + Types.Add("unsigned short", new TypeInfo("UInt16")); + Types.Add("unsigned long", new TypeInfo("UInt32")); + Types.Add("long long", new TypeInfo("Int64")); + Types.Add("long", new TypeInfo("Int32")); + Types.Add("octet", new TypeInfo("Byte")); + Types.Add("unsigned long long", new TypeInfo("UInt32")); + //Types.Add("boolean", new TypeInfo("Boolean", "MarshalAs(UnmanagedType.Bool)")); + Types.Add("boolean", new TypeInfo("Int32")); + 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("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")); + } + static void Main(string[] args) { + InitTypes(); + + XPathDocument doc = new XPathDocument("VirtualBox.xidl"); + XPathNavigator nav = doc.CreateNavigator(); + nav = nav.SelectSingleNode("/idl/library[@name='VirtualBox']"); + TextWriter o = Console.Out; + o.WriteLine("using System;"); + o.WriteLine("using System.Runtime.CompilerServices;"); + o.WriteLine("using System.Runtime.InteropServices;"); + o.WriteLine("namespace VirtualBox {"); + foreach (XPathNavigator intf in nav.Select("interface")) { + ProcessInterface(intf, o, nav); + } + foreach (XPathNavigator intf in nav.Select("enum")) { + ProcessEnum(intf, o); + } + o.WriteLine("}"); + } + static void ProcessEnum(XPathNavigator nav, TextWriter o) { + String typeName = nav.SelectSingleNode("@name").Value; + if (!Types.ContainsKey(typeName)) Types.Add(typeName, new TypeInfo(typeName)); + o.WriteLine("[Guid(\"{0}\")]", nav.SelectSingleNode("@uuid").Value); + o.WriteLine("enum " + typeName + " {"); + foreach (XPathNavigator member in nav.SelectChildren(XPathNodeType.Element)) { + switch (member.Name) { + case "desc": + break; + case "const": + o.WriteLine("\t{0} = {1},", member.SelectSingleNode("@name").Value, member.SelectSingleNode("@value").Value); + break; + default: + Console.Error.WriteLine("Unknown member type {0}", member.Name); + break; + } + } + o.WriteLine("}"); + } + static void ProcessInterface(XPathNavigator nav, TextWriter o, XPathNavigator parentNav) { + String typeName = nav.SelectSingleNode("@name").Value; + if (!Types.ContainsKey(typeName)) Types.Add(typeName, new TypeInfo(typeName, "MarshalAs(UnmanagedType.Interface)")); + o.WriteLine("[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]"); + o.WriteLine("[Guid(\"{0}\")]", nav.SelectSingleNode("@uuid").Value); + o.WriteLine("[ComImport()]"); + o.Write("interface " + typeName); + o.WriteLine(" {"); + ProcessInterfaceMembersAndInherited(nav, o, parentNav); + o.WriteLine("}"); + } + static void ProcessInterfaceMembersAndInherited(XPathNavigator nav, TextWriter o, XPathNavigator parentNav) { + XPathItem item = nav.SelectSingleNode("@extends"); + if (item != null && item.Value[0] != '$') { + XPathNavigator inav = parentNav.SelectSingleNode("interface[@name='" + item.Value + "']"); + ProcessInterfaceMembersAndInherited(inav, o, parentNav); + } + ProcessInterfaceMembers(nav.SelectChildren(XPathNodeType.Element), o); + } + static void ProcessInterfaceMembers(XPathNodeIterator members, TextWriter oattribute) { + XPathItem item; + StringWriter omethod = new StringWriter(); + foreach (XPathNavigator member in members) { + switch (member.Name) { + case "desc": + 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(" "); + oattribute.Write(mName); + oattribute.WriteLine(" {"); + oattribute.Write("\t\t[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] "); + t.WriteAttributes(oattribute, ParameterType.Return); + oattribute.WriteLine("get;"); + if (!mReadOnly) { + oattribute.Write("\t\t[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] "); + t.WriteAttributes(oattribute, ParameterType.Param); + oattribute.WriteLine("set;"); + } + oattribute.WriteLine("\t}"); + } break; + case "method": { + String mName = member.SelectSingleNode("@name").Value; + XPathNodeIterator mParamReturn = member.Select("param[@dir='return']"); + omethod.WriteLine("\t[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]"); + omethod.Write("\t"); + bool mReturn = false; + if (mParamReturn == null || mParamReturn.Count != 1) { + omethod.Write("void"); + } 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); + } + mName = mName.Substring(0, 1).ToUpper() + mName.Substring(1); + omethod.Write(" "); + omethod.Write(mName); + omethod.Write("("); + XPathNodeIterator mParams = member.Select("param"); + bool first = true; + if (mParams.MoveNext()) { + 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; + } else { + break; + } + } else if (pDir == "in") { + } else if (pDir == "out") { + } else { + Console.Error.WriteLine("Unsupported parameter direction {0}", pDir); + } + if (first) { + first = false; + } 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); + } + }*/ + omethod.Write(" p"); + omethod.Write(mParam.SelectSingleNode("@name").Value); + if (!mParams.MoveNext()) break; + } + } + omethod.WriteLine(");"); + } break; + default: + Console.Error.WriteLine("Unknown member type {0}", member.Name); + break; + } + } + oattribute.Write((omethod as StringWriter).ToString()); + } + private static TypeInfo GetTypeDeclaration(XPathNavigator nav) { + ParameterType pt = ParameterType.Param; + return GetTypeDeclaration(nav, ref pt); + } + private static TypeInfo GetTypeDeclaration(XPathNavigator nav, ref ParameterType paramType) { + String mType = nav.SelectSingleNode("@type").Value; + XPathItem item; + item = nav.SelectSingleNode("@mod"); + String mMod = item == null ? null : item.Value; + item = nav.SelectSingleNode("@safearray"); + Boolean pArray = item == null ? false : item.Value == "yes"; + + TypeInfo t; + if (!Types.TryGetValue(mType, out t)) { + Console.Error.WriteLine("Type {0} is not supported", mType); + t = new TypeInfo("void"); + } + if (mMod == "ptr") { + if (paramType == ParameterType.In) { + paramType = ParameterType.Reference; + } else { + t = new TypeInfo("IntPtr"); + } + } else if (mMod == "string") { + t = new TypeInfo("String", "MarshalAs(UnmanagedType.LPWStr)"); + } else if (mMod != null) { + Console.Error.WriteLine("Type modifier {0} is not supported", mMod); + t = new TypeInfo("void"); + } + if (pArray) { + t = new TypeInfo("Array", "MarshalAs(UnmanagedType.SafeArray)"); + if (paramType == ParameterType.In || paramType == ParameterType.Out) paramType = ParameterType.Reference; + } + return t; + } +} diff -r 000000000000 -r e1ec7bf71313 VBoxDotNet.sln --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxDotNet.sln Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VBoxFrontend", "VBoxFrontend\VBoxFrontend.csproj", "{B1236187-8BCB-4DD7-A4C2-F2C3BBC555A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InteropCodeGen", "InteropCodeGen\InteropCodeGen.csproj", "{9C96A3C0-1673-457A-BF8D-CB97B44533A3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B1236187-8BCB-4DD7-A4C2-F2C3BBC555A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1236187-8BCB-4DD7-A4C2-F2C3BBC555A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1236187-8BCB-4DD7-A4C2-F2C3BBC555A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1236187-8BCB-4DD7-A4C2-F2C3BBC555A1}.Release|Any CPU.Build.0 = Release|Any CPU + {9C96A3C0-1673-457A-BF8D-CB97B44533A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C96A3C0-1673-457A-BF8D-CB97B44533A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C96A3C0-1673-457A-BF8D-CB97B44533A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C96A3C0-1673-457A-BF8D-CB97B44533A3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Display.Designer.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Display.Designer.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,187 @@ +namespace ConsoleApplication1 { + partial class Display { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if (disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Display)); + this.DisplayBox = new System.Windows.Forms.PictureBox(); + this.COMEventTimer = new System.Windows.Forms.Timer(this.components); + this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.toolStripDropDownButton1 = new System.Windows.Forms.ToolStripDropDownButton(); + this.testToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resumeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.saveStateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aCPIPowerDownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.shutdownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.resetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.statusLabel = new System.Windows.Forms.ToolStripLabel(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.ProgressWatcher = new System.Windows.Forms.Timer(this.components); + ((System.ComponentModel.ISupportInitialize)(this.DisplayBox)).BeginInit(); + this.toolStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // DisplayBox + // + this.DisplayBox.BackColor = System.Drawing.Color.Black; + this.DisplayBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.DisplayBox.Location = new System.Drawing.Point(0, 20); + this.DisplayBox.Name = "DisplayBox"; + this.DisplayBox.Size = new System.Drawing.Size(292, 246); + this.DisplayBox.TabIndex = 0; + this.DisplayBox.TabStop = false; + this.DisplayBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Display_MouseEvent); + this.DisplayBox.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Display_MouseEvent); + this.DisplayBox.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Display_MouseEvent); + // + // COMEventTimer + // + this.COMEventTimer.Tick += new System.EventHandler(this.COMEventTimer_Tick); + // + // toolStrip1 + // + this.toolStrip1.AutoSize = false; + this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripDropDownButton1, + this.toolStripSeparator1, + this.statusLabel}); + this.toolStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow; + this.toolStrip1.Location = new System.Drawing.Point(0, 0); + this.toolStrip1.Name = "toolStrip1"; + this.toolStrip1.Size = new System.Drawing.Size(292, 20); + this.toolStrip1.TabIndex = 2; + this.toolStrip1.Text = "toolStrip1"; + // + // toolStripDropDownButton1 + // + this.toolStripDropDownButton1.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.toolStripDropDownButton1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.testToolStripMenuItem, + this.resumeToolStripMenuItem, + this.saveStateToolStripMenuItem, + this.aCPIPowerDownToolStripMenuItem, + this.resetToolStripMenuItem, + this.shutdownToolStripMenuItem}); + this.toolStripDropDownButton1.Image = ((System.Drawing.Image)(resources.GetObject("toolStripDropDownButton1.Image"))); + this.toolStripDropDownButton1.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripDropDownButton1.Name = "toolStripDropDownButton1"; + this.toolStripDropDownButton1.Size = new System.Drawing.Size(59, 17); + this.toolStripDropDownButton1.Text = "Machine"; + // + // testToolStripMenuItem + // + this.testToolStripMenuItem.Name = "testToolStripMenuItem"; + this.testToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.testToolStripMenuItem.Text = "Pause"; + this.testToolStripMenuItem.Click += new System.EventHandler(this.pauseToolStripMenuItem_Click); + // + // resumeToolStripMenuItem + // + this.resumeToolStripMenuItem.Name = "resumeToolStripMenuItem"; + this.resumeToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.resumeToolStripMenuItem.Text = "Resume"; + this.resumeToolStripMenuItem.Click += new System.EventHandler(this.resumeToolStripMenuItem_Click); + // + // saveStateToolStripMenuItem + // + this.saveStateToolStripMenuItem.Name = "saveStateToolStripMenuItem"; + this.saveStateToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.saveStateToolStripMenuItem.Text = "Save state"; + this.saveStateToolStripMenuItem.Click += new System.EventHandler(this.savestateToolStripMenuItem_Click); + // + // aCPIPowerDownToolStripMenuItem + // + this.aCPIPowerDownToolStripMenuItem.Name = "aCPIPowerDownToolStripMenuItem"; + this.aCPIPowerDownToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.aCPIPowerDownToolStripMenuItem.Text = "ACPI power down"; + this.aCPIPowerDownToolStripMenuItem.Click += new System.EventHandler(this.aCPIPowerButtonToolStripMenuItem_Click); + // + // shutdownToolStripMenuItem + // + this.shutdownToolStripMenuItem.Name = "shutdownToolStripMenuItem"; + this.shutdownToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.shutdownToolStripMenuItem.Text = "Shutdown"; + this.shutdownToolStripMenuItem.Click += new System.EventHandler(this.powerdownToolStripMenuItem_Click); + // + // resetToolStripMenuItem + // + this.resetToolStripMenuItem.Name = "resetToolStripMenuItem"; + this.resetToolStripMenuItem.Size = new System.Drawing.Size(171, 22); + this.resetToolStripMenuItem.Text = "Reset"; + this.resetToolStripMenuItem.Click += new System.EventHandler(this.resetToolStripMenuItem_Click); + // + // statusLabel + // + this.statusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + this.statusLabel.Name = "statusLabel"; + this.statusLabel.Size = new System.Drawing.Size(38, 13); + this.statusLabel.Text = "Busy.."; + this.statusLabel.Visible = false; + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(6, 23); + // + // ProgressWatcher + // + this.ProgressWatcher.Tick += new System.EventHandler(this.ProgressWatcher_Tick); + // + // Display + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(292, 266); + this.Controls.Add(this.DisplayBox); + this.Controls.Add(this.toolStrip1); + this.Name = "Display"; + this.Text = "VirtualBox Virtual Machine Display"; + this.Load += new System.EventHandler(this.Display_Load); + this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Display_KeyUp); + this.Resize += new System.EventHandler(this.Display_Resize); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Display_KeyDown); + ((System.ComponentModel.ISupportInitialize)(this.DisplayBox)).EndInit(); + this.toolStrip1.ResumeLayout(false); + this.toolStrip1.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.PictureBox DisplayBox; + private System.Windows.Forms.Timer COMEventTimer; + private System.Windows.Forms.ToolStrip toolStrip1; + private System.Windows.Forms.ToolStripDropDownButton toolStripDropDownButton1; + private System.Windows.Forms.ToolStripMenuItem testToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem resumeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem saveStateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem aCPIPowerDownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem shutdownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem resetToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripLabel statusLabel; + private System.Windows.Forms.Timer ProgressWatcher; + } +} \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Display.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Display.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,243 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using System.Threading; +using VirtualBox; + +namespace ConsoleApplication1 { + public partial class Display : Form { + public Framebuffer Framebuffer { get; private set; } + public IConsole VMConsole { get; private set; } + private Point MouseLocation = new Point(0, 0); + private VBoxEventListener EventListener = new VBoxEventListener(); + private VBoxKeyboardHelper Keyboard; + private Size RequestedClientSize = new Size(0, 0); + private IProgress WaitingForProgress = null; + private Boolean InitialPaused = true; + + public Display(IConsole console, Framebuffer fb) { + VMConsole = console; + Framebuffer = fb; + Keyboard = new VBoxKeyboardHelper(VMConsole.Keyboard); + InitializeComponent(); + Framebuffer.BufferChanged += Framebuffer_BufferChanged; + Framebuffer.Update += Framebuffer_Update; + DisplayBox.Image = Framebuffer.Bitmap; + EventListener.HandleEvent += EventListener_HandleEvent; + EventListener.RegisterSource(VMConsole.EventSource, VBoxEventType.VBoxEventType_Any); + this.MouseWheel += Display_MouseEvent; + } + + private void Display_Load(object sender, EventArgs e) { + ClientSize = RequestedClientSize = new Size(800, 600); + if (ProgramRun.VBoxXPCOM != null) COMEventTimer.Enabled = true; + Framebuffer.WinId = Handle.ToInt64(); + } + + private void EventListener_HandleEvent(Object sender, VBoxEventArgs ea) { + IEvent aEvent = ea.Event; + switch (aEvent.Type) { + case VBoxEventType.VBoxEventType_OnCanShowWindow: { + ICanShowWindowEvent e = (ICanShowWindowEvent)aEvent; + } break; + case VBoxEventType.VBoxEventType_OnEventSourceChanged: + break; + case VBoxEventType.VBoxEventType_OnStateChanged: { + IStateChangedEvent e = (IStateChangedEvent)aEvent; + Console.WriteLine("New state: {0}", e.State); + switch (e.State) { + case MachineState.MachineState_Paused: + if (InitialPaused) { + InitialPaused = false; + ThreadPool.QueueUserWorkItem(delegate(Object state) { + VMConsole.Resume(); + }); + } + break; + case MachineState.MachineState_Running: + ThreadPool.QueueUserWorkItem(delegate(Object state) { + try { + if (VMConsole.Mouse.AbsoluteSupported == 0 && VMConsole.Mouse.RelativeSupported != 0) { + Console.WriteLine("Reset mouse position to {0}", MouseLocation); + //MouseLocation = new Point(0, 0); + VMConsole.Mouse.PutMouseEvent(-(int)Framebuffer.Width, -(int)Framebuffer.Height, 0, 0, 0); + VMConsole.Mouse.PutMouseEvent(MouseLocation.X, MouseLocation.Y, 0, 0, 0); + } + } catch (Exception ex) { + Console.WriteLine(ex.ToString()); + } + try { + VMConsole.Display.InvalidateAndUpdate(); + } catch (Exception ex) { + Console.WriteLine(ex.ToString()); + } + }); + break; + case MachineState.MachineState_Aborted: + case MachineState.MachineState_PoweredOff: + case MachineState.MachineState_Saved: + if (IsHandleCreated) Invoke((MethodInvoker)delegate() { Close(); }); + break; + } + } break; + case VBoxEventType.VBoxEventType_OnShowWindow: { + IShowWindowEvent e = (IShowWindowEvent)aEvent; + e.WinId = Handle.ToInt64(); + } break; + case VBoxEventType.VBoxEventType_OnKeyboardLedsChanged: { + IKeyboardLedsChangedEvent e = (IKeyboardLedsChangedEvent)aEvent; + Console.WriteLine("Keyboard leds: Numlock={0} Capslock={1} Scrolllock={2}", e.NumLock, e.CapsLock, e.ScrollLock); + } break; + case VBoxEventType.VBoxEventType_OnMouseCapabilityChanged: { + IMouseCapabilityChangedEvent e = (IMouseCapabilityChangedEvent)aEvent; + Console.WriteLine("MouseCapabilityChanged NeedsHostCursor={0} SupportsAbsolute={1} SupportsRelative={2}", e.NeedsHostCursor, e.SupportsAbsolute, e.SupportsRelative); + } break; + case VBoxEventType.VBoxEventType_OnMousePointerShapeChanged: { + IMousePointerShapeChangedEvent e = (IMousePointerShapeChangedEvent)aEvent; + } break; + case VBoxEventType.VBoxEventType_OnAdditionsStateChanged: { + IAdditionsStateChangedEvent e = (IAdditionsStateChangedEvent)aEvent; + } break; + } + } + + private void COMEventTimer_Tick(object sender, EventArgs e) { + ProgramRun.VBoxXPCOM.EventQueue.ProcessPendingEvents(); + } + + private void Display_Resize(object sender, EventArgs e) { + if (RequestedClientSize.Equals(ClientSize)) return; + if (VMConsole.State != MachineState.MachineState_Running) return; + VMConsole.Display.SetVideoModeHint((uint)DisplayBox.Width, (uint)DisplayBox.Height, 0, 0); + } + + private void Framebuffer_BufferChanged(Object sender, EventArgs e) { + DisplayBox.Invoke((MethodInvoker)delegate() { + Framebuffer fb = (Framebuffer)sender; + DisplayBox.Image = fb.Bitmap; + if (fb.Width > Screen.FromControl(this).WorkingArea.Width || fb.Height > Screen.FromControl(this).WorkingArea.Height) return; + ClientSize = RequestedClientSize = new Size((int)fb.Width + ClientSize.Width - DisplayBox.Width, (int)fb.Height + ClientSize.Height - DisplayBox.Height); + }); + } + + private void Framebuffer_Update(Object sender, FramebufferUpdateEventArgs e) { + DisplayBox.Invoke((MethodInvoker)delegate() { + DisplayBox.Invalidate(e.Rectangle); + }); + } + + private void Display_MouseEvent(object sender, MouseEventArgs e) { + IMouse mouse = VMConsole.Mouse; + MouseButtonState mbs = (MouseButtonState)0; + if ((e.Button & MouseButtons.Left) == MouseButtons.Left) mbs |= MouseButtonState.MouseButtonState_LeftButton; + if ((e.Button & MouseButtons.Right) == MouseButtons.Right) mbs |= MouseButtonState.MouseButtonState_RightButton; + if ((e.Button & MouseButtons.Middle) == MouseButtons.Middle) mbs |= MouseButtonState.MouseButtonState_MiddleButton; + if ((e.Button & MouseButtons.XButton1) == MouseButtons.XButton1) mbs |= MouseButtonState.MouseButtonState_XButton1; + if ((e.Button & MouseButtons.XButton2) == MouseButtons.XButton2) mbs |= MouseButtonState.MouseButtonState_XButton2; + try { + //Console.WriteLine("Mouse {0} Scroll {1} Buttons {2}", e.Location, e.Delta, mbs); + if (mouse.AbsoluteSupported != 0) { + mouse.PutMouseEventAbsolute(e.X + 1, e.Y + 1, -e.Delta / 120, 0, (int)mbs); + } else if (mouse.RelativeSupported != 0) { + mouse.PutMouseEvent(e.X - MouseLocation.X, e.Y - MouseLocation.Y, -e.Delta / 120, 0, (int)mbs); + } + MouseLocation = e.Location; + } catch (Exception ex) { + Console.WriteLine("MouseEventHandler Exception: {0}", ex.ToString()); + } + } + + private void Display_KeyDown(object sender, KeyEventArgs e) { + Keyboard.SendKeyCode(e.KeyCode, true); + } + + private void Display_KeyUp(object sender, KeyEventArgs e) { + Keyboard.SendKeyCode(e.KeyCode, false); + } + + private void pauseToolStripMenuItem_Click(object sender, EventArgs e) { + try { + VMConsole.Pause(); + statusLabel.Text = "Paused"; + statusLabel.Visible = true; + } catch (Exception ex) { + MessageBox.Show(ex.ToString()); + } + } + + private void resumeToolStripMenuItem_Click(object sender, EventArgs e) { + try { + VMConsole.Resume(); + if (statusLabel.Text == "Paused") statusLabel.Visible = false; + } catch (Exception ex) { + MessageBox.Show(ex.ToString()); + } + } + + private void savestateToolStripMenuItem_Click(object sender, EventArgs e) { + try { + MonitorUntilCompleted(VMConsole.SaveState()); + } catch (Exception ex) { + MessageBox.Show(ex.ToString()); + } + } + + private void aCPIPowerButtonToolStripMenuItem_Click(object sender, EventArgs e) { + try { + VMConsole.PowerButton(); + } catch (Exception ex) { + MessageBox.Show(ex.ToString()); + } + } + + private void powerdownToolStripMenuItem_Click(object sender, EventArgs e) { + try { + MonitorUntilCompleted(VMConsole.PowerDown()); + } catch (Exception ex) { + MessageBox.Show(ex.ToString()); + } + } + + private void resetToolStripMenuItem_Click(object sender, EventArgs e) { + try { + VMConsole.Reset(); + } catch (Exception ex) { + MessageBox.Show(ex.ToString()); + } + } + + public void MonitorUntilCompleted(IProgress p) { + WaitingForProgress = p; + statusLabel.Visible = true; + statusLabel.Text = "Busy..."; + ProgressWatcher.Enabled = true; + } + + private void ProgressWatcher_Tick(object sender, EventArgs e) { + IProgress p = WaitingForProgress; + if (p == null) { + ProgressWatcher.Enabled = false; + statusLabel.Visible = false; + } else { + if (p.Canceled == 0 && p.Completed == 0) { + statusLabel.Text = "Busy " + p.Percent + "%..."; + } else if (p.Canceled != 0) { + WaitingForProgress = null; + statusLabel.Text = "Operation aborted"; + } else if (p.Completed != 0) { + WaitingForProgress = null; + if (p.ErrorInfo == null || p.ErrorInfo.ResultCode == 0) { + statusLabel.Text = "Operation completed"; + } else { + statusLabel.Text = "Operation failed"; + MessageBox.Show(p.ErrorInfo.Text, "Operation failed"); + if (p.Cancelable != 0) p.Cancel(); + } + } + } + } + } +} \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Display.resx --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Display.resx Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 133, 17 + + + 374, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL + U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI + VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ + QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 + /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 + cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j + 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR + dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb + NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE + s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC + + + + 473, 17 + + \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Framebuffer.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Framebuffer.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,101 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Threading; +using VirtualBox; + +namespace ConsoleApplication1 { + public class FramebufferUpdateEventArgs : EventArgs { + public Rectangle Rectangle { get; private set; } + public FramebufferUpdateEventArgs(Rectangle rect) { + Rectangle = rect; + } + } + [ClassInterface((Int16)0)] + [TypeLibType(2)] + [ComVisible(true)] + public class Framebuffer : IFramebuffer { + Mutex mutex = new Mutex(); + + public Framebuffer() { + byte b = 0; + RequestResize(0, (int)FramebufferPixelFormat.FramebufferPixelFormat_FOURCC_RGB, ref b, 32, 0, 640, 480); + } + + public void Lock() { + //Console.WriteLine("Lock"); + mutex.WaitOne(); + } + public void Unlock() { + //Console.WriteLine("Unlock"); + mutex.ReleaseMutex(); + } + + public Bitmap Bitmap { get; private set; } + public event EventHandler BufferChanged; + public event EventHandler Update; + + public IntPtr Address { get; private set; } + public uint BitsPerPixel { get; private set; } + public uint BytesPerLine { get; private set; } + public uint Height { get; private set; } + public uint HeightReduction { get { return 0; } } + public IFramebufferOverlay Overlay { get { return null; } } + public uint PixelFormat { get; private set; } + public int UsesGuestVRAM { get { return 0; } } + public uint Width { get; private set; } + public long WinId { get; internal set; } + + public unsafe void NotifyUpdate(uint aX, uint aY, uint aWidth, uint aHeight) { + //Console.WriteLine("NotifyUpdate X={0} Y={1} Width={2} Height={3}", aX, aY, aWidth, aHeight); + if (Update != null) Update(this, new FramebufferUpdateEventArgs(new Rectangle((int)aX, (int)aY, (int)aWidth, (int)aHeight))); + } + public void ProcessVHWACommand(ref byte aCommand) { + Console.WriteLine("ProcessVHWACommand"); + } + public unsafe int RequestResize(uint aScreenId, uint aPixelFormat, ref byte aVRAM, uint aBitsPerPixel, uint aBytesPerLine, uint aWidth, uint aHeight) { + //Note that aVRAM is a pointer, which may be NULL! + //fixed (Byte* vrp = &aVRAM) Console.WriteLine("RequestResize Current={0} ScreenId={1} PixelFormat={2} VRAM={3} BitsPerPixel={4} BytesPerLine={5} Width={6} Height={7}", Address, aScreenId, aPixelFormat, (IntPtr)vrp, aBitsPerPixel, aBytesPerLine, aWidth, aHeight); + Console.WriteLine("RequestResize Current={0} ScreenId={1} PixelFormat={2} VRAM={3} BitsPerPixel={4} BytesPerLine={5} Width={6} Height={7}", Address, aScreenId, aPixelFormat, 0, aBitsPerPixel, aBytesPerLine, aWidth, aHeight); + Lock(); + try { + IntPtr oldAddress = Address; + + Width = aWidth; + Height = aHeight; + + BitsPerPixel = 32; + PixelFormat = (int)FramebufferPixelFormat.FramebufferPixelFormat_FOURCC_RGB; + BytesPerLine = BitsPerPixel * Width / 8; //aBytesPerLine; + Address = Marshal.AllocHGlobal((int)(BytesPerLine * Height)); + if (Bitmap != null) Bitmap.Dispose(); + Bitmap = new Bitmap((int)Width, (int)Height, (int)BytesPerLine, System.Drawing.Imaging.PixelFormat.Format32bppRgb, Address); + if (BufferChanged != null) BufferChanged(this, new EventArgs()); + if (oldAddress != IntPtr.Zero) Marshal.FreeHGlobal(oldAddress); + //Console.WriteLine("RequestResizeDone Current={0} ScreenId={1} PixelFormat={2} VRAM={3} BitsPerPixel={4} BytesPerLine={5} Width={6} Height={7}", Address, aScreenId, PixelFormat, 0, BitsPerPixel, BytesPerLine, Width, Height); + } finally { + Unlock(); + } + return 1; //Finished + } + + ~Framebuffer() { + if (Bitmap != null) Bitmap.Dispose(); + if (Address != IntPtr.Zero) Marshal.FreeHGlobal(Address); + } + + public void SetVisibleRegion(ref byte aRectangles, uint aCount) { + Console.WriteLine("SetVisibleRegion"); + } + public uint GetVisibleRegion(ref byte aRectangles, uint aCount) { + Console.WriteLine("GetVisibleRegion"); + return 0; + } + public int VideoModeSupported(uint aWidth, uint aHeight, uint aBpp) { + Console.WriteLine("VideoModeSupported Width={0} Height={1} Bpp={2}", aWidth, aHeight, aBpp); + return 1; //Supported + } + } +} diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Program.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Program.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,134 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using System.Threading; +using VirtualBox; + +namespace ConsoleApplication1 { + class ProgramRun { + public static VBoxXPCOM VBoxXPCOM { get; private set; } + Object WaitingForProgress = null; + + public int Run(string[] args) { + IVirtualBox vb; + ISession sess; + if (Environment.OSVersion.Platform == PlatformID.Unix) { + VBoxXPCOM = new VBoxXPCOM(); + vb = VBoxXPCOM.VirtualBox; + sess = VBoxXPCOM.Session; + } else { + VBoxCOMInit(out vb, out sess); + } + + Console.WriteLine("VirtualBox version={0} revision={1}", vb.Version, vb.Revision); + Console.WriteLine("VirtualBox HomeFolder={0}", vb.HomeFolder); + + if (args.Length < 1) { + Console.Error.WriteLine("Usage: {0} machine-name-or-id", Assembly.GetExecutingAssembly().Location); + return 1; + } + IMachine m; + m = vb.FindMachine(args[0]); + + Console.WriteLine("Lock machine"); + m.LockMachine((Session)sess, LockType.LockType_Write); + try { + Framebuffer fb = new Framebuffer(); + sess.Console.Display.SetFramebuffer(0, fb); + + Console.WriteLine("Start GUI thread"); + Display disp = new Display(sess.Console, fb); + + Console.WriteLine("Power up..."); + //MonitorAndProcessEventsUntilCompleted(sess.Console.PowerUpPaused()); + + try { + disp.MonitorUntilCompleted(sess.Console.PowerUpPaused()); + + //Console.WriteLine("Resume"); + //sess.Console.Resume(); + + Application.Run(disp); + } finally { + if (VBoxXPCOM != null) VBoxXPCOM.EventQueue.ProcessPendingEvents(); + switch (sess.Console.State) { + case MachineState.MachineState_PoweredOff: + case MachineState.MachineState_Saved: + case MachineState.MachineState_Aborted: + break; + default: + Console.WriteLine("Power down"); + WaitingForProgress = null; + ThreadPool.QueueUserWorkItem(delegate(Object state) { + Console.WriteLine("Requesting SaveState"); + IProgress p = sess.Console.SaveState(); + Console.WriteLine("Waiting for SaveState completion"); + WaitingForProgress = p; + VBoxWaitComplete(p); + }); + ProcessEventsUntilCompleted(); + break; + } + } + } finally { + Console.WriteLine("Unlock machine"); + sess.UnlockMachine(); + if (VBoxXPCOM != null) VBoxXPCOM.EventQueue.ProcessPendingEvents(); + } + return 0; + } + + void VBoxCOMInit(out IVirtualBox vb, out ISession sess) { + //vb = (IVirtualBox)Activator.CreateInstance(Type.GetTypeFromProgID("VirtualBox.VirtualBox")); + //vb = (IVirtualBox)Activator.CreateInstance(typeof(VirtualBoxClass)); + //vb = (IVirtualBox)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("B1A7A4F2-47B9-4A1E-82B2-07CCD5323C3F"))); + vb = new VirtualBox.VirtualBoxClass(); + sess = new VirtualBox.SessionClass(); + } + + public void VBoxWaitComplete(IProgress p) { + uint prev = 0; + while (p.Completed == 0) { + if (p.Percent != prev) Console.Write("{0}% ", p.Percent); + prev = p.Percent; + p.WaitForCompletion(100); + } + if (p.ResultCode == 0) { + Console.WriteLine("done"); + } else { + Console.WriteLine("Error {0} {1}", p.ErrorInfo.ResultCode, p.ErrorInfo.Text); + throw new COMException(p.ErrorInfo.Text, p.ErrorInfo.ResultCode); + } + } + + public void MonitorAndProcessEventsUntilCompleted(IProgress p) { + MonitorProgressAsync(p); + ProcessEventsUntilCompleted(p); + } + public void MonitorProgressAsync(IProgress p) { + ThreadPool.QueueUserWorkItem(delegate(Object state) { + try { + VBoxWaitComplete(p); + } catch (Exception ex) { + Console.WriteLine(ex.ToString()); + } + }); + } + public void ProcessEventsUntilCompleted(IProgress p) { + do { + if (VBoxXPCOM != null) VBoxXPCOM.EventQueue.ProcessPendingEvents(); + Thread.Sleep(100); + } while (p.Canceled == 0 && p.Completed == 0); + Console.WriteLine("Event processing completed"); + } + public void ProcessEventsUntilCompleted() { + Console.WriteLine("Processing COM events..."); + do { + if (VBoxXPCOM != null) VBoxXPCOM.EventQueue.ProcessPendingEvents(); + Thread.Sleep(100); + } while (WaitingForProgress == null || ((WaitingForProgress as IProgress).Canceled == 0 && (WaitingForProgress as IProgress).Completed == 0)); + Console.WriteLine("COM Event processing completed"); + } + } +} \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/ProgramLoader.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/ProgramLoader.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,36 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace ConsoleApplication1 { + class ProgramLoader { + [DllImport("/usr/lib/virtualbox/VBoxXPCOMC.so")] + private static extern Int32 RTR3InitAndSUPLib(); + + static unsafe int Main(string[] args) { + if (Environment.OSVersion.Platform == PlatformID.Unix) { + Console.WriteLine("UNIX based OS detected, doing some magic..."); + int init = RTR3InitAndSUPLib(); + if (init != 0) throw new COMException("Failed to initialize VirtualBox driver", init); + Unix_setuid(); + Assembly.LoadFile("Interop.VirtualBox.XPCOM.dll"); + } + return Main2(args); + } + + static int Main2(String[] args) { + ProgramRun p = new ProgramRun(); + return p.Run(args); + } + + private static void Unix_setuid() { + uint uid = Mono.Unix.Native.Syscall.getuid(); + uint euid = Mono.Unix.Native.Syscall.geteuid(); + Console.WriteLine("Running as user {0} effective {1}", uid, euid); + if (uid != euid) { + Console.WriteLine("Set user ID: {0}", uid); + Mono.Unix.Native.Syscall.setreuid(uid, uid); + } + } + } +} \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Properties/AssemblyInfo.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Properties/AssemblyInfo.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ConsoleApplication1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApplication1")] +[assembly: AssemblyCopyright("Copyright © 2011")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("961036de-7f79-4cab-8f29-b6fc4c427a71")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Properties/Resources.Designer.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Properties/Resources.Designer.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3620 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace ConsoleApplication1.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ConsoleApplication1.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/Properties/Resources.resx --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/Properties/Resources.resx Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/VBoxEventListener.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/VBoxEventListener.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,66 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using VirtualBox; + +namespace ConsoleApplication1 { + public class VBoxEventArgs : EventArgs { + public IEvent Event { get; private set; } + public VBoxEventArgs(IEvent e) { + Event = e; + } + } + + [ClassInterface(ClassInterfaceType.None)] + [TypeLibType(TypeLibTypeFlags.FCanCreate)] + [ComVisible(true)] + public class VBoxEventListener : IEventListener { + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("9b6e1aee-35f3-4f4d-b5bb-ed0ecefd8538")] + [ComImport()] + interface IEventSourceXPCOM { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IEventListener CreateListener(); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IEventSource CreateAggregator([MarshalAs(UnmanagedType.SafeArray)] ref System.Array psubordinates); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void RegisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, UInt32 pinterestinglen, IntPtr pinteresting, Int32 pactive); + //void RegisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, UInt32 pinterestinglen, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] VBoxEventType[] pinteresting, Int32 pactive); + + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void UnregisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + Int32 FireEvent([MarshalAs(UnmanagedType.Interface)] IEvent pevent, Int32 ptimeout); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + [return: MarshalAs(UnmanagedType.Interface)] + IEvent GetEvent([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, Int32 ptimeout); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void EventProcessed([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, [MarshalAs(UnmanagedType.Interface)] IEvent pevent); + } + + public EventHandler HandleEvent; + void IEventListener.HandleEvent(IEvent aEvent) { + Console.WriteLine("Event: {0}", aEvent.Type); + if (HandleEvent != null) HandleEvent(this, new VBoxEventArgs(aEvent)); + } + + public void RegisterSource(IEventSource src, params VBoxEventType[] events) { + if (Environment.OSVersion.Platform == PlatformID.Win32NT || Environment.OSVersion.Platform == PlatformID.WinCE) { + Array eventTypesArray = (Array)events; + src.RegisterListener(this, ref eventTypesArray, 1); + } else { + unsafe { + fixed (VBoxEventType* ptr = events) { + ((IEventSourceXPCOM)src).RegisterListener(this, (uint)events.Length, (IntPtr)ptr, 1); + } + } + } + } + + public void UnregisterSource(IEventSource src) { + src.UnregisterListener(this); + } + } +} diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/VBoxFrontend.csproj --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/VBoxFrontend.csproj Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,94 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {B1236187-8BCB-4DD7-A4C2-F2C3BBC555A1} + Exe + Properties + ConsoleApplication1 + VBoxTest + v2.0 + 512 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + true + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + C:\Program Files\Mono-2.8\lib\mono\2.0\Mono.Posix.dll + False + + + + + + + + + Form + + + Display.cs + + + + + + + True + True + Resources.resx + + + + + + + + {46137EEC-703B-4FE5-AFD4-7C9BBBBA0259} + 1 + 3 + 0 + tlbimp + False + + + + + Display.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + \ No newline at end of file diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/VBoxKeyboardHelper.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/VBoxKeyboardHelper.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,80 @@ +using System; +using VirtualBox; +using System.Windows.Forms; + +namespace ConsoleApplication1 { + public class VBoxKeyboardHelper { + public IKeyboard Keyboard { get; private set; } + + public VBoxKeyboardHelper(IKeyboard kb) { + Keyboard = kb; + } + + public void SendKeyCode(Keys keycode, bool down) { + int code; + //Console.WriteLine("VBoxKeyboardHelper.SendKeyCode({1}={2},{0})", down, keycode, (int)keycode); + int[] codes_az = { 0x1e, 0x30, 0x2e, 0x20, 0x12, 0x21, 0x22, 0x23, 0x17, 0x24, 0x25, 0x26, 0x32, 0x31, 0x18, 0x19, 0x10, 0x13, 0x1f, 0x14, 0x16, 0x2f, 0x11, 0x2d, 0x15, 0x2c }; //a-z + int[] codes_num = {0x0b, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a}; //0123456789 + int[] codes_Fkeys = { 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x57, 0x58 }; //F123456789,10,11,12 + if (keycode >= Keys.A && keycode <= Keys.Z) { + code = codes_az[keycode - Keys.A]; + } else if (keycode >= Keys.D0 && keycode <= Keys.D9) { + code = codes_num[keycode - Keys.D0]; + } else if (keycode >= Keys.F1 && keycode <= Keys.F12) { + code = codes_Fkeys[keycode - Keys.F1]; + } else { + switch (keycode) { + case Keys.Space: code = 0x0239; break; + case Keys.Left: code = 0xe04b; break; + case Keys.Up: code = 0xe048; break; + case Keys.Right: code = 0xe04d; break; + case Keys.Down: code = 0xe050; break; + case Keys.Enter: code = 0x1c; break; + case Keys.LShiftKey: + case Keys.RShiftKey: + case Keys.ShiftKey: code = 0x2a; break; + case Keys.Tab: code = 0x0f; break; + case Keys.Back: code = 0x0e; break; + case Keys.Escape: code = 0x01; break; + case Keys.Home: code = 0xe047; break; + case Keys.PageUp: code = 0xe049; break; + case Keys.PageDown: code = 0xe051; break; + case Keys.End: code = 0xe04f; break; + case Keys.Insert: code = 0xe052; break; + case Keys.ControlKey: + case Keys.LControlKey: code = 0x1d; break; + case Keys.RControlKey: code = 0xe01d; break; + case Keys.Menu: + case Keys.LMenu: code = 0x38; break; //Left Alt + case Keys.RMenu: code = 0xe038; break; //Right Alt + case Keys.LWin: code = 0xe05b; break; //Left windows key + case Keys.RWin: code = 0xe05c; break; //Right windows key + case Keys.Delete: code = 0xe053; break; + case Keys.OemQuotes: code = 0x28; break; + case Keys.OemQuestion: code = 0x35; break; + case Keys.OemPeriod: code = 0x34; break; + case Keys.OemMinus: code = 0x0c; break; + case Keys.Oemplus: code = 0x0d; break; + case Keys.Oemcomma: code = 0x33; break; + case Keys.OemSemicolon: code = 0x27; break; + case Keys.Oemtilde: code = 0x29; break; + case Keys.OemCloseBrackets: code = 0x1b; break; + case Keys.OemBackslash: code = 0x2b; break; + case Keys.OemOpenBrackets: code = 0x1a; break; + default: + Console.Error.WriteLine("VBoxKeyboardHelper.SendKeyCode({1}={2},{0}) unknown key", down, keycode, (int)keycode); + return; + } + } + if ((code & 0xff00) != 0) kbdPutCode((code >> 8) & 0xff); + kbdPutCode((code & 0xff) | (down ? 0 : 0x80)); + } + private void kbdPutCode(int code) { + try { + Keyboard.PutScancode(code); + } catch (Exception ex) { + Console.Error.WriteLine("VBoxKeyboardHelper.PutScancode Exception: {0}", ex.ToString()); + } + } + } +} diff -r 000000000000 -r e1ec7bf71313 VBoxFrontend/VBoxXPCOM.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VBoxFrontend/VBoxXPCOM.cs Wed May 04 00:59:43 2011 +0200 @@ -0,0 +1,124 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using VirtualBox; + +namespace ConsoleApplication1 { + public class VBoxXPCOM { + private delegate UInt32 pfnGetVersionDelegate(); + private unsafe delegate void pfnComInitializeDelegate( + [MarshalAs(UnmanagedType.LPStr)] String pszVirtualBoxIID, + out IntPtr ppVirtualBox, + [MarshalAs(UnmanagedType.LPStr)] String pszSessionIID, + out IntPtr ppSession); + private delegate void pfnComUninitializeDelegate(); + private delegate void pfnGetEventQueueDelegate(out IntPtr eventQueue); //void (*pfnGetEventQueue)(nsIEventQueue **eventQueue); + + private struct VBOXXPCOMC { + public UInt32 cb; //The size of the structure. + public UInt32 uVersion; //The structure version. + [MarshalAs(UnmanagedType.FunctionPtr)] + public pfnGetVersionDelegate pfnGetVersion; + [MarshalAs(UnmanagedType.FunctionPtr)] + public pfnComInitializeDelegate pfnComInitialize; + [MarshalAs(UnmanagedType.FunctionPtr)] + public pfnComUninitializeDelegate pfnComUninitialize; + [MarshalAs(UnmanagedType.FunctionPtr)] + private pfnComUninitializeDelegate pfnComUnallocMem; //void (*pfnComUnallocMem)(void *pv); + [MarshalAs(UnmanagedType.FunctionPtr)] + private pfnComUninitializeDelegate pfnUtf16Free; //void (*pfnUtf16Free)(PRUnichar *pwszString); + [MarshalAs(UnmanagedType.FunctionPtr)] + private pfnComUninitializeDelegate pfnUtf8Free; //void (*pfnUtf8Free)(char *pszString); + [MarshalAs(UnmanagedType.FunctionPtr)] + private pfnComUninitializeDelegate pfnUtf16ToUtf8; //int (*pfnUtf16ToUtf8)(const PRUnichar *pwszString, char **ppszString); + [MarshalAs(UnmanagedType.FunctionPtr)] + private pfnComUninitializeDelegate pfnUtf8ToUtf16; //int (*pfnUtf8ToUtf16)(const char *pszString, PRUnichar **ppwszString); + [MarshalAs(UnmanagedType.FunctionPtr)] + public pfnGetEventQueueDelegate pfnGetEventQueue; //void (*pfnGetEventQueue)(nsIEventQueue **eventQueue); + public UInt32 uEndVersion; //Tail version, same as uVersion. + } + + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("176afb41-00a4-11d3-9f2a-00400553eef0")] + [ComImport()] + public interface nsIEventQueue { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PostEvent(IntPtr aEvent); //[noscript] void postEvent (in PLEventPtr aEvent); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + Int32 IsOnCurrentThread(); //boolean isOnCurrentThread (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void InitEvent(IntPtr aEvent, IntPtr owner, IntPtr handler, IntPtr destructor); //[noscript] void initEvent (in PLEventPtr aEvent, in voidPtr owner, in PLHandleEventProc handler, in PLDestroyEventProc destructor); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void PostSynchronousEvent(IntPtr aEvent, out IntPtr aResult); //[noscript] void postSynchronousEvent (in PLEventPtr aEvent, out voidPtr aResult); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + Int32 PendingEvents(); //boolean pendingEvents (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ProcessPendingEvents(); //void processPendingEvents (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void EventLoop(); //void eventLoop (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void EventAvailable(ref Int32 aResult); //[noscript] void eventAvailable (in PRBoolRef aResult); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + IntPtr GetEvent(); //[noscript] PLEventPtr getEvent (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void HandleEvent(IntPtr aEvent); //[noscript] void handleEvent (in PLEventPtr aEvent); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + IntPtr WaitForEvent(); //[noscript] PLEventPtr waitForEvent (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + Int32 GetEventQueueSelectFD(); //[notxpcom] PRInt32 getEventQueueSelectFD (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void Init(Int32 aNative); //void init (in boolean aNative); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void InitFromPRThread(IntPtr thread, Int32 aNative); //[noscript] void initFromPRThread (in PRThreadPtr thread, in boolean aNative); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void InitFromPLQueue(IntPtr aQueue); //[noscript] void initFromPLQueue (in PLEventQueuePtr aQueue); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void EnterMonitor(); //void enterMonitor (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void ExitMonitor(); //void exitMonitor (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void RevokeEvents(IntPtr owner); //[noscript] void revokeEvents (in voidPtr owner); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + IntPtr GetPLEventQueue(); //[noscript] PLEventQueuePtr getPLEventQueue (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + Int32 IsQueueNative(); //boolean isQueueNative (); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + void StopAcceptingEvents(); //void stopAcceptingEvents (); + } + + public const UInt32 VBOX_XPCOMC_VERSION = 0x00020000U; + [DllImport("/usr/lib/virtualbox/VBoxXPCOMC.so")] + public static extern IntPtr VBoxGetXPCOMCFunctions(UInt32 uVersion); + + private VBOXXPCOMC FunctionTable; + public IVirtualBox VirtualBox { get; private set; } + public ISession Session { get; private set; } + public nsIEventQueue EventQueue { get; private set; } + + //[STAThread] + public VBoxXPCOM() { + IntPtr ftptr = VBoxGetXPCOMCFunctions(VBOX_XPCOMC_VERSION); + //Console.WriteLine("Function table={0}", ftptr); + + FunctionTable = (VBOXXPCOMC)Marshal.PtrToStructure(ftptr, typeof(VBOXXPCOMC)); + //Console.WriteLine("Version {0}={1}={2}", VBOX_XPCOMC_VERSION, FunctionTable.uVersion, FunctionTable.uEndVersion); + //Console.WriteLine("Version {0}", FunctionTable.pfnGetVersion()); + + IntPtr vbptr, sessptr, eqptr; + FunctionTable.pfnComInitialize("D2DE270C-1D4B-4C9E-843F-BBB9B47269FF", out vbptr, "12F4DCDB-12B2-4EC1-B7CD-DDD9F6C5BF4D", out sessptr); + FunctionTable.pfnGetEventQueue(out eqptr); + //Console.WriteLine("VirtualBox={0} Session={1} EventQueue={2}", vbptr, sessptr, eqptr); + + VirtualBox = (IVirtualBox)Marshal.GetObjectForIUnknown(vbptr); + Session = (ISession)Marshal.GetObjectForIUnknown(sessptr); + EventQueue = (nsIEventQueue)Marshal.GetObjectForIUnknown(eqptr); + } + ~VBoxXPCOM() { + VirtualBox = null; + Session = null; + EventQueue = null; + GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); + FunctionTable.pfnComUninitialize(); + } + } +} \ No newline at end of file