[telepathy-salut/master] connection: if presence is set before connected, save and set after connecting
Jonny Lamb
jonny.lamb at collabora.co.uk
Tue Sep 8 11:22:08 PDT 2009
Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
src/salut-connection.c | 78 +++++++++++++++++++++++++++++++++++------------
1 files changed, 58 insertions(+), 20 deletions(-)
diff --git a/src/salut-connection.c b/src/salut-connection.c
index 418e3c6..40aad29 100644
--- a/src/salut-connection.c
+++ b/src/salut-connection.c
@@ -184,6 +184,8 @@ struct _SalutConnectionPrivate
/* TpHandler for our presence on the lan */
SalutSelf *self;
+ SalutPresenceId pre_connect_presence;
+ gchar *pre_connect_message;
/* XMPP connection manager */
SalutXmppConnectionManager *xmpp_connection_manager;
@@ -293,6 +295,9 @@ salut_connection_init (SalutConnection *obj)
priv->discovery_client = NULL;
priv->self = NULL;
+ priv->pre_connect_presence = SALUT_PRESENCE_AVAILABLE;
+ priv->pre_connect_message = NULL;
+
priv->contact_manager = NULL;
priv->xmpp_connection_manager = NULL;
}
@@ -566,15 +571,42 @@ get_contact_statuses (GObject *obj,
return ret;
}
+static void
+set_self_presence (SalutConnection *self,
+ SalutPresenceId presence,
+ const gchar *message,
+ GError **error)
+{
+ SalutConnectionPrivate *priv = SALUT_CONNECTION_GET_PRIVATE (self);
+ TpBaseConnection *base = TP_BASE_CONNECTION (self);
+
+ if (priv->self == NULL)
+ {
+ priv->pre_connect_presence = presence;
+ priv->pre_connect_message = g_strdup (message);
+ return;
+ }
+
+ if (salut_self_set_presence (priv->self, presence, message, error))
+ {
+ TpPresenceStatus ps = { priv->self->status,
+ make_presence_opt_args (priv->self->status,
+ priv->self->status_message) };
+
+ tp_presence_mixin_emit_one_presence_update ((GObject *) self,
+ base->self_handle, &ps);
+
+ if (ps.optional_arguments != NULL)
+ g_hash_table_destroy (ps.optional_arguments);
+ }
+}
+
static gboolean
set_own_status (GObject *obj,
const TpPresenceStatus *status,
GError **error)
{
SalutConnection *self = SALUT_CONNECTION (obj);
- SalutConnectionPrivate *priv = SALUT_CONNECTION_GET_PRIVATE (self);
- TpBaseConnection *base = (TpBaseConnection *) self;
- gboolean ret;
GError *err = NULL;
const GValue *value;
const gchar *message = NULL;
@@ -602,25 +634,12 @@ set_own_status (GObject *obj,
}
}
- ret = salut_self_set_presence (priv->self, presence, message, &err);
+ set_self_presence (self, presence, message, &err);
- if (ret)
+ if (err != NULL)
{
- TpPresenceStatus ps = { priv->self->status,
- make_presence_opt_args (priv->self->status,
- priv->self->status_message) };
-
- tp_presence_mixin_emit_one_presence_update ((GObject *) self,
- base->self_handle, &ps);
-
- if (ps.optional_arguments != NULL)
- g_hash_table_destroy (ps.optional_arguments);
- }
- else
- {
- if (error != NULL)
- *error = g_error_new_literal (TP_ERRORS, TP_ERROR_NETWORK_ERROR,
- err->message);
+ *error = g_error_new_literal (TP_ERRORS, TP_ERROR_NETWORK_ERROR,
+ err->message);
}
return TRUE;
@@ -835,6 +854,12 @@ salut_connection_dispose (GObject *object)
self->presence_cache = NULL;
}
+ if (priv->pre_connect_message != NULL)
+ {
+ g_free (priv->pre_connect_message);
+ priv->pre_connect_message = NULL;
+ }
+
if (priv->self) {
g_object_unref (priv->self);
priv->self = NULL;
@@ -946,12 +971,25 @@ _self_established_cb (SalutSelf *s, gpointer data)
TpBaseConnection *base = TP_BASE_CONNECTION (self);
TpHandleRepoIface *handle_repo = tp_base_connection_get_handles (
TP_BASE_CONNECTION (self), TP_HANDLE_TYPE_CONTACT);
+ GError *error = NULL;
g_free (self->name);
self->name = g_strdup (s->name);
base->self_handle = tp_handle_ensure (handle_repo, self->name, NULL, NULL);
+ set_self_presence (self, priv->pre_connect_presence,
+ priv->pre_connect_message, &error);
+
+ if (error != NULL)
+ {
+ DEBUG ("Failed to set presence from pre-connection: %s", error->message);
+ g_clear_error (&error);
+ }
+
+ g_free (priv->pre_connect_message);
+ priv->pre_connect_message = NULL;
+
if (!salut_contact_manager_start (priv->contact_manager, NULL))
{
tp_base_connection_change_status ( TP_BASE_CONNECTION (base),
--
1.5.6.5
More information about the telepathy-commits
mailing list