Mercurial > pidgin
comparison libpurple/protocols/jabber/google.c @ 28045:98d8c11e4937
Gracefully handle failures to create an FsStream. This was caused by
Farsight 2's new "tos" property which isn't defaulting to 0 properly on some
systems. This won't make calls on systems that are affected by this bug #10017
work, but it won't crash now. Fixes #10016
author | maiku@pidgin.im |
---|---|
date | Sat, 22 Aug 2009 02:55:18 +0000 |
parents | ed30bc20442c |
children | 1e529b03ec81 |
comparison
equal
deleted
inserted
replaced
28044:74958cad186d | 28045:98d8c11e4937 |
---|---|
86 xmlnode_set_namespace(node, "http://www.google.com/session"); | 86 xmlnode_set_namespace(node, "http://www.google.com/session"); |
87 xmlnode_set_attrib(node, "id", session->id.id); | 87 xmlnode_set_attrib(node, "id", session->id.id); |
88 xmlnode_set_attrib(node, "initiator", session->id.initiator); | 88 xmlnode_set_attrib(node, "initiator", session->id.initiator); |
89 xmlnode_set_attrib(node, "type", type); | 89 xmlnode_set_attrib(node, "type", type); |
90 return node; | 90 return node; |
91 } | |
92 | |
93 static void | |
94 google_session_send_terminate(GoogleSession *session) | |
95 { | |
96 xmlnode *sess; | |
97 JabberIq *iq = jabber_iq_new(session->js, JABBER_IQ_SET); | |
98 | |
99 xmlnode_set_attrib(iq->node, "to", session->remote_jid); | |
100 sess = google_session_create_xmlnode(session, "terminate"); | |
101 xmlnode_insert_child(iq->node, sess); | |
102 | |
103 jabber_iq_send(iq); | |
104 google_session_destroy(session); | |
105 } | 91 } |
106 | 92 |
107 static void | 93 static void |
108 google_session_send_candidates(PurpleMedia *media, gchar *session_id, | 94 google_session_send_candidates(PurpleMedia *media, gchar *session_id, |
109 gchar *participant, GoogleSession *session) | 95 gchar *participant, GoogleSession *session) |
396 purple_connection_get_account(js->gc), | 382 purple_connection_get_account(js->gc), |
397 "fsrtpconference", session->remote_jid, TRUE); | 383 "fsrtpconference", session->remote_jid, TRUE); |
398 | 384 |
399 purple_media_set_prpl_data(session->media, session); | 385 purple_media_set_prpl_data(session->media, session); |
400 | 386 |
401 params = jabber_google_session_get_params(js, &num_params); | |
402 | |
403 if (purple_media_add_stream(session->media, "google-voice", | |
404 session->remote_jid, PURPLE_MEDIA_AUDIO, | |
405 TRUE, "nice", num_params, params) == FALSE || | |
406 (session->video && purple_media_add_stream( | |
407 session->media, "google-video", | |
408 session->remote_jid, PURPLE_MEDIA_VIDEO, | |
409 TRUE, "nice", num_params, params) == FALSE)) { | |
410 purple_media_error(session->media, "Error adding stream."); | |
411 purple_media_stream_info(session->media, | |
412 PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE); | |
413 google_session_destroy(session); | |
414 g_free(params); | |
415 return FALSE; | |
416 } | |
417 | |
418 g_signal_connect_swapped(G_OBJECT(session->media), | 387 g_signal_connect_swapped(G_OBJECT(session->media), |
419 "candidates-prepared", | 388 "candidates-prepared", |
420 G_CALLBACK(google_session_ready), session); | 389 G_CALLBACK(google_session_ready), session); |
421 g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed", | 390 g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed", |
422 G_CALLBACK(google_session_ready), session); | 391 G_CALLBACK(google_session_ready), session); |
423 g_signal_connect(G_OBJECT(session->media), "state-changed", | 392 g_signal_connect(G_OBJECT(session->media), "state-changed", |
424 G_CALLBACK(google_session_state_changed_cb), session); | 393 G_CALLBACK(google_session_state_changed_cb), session); |
425 g_signal_connect(G_OBJECT(session->media), "stream-info", | 394 g_signal_connect(G_OBJECT(session->media), "stream-info", |
426 G_CALLBACK(google_session_stream_info_cb), session); | 395 G_CALLBACK(google_session_stream_info_cb), session); |
427 | 396 |
397 params = jabber_google_session_get_params(js, &num_params); | |
398 | |
399 if (purple_media_add_stream(session->media, "google-voice", | |
400 session->remote_jid, PURPLE_MEDIA_AUDIO, | |
401 TRUE, "nice", num_params, params) == FALSE || | |
402 (session->video && purple_media_add_stream( | |
403 session->media, "google-video", | |
404 session->remote_jid, PURPLE_MEDIA_VIDEO, | |
405 TRUE, "nice", num_params, params) == FALSE)) { | |
406 purple_media_error(session->media, "Error adding stream."); | |
407 purple_media_end(session->media, NULL, NULL); | |
408 g_free(params); | |
409 return FALSE; | |
410 } | |
411 | |
428 g_free(params); | 412 g_free(params); |
429 | 413 |
430 return (session->media != NULL) ? TRUE : FALSE; | 414 return (session->media != NULL) ? TRUE : FALSE; |
431 } | 415 } |
432 | 416 |
463 purple_media_manager_get(), | 447 purple_media_manager_get(), |
464 purple_connection_get_account(js->gc), | 448 purple_connection_get_account(js->gc), |
465 "fsrtpconference", session->remote_jid, FALSE); | 449 "fsrtpconference", session->remote_jid, FALSE); |
466 | 450 |
467 purple_media_set_prpl_data(session->media, session); | 451 purple_media_set_prpl_data(session->media, session); |
452 | |
453 g_signal_connect_swapped(G_OBJECT(session->media), | |
454 "candidates-prepared", | |
455 G_CALLBACK(google_session_ready), session); | |
456 g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed", | |
457 G_CALLBACK(google_session_ready), session); | |
458 g_signal_connect(G_OBJECT(session->media), "state-changed", | |
459 G_CALLBACK(google_session_state_changed_cb), session); | |
460 g_signal_connect(G_OBJECT(session->media), "stream-info", | |
461 G_CALLBACK(google_session_stream_info_cb), session); | |
468 | 462 |
469 params = jabber_google_session_get_params(js, &num_params); | 463 params = jabber_google_session_get_params(js, &num_params); |
470 | 464 |
471 if (purple_media_add_stream(session->media, "google-voice", | 465 if (purple_media_add_stream(session->media, "google-voice", |
472 session->remote_jid, PURPLE_MEDIA_AUDIO, FALSE, | 466 session->remote_jid, PURPLE_MEDIA_AUDIO, FALSE, |
475 session->media, "google-video", | 469 session->media, "google-video", |
476 session->remote_jid, PURPLE_MEDIA_VIDEO, | 470 session->remote_jid, PURPLE_MEDIA_VIDEO, |
477 FALSE, "nice", num_params, params) == FALSE)) { | 471 FALSE, "nice", num_params, params) == FALSE)) { |
478 purple_media_error(session->media, "Error adding stream."); | 472 purple_media_error(session->media, "Error adding stream."); |
479 purple_media_stream_info(session->media, | 473 purple_media_stream_info(session->media, |
480 PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE); | 474 PURPLE_MEDIA_INFO_REJECT, NULL, NULL, TRUE); |
481 google_session_send_terminate(session); | |
482 g_free(params); | 475 g_free(params); |
483 return FALSE; | 476 return FALSE; |
484 } | 477 } |
485 | 478 |
486 g_free(params); | 479 g_free(params); |
532 purple_media_set_remote_codecs(session->media, "google-video", | 525 purple_media_set_remote_codecs(session->media, "google-video", |
533 session->remote_jid, video_codecs); | 526 session->remote_jid, video_codecs); |
534 | 527 |
535 purple_media_codec_list_free(codecs); | 528 purple_media_codec_list_free(codecs); |
536 purple_media_codec_list_free(video_codecs); | 529 purple_media_codec_list_free(video_codecs); |
537 | |
538 g_signal_connect_swapped(G_OBJECT(session->media), "accepted", | |
539 G_CALLBACK(google_session_ready), session); | |
540 g_signal_connect_swapped(G_OBJECT(session->media), | |
541 "candidates-prepared", | |
542 G_CALLBACK(google_session_ready), session); | |
543 g_signal_connect_swapped(G_OBJECT(session->media), "codecs-changed", | |
544 G_CALLBACK(google_session_ready), session); | |
545 g_signal_connect(G_OBJECT(session->media), "state-changed", | |
546 G_CALLBACK(google_session_state_changed_cb), session); | |
547 g_signal_connect(G_OBJECT(session->media), "stream-info", | |
548 G_CALLBACK(google_session_stream_info_cb), session); | |
549 | 530 |
550 result = jabber_iq_new(js, JABBER_IQ_RESULT); | 531 result = jabber_iq_new(js, JABBER_IQ_RESULT); |
551 jabber_iq_set_id(result, iq_id); | 532 jabber_iq_set_id(result, iq_id); |
552 xmlnode_set_attrib(result->node, "to", session->remote_jid); | 533 xmlnode_set_attrib(result->node, "to", session->remote_jid); |
553 jabber_iq_send(result); | 534 jabber_iq_send(result); |
776 session->id.initiator = g_strdup(id.initiator); | 757 session->id.initiator = g_strdup(id.initiator); |
777 session->state = UNINIT; | 758 session->state = UNINIT; |
778 session->js = js; | 759 session->js = js; |
779 session->remote_jid = g_strdup(session->id.initiator); | 760 session->remote_jid = g_strdup(session->id.initiator); |
780 | 761 |
781 if (!google_session_handle_initiate(js, session, session_node, iq_id)) | 762 google_session_handle_initiate(js, session, session_node, iq_id); |
782 google_session_destroy(session); | |
783 } | 763 } |
784 #endif /* USE_VV */ | 764 #endif /* USE_VV */ |
785 | 765 |
786 static void | 766 static void |
787 jabber_gmail_parse(JabberStream *js, const char *from, | 767 jabber_gmail_parse(JabberStream *js, const char *from, |