diff options
author | Vincent Untz <vuntz@gnome.org> | 2011-10-17 20:02:16 +0200 |
---|---|---|
committer | Ross Burton <ross@linux.intel.com> | 2011-10-23 21:08:36 +0100 |
commit | dc7e44d0a7a9f34d491ce4629c89cb4b37b7bcca (patch) | |
tree | 61f3aa12534dabfa0d937cabb098bfa173056b87 | |
parent | 54318ebf218743ea1a3353f940eb8f44767fd2bb (diff) | |
download | gconf-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.c | 1 | ||||
-rw-r--r-- | gconf/gconf-dbus-utils.h | 1 | ||||
-rw-r--r-- | gconf/gconf-dbus.c | 42 | ||||
-rw-r--r-- | gconf/gconfd-dbus.c | 16 | ||||
-rw-r--r-- | gconf/gconfd-dbus.h | 2 |
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 |