diff options
author | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-07 15:32:51 +0100 |
---|---|---|
committer | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-07 15:32:51 +0100 |
commit | 069d069e6dde75dc42da3245acae82baa181d9f0 (patch) | |
tree | c55ef70789b21505aff69d185cb3bd5fa820c6bf | |
parent | a431c890b1546ce29be507374c2333309faa3467 (diff) |
Quit correctly on dbus disconnections
-rw-r--r-- | src/main.c | 15 | ||||
-rw-r--r-- | src/tidbit-dbus.c | 17 | ||||
-rw-r--r-- | src/tidbit-dbus.h | 3 |
3 files changed, 21 insertions, 14 deletions
@@ -22,6 +22,7 @@ #include "tidbit-database-http.h" #include "tidbit-database-mem.h" #include "tidbit-database-dbus.h" +#include "tidbit-database-sqlite.h" #include "tidbit-database.h" #include "tidbit-record.h" #include "tidbit-key.h" @@ -65,20 +66,19 @@ int main(int argc, char* argv[]) if (!g_thread_supported ()) g_thread_init (NULL); - dbus_g_thread_init (); - GMainLoop *loop = g_main_loop_new (NULL, FALSE); + GMainLoop *loop = g_main_loop_new (NULL, TRUE); PtrTidbitDatabase database; if (enable_http || enable_dbus) database = tidbit_database_mem_new (); else - database = tidbit_database_http_new (); + database = tidbit_database_dbus_new (); if (enable_http) tidbit_http_setup (database); if (enable_dbus) - tidbit_dbus_setup (database); + tidbit_dbus_setup (database, loop); @@ -112,11 +112,8 @@ int main(int argc, char* argv[]) tidbit_query_unref (query); tidbit_guid_set_unref (guid_set); - - - - - g_main_loop_run (loop); + g_main_loop_unref (loop); + return 0; } diff --git a/src/tidbit-dbus.c b/src/tidbit-dbus.c index b2186b0..51e74a8 100644 --- a/src/tidbit-dbus.c +++ b/src/tidbit-dbus.c @@ -31,10 +31,9 @@ tidbit_dbus_finalize (GObject *object) { G_OBJECT_CLASS (tidbit_dbus_parent_class)->finalize (object); TidbitDbus *tidbit_dbus = TIDBIT_DBUS (object); - tidbit_database_unref (tidbit_dbus->database); + tidbit_database_unref(tidbit_dbus->database); } - static void tidbit_dbus_class_init (TidbitDbusClass *klass) { @@ -50,7 +49,12 @@ tidbit_dbus_init (TidbitDbus *object) tidbit_dbus->database = NULL; } -void tidbit_dbus_setup (PtrTidbitDatabase database) +static void on_disconnect_cb (DBusGProxy *proxy, GMainLoop *loop) +{ + g_main_loop_quit (loop); +} + +void tidbit_dbus_setup (PtrTidbitDatabase database, GMainLoop *loop) { guint result; GError *error = NULL; @@ -58,15 +62,19 @@ void tidbit_dbus_setup (PtrTidbitDatabase database) DBusGProxy *proxy; GObject *object; + dbus_g_thread_init (); connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); proxy = dbus_g_proxy_new_for_name (connection, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS); + dbus_connection_set_exit_on_disconnect (dbus_g_connection_get_connection (connection), FALSE); org_freedesktop_DBus_request_name (proxy, DBUS_TIDBIT, DBUS_NAME_FLAG_DO_NOT_QUEUE, &result, &error); - + g_signal_connect (G_OBJECT (proxy), "destroy", G_CALLBACK (on_disconnect_cb), loop); + object = g_object_new (TYPE_TIDBIT_DBUS, NULL); TidbitDbus *tidbit_dbus = TIDBIT_DBUS (object); dbus_g_object_type_install_info (TYPE_TIDBIT_DBUS, &dbus_glib_tidbit_dbus_object_info); dbus_g_connection_register_g_object (connection, DBUS_TIDBIT_PATH, object); tidbit_dbus->database = database; + tidbit_dbus->proxy = proxy; tidbit_database_ref(database); } @@ -90,6 +98,7 @@ gboolean tidbit_dbus_fetch (TidbitDbus *object, gchar *signature, gchar **reply_ *reply_record = g_strdup(record->raw); tidbit_record_unref (record); } + g_object_unref (tidbit_dbus->proxy); return TRUE; } diff --git a/src/tidbit-dbus.h b/src/tidbit-dbus.h index bc848d0..1e9aec4 100644 --- a/src/tidbit-dbus.h +++ b/src/tidbit-dbus.h @@ -44,6 +44,7 @@ typedef struct _TidbitDbusClass TidbitDbusClass; struct _TidbitDbus { GObject parent; PtrTidbitDatabase database; + DBusGProxy *proxy; }; struct _TidbitDbusClass { @@ -57,7 +58,7 @@ gboolean tidbit_dbus_query (TidbitDbus *object, gchar *table_name, GPtrArray *el TidbitDbus *tidbit_dbus_new (void); GType tidbit_dbus_get_type (void); -void tidbit_dbus_setup (PtrTidbitDatabase database); +void tidbit_dbus_setup (PtrTidbitDatabase database, GMainLoop *loop); G_END_DECLS |