summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Brej <cbrej@cs.man.ac.uk>2010-08-07 15:32:51 +0100
committerCharlie Brej <cbrej@cs.man.ac.uk>2010-08-07 15:32:51 +0100
commit069d069e6dde75dc42da3245acae82baa181d9f0 (patch)
treec55ef70789b21505aff69d185cb3bd5fa820c6bf
parenta431c890b1546ce29be507374c2333309faa3467 (diff)
Quit correctly on dbus disconnections
-rw-r--r--src/main.c15
-rw-r--r--src/tidbit-dbus.c17
-rw-r--r--src/tidbit-dbus.h3
3 files changed, 21 insertions, 14 deletions
diff --git a/src/main.c b/src/main.c
index cd46d6f..3a65d0d 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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