[Telepathy-commits] [telepathy-salut/master] SalutXmppConnectionManager: connect to TpSvcConnection::status-changed and close streams
Alban Crequy
alban.crequy at collabora.co.uk
Thu Oct 23 07:30:39 PDT 2008
---
src/salut-xmpp-connection-manager.c | 77 ++++++++++++++++++++++++++++------
1 files changed, 63 insertions(+), 14 deletions(-)
diff --git a/src/salut-xmpp-connection-manager.c b/src/salut-xmpp-connection-manager.c
index 10371f3..e65fb37 100644
--- a/src/salut-xmpp-connection-manager.c
+++ b/src/salut-xmpp-connection-manager.c
@@ -102,6 +102,7 @@ struct _SalutXmppConnectionManagerPrivate
* be allowed to request a new connection with the contact */
/* GibberXmppConnection * -> SalutContact */
GHashTable *connections_waiting_close;
+ gulong status_changed_id;
gboolean dispose_has_run;
};
@@ -850,18 +851,12 @@ disconnect_signals_foreach (gpointer key,
0, 0, NULL, NULL, self);
}
-void
-salut_xmpp_connection_manager_dispose (GObject *object)
+static void
+salut_xmpp_manager_close_all (SalutXmppConnectionManager *self)
{
- SalutXmppConnectionManager *self = SALUT_XMPP_CONNECTION_MANAGER (object);
SalutXmppConnectionManagerPrivate *priv =
SALUT_XMPP_CONNECTION_MANAGER_GET_PRIVATE (self);
- if (priv->dispose_has_run)
- return;
-
- priv->dispose_has_run = TRUE;
-
/* Disconnect signals from all connections */
g_hash_table_foreach (priv->connections, disconnect_signals_foreach, self);
g_hash_table_foreach (priv->incoming_pending_connections,
@@ -899,12 +894,6 @@ salut_xmpp_connection_manager_dispose (GObject *object)
priv->outgoing_pending_connections = NULL;
}
- if (priv->stanza_filters != NULL)
- {
- g_hash_table_destroy (priv->stanza_filters);
- priv->stanza_filters = NULL;
- }
-
if (priv->connection_timers != NULL)
{
g_hash_table_destroy (priv->connection_timers);
@@ -926,6 +915,65 @@ salut_xmpp_connection_manager_dispose (GObject *object)
free_stanza_filters_list (priv->all_connection_filters);
priv->all_connection_filters = NULL;
+ if (priv->status_changed_id != 0)
+ {
+ g_signal_handler_disconnect (priv->connection, priv->status_changed_id);
+ priv->status_changed_id = 0;
+ }
+}
+
+static void
+connection_status_changed_cb (SalutConnection *conn,
+ guint status,
+ guint reason,
+ SalutXmppConnectionManager *self)
+{
+ if (status == TP_CONNECTION_STATUS_DISCONNECTED)
+ {
+ salut_xmpp_manager_close_all (self);
+ }
+}
+
+static GObject *
+salut_xmpp_connection_manager_constructor (GType type,
+ guint n_props,
+ GObjectConstructParam *props)
+{
+ GObject *obj;
+ SalutXmppConnectionManager *self;
+ SalutXmppConnectionManagerPrivate *priv;
+
+ obj = G_OBJECT_CLASS (salut_xmpp_connection_manager_parent_class)->
+ constructor (type, n_props, props);
+
+ self = SALUT_XMPP_CONNECTION_MANAGER (obj);
+ priv = SALUT_XMPP_CONNECTION_MANAGER_GET_PRIVATE (self);
+
+ priv->status_changed_id = g_signal_connect (priv->connection,
+ "status-changed", (GCallback) connection_status_changed_cb, self);
+
+ return obj;
+}
+
+void
+salut_xmpp_connection_manager_dispose (GObject *object)
+{
+ SalutXmppConnectionManager *self = SALUT_XMPP_CONNECTION_MANAGER (object);
+ SalutXmppConnectionManagerPrivate *priv =
+ SALUT_XMPP_CONNECTION_MANAGER_GET_PRIVATE (self);
+
+ if (priv->dispose_has_run)
+ return;
+
+ priv->dispose_has_run = TRUE;
+
+ if (priv->stanza_filters != NULL)
+ {
+ g_hash_table_destroy (priv->stanza_filters);
+ priv->stanza_filters = NULL;
+ }
+
+
if (G_OBJECT_CLASS (salut_xmpp_connection_manager_parent_class)->dispose)
G_OBJECT_CLASS (salut_xmpp_connection_manager_parent_class)->dispose (
object);
@@ -991,6 +1039,7 @@ salut_xmpp_connection_manager_class_init (
g_type_class_add_private (salut_xmpp_connection_manager_class,
sizeof (SalutXmppConnectionManagerPrivate));
+ object_class->constructor = salut_xmpp_connection_manager_constructor;
object_class->dispose = salut_xmpp_connection_manager_dispose;
object_class->get_property = salut_xmpp_connection_manager_get_property;
--
1.5.6.5
More information about the Telepathy-commits
mailing list