pidgin.vv: 1cd039d2: Handle having multiple active candidates...
maiku at soc.pidgin.im
maiku at soc.pidgin.im
Thu Feb 5 05:40:25 EST 2009
-----------------------------------------------------------------
Revision: 1cd039d2f04c877820b4097e462f26831c2d828e
Ancestor: dd70abdae9f96389afee1f1a67f4d95650e19237
Author: maiku at soc.pidgin.im
Date: 2009-02-05T10:25:28
Branch: im.pidgin.pidgin.vv
URL: http://d.pidgin.im/viewmtn/revision/info/1cd039d2f04c877820b4097e462f26831c2d828e
Modified files:
libpurple/media.c libpurple/media.h
ChangeLog:
Handle having multiple active candidates.
-------------- next part --------------
============================================================
--- libpurple/media.c d603b753c0471f6ab91afa0e0f9b498eccba473a
+++ libpurple/media.c d51bf3ea0b9f6776f37a01452c66401def0fedc7
@@ -75,8 +75,8 @@ struct _PurpleMediaStream
gboolean candidates_prepared;
- FsCandidate *local_candidate;
- FsCandidate *remote_candidate;
+ GList *active_local_candidates;
+ GList *active_remote_candidates;
gulong window_id;
};
@@ -250,10 +250,10 @@ purple_media_stream_free(PurpleMediaStre
if (stream->remote_candidates)
fs_candidate_list_destroy(stream->remote_candidates);
- if (stream->local_candidate)
- fs_candidate_destroy(stream->local_candidate);
- if (stream->remote_candidate)
- fs_candidate_destroy(stream->remote_candidate);
+ if (stream->active_local_candidates)
+ fs_candidate_list_destroy(stream->active_local_candidates);
+ if (stream->active_remote_candidates)
+ fs_candidate_list_destroy(stream->active_remote_candidates);
g_free(stream);
}
@@ -1670,6 +1670,7 @@ purple_media_candidate_pair_established_
gchar *name;
FsParticipant *participant;
PurpleMediaStream *stream;
+ GList *iter;
g_return_if_fail(FS_IS_STREAM(fsstream));
g_return_if_fail(session != NULL);
@@ -1680,9 +1681,42 @@ purple_media_candidate_pair_established_
stream = purple_media_get_stream(session->media, session->id, name);
- stream->local_candidate = fs_candidate_copy(native_candidate);
- stream->remote_candidate = fs_candidate_copy(remote_candidate);
+ iter = stream->active_local_candidates;
+ for(; iter; iter = g_list_next(iter)) {
+ FsCandidate *c = iter->data;
+ if (native_candidate->component_id == c->component_id) {
+ fs_candidate_destroy(c);
+ stream->active_local_candidates =
+ g_list_delete_link(iter, iter);
+ stream->active_local_candidates = g_list_prepend(
+ stream->active_local_candidates,
+ fs_candidate_copy(native_candidate));
+ break;
+ }
+ }
+ if (iter == NULL)
+ stream->active_local_candidates = g_list_prepend(
+ stream->active_local_candidates,
+ fs_candidate_copy(native_candidate));
+ iter = stream->active_remote_candidates;
+ for(; iter; iter = g_list_next(iter)) {
+ FsCandidate *c = iter->data;
+ if (native_candidate->component_id == c->component_id) {
+ fs_candidate_destroy(c);
+ stream->active_remote_candidates =
+ g_list_delete_link(iter, iter);
+ stream->active_remote_candidates = g_list_prepend(
+ stream->active_remote_candidates,
+ fs_candidate_copy(remote_candidate));
+ break;
+ }
+ }
+ if (iter == NULL)
+ stream->active_remote_candidates = g_list_prepend(
+ stream->active_remote_candidates,
+ fs_candidate_copy(remote_candidate));
+
purple_debug_info("media", "candidate pair established\n");
}
@@ -2023,22 +2057,26 @@ purple_media_add_remote_candidates(Purpl
}
}
-PurpleMediaCandidate *
-purple_media_get_local_candidate(PurpleMedia *media, const gchar *sess_id, const gchar *name)
+GList *
+purple_media_get_active_local_candidates(PurpleMedia *media,
+ const gchar *sess_id, const gchar *name)
{
PurpleMediaStream *stream;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
stream = purple_media_get_stream(media, sess_id, name);
- return purple_media_candidate_from_fs(stream->local_candidate);
+ return purple_media_candidate_list_from_fs(
+ stream->active_local_candidates);
}
-PurpleMediaCandidate *
-purple_media_get_remote_candidate(PurpleMedia *media, const gchar *sess_id, const gchar *name)
+GList *
+purple_media_get_active_remote_candidates(PurpleMedia *media,
+ const gchar *sess_id, const gchar *name)
{
PurpleMediaStream *stream;
g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
stream = purple_media_get_stream(media, sess_id, name);
- return purple_media_candidate_from_fs(stream->remote_candidate);
+ return purple_media_candidate_list_from_fs(
+ stream->active_remote_candidates);
}
gboolean
@@ -2080,8 +2118,14 @@ purple_media_candidates_prepared(PurpleM
for (; sessions; sessions = sessions->next) {
const gchar *session = sessions->data;
- if (!purple_media_get_local_candidate(media, session, name) ||
- !purple_media_get_remote_candidate(media, session, name))
+ GList *local = purple_media_get_active_local_candidates(
+ media, session, name);
+ GList *remote = purple_media_get_active_remote_candidates(
+ media, session, name);
+ gboolean result = (local == NULL || remote == NULL);
+ purple_media_candidate_list_free(local);
+ purple_media_candidate_list_free(remote);
+ if (!result)
return FALSE;
}
============================================================
--- libpurple/media.h 001a7b2df4b9909c9d645205379ecf1b82c577a4
+++ libpurple/media.h f35309f5550f135f95e0330c2c362a47c8fd1b9e
@@ -533,27 +533,27 @@ GList *purple_media_get_local_candidates
const gchar *name);
/**
- * Gets the active local candidate for the stream.
+ * Gets the active local candidates for the stream.
*
* @param media The media object to find the session in.
* @param sess_id The session id of the session to find the stream in.
* @param name The name of the remote user to get the active candidate from.
*
- * @return The active candidate retrieved.
+ * @return The active candidates retrieved.
*/
-PurpleMediaCandidate *purple_media_get_local_candidate(PurpleMedia *media,
+GList *purple_media_get_active_local_candidates(PurpleMedia *media,
const gchar *sess_id, const gchar *name);
/**
- * Gets the active remote candidate for the stream.
+ * Gets the active remote candidates for the stream.
*
* @param media The media object to find the session in.
* @param sess_id The session id of the session to find the stream in.
* @param name The name of the remote user to get the remote candidate from.
*
- * @return The remote candidate retrieved.
+ * @return The remote candidates retrieved.
*/
-PurpleMediaCandidate *purple_media_get_remote_candidate(PurpleMedia *media,
+GList *purple_media_get_active_remote_candidates(PurpleMedia *media,
const gchar *sess_id, const gchar *name);
/**
More information about the Commits
mailing list