diff options
Diffstat (limited to 'mono/Handler.cs')
-rw-r--r-- | mono/Handler.cs | 102 |
1 files changed, 18 insertions, 84 deletions
diff --git a/mono/Handler.cs b/mono/Handler.cs index 9696a4d3..87092f90 100644 --- a/mono/Handler.cs +++ b/mono/Handler.cs @@ -13,7 +13,7 @@ namespace DBus NeedMemory = 2 } - internal class Handler : IDisposable + internal class Handler { private string path = null; private Introspector introspector = null; @@ -21,70 +21,12 @@ namespace DBus private DBusObjectPathVTable vTable; private Connection connection; private Service service; - private bool disposed = false; - - internal delegate void DBusObjectPathUnregisterFunction(IntPtr rawConnection, - IntPtr userData); - - internal delegate int DBusObjectPathMessageFunction(IntPtr rawConnection, - IntPtr rawMessage, - IntPtr userData); - - [StructLayout (LayoutKind.Sequential)] - private struct DBusObjectPathVTable - { - public DBusObjectPathUnregisterFunction unregisterFunction; - public DBusObjectPathMessageFunction messageFunction; - public IntPtr padding1; - public IntPtr padding2; - public IntPtr padding3; - public IntPtr padding4; - - public DBusObjectPathVTable(DBusObjectPathUnregisterFunction unregisterFunction, - DBusObjectPathMessageFunction messageFunction) - { - this.unregisterFunction = unregisterFunction; - this.messageFunction = messageFunction; - this.padding1 = IntPtr.Zero; - this.padding2 = IntPtr.Zero; - this.padding3 = IntPtr.Zero; - this.padding4 = IntPtr.Zero; - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - private void Dispose(bool disposing) - { - if (!disposed) { - if (disposing) { - // Clean up managed resources - } - - service = null; - // Clean up unmanaged resources - if (Connection != null && Connection.RawConnection != IntPtr.Zero && Path != null) { - dbus_connection_unregister_object_path(Connection.RawConnection, - Path); - } - - connection = null; - introspector = null; - handledObject = null; - } - - disposed = true; - } - - ~Handler() - { - Dispose(false); - } + // We need to hold extra references to these callbacks so that they don't + // get garbage collected before they are called back into from unmanaged + // code. + private DBusObjectPathUnregisterFunction unregister_func; + private DBusObjectPathMessageFunction message_func; public Handler(object handledObject, string path, @@ -96,15 +38,11 @@ namespace DBus this.path = path; // Create the vTable and register the path - vTable = new DBusObjectPathVTable(new DBusObjectPathUnregisterFunction(Unregister_Called), - new DBusObjectPathMessageFunction(Message_Called)); - - if (!dbus_connection_register_object_path(Connection.RawConnection, - Path, - ref vTable, - IntPtr.Zero)) - throw new OutOfMemoryException(); + this.unregister_func = new DBusObjectPathUnregisterFunction (Unregister_Called); + this.message_func = new DBusObjectPathMessageFunction (Message_Called); + vTable = new DBusObjectPathVTable (this.unregister_func, this.message_func); + Connection.RegisterObjectPath (Path, vTable); RegisterSignalHandlers(); } @@ -131,8 +69,6 @@ namespace DBus set { this.handledObject = value; - object[] attributes; - // Register the methods this.introspector = Introspector.GetIntrospector(value.GetType()); } @@ -153,17 +89,22 @@ namespace DBus IntPtr userData) { Message message = Message.Wrap(rawMessage, Service); + Result res = Result.NotYetHandled; switch (message.Type) { + case Message.MessageType.MethodCall: + res = HandleMethod ((MethodCall) message); + break; + case Message.MessageType.Signal: // We're not interested in signals here because we're the ones // that generate them! break; - case Message.MessageType.MethodCall: - return (int) HandleMethod((MethodCall) message); } - return (int) Result.NotYetHandled; + message.Dispose (); + + return (int) res; } private Result HandleMethod(MethodCall methodCall) @@ -227,12 +168,5 @@ namespace DBus this.service = value; } } - - [DllImport ("dbus-1")] - private extern static bool dbus_connection_register_object_path (IntPtr rawConnection, string path, ref DBusObjectPathVTable vTable, IntPtr userData); - - [DllImport ("dbus-1")] - private extern static void dbus_connection_unregister_object_path (IntPtr rawConnection, string path); - } } |