From d95a09bded20a2cccf0847f4663fd075536399ca Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 8 Jan 2013 12:31:43 +0100 Subject: [PATCH] tp-chat: prepare CONNECTED on the TpConnection first We have to make sure that tp_connection_get_self_contact() won't return NULL. https://bugzilla.gnome.org/show_bug.cgi?id=691006 --- libempathy/empathy-tp-chat.c | 58 +++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 10 deletions(-) diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c index 4857243c..42ab0836 100644 --- a/libempathy/empathy-tp-chat.c +++ b/libempathy/empathy-tp-chat.c @@ -1298,20 +1298,12 @@ password_feature_prepare_cb (GObject *source, } static void -tp_chat_prepare_ready_async (TpProxy *proxy, - const TpProxyFeature *feature, - GAsyncReadyCallback callback, - gpointer user_data) +continue_preparing (EmpathyTpChat *self) { - EmpathyTpChat *self = (EmpathyTpChat *) proxy; - TpChannel *channel = (TpChannel *) proxy; + TpChannel *channel = (TpChannel *) self; TpConnection *connection; gboolean listen_for_dbus_properties_changed = FALSE; - g_assert (self->priv->ready_result == NULL); - self->priv->ready_result = g_simple_async_result_new (G_OBJECT (self), - callback, user_data, tp_chat_prepare_ready_async); - connection = tp_channel_get_connection (channel); if (tp_proxy_has_interface_by_id (self, @@ -1436,3 +1428,49 @@ tp_chat_prepare_ready_async (TpProxy *proxy, G_OBJECT (self), NULL); } } + +static void +conn_connected_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + EmpathyTpChat *self = user_data; + GError *error = NULL; + + if (!tp_proxy_prepare_finish (source, result, &error)) + { + DEBUG ("Failed to prepare Connected: %s", error->message); + g_simple_async_result_take_error (self->priv->ready_result, error); + g_simple_async_result_complete (self->priv->ready_result); + tp_clear_object (&self->priv->ready_result); + return; + } + + continue_preparing (self); +} + +static void +tp_chat_prepare_ready_async (TpProxy *proxy, + const TpProxyFeature *feature, + GAsyncReadyCallback callback, + gpointer user_data) +{ + EmpathyTpChat *self = (EmpathyTpChat *) proxy; + TpChannel *channel = (TpChannel *) proxy; + TpConnection *connection; + GQuark features[] = { TP_CONNECTION_FEATURE_CONNECTED, 0 }; + + g_assert (self->priv->ready_result == NULL); + + self->priv->ready_result = g_simple_async_result_new (G_OBJECT (self), + callback, user_data, tp_chat_prepare_ready_async); + + connection = tp_channel_get_connection (channel); + + /* First we have to make sure that TP_CONNECTION_FEATURE_CONNECTED is + * prepared as we rely on TpConnection::self-contact + * in continue_preparing(). + * + * It would be nice if tp-glib could do this for us: fdo#59126 */ + tp_proxy_prepare_async (connection, features, conn_connected_cb, proxy); +} -- 2.39.2