Ivo@0: using System; Ivo@0: using System.Runtime.InteropServices; Ivo@0: using System.Runtime.CompilerServices; Ivo@0: using VirtualBox; Ivo@0: Ivo@0: namespace ConsoleApplication1 { Ivo@0: public class VBoxEventArgs : EventArgs { Ivo@0: public IEvent Event { get; private set; } Ivo@0: public VBoxEventArgs(IEvent e) { Ivo@0: Event = e; Ivo@0: } Ivo@0: } Ivo@0: Ivo@0: [ClassInterface(ClassInterfaceType.None)] Ivo@0: [TypeLibType(TypeLibTypeFlags.FCanCreate)] Ivo@0: [ComVisible(true)] Ivo@0: public class VBoxEventListener : IEventListener { Ivo@0: [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] Ivo@0: [Guid("9b6e1aee-35f3-4f4d-b5bb-ed0ecefd8538")] Ivo@0: [ComImport()] Ivo@0: interface IEventSourceXPCOM { Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: [return: MarshalAs(UnmanagedType.Interface)] Ivo@0: IEventListener CreateListener(); Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: [return: MarshalAs(UnmanagedType.Interface)] Ivo@0: IEventSource CreateAggregator([MarshalAs(UnmanagedType.SafeArray)] ref System.Array psubordinates); Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: void RegisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, UInt32 pinterestinglen, IntPtr pinteresting, Int32 pactive); Ivo@0: //void RegisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, UInt32 pinterestinglen, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] VBoxEventType[] pinteresting, Int32 pactive); Ivo@0: Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: void UnregisterListener([MarshalAs(UnmanagedType.Interface)] IEventListener plistener); Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: Int32 FireEvent([MarshalAs(UnmanagedType.Interface)] IEvent pevent, Int32 ptimeout); Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: [return: MarshalAs(UnmanagedType.Interface)] Ivo@0: IEvent GetEvent([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, Int32 ptimeout); Ivo@0: [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] Ivo@0: void EventProcessed([MarshalAs(UnmanagedType.Interface)] IEventListener plistener, [MarshalAs(UnmanagedType.Interface)] IEvent pevent); Ivo@0: } Ivo@0: Ivo@0: public EventHandler HandleEvent; Ivo@0: void IEventListener.HandleEvent(IEvent aEvent) { Ivo@0: Console.WriteLine("Event: {0}", aEvent.Type); Ivo@0: if (HandleEvent != null) HandleEvent(this, new VBoxEventArgs(aEvent)); Ivo@0: } Ivo@0: Ivo@0: public void RegisterSource(IEventSource src, params VBoxEventType[] events) { Ivo@0: if (Environment.OSVersion.Platform == PlatformID.Win32NT || Environment.OSVersion.Platform == PlatformID.WinCE) { Ivo@0: Array eventTypesArray = (Array)events; Ivo@0: src.RegisterListener(this, ref eventTypesArray, 1); Ivo@0: } else { Ivo@0: unsafe { Ivo@0: fixed (VBoxEventType* ptr = events) { Ivo@0: ((IEventSourceXPCOM)src).RegisterListener(this, (uint)events.Length, (IntPtr)ptr, 1); Ivo@0: } Ivo@0: } Ivo@0: } Ivo@0: } Ivo@0: Ivo@0: public void UnregisterSource(IEventSource src) { Ivo@0: src.UnregisterListener(this); Ivo@0: } Ivo@0: } Ivo@0: }