comparison libpurple/protocols/jabber/google.c @ 26045:62b41bb71a60

merge of '36ce4dcc4d637d6227ef52b2e9e72f957f0435ff' and 'fc5fe0f88226b374c4d42d65ed90e97a059f4d0f'
author Marcus Lundblad <ml@update.uu.se>
date Tue, 13 Jan 2009 09:00:57 +0000
parents 7bbac147f276
children 5d9a97a23d6e
comparison
equal deleted inserted replaced
26044:b04508e5cc6c 26045:62b41bb71a60
96 xmlnode_set_attrib(node, "type", type); 96 xmlnode_set_attrib(node, "type", type);
97 return node; 97 return node;
98 } 98 }
99 99
100 static void 100 static void
101 google_session_send_accept(GoogleSession *session)
102 {
103 xmlnode *sess, *desc, *payload;
104 GList *codecs = purple_media_get_codecs(session->media, "google-voice");
105 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
106
107 xmlnode_set_attrib(iq->node, "to", session->remote_jid);
108 sess = google_session_create_xmlnode(session, "accept");
109 xmlnode_insert_child(iq->node, sess);
110 desc = xmlnode_new_child(sess, "description");
111 xmlnode_set_namespace(desc, "http://www.google.com/session/phone");
112
113 for (;codecs; codecs = codecs->next) {
114 PurpleMediaCodec *codec = (PurpleMediaCodec*)codecs->data;
115 char id[8], clockrate[10];
116 payload = xmlnode_new_child(desc, "payload-type");
117 g_snprintf(id, sizeof(id), "%d", codec->id);
118 g_snprintf(clockrate, sizeof(clockrate), "%d", codec->clock_rate);
119 xmlnode_set_attrib(payload, "name", codec->encoding_name);
120 xmlnode_set_attrib(payload, "id", id);
121 xmlnode_set_attrib(payload, "clockrate", clockrate);
122 }
123
124 purple_media_codec_list_free(codecs);
125 jabber_iq_send(iq);
126 }
127
128 static void
129 google_session_send_terminate(GoogleSession *session) 101 google_session_send_terminate(GoogleSession *session)
130 { 102 {
131 xmlnode *sess; 103 xmlnode *sess;
132 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET); 104 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
133 105
137 109
138 jabber_iq_send(iq); 110 jabber_iq_send(iq);
139 google_session_destroy(session); 111 google_session_destroy(session);
140 } 112 }
141 113
142 static void
143 google_session_send_reject(GoogleSession *session)
144 {
145 xmlnode *sess;
146 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
147
148 xmlnode_set_attrib(iq->node, "to", session->remote_jid);
149 sess = google_session_create_xmlnode(session, "reject");
150 xmlnode_insert_child(iq->node, sess);
151
152 jabber_iq_send(iq);
153 google_session_destroy(session);
154 }
155
156
157 static void 114 static void
158 google_session_candidates_prepared (PurpleMedia *media, gchar *session_id, 115 google_session_send_candidates(PurpleMedia *media, gchar *session_id,
159 gchar *participant, GoogleSession *session) 116 gchar *participant, GoogleSession *session)
160 { 117 {
161 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET); 118 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
162 GList *candidates = purple_media_get_local_candidates(session->media, "google-voice", 119 GList *candidates = purple_media_get_local_candidates(session->media, "google-voice",
163 session->remote_jid); 120 session->remote_jid);
217 if (id == NULL && participant == NULL) { 174 if (id == NULL && participant == NULL) {
218 gchar *me = g_strdup_printf("%s@%s/%s", 175 gchar *me = g_strdup_printf("%s@%s/%s",
219 session->js->user->node, 176 session->js->user->node,
220 session->js->user->domain, 177 session->js->user->domain,
221 session->js->user->resource); 178 session->js->user->resource);
179 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
180 xmlnode *sess, *desc, *payload;
181 GList *codecs, *iter;
182
222 if (!strcmp(session->id.initiator, me)) { 183 if (!strcmp(session->id.initiator, me)) {
223 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
224 xmlnode *sess, *desc, *payload;
225 GList *codecs, *iter;
226
227 sess = google_session_create_xmlnode(session, "initiate");
228 xmlnode_insert_child(iq->node, sess);
229 xmlnode_set_attrib(iq->node, "to", session->remote_jid); 184 xmlnode_set_attrib(iq->node, "to", session->remote_jid);
230 xmlnode_set_attrib(iq->node, "from", session->id.initiator); 185 xmlnode_set_attrib(iq->node, "from", session->id.initiator);
231 desc = xmlnode_new_child(sess, "description"); 186 sess = google_session_create_xmlnode(session, "initiate");
232 xmlnode_set_namespace(desc, "http://www.google.com/session/phone"); 187 } else {
233 188 xmlnode_set_attrib(iq->node, "to", session->remote_jid);
234 codecs = purple_media_get_codecs(media, "google-voice"); 189 xmlnode_set_attrib(iq->node, "from", me);
190 sess = google_session_create_xmlnode(session, "accept");
191 }
192 xmlnode_insert_child(iq->node, sess);
193 desc = xmlnode_new_child(sess, "description");
194 xmlnode_set_namespace(desc, "http://www.google.com/session/phone");
195
196 codecs = purple_media_get_codecs(media, "google-voice");
197
198 for (iter = codecs; iter; iter = g_list_next(iter)) {
199 PurpleMediaCodec *codec = (PurpleMediaCodec*)iter->data;
200 gchar *id = g_strdup_printf("%d", codec->id);
201 gchar *clock_rate = g_strdup_printf("%d", codec->clock_rate);
202 payload = xmlnode_new_child(desc, "payload-type");
203 xmlnode_set_attrib(payload, "id", id);
204 xmlnode_set_attrib(payload, "name", codec->encoding_name);
205 xmlnode_set_attrib(payload, "clockrate", clock_rate);
206 g_free(clock_rate);
207 g_free(id);
208 }
209 purple_media_codec_list_free(codecs);
210
211 jabber_iq_send(iq);
212
213 google_session_send_candidates(session->media,
214 "google-voice", session->remote_jid, session);
215 }
216 }
217
218 static void
219 google_session_state_changed_cb(PurpleMedia *media,
220 PurpleMediaStateChangedType type,
221 gchar *sid, gchar *name, GoogleSession *session)
222 {
223 if (sid == NULL && name == NULL) {
224 if (type == PURPLE_MEDIA_STATE_CHANGED_END) {
225 google_session_destroy(session);
226 } else if (type == PURPLE_MEDIA_STATE_CHANGED_HANGUP) {
227 xmlnode *sess;
228 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
229
230 xmlnode_set_attrib(iq->node, "to", session->remote_jid);
231 sess = google_session_create_xmlnode(session, "terminate");
232 xmlnode_insert_child(iq->node, sess);
235 233
236 for (iter = codecs; iter; iter = g_list_next(iter)) {
237 PurpleMediaCodec *codec = (PurpleMediaCodec*)iter->data;
238 gchar *id = g_strdup_printf("%d", codec->id);
239 gchar *clock_rate = g_strdup_printf("%d", codec->clock_rate);
240 payload = xmlnode_new_child(desc, "payload-type");
241 xmlnode_set_attrib(payload, "id", id);
242 xmlnode_set_attrib(payload, "name", codec->encoding_name);
243 xmlnode_set_attrib(payload, "clockrate", clock_rate);
244 g_free(clock_rate);
245 g_free(id);
246 }
247 purple_media_codec_list_free(codecs);
248
249 jabber_iq_send(iq); 234 jabber_iq_send(iq);
235 } else if (type == PURPLE_MEDIA_STATE_CHANGED_REJECTED) {
236 xmlnode *sess;
237 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET);
238
239 xmlnode_set_attrib(iq->node, "to", session->remote_jid);
240 sess = google_session_create_xmlnode(session, "reject");
241 xmlnode_insert_child(iq->node, sess);
250 242
251 google_session_candidates_prepared(session->media, 243 jabber_iq_send(iq);
252 "google-voice", session->remote_jid, session);
253 } 244 }
245
254 } 246 }
255 } 247 }
256 248
257 PurpleMedia* 249 PurpleMedia*
258 jabber_google_session_initiate(JabberStream *js, const gchar *who, PurpleMediaSessionType type) 250 jabber_google_session_initiate(JabberStream *js, const gchar *who, PurpleMediaSessionType type)
309 return NULL; 301 return NULL;
310 } 302 }
311 303
312 g_signal_connect(G_OBJECT(session->media), "ready-new", 304 g_signal_connect(G_OBJECT(session->media), "ready-new",
313 G_CALLBACK(google_session_ready), session); 305 G_CALLBACK(google_session_ready), session);
314 g_signal_connect_swapped(G_OBJECT(session->media), "accepted", 306 g_signal_connect(G_OBJECT(session->media), "state-changed",
315 G_CALLBACK(google_session_send_accept), session); 307 G_CALLBACK(google_session_state_changed_cb), session);
316 g_signal_connect_swapped(G_OBJECT(session->media), "reject",
317 G_CALLBACK(google_session_send_reject), session);
318 g_signal_connect_swapped(G_OBJECT(session->media), "hangup",
319 G_CALLBACK(google_session_send_terminate), session);
320 purple_media_ready(session->media); 308 purple_media_ready(session->media);
321 309
322 if (sessions == NULL) 310 if (sessions == NULL)
323 sessions = g_hash_table_new(google_session_id_hash, 311 sessions = g_hash_table_new(google_session_id_hash,
324 google_session_id_equal); 312 google_session_id_equal);
373 codecs = g_list_append(codecs, codec); 361 codecs = g_list_append(codecs, codec);
374 } 362 }
375 363
376 purple_media_set_remote_codecs(session->media, "google-voice", session->remote_jid, codecs); 364 purple_media_set_remote_codecs(session->media, "google-voice", session->remote_jid, codecs);
377 365
378 g_signal_connect_swapped(G_OBJECT(session->media), "accepted", 366 g_signal_connect(G_OBJECT(session->media), "ready-new",
379 G_CALLBACK(google_session_send_accept), session); 367 G_CALLBACK(google_session_ready), session);
380 g_signal_connect_swapped(G_OBJECT(session->media), "reject", 368 g_signal_connect(G_OBJECT(session->media), "state-changed",
381 G_CALLBACK(google_session_send_reject), session); 369 G_CALLBACK(google_session_state_changed_cb), session);
382 g_signal_connect_swapped(G_OBJECT(session->media), "hangup",
383 G_CALLBACK(google_session_send_terminate), session);
384 g_signal_connect(G_OBJECT(session->media), "candidates-prepared",
385 G_CALLBACK(google_session_candidates_prepared), session);
386 purple_media_ready(session->media); 370 purple_media_ready(session->media);
387 371
388 purple_media_codec_list_free(codecs); 372 purple_media_codec_list_free(codecs);
389 373
390 result = jabber_iq_new(js, JABBER_IQ_RESULT); 374 result = jabber_iq_new(js, JABBER_IQ_RESULT);
463 447
464 static void 448 static void
465 google_session_handle_reject(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) 449 google_session_handle_reject(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess)
466 { 450 {
467 purple_media_got_hangup(session->media); 451 purple_media_got_hangup(session->media);
468
469 google_session_destroy(session);
470 } 452 }
471 453
472 static void 454 static void
473 google_session_handle_terminate(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess) 455 google_session_handle_terminate(JabberStream *js, GoogleSession *session, xmlnode *packet, xmlnode *sess)
474 { 456 {
475 purple_media_got_hangup(session->media); 457 purple_media_got_hangup(session->media);
476
477 google_session_destroy(session);
478 } 458 }
479 459
480 static void 460 static void
481 google_session_parse_iq(JabberStream *js, GoogleSession *session, xmlnode *packet) 461 google_session_parse_iq(JabberStream *js, GoogleSession *session, xmlnode *packet)
482 { 462 {