GList * purple_media_candidate_list_copy(GList *candidates) { GList *new_list = NULL; for (; candidates; candidates = g_list_next(candidates)) { new_list = g_list_prepend(new_list, purple_media_candidate_copy(candidates->data)); } new_list = g_list_reverse(new_list); return new_list; }
static void purple_media_new_local_candidate_cb(PurpleMediaBackend *backend, const gchar *sess_id, const gchar *participant, PurpleMediaCandidate *candidate, PurpleMedia *media) { PurpleMediaSession *session = purple_media_get_session(media, sess_id); purple_media_insert_local_candidate(session, participant, purple_media_candidate_copy(candidate)); g_signal_emit(session->media, purple_media_signals[NEW_CANDIDATE], 0, session->id, participant, candidate); }
/* callback called when a pair of transport candidates (local and remote) * has been established */ static void purple_media_candidate_pair_established_cb(PurpleMediaBackend *backend, const gchar *sess_id, const gchar *name, PurpleMediaCandidate *local_candidate, PurpleMediaCandidate *remote_candidate, PurpleMedia *media) { PurpleMediaStream *stream; GList *iter; guint id; g_return_if_fail(PURPLE_IS_MEDIA(media)); stream = purple_media_get_stream(media, sess_id, name); id = purple_media_candidate_get_component_id(local_candidate); iter = stream->active_local_candidates; for(; iter; iter = g_list_next(iter)) { PurpleMediaCandidate *c = iter->data; if (id == purple_media_candidate_get_component_id(c)) { g_object_unref(c); stream->active_local_candidates = g_list_delete_link(iter, iter); stream->active_local_candidates = g_list_prepend( stream->active_local_candidates, purple_media_candidate_copy( local_candidate)); break; } } if (iter == NULL) stream->active_local_candidates = g_list_prepend( stream->active_local_candidates, purple_media_candidate_copy( local_candidate)); id = purple_media_candidate_get_component_id(local_candidate); iter = stream->active_remote_candidates; for(; iter; iter = g_list_next(iter)) { PurpleMediaCandidate *c = iter->data; if (id == purple_media_candidate_get_component_id(c)) { g_object_unref(c); stream->active_remote_candidates = g_list_delete_link(iter, iter); stream->active_remote_candidates = g_list_prepend( stream->active_remote_candidates, purple_media_candidate_copy( remote_candidate)); break; } } if (iter == NULL) stream->active_remote_candidates = g_list_prepend( stream->active_remote_candidates, purple_media_candidate_copy( remote_candidate)); g_signal_emit(media, purple_media_signals[CANDIDATE_PAIR_ESTABLISHED], 0, sess_id, name, local_candidate, remote_candidate); purple_debug_info("media", "candidate pair established\n"); }