]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-call-utils.c
Always build telepathy-yell and handle Call channels
[empathy.git] / libempathy-gtk / empathy-call-utils.c
1 /*
2  * Copyright (C) 2011 Collabora Ltd.
3  *
4  * The code contained in this file is free software; you can redistribute
5  * it and/or modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either version
7  * 2.1 of the License, or (at your option) any later version.
8  *
9  * This file is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this code; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  *
18  * Authors: Emilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
19  */
20
21 #include "config.h"
22
23 #include <glib/gi18n.h>
24
25 #include <gtk/gtk.h>
26
27 #include <telepathy-glib/telepathy-glib.h>
28
29 #include <telepathy-yell/telepathy-yell.h>
30
31 #include "empathy-call-utils.h"
32
33 #include <libempathy/empathy-request-util.h>
34
35 #define DEBUG_FLAG EMPATHY_DEBUG_OTHER
36 #include <libempathy/empathy-debug.h>
37
38 static void
39 show_call_error (GError *error)
40 {
41   GtkWidget *dialog;
42
43   dialog = gtk_message_dialog_new (NULL, 0,
44       GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
45       _("There was an error starting the call"));
46
47   g_signal_connect_swapped (dialog, "response",
48       G_CALLBACK (gtk_widget_destroy),
49       dialog);
50
51   gtk_widget_show (dialog);
52 }
53
54 GHashTable *
55 empathy_call_create_call_request (const gchar *contact,
56     gboolean initial_audio,
57     gboolean initial_video)
58 {
59   return tp_asv_new (
60     TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
61       TPY_IFACE_CHANNEL_TYPE_CALL,
62     TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
63       TP_HANDLE_TYPE_CONTACT,
64     TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING,
65       contact,
66     TPY_PROP_CHANNEL_TYPE_CALL_INITIAL_AUDIO, G_TYPE_BOOLEAN,
67       initial_audio,
68     TPY_PROP_CHANNEL_TYPE_CALL_INITIAL_VIDEO, G_TYPE_BOOLEAN,
69       initial_video,
70     NULL);
71 }
72
73 GHashTable *
74 empathy_call_create_streamed_media_request (const gchar *contact,
75     gboolean initial_audio,
76     gboolean initial_video)
77 {
78   return tp_asv_new (
79     TP_PROP_CHANNEL_CHANNEL_TYPE, G_TYPE_STRING,
80       TP_IFACE_CHANNEL_TYPE_STREAMED_MEDIA,
81     TP_PROP_CHANNEL_TARGET_HANDLE_TYPE, G_TYPE_UINT,
82       TP_HANDLE_TYPE_CONTACT,
83     TP_PROP_CHANNEL_TARGET_ID, G_TYPE_STRING,
84       contact,
85     TP_PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_AUDIO, G_TYPE_BOOLEAN,
86       initial_audio,
87     TP_PROP_CHANNEL_TYPE_STREAMED_MEDIA_INITIAL_VIDEO, G_TYPE_BOOLEAN,
88       initial_video,
89     NULL);
90 }
91
92 static void
93 create_streamed_media_channel_cb (GObject *source,
94     GAsyncResult *result,
95     gpointer user_data)
96 {
97   GError *error = NULL;
98
99   if (!tp_account_channel_request_create_channel_finish (
100            TP_ACCOUNT_CHANNEL_REQUEST (source),
101            result,
102            &error))
103     {
104       DEBUG ("Failed to create StreamedMedia channel: %s", error->message);
105       show_call_error (error);
106       g_error_free (error);
107     }
108 }
109
110 static void
111 create_call_channel_cb (GObject *source,
112     GAsyncResult *result,
113     gpointer user_data)
114 {
115   TpAccountChannelRequest *streamed_media_req = user_data;
116   GError *error = NULL;
117
118   if (tp_account_channel_request_create_channel_finish (
119       TP_ACCOUNT_CHANNEL_REQUEST (source), result, &error))
120     {
121       g_object_unref (streamed_media_req);
122       return;
123     }
124
125   DEBUG ("Failed to create Call channel: %s", error->message);
126
127   if (error->code != TP_ERROR_NOT_IMPLEMENTED)
128     {
129       show_call_error (error);
130       return;
131     }
132
133   DEBUG ("Let's try with an StreamedMedia channel");
134   g_error_free (error);
135   tp_account_channel_request_create_channel_async (streamed_media_req,
136       EMPATHY_AV_BUS_NAME, NULL,
137       create_streamed_media_channel_cb,
138       NULL);
139 }
140
141 void
142 empathy_call_new_with_streams (const gchar *contact,
143     TpAccount *account,
144     gboolean initial_audio,
145     gboolean initial_video,
146     gint64 timestamp)
147 {
148   GHashTable *call_request, *streamed_media_request;
149   TpAccountChannelRequest *call_req, *streamed_media_req;
150
151   call_request = empathy_call_create_call_request (contact,
152       initial_audio,
153       initial_video);
154
155   streamed_media_request = empathy_call_create_streamed_media_request (
156       contact, initial_audio, initial_video);
157
158   call_req = tp_account_channel_request_new (account, call_request, timestamp);
159   streamed_media_req = tp_account_channel_request_new (account,
160       streamed_media_request,
161       timestamp);
162
163   tp_account_channel_request_create_channel_async (call_req,
164       EMPATHY_CALL_BUS_NAME, NULL,
165       create_call_channel_cb,
166       streamed_media_req);
167
168   g_hash_table_unref (call_request);
169   g_hash_table_unref (streamed_media_request);
170   g_object_unref (call_req);
171 }