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,