From 25b009d1f6a98f230c99f7b0c960c5df1f7d5cde Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 17 Jul 2012 14:46:39 +0200 Subject: tp-chat: prepare the Password feature if needed --- libempathy/empathy-tp-chat.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'libempathy/empathy-tp-chat.c') diff --git a/libempathy/empathy-tp-chat.c b/libempathy/empathy-tp-chat.c index 03014ea01..5cdcf28ad 100644 --- a/libempathy/empathy-tp-chat.c +++ b/libempathy/empathy-tp-chat.c @@ -59,6 +59,7 @@ struct _EmpathyTpChatPrivate /* GSimpleAsyncResult used when preparing EMPATHY_TP_CHAT_FEATURE_CORE */ GSimpleAsyncResult *ready_result; + gboolean preparing_password; }; enum @@ -703,6 +704,9 @@ check_almost_ready (EmpathyTpChat *self) if (self->priv->user == NULL) return; + if (self->priv->preparing_password) + return; + /* We need either the members (room) or the remote contact (private chat). * If the chat is protected by a password we can't get these information so * consider the chat as ready so it can be presented to the user. */ @@ -1249,6 +1253,25 @@ empathy_tp_chat_get_feature_ready (void) return g_quark_from_static_string ("empathy-tp-chat-feature-ready"); } +static void +password_feature_prepare_cb (GObject *source, + GAsyncResult *result, + gpointer user_data) +{ + EmpathyTpChat *self = user_data; + GError *error; + + if (!tp_proxy_prepare_finish (source, result, &error)) + { + DEBUG ("Failed to prepare Password: %s", error->message); + g_error_free (error); + } + + self->priv->preparing_password = FALSE; + + check_almost_ready (self); +} + static void tp_chat_prepare_ready_async (TpProxy *proxy, const TpProxyFeature *feature, @@ -1266,6 +1289,21 @@ tp_chat_prepare_ready_async (TpProxy *proxy, connection = tp_channel_borrow_connection (channel); + if (tp_proxy_has_interface_by_id (self, + TP_IFACE_QUARK_CHANNEL_INTERFACE_PASSWORD)) + { + /* The password feature can't be a hard dep on our own feature has we + * depend on it only if the channel implements the + * Password interface. + */ + GQuark features[] = { TP_CHANNEL_FEATURE_PASSWORD , 0 }; + + self->priv->preparing_password = TRUE; + + tp_proxy_prepare_async (self, features, password_feature_prepare_cb, + self); + } + if (tp_proxy_has_interface_by_id (self, TP_IFACE_QUARK_CHANNEL_INTERFACE_GROUP)) { -- cgit v1.2.3