diff --git a/daemon/src/dbus/instance-introspec.xml b/daemon/src/dbus/instance-introspec.xml index ad343b217d058add616f04bddb94fc6be10ba60b..f564d54cc1ed7bb941af0b35fb063928cd2a9f88 100644 --- a/daemon/src/dbus/instance-introspec.xml +++ b/daemon/src/dbus/instance-introspec.xml @@ -2,12 +2,32 @@ <node name="/instance-introspec" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> <interface name="org.sflphone.SFLphone.Instance"> <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> - <p></p> + <p>Count the number of clients actually registered to the core. When initializing your client, you need to register it against the core by using this interface.</p> </tp:docstring> - <method name="Quit" tp:name-for-bindings="Quit"> + <method name="Register" tp:name-for-bindings="Register"> <tp:docstring> - Properly quits the core. - </tp:docstring> + Register a new client to the core. Increments the registration count. + </tp:docstring> + <arg type="i" name="pid" direction="in"> + <tp:docstring> + The pid of the client process + </tp:docstring> + </arg> + <arg type="s" name="name" direction="in"> + <tp:docstring> + The name of the client + </tp:docstring> + </arg> + </method> + <method name="Unregister" tp:name-for-bindings="Unregister"> + <tp:docstring> + Unregister a connected client from the core. Decrements the registration count. If no more clients are connected, ie the registration count equals 0, the core properly quits. + </tp:docstring> + <arg type="i" name="pid" direction="in"> + <tp:docstring> + The pid of the client process + </tp:docstring> + </arg> </method> </interface> </node> diff --git a/daemon/src/dbus/instance.cpp b/daemon/src/dbus/instance.cpp index 8f45db1dbe01d5a1f485194d434b6418e24cc0b3..266b1b86cf97309032bd2a0ee10e7b4b343cd3ed 100644 --- a/daemon/src/dbus/instance.cpp +++ b/daemon/src/dbus/instance.cpp @@ -34,11 +34,24 @@ Instance::Instance (DBus::Connection& connection) : DBus::ObjectAdaptor (connection, "/org/sflphone/SFLphone/Instance") { + count = 0; } void -Instance::Quit(void) +Instance::Register (const int32_t& pid UNUSED, + const std::string& name UNUSED) { - Manager::instance().terminate(); - Manager::instance().getDbusManager()->exit(); + count++; +} + + +void +Instance::Unregister (const int32_t& pid UNUSED) +{ + count --; + + if (count <= 0) { + Manager::instance().terminate(); + Manager::instance().getDbusManager()->exit(); + } } diff --git a/daemon/src/dbus/instance.h b/daemon/src/dbus/instance.h index 7bed4504b959812587716ab754b4198df8a193f6..0258d7fdcd8f16be390979a524f83350bbe0a57c 100644 --- a/daemon/src/dbus/instance.h +++ b/daemon/src/dbus/instance.h @@ -52,10 +52,16 @@ class Instance public DBus::IntrospectableAdaptor, public DBus::ObjectAdaptor { + private: + int count; + public: Instance (DBus::Connection& connection); + static const char* SERVER_PATH; - void Quit(void); + void Register (const int32_t& pid, const std::string& name); + void Unregister (const int32_t& pid); + int32_t getRegistrationCount (void); }; diff --git a/gnome/src/actions.c b/gnome/src/actions.c index e84346e4dbd96a642c37e798ed9f0fcc8b7f595d..84e3bb0a36cfc631135eda6f0505bc3c046bf4a5 100644 --- a/gnome/src/actions.c +++ b/gnome/src/actions.c @@ -184,7 +184,7 @@ sflphone_quit () // Save the history sflphone_save_history (); - dbus_quit(); + dbus_unregister (getpid()); dbus_clean (); calllist_clean (current_calls); calllist_clean (contacts); @@ -315,7 +315,7 @@ void sflphone_fill_account_list (void) gboolean sflphone_init (GError **error) { - if (!dbus_connect (error)) + if (!dbus_connect (error) || !dbus_register (getpid (), "Gtk+ Client", error)) return FALSE; abook_init(); diff --git a/gnome/src/dbus/dbus.c b/gnome/src/dbus/dbus.c index ff6356868b94ee4187699a532a4597bd7a6edcbb..0873e07ded24502c922acb5dfda93a1f78828e6c 100644 --- a/gnome/src/dbus/dbus.c +++ b/gnome/src/dbus/dbus.c @@ -1098,12 +1098,18 @@ dbus_start_tone (const int start, const guint type) } } +gboolean +dbus_register (int pid, gchar *name, GError **error) +{ + return org_sflphone_SFLphone_Instance_register (instanceProxy, pid, name, error); +} + void -dbus_quit(void) +dbus_unregister (int pid) { GError *error = NULL; - org_sflphone_SFLphone_Instance_quit(instanceProxy, &error); + org_sflphone_SFLphone_Instance_unregister (instanceProxy, pid, &error); if (error) { ERROR ("Failed to call unregister() on instanceProxy: %s", diff --git a/gnome/src/dbus/dbus.h b/gnome/src/dbus/dbus.h index 157e4ae8d338eeb4616d30b3dc9a731700197c1c..1eaebc4edec4a78a1925ec183367bd05fd77580b 100644 --- a/gnome/src/dbus/dbus.h +++ b/gnome/src/dbus/dbus.h @@ -359,10 +359,20 @@ void dbus_set_audio_manager (const gchar *api); */ void dbus_start_tone (const int start , const guint type); +/** + * Instance - Send registration request to dbus service. + * Manage the instances of clients connected to the server + * @param pid The pid of the processus client + * @param name The string description of the client. Here : GTK+ Client + * @param error return location for a GError or NULL + */ +gboolean dbus_register (int pid, gchar * name, GError **error); + /** * Instance - Send unregistration request to dbus services + * @param pid The pid of the processus */ -void dbus_quit(void); +void dbus_unregister (int pid); void dbus_set_sip_address (const gchar* address); diff --git a/gnome/src/dbus/instance-introspec.xml b/gnome/src/dbus/instance-introspec.xml index ad343b217d058add616f04bddb94fc6be10ba60b..f564d54cc1ed7bb941af0b35fb063928cd2a9f88 100644 --- a/gnome/src/dbus/instance-introspec.xml +++ b/gnome/src/dbus/instance-introspec.xml @@ -2,12 +2,32 @@ <node name="/instance-introspec" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> <interface name="org.sflphone.SFLphone.Instance"> <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> - <p></p> + <p>Count the number of clients actually registered to the core. When initializing your client, you need to register it against the core by using this interface.</p> </tp:docstring> - <method name="Quit" tp:name-for-bindings="Quit"> + <method name="Register" tp:name-for-bindings="Register"> <tp:docstring> - Properly quits the core. - </tp:docstring> + Register a new client to the core. Increments the registration count. + </tp:docstring> + <arg type="i" name="pid" direction="in"> + <tp:docstring> + The pid of the client process + </tp:docstring> + </arg> + <arg type="s" name="name" direction="in"> + <tp:docstring> + The name of the client + </tp:docstring> + </arg> + </method> + <method name="Unregister" tp:name-for-bindings="Unregister"> + <tp:docstring> + Unregister a connected client from the core. Decrements the registration count. If no more clients are connected, ie the registration count equals 0, the core properly quits. + </tp:docstring> + <arg type="i" name="pid" direction="in"> + <tp:docstring> + The pid of the client process + </tp:docstring> + </arg> </method> </interface> </node>