]> git.0d.be Git - empathy.git/blobdiff - libempathy/empathy-utils.c
Merge call branch from Elliot Fairweather with cleanups from Xavier Claessens.
[empathy.git] / libempathy / empathy-utils.c
index 796d23ddf1675b2b30b64d05d145be97b8d22a6c..8c6edafc5ce37f3a04d37163f02b3c587ec82abc 100644 (file)
@@ -37,6 +37,7 @@
 
 #include "empathy-debug.h"
 #include "empathy-utils.h"
+#include "empathy-contact-factory.h"
 #include "empathy-contact-manager.h"
 #include "empathy-tp-group.h"
 
@@ -397,19 +398,61 @@ empathy_inspect_handle (McAccount *account,
 }
 
 void
-empathy_call_with_contact (EmpathyContact  *contact)
+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;
+
+       g_return_if_fail (EMPATHY_IS_CONTACT (contact));
+
+       /* StreamedMedia channels must have handle=0 and handle_type=none.
+        * To call a contact we have to add him in the group interface of the
+        * channel. MissionControl will detect the channel creation and 
+        * dispatch it to the VoIP chandler automatically. */
 
        mc = empathy_mission_control_new ();
-       mission_control_request_channel (mc,
-                                        empathy_contact_get_account (contact),
-                                        TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA,
-                                        empathy_contact_get_handle (contact),
-                                        TP_HANDLE_TYPE_CONTACT,
-                                        NULL, NULL);
+       account = empathy_contact_get_account (contact);
+       tp_conn = mission_control_get_connection (mc, account, NULL);
+       /* FIXME: Should be async */
+       if (!tp_conn_request_channel (DBUS_G_PROXY (tp_conn),
+                                     TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA,
+                                     TP_HANDLE_TYPE_NONE,
+                                     0,
+                                     FALSE,
+                                     &object_path,
+                                     &error)) {
+               empathy_debug (DEBUG_DOMAIN, 
+                             "Couldn't request channel: %s",
+                             error ? error->message : "No error given");
+               g_clear_error (&error);
+               g_object_unref (mc);
+               g_object_unref (tp_conn);
+               return;
+       }
+
+       bus_name = dbus_g_proxy_get_bus_name (DBUS_G_PROXY (tp_conn));
+       new_chan = tp_chan_new (tp_get_bus (),
+                               bus_name,
+                               object_path,
+                               TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA,
+                               TP_HANDLE_TYPE_NONE,
+                               0);
+
+       group = empathy_tp_group_new (account, new_chan);
+       empathy_tp_group_add_member (group, contact, "");
+
+       g_object_unref (group);
        g_object_unref (mc);
+       g_object_unref (tp_conn);
+       g_object_unref (new_chan);
+       g_free (object_path);
 #endif
 }
 
@@ -417,16 +460,14 @@ void
 empathy_call_with_contact_id (McAccount *account, const gchar *contact_id)
 {
 #ifdef HAVE_VOIP
-       MissionControl *mc;
-
-       mc = empathy_mission_control_new ();
-       mission_control_request_channel_with_string_handle (mc,
-                                                           account,
-                                                           TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA,
-                                                           contact_id,
-                                                           TP_HANDLE_TYPE_CONTACT,
-                                                           NULL, NULL);
-       g_object_unref (mc);
+       EmpathyContactFactory *factory;
+       EmpathyContact        *contact;
+
+       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);
 #endif
 }