summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Untz <vuntz@gnome.org>2011-10-17 20:02:16 +0200
committerRoss Burton <ross@linux.intel.com>2011-10-23 21:08:36 +0100
commitdc7e44d0a7a9f34d491ce4629c89cb4b37b7bcca (patch)
tree61f3aa12534dabfa0d937cabb098bfa173056b87
parent54318ebf218743ea1a3353f940eb8f44767fd2bb (diff)
downloadgconf-dc7e44d0a7a9f34d491ce4629c89cb4b37b7bcca.tar.gz
gconf-dbus: Emit a Bye dbus signal when dropping a database
This enables clients to know the database got dropped, and to stop referencing the object path of this database. The clients will eventually cause the re-creation of this database when they'll need it. https://bugzilla.gnome.org/show_bug.cgi?id=659835
-rw-r--r--gconf/gconf-database-dbus.c1
-rw-r--r--gconf/gconf-dbus-utils.h1
-rw-r--r--gconf/gconf-dbus.c42
-rw-r--r--gconf/gconfd-dbus.c16
-rw-r--r--gconf/gconfd-dbus.h2
5 files changed, 62 insertions, 0 deletions
diff --git a/gconf/gconf-database-dbus.c b/gconf/gconf-database-dbus.c
index ea3b5531..1ba705bd 100644
--- a/gconf/gconf-database-dbus.c
+++ b/gconf/gconf-database-dbus.c
@@ -873,6 +873,7 @@ gconf_database_dbus_teardown (GConfDatabase *db)
conn = gconfd_dbus_get_connection ();
+ gconfd_emit_db_gone (db->object_path);
dbus_connection_unregister_object_path (conn, db->object_path);
dbus_connection_remove_filter (conn,
diff --git a/gconf/gconf-dbus-utils.h b/gconf/gconf-dbus-utils.h
index deeab870..8d16a515 100644
--- a/gconf/gconf-dbus-utils.h
+++ b/gconf/gconf-dbus-utils.h
@@ -35,6 +35,7 @@
#define GCONF_DBUS_SERVER_GET_DEFAULT_DB "GetDefaultDatabase"
#define GCONF_DBUS_SERVER_GET_DB "GetDatabase"
#define GCONF_DBUS_SERVER_SHUTDOWN "Shutdown"
+#define GCONF_DBUS_SERVER_BYE_SIGNAL "Bye"
#define GCONF_DBUS_DATABASE_LOOKUP "Lookup"
#define GCONF_DBUS_DATABASE_LOOKUP_EXTENDED "LookupExtended"
diff --git a/gconf/gconf-dbus.c b/gconf/gconf-dbus.c
index 335bc229..8845ed9d 100644
--- a/gconf/gconf-dbus.c
+++ b/gconf/gconf-dbus.c
@@ -46,6 +46,8 @@
"type='method_call',interface='org.gnome.GConf.Database',member='Notify'"
#define DAEMON_DISCONNECTED_RULE \
"type='signal',member='Disconnected'"
+#define BYE_RULE \
+ "type='signal',interface='org.gnome.GConf.Server',member='Bye'"
struct _GConfEngine {
guint refcount;
@@ -416,6 +418,7 @@ ensure_dbus_connection (void)
dbus_bus_add_match (global_conn, DAEMON_NAME_OWNER_CHANGED_RULE, NULL);
dbus_bus_add_match (global_conn, NOTIFY_RULE, NULL);
+ dbus_bus_add_match (global_conn, BYE_RULE, NULL);
dbus_bus_add_match (global_conn, DAEMON_DISCONNECTED_RULE, NULL);
dbus_connection_add_filter (global_conn, gconf_dbus_message_filter,
@@ -2314,6 +2317,45 @@ gconf_dbus_message_filter (DBusConnection *dbus_conn,
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
+ else if (dbus_message_is_signal (message,
+ GCONF_DBUS_SERVER_INTERFACE,
+ "Bye"))
+ {
+ char *db;
+ GConfEngine *conf;
+
+ dbus_message_get_args (message,
+ NULL,
+ DBUS_TYPE_OBJECT_PATH, &db,
+ DBUS_TYPE_INVALID);
+
+ conf = lookup_engine_by_database (db);
+ if (conf != NULL)
+ {
+ g_hash_table_remove (engines_by_db, db);
+
+ if (g_hash_table_size (conf->notify_ids) > 0)
+ {
+ GList *cnxns, *l;
+
+ cnxns = NULL;
+ g_hash_table_foreach (conf->notify_ids,
+ cnxn_get_all_func,
+ &cnxns);
+
+ for (l = cnxns; l; l = l->next)
+ {
+ GConfCnxn *cnxn = l->data;
+
+ send_notify_add (conf, cnxn, NULL);
+ }
+
+ g_list_free (cnxns);
+ }
+ }
+
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
diff --git a/gconf/gconfd-dbus.c b/gconf/gconfd-dbus.c
index 6f42ef57..ed2f3caa 100644
--- a/gconf/gconfd-dbus.c
+++ b/gconf/gconfd-dbus.c
@@ -390,3 +390,19 @@ gconfd_dbus_get_connection (void)
return bus_conn;
}
+void
+gconfd_emit_db_gone (const char *object_path)
+{
+ DBusMessage *signal;
+
+ signal = dbus_message_new_signal (server_path,
+ GCONF_DBUS_SERVER_INTERFACE,
+ GCONF_DBUS_SERVER_BYE_SIGNAL);
+
+ dbus_message_append_args (signal,
+ DBUS_TYPE_OBJECT_PATH, &object_path,
+ DBUS_TYPE_INVALID);
+
+ dbus_connection_send (bus_conn, signal, NULL);
+ dbus_message_unref (signal);
+}
diff --git a/gconf/gconfd-dbus.h b/gconf/gconfd-dbus.h
index 40695abd..f2e266dd 100644
--- a/gconf/gconfd-dbus.h
+++ b/gconf/gconfd-dbus.h
@@ -39,4 +39,6 @@ gboolean gconfd_dbus_check_in_shutdown (DBusConnection *connection,
DBusMessage *message);
DBusConnection *gconfd_dbus_get_connection (void);
+void gconfd_emit_db_gone (const char *object_path);
+
#endif