| 174 |
174 |
| 175 static PurpleMedia * |
175 static PurpleMedia * |
| 176 jingle_rtp_get_media(JingleSession *session) |
176 jingle_rtp_get_media(JingleSession *session) |
| 177 { |
177 { |
| 178 JabberStream *js = jingle_session_get_js(session); |
178 JabberStream *js = jingle_session_get_js(session); |
| 179 gchar *sid = jingle_session_get_sid(session); |
179 PurpleMedia *media = NULL; |
| 180 |
180 GList *iter = purple_media_manager_get_media_by_connection( |
| 181 PurpleMedia *media = (PurpleMedia *) (js->medias) ? |
181 purple_media_manager_get(), js->gc); |
| 182 g_hash_table_lookup(js->medias, sid) : NULL; |
182 |
| 183 g_free(sid); |
183 for (; iter; iter = g_list_delete_link(iter, iter)) { |
| |
184 JingleSession *media_session = |
| |
185 purple_media_get_prpl_data(iter->data); |
| |
186 if (media_session == session) { |
| |
187 media = iter->data; |
| |
188 break; |
| |
189 } |
| |
190 } |
| |
191 if (iter != NULL) |
| |
192 g_list_free(iter); |
| 184 |
193 |
| 185 return media; |
194 return media; |
| 186 } |
195 } |
| 187 |
196 |
| 188 static JingleTransport * |
197 static JingleTransport * |
| 303 { |
312 { |
| 304 JingleSession *session = data; |
313 JingleSession *session = data; |
| 305 |
314 |
| 306 if (!strcmp(xmlnode_get_attrib(packet, "type"), "error") || |
315 if (!strcmp(xmlnode_get_attrib(packet, "type"), "error") || |
| 307 xmlnode_get_child(packet, "error")) { |
316 xmlnode_get_child(packet, "error")) { |
| 308 gchar *sid = jingle_session_get_sid(session); |
|
| 309 purple_media_end(jingle_rtp_get_media(session), NULL, NULL); |
317 purple_media_end(jingle_rtp_get_media(session), NULL, NULL); |
| 310 g_hash_table_remove(jingle_session_get_js( |
|
| 311 session)->medias, sid); |
|
| 312 g_free(sid); |
|
| 313 g_object_unref(session); |
318 g_object_unref(session); |
| 314 return; |
319 return; |
| 315 } |
320 } |
| 316 |
321 |
| 317 jabber_iq_send(jingle_session_to_packet(session, |
322 jabber_iq_send(jingle_session_to_packet(session, |
| 365 purple_debug_info("jingle-rtp", "state-changed: type %d id: %s name: %s\n", type, sid, name); |
370 purple_debug_info("jingle-rtp", "state-changed: type %d id: %s name: %s\n", type, sid, name); |
| 366 |
371 |
| 367 if ((type == PURPLE_MEDIA_STATE_CHANGED_REJECTED || |
372 if ((type == PURPLE_MEDIA_STATE_CHANGED_REJECTED || |
| 368 type == PURPLE_MEDIA_STATE_CHANGED_HANGUP) && |
373 type == PURPLE_MEDIA_STATE_CHANGED_HANGUP) && |
| 369 sid == NULL && name == NULL) { |
374 sid == NULL && name == NULL) { |
| 370 gchar *sid = jingle_session_get_sid(session); |
|
| 371 jabber_iq_send(jingle_session_to_packet(session, |
375 jabber_iq_send(jingle_session_to_packet(session, |
| 372 JINGLE_SESSION_TERMINATE)); |
376 JINGLE_SESSION_TERMINATE)); |
| 373 g_hash_table_remove(jingle_session_get_js(session)->medias, sid); |
|
| 374 g_free(sid); |
|
| 375 g_object_unref(session); |
377 g_object_unref(session); |
| 376 } |
378 } |
| 377 } |
379 } |
| 378 |
380 |
| 379 static PurpleMedia * |
381 static PurpleMedia * |
| 380 jingle_rtp_create_media(JingleContent *content) |
382 jingle_rtp_create_media(JingleContent *content) |
| 381 { |
383 { |
| 382 JingleSession *session = jingle_content_get_session(content); |
384 JingleSession *session = jingle_content_get_session(content); |
| 383 JabberStream *js = jingle_session_get_js(session); |
385 JabberStream *js = jingle_session_get_js(session); |
| 384 gchar *remote_jid = jingle_session_get_remote_jid(session); |
386 gchar *remote_jid = jingle_session_get_remote_jid(session); |
| 385 gchar *sid = jingle_session_get_sid(session); |
|
| 386 |
387 |
| 387 PurpleMedia *media = purple_media_manager_create_media(purple_media_manager_get(), |
388 PurpleMedia *media = purple_media_manager_create_media(purple_media_manager_get(), |
| 388 js->gc, "fsrtpconference", remote_jid, |
389 js->gc, "fsrtpconference", remote_jid, |
| 389 jingle_session_is_initiator(session)); |
390 jingle_session_is_initiator(session)); |
| 390 g_free(remote_jid); |
391 g_free(remote_jid); |
| 392 if (!media) { |
393 if (!media) { |
| 393 purple_debug_error("jingle-rtp", "Couldn't create media session\n"); |
394 purple_debug_error("jingle-rtp", "Couldn't create media session\n"); |
| 394 return NULL; |
395 return NULL; |
| 395 } |
396 } |
| 396 |
397 |
| 397 /* insert it into the hash table */ |
398 purple_media_set_prpl_data(media, session); |
| 398 if (!js->medias) { |
|
| 399 purple_debug_info("jingle-rtp", "Creating hash table for media\n"); |
|
| 400 js->medias = g_hash_table_new(g_str_hash, g_str_equal); |
|
| 401 } |
|
| 402 purple_debug_info("jingle-rtp", "inserting media with sid: %s into table\n", sid); |
|
| 403 g_hash_table_insert(js->medias, sid, media); |
|
| 404 |
399 |
| 405 /* connect callbacks */ |
400 /* connect callbacks */ |
| 406 g_signal_connect(G_OBJECT(media), "accepted", |
401 g_signal_connect(G_OBJECT(media), "accepted", |
| 407 G_CALLBACK(jingle_rtp_accepted_cb), session); |
402 G_CALLBACK(jingle_rtp_accepted_cb), session); |
| 408 g_signal_connect(G_OBJECT(media), "codecs-changed", |
403 g_signal_connect(G_OBJECT(media), "codecs-changed", |
| 644 case JINGLE_SESSION_TERMINATE: { |
639 case JINGLE_SESSION_TERMINATE: { |
| 645 JingleSession *session = jingle_content_get_session(content); |
640 JingleSession *session = jingle_content_get_session(content); |
| 646 PurpleMedia *media = jingle_rtp_get_media(session); |
641 PurpleMedia *media = jingle_rtp_get_media(session); |
| 647 |
642 |
| 648 if (media != NULL) { |
643 if (media != NULL) { |
| 649 gchar *sid = jingle_session_get_sid(session); |
|
| 650 purple_media_end(media, NULL, NULL); |
644 purple_media_end(media, NULL, NULL); |
| 651 g_hash_table_remove(jingle_session_get_js( |
|
| 652 session)->medias, sid); |
|
| 653 g_free(sid); |
|
| 654 } |
645 } |
| 655 |
646 |
| 656 g_object_unref(session); |
647 g_object_unref(session); |
| 657 break; |
648 break; |
| 658 } |
649 } |