summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--mono/Handler.cs43
-rw-r--r--mono/Service.cs7
3 files changed, 49 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 30c958ff..a5fa0b8a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
{