diff options
author | Marcus Lundblad <malu@pidgin.im> | 2010-09-02 21:00:25 +0000 |
---|---|---|
committer | Marcus Lundblad <malu@pidgin.im> | 2010-09-02 21:00:25 +0000 |
commit | 4dd8cff0704af58d243e44fe7bf673420c820600 (patch) | |
tree | 444d55a1cb0462622813ed04dffd8ba317463954 | |
parent | 478c8399aaa1e352b150f71754399905492c7016 (diff) | |
download | pidgin-4dd8cff0704af58d243e44fe7bf673420c820600.tar.gz |
Actually handle candidates we receive from the initiator before setting up our own streams (after getting a relay response from the HTTP server). This seems to somewhat work now, though for some reason it seems to use relays also locally...
-rw-r--r-- | libpurple/protocols/jabber/google/google_session.c | 77 |
1 files changed, 61 insertions, 16 deletions
diff --git a/libpurple/protocols/jabber/google/google_session.c b/libpurple/protocols/jabber/google/google_session.c index 98c6db9797..40adc96d1c 100644 --- a/libpurple/protocols/jabber/google/google_session.c +++ b/libpurple/protocols/jabber/google/google_session.c @@ -29,6 +29,10 @@ typedef struct { PurpleMedia *media; gboolean video; + GList *remote_audio_candidates; /* list of PurpleMediaCandidate */ + GList *remote_video_candidates; /* list of PurpleMediaCandidate */ + gboolean added_streams; /* this indicates if the streams have been + to media (ie. after getting relay credentials */ } GoogleAVSessionData; static gboolean @@ -43,9 +47,18 @@ google_session_id_equal(gconstpointer a, gconstpointer b) static void google_session_destroy(GoogleSession *session) { + GoogleAVSessionData *session_data = + (GoogleAVSessionData *) session->session_data; g_free(session->id.id); g_free(session->id.initiator); g_free(session->remote_jid); + + if (session_data->remote_audio_candidates) + purple_media_candidate_list_free(session_data->remote_audio_candidates); + + if (session_data->remote_video_candidates) + purple_media_candidate_list_free(session_data->remote_video_candidates); + g_free(session->session_data); g_free(session); } @@ -436,6 +449,8 @@ jabber_google_relay_response_session_initiate_cb(PurpleUtilFetchUrlData *url_dat purple_media_error(session_data->media, "Error adding stream."); purple_media_end(session_data->media, NULL, NULL); g_free(params); + } else { + session_data->added_streams = TRUE; } g_free(params); @@ -576,9 +591,26 @@ jabber_google_relay_response_session_handle_initiate_cb( purple_media_error(session_data->media, "Error adding stream."); purple_media_stream_info(session_data->media, PURPLE_MEDIA_INFO_REJECT, NULL, NULL, TRUE); - g_free(params); + } else { + /* successfully added stream(s) */ + session_data->added_streams = TRUE; + + if (session_data->remote_audio_candidates) { + purple_media_add_remote_candidates(session_data->media, + "google-voice", session->remote_jid, + session_data->remote_audio_candidates); + purple_media_candidate_list_free(session_data->remote_audio_candidates); + session_data->remote_audio_candidates = NULL; + } + if (session_data->remote_video_candidates) { + purple_media_add_remote_candidates(session_data->media, + "google-video", session->remote_jid, + session_data->remote_video_candidates); + purple_media_candidate_list_free(session_data->remote_video_candidates); + session_data->remote_video_candidates = NULL; + } } - + g_free(params); for (codec_element = xmlnode_get_child(desc_element, "payload-type"); @@ -744,23 +776,36 @@ google_session_handle_candidates(JabberStream *js, GoogleSession *session, xmln atoi(port)); g_object_set(info, "username", xmlnode_get_attrib(cand, "username"), "password", xmlnode_get_attrib(cand, "password"), NULL); - if (!strncmp(cname, "video_", 6)) - video_list = g_list_append(video_list, info); - else - list = g_list_append(list, info); + if (!strncmp(cname, "video_", 6)) { + if (session_data->added_streams) { + video_list = g_list_append(video_list, info); + } else { + session_data->remote_video_candidates = + g_list_append(session_data->remote_video_candidates, + info); + } + } else { + if (session_data->added_streams) { + list = g_list_append(list, info); + } else { + session_data->remote_audio_candidates = + g_list_append(session_data->remote_audio_candidates, + info); + } + } } } - if (list) - purple_media_add_remote_candidates( - session_data->media, "google-voice", - session->remote_jid, list); - if (video_list) - purple_media_add_remote_candidates( - session_data->media, "google-video", - session->remote_jid, video_list); - purple_media_candidate_list_free(list); - purple_media_candidate_list_free(video_list); + if (list) { + purple_media_add_remote_candidates(session_data->media, "google-voice", + session->remote_jid, list); + purple_media_candidate_list_free(list); + } + if (video_list) { + purple_media_add_remote_candidates(session_data->media, "google-video", + session->remote_jid, video_list); + purple_media_candidate_list_free(video_list); + } result = jabber_iq_new(js, JABBER_IQ_RESULT); jabber_iq_set_id(result, iq_id); |