diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | mono/Handler.cs | 43 | ||||
-rw-r--r-- | mono/Service.cs | 7 |
3 files changed, 49 insertions, 6 deletions
@@ -1,3 +1,8 @@ +2004-05-23 Owen Fraser-Green <owen@discobabe.net> + + * mono/Handler.cs, mono/Service.cs: Added UnregisterObject method + which unregisters the object path and disposes the handler. + 2004-05-23 Kristian Høgsberg <krh@redhat.com> Patch from Timo Teräs <ext-timo.teras@nokia.com> (#614): diff --git a/mono/Handler.cs b/mono/Handler.cs index 000a7886..ce3974b6 100644 --- a/mono/Handler.cs +++ b/mono/Handler.cs @@ -13,7 +13,7 @@ namespace DBus NeedMemory = 2 } - internal class Handler + internal class Handler : IDisposable { private string[] path = null; private string pathName = null; @@ -22,6 +22,7 @@ namespace DBus private DBusObjectPathVTable vTable; private Connection connection; private Service service; + private bool disposed = false; internal delegate void DBusObjectPathUnregisterFunction(IntPtr rawConnection, IntPtr userData); @@ -52,12 +53,38 @@ namespace DBus } } + 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() { - if (Connection != null && Connection.RawConnection != IntPtr.Zero && path != null) { - dbus_connection_unregister_object_path(Connection.RawConnection, - Path); - } + Dispose(false); } public Handler(object handledObject, @@ -119,7 +146,11 @@ namespace DBus public void Unregister_Called(IntPtr rawConnection, IntPtr userData) { - System.Console.WriteLine("FIXME: Unregister called."); + if (service != null) { + service.UnregisterObject(HandledObject); + } + + path = null; } private int Message_Called(IntPtr rawConnection, diff --git a/mono/Service.cs b/mono/Service.cs index 5dea3113..167cfc4c 100644 --- a/mono/Service.cs +++ b/mono/Service.cs @@ -73,6 +73,13 @@ namespace DBus } } + public void UnregisterObject(object handledObject) + { + Handler handler = (Handler) registeredHandlers[handledObject]; + registeredHandlers.Remove(handledObject); + handler.Dispose(); + } + public void RegisterObject(object handledObject, string pathName) { |