Mercurial > pidgin
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 { |