[Telepathy-commits] [telepathy-gabble/master] GabbleRoster: use status-changed signal instead of connecting, connected, disconnected
Simon McVittie
simon.mcvittie at collabora.co.uk
Tue Aug 19 10:54:18 PDT 2008
20080728161945-53eee-a558db9a45e9ffb4eb3bacd27c39fd7ef6021e03.gz
---
src/roster.c | 136 ++++++++++++++++++++++++++++-----------------------------
1 files changed, 67 insertions(+), 69 deletions(-)
diff --git a/src/roster.c b/src/roster.c
index 0d35db3..9e910dd 100644
--- a/src/roster.c
+++ b/src/roster.c
@@ -185,20 +185,6 @@ gabble_roster_init (GabbleRoster *obj)
NULL, (GDestroyNotify) _gabble_roster_item_free);
}
-static GObject *
-gabble_roster_constructor (GType type, guint n_props,
- GObjectConstructParam *props)
-{
- GObject *obj;
- /* GabbleRosterPrivate *priv; */
-
- obj = G_OBJECT_CLASS (gabble_roster_parent_class)->
- constructor (type, n_props, props);
- /* priv = GABBLE_ROSTER_GET_PRIVATE (GABBLE_ROSTER (obj)); */
-
- return obj;
-}
-
void
gabble_roster_dispose (GObject *object)
{
@@ -1605,72 +1591,87 @@ gabble_roster_factory_iface_close_all (TpChannelFactoryIface *iface)
}
}
-static void
-gabble_roster_factory_iface_connecting (TpChannelFactoryIface *iface)
-{
- GabbleRoster *roster = GABBLE_ROSTER (iface);
- GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster);
-
- DEBUG ("adding callbacks");
-
- g_assert (priv->iq_cb == NULL);
- g_assert (priv->presence_cb == NULL);
-
- priv->iq_cb = lm_message_handler_new (gabble_roster_iq_cb,
- roster, NULL);
- lm_connection_register_message_handler (priv->conn->lmconn,
- priv->iq_cb,
- LM_MESSAGE_TYPE_IQ,
- LM_HANDLER_PRIORITY_NORMAL);
-
- priv->presence_cb = lm_message_handler_new (gabble_roster_presence_cb,
- roster, NULL);
- lm_connection_register_message_handler (priv->conn->lmconn,
- priv->presence_cb,
- LM_MESSAGE_TYPE_PRESENCE,
- LM_HANDLER_PRIORITY_LAST);
-}
static void
-gabble_roster_factory_iface_connected (TpChannelFactoryIface *iface)
+connection_status_changed_cb (GabbleConnection *conn,
+ guint status,
+ guint reason,
+ GabbleRoster *self)
{
- GabbleRoster *roster = GABBLE_ROSTER (iface);
- GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster);
- LmMessage *message;
+ switch (status)
+ {
+ case TP_CONNECTION_STATUS_CONNECTING:
+ DEBUG ("adding callbacks");
+ g_assert (self->priv->iq_cb == NULL);
+ g_assert (self->priv->presence_cb == NULL);
+
+ self->priv->iq_cb = lm_message_handler_new (gabble_roster_iq_cb,
+ self, NULL);
+ lm_connection_register_message_handler (self->priv->conn->lmconn,
+ self->priv->iq_cb, LM_MESSAGE_TYPE_IQ,
+ LM_HANDLER_PRIORITY_NORMAL);
+
+ self->priv->presence_cb = lm_message_handler_new (
+ gabble_roster_presence_cb, self, NULL);
+ lm_connection_register_message_handler (self->priv->conn->lmconn,
+ self->priv->presence_cb, LM_MESSAGE_TYPE_PRESENCE,
+ LM_HANDLER_PRIORITY_LAST);
- DEBUG ("requesting roster");
+ break;
- message = _gabble_roster_message_new (roster, LM_MESSAGE_SUB_TYPE_GET, NULL);
+ case TP_CONNECTION_STATUS_CONNECTED:
+ {
+ LmMessage *message;
- _gabble_connection_send (priv->conn, message, NULL);
+ DEBUG ("requesting roster");
- lm_message_unref (message);
-}
+ message = _gabble_roster_message_new (self, LM_MESSAGE_SUB_TYPE_GET,
+ NULL);
+ _gabble_connection_send (self->priv->conn, message, NULL);
+ lm_message_unref (message);
+ }
+ break;
-static void
-gabble_roster_factory_iface_disconnected (TpChannelFactoryIface *iface)
-{
- GabbleRoster *roster = GABBLE_ROSTER (iface);
- GabbleRosterPrivate *priv = GABBLE_ROSTER_GET_PRIVATE (roster);
+ case TP_CONNECTION_STATUS_DISCONNECTED:
+ /* this can be called before we have ever been CONNECTING, so we need
+ * to guard it */
+ if (self->priv->iq_cb != NULL)
+ {
+ DEBUG ("removing callbacks");
+ g_assert (self->priv->presence_cb != NULL);
+
+ lm_connection_unregister_message_handler (self->priv->conn->lmconn,
+ self->priv->iq_cb, LM_MESSAGE_TYPE_IQ);
+ lm_message_handler_unref (self->priv->iq_cb);
+ self->priv->iq_cb = NULL;
+
+ lm_connection_unregister_message_handler (self->priv->conn->lmconn,
+ self->priv->presence_cb, LM_MESSAGE_TYPE_PRESENCE);
+ lm_message_handler_unref (self->priv->presence_cb);
+ self->priv->presence_cb = NULL;
+ }
+ break;
+ }
+}
- DEBUG ("removing callbacks");
- g_assert (priv->iq_cb != NULL);
- g_assert (priv->presence_cb != NULL);
+static GObject *
+gabble_roster_constructor (GType type, guint n_props,
+ GObjectConstructParam *props)
+{
+ GObject *obj = G_OBJECT_CLASS (gabble_roster_parent_class)->
+ constructor (type, n_props, props);
+ GabbleRoster *self = GABBLE_ROSTER (obj);
- lm_connection_unregister_message_handler (priv->conn->lmconn,
- priv->iq_cb,
- LM_MESSAGE_TYPE_IQ);
- lm_message_handler_unref (priv->iq_cb);
- priv->iq_cb = NULL;
+ /* conn is guaranteed to live longer than the factory, so this
+ * never needs disconnecting */
+ g_signal_connect (self->priv->conn, "status-changed",
+ (GCallback) connection_status_changed_cb, obj);
- lm_connection_unregister_message_handler (priv->conn->lmconn,
- priv->presence_cb,
- LM_MESSAGE_TYPE_PRESENCE);
- lm_message_handler_unref (priv->presence_cb);
- priv->presence_cb = NULL;
+ return obj;
}
+
struct foreach_data {
TpChannelFunc func;
gpointer data;
@@ -1758,9 +1759,6 @@ gabble_roster_factory_iface_init (gpointer g_iface,
TpChannelFactoryIfaceClass *klass = (TpChannelFactoryIfaceClass *) g_iface;
klass->close_all = gabble_roster_factory_iface_close_all;
- klass->connecting = gabble_roster_factory_iface_connecting;
- klass->connected = gabble_roster_factory_iface_connected;
- klass->disconnected = gabble_roster_factory_iface_disconnected;
klass->foreach = gabble_roster_factory_iface_foreach;
klass->request = gabble_roster_factory_iface_request;
}
--
1.5.6.3
More information about the Telepathy-commits
mailing list