]> git.0d.be Git - empathy.git/commitdiff
tp-chat: prepare the Password feature if needed
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 17 Jul 2012 12:46:39 +0000 (14:46 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 17 Jul 2012 12:47:57 +0000 (14:47 +0200)
libempathy/empathy-tp-chat.c

index 03014ea01d1380db6f4c8b3d93208847d0d49aa9..5cdcf28ad5ee46c7b91ca7c98752575a40083ebc 100644 (file)
@@ -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))
     {