Revert "Don't reference count DBus clients, exit core immediately when one of them request it"

It make more sense to keep it as it was. Un the case of a Dataengine, Canonical AppIndicator / KDE Plasmoid systray RFC, the daemon can run event if the client have not been openned or have been closed.

This reverts commit 66a2b8eede.
This commit is contained in:
Emmanuel Lepage
2011-09-27 15:30:09 -04:00
parent 66a2b8eede
commit 5f8faba840
7 changed files with 93 additions and 18 deletions

View File

@ -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>

View File

@ -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();
}
}

View File

@ -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);
};

View File

@ -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();

View File

@ -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",

View File

@ -360,9 +360,19 @@ void dbus_set_audio_manager (const gchar *api);
void dbus_start_tone (const int start , const guint type);
/**
* Instance - Send unregistration request to dbus services
* 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
*/
void dbus_quit(void);
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_unregister (int pid);
void dbus_set_sip_address (const gchar* address);

View File

@ -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>