]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-utils.c
Merge commit 'sjoerd/master'
[empathy.git] / libempathy / empathy-utils.c
index 8c6edafc5ce37f3a04d37163f02b3c587ec82abc..7548c58fbf4fe774a9e796221d91bdad53c1128c 100644 (file)
@@ -401,14 +401,16 @@ void
 empathy_call_with_contact (EmpathyContact *contact)
 {
 #ifdef HAVE_VOIP
-       MissionControl *mc;
-       McAccount      *account;
-       TpConn         *tp_conn;
-       gchar          *object_path;
-       const gchar    *bus_name;
-       TpChan         *new_chan;
-       EmpathyTpGroup *group;
-       GError         *error = NULL;
+       MissionControl        *mc;
+       McAccount             *account;
+       TpConn                *tp_conn;
+       gchar                 *object_path;
+       const gchar           *bus_name;
+       TpChan                *new_chan;
+       EmpathyContactFactory *factory;
+       EmpathyTpGroup        *group;
+       EmpathyContact        *self_contact;
+       GError                *error = NULL;
 
        g_return_if_fail (EMPATHY_IS_CONTACT (contact));
 
@@ -446,8 +448,13 @@ empathy_call_with_contact (EmpathyContact *contact)
                                0);
 
        group = empathy_tp_group_new (account, new_chan);
+       factory = empathy_contact_factory_new ();
+       self_contact = empathy_contact_factory_get_user (factory, account);
        empathy_tp_group_add_member (group, contact, "");
+       empathy_tp_group_add_member (group, self_contact, "");  
 
+       g_object_unref (factory);
+       g_object_unref (self_contact);
        g_object_unref (group);
        g_object_unref (mc);
        g_object_unref (tp_conn);
@@ -456,6 +463,28 @@ empathy_call_with_contact (EmpathyContact *contact)
 #endif
 }
 
+#ifdef HAVE_VOIP
+struct empathy_call_cb_user_data {
+       guint handler;
+       GObject *factory;
+};
+
+static void
+empathy_call_with_contact_id_got_handle_cb (EmpathyContact *contact, 
+  GParamSpec *property, gpointer user_data) {
+
+       struct empathy_call_cb_user_data *ud =
+               (struct empathy_call_cb_user_data *) user_data;
+
+       g_signal_handler_disconnect (contact, ud->handler);
+
+       empathy_call_with_contact (contact);
+       g_object_unref (ud->factory);
+       g_object_unref (contact);
+       g_free (ud);
+}
+#endif
+
 void
 empathy_call_with_contact_id (McAccount *account, const gchar *contact_id)
 {
@@ -465,9 +494,19 @@ empathy_call_with_contact_id (McAccount *account, const gchar *contact_id)
 
        factory = empathy_contact_factory_new ();
        contact = empathy_contact_factory_get_from_id (factory, account, contact_id);
-       empathy_call_with_contact (contact);
-       g_object_unref (contact);
-       g_object_unref (factory);
+
+       if (empathy_contact_get_handle (contact) != 0) {
+               empathy_call_with_contact (contact);
+               g_object_unref (contact);
+               g_object_unref (factory);
+       } else {
+               struct empathy_call_cb_user_data *ud;
+               ud = g_malloc0 (sizeof (struct empathy_call_cb_user_data));
+               ud->factory = G_OBJECT (factory);
+               ud->handler = g_signal_connect (G_OBJECT (contact), "notify::handle",
+                       G_CALLBACK (empathy_call_with_contact_id_got_handle_cb), ud);
+       }
+
 #endif
 }