summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Ruprecht <maiku@pidgin.im>2009-10-27 00:13:39 +0000
committerMichael Ruprecht <maiku@pidgin.im>2009-10-27 00:13:39 +0000
commit9209d6b82614fed38f25cb54a18875b251838637 (patch)
tree850de1afe16fd6b20feb476c3e6dec89ecae423b
parent9b4a39146ec7f8fb745c33d601b72f5e18a6369d (diff)
downloadpidgin-9209d6b82614fed38f25cb54a18875b251838637.tar.gz
Handle part of accepting a stream in the Fs2 media backend.
-rw-r--r--libpurple/media/backend-fs2.c54
-rw-r--r--libpurple/media/media.c94
2 files changed, 57 insertions, 91 deletions
diff --git a/libpurple/media/backend-fs2.c b/libpurple/media/backend-fs2.c
index 716a507f70..9aaf47958a 100644
--- a/libpurple/media/backend-fs2.c
+++ b/libpurple/media/backend-fs2.c
@@ -625,6 +625,33 @@ _get_stream(PurpleMediaBackendFs2 *self,
return NULL;
}
+static GList *
+_get_streams(PurpleMediaBackendFs2 *self,
+ const gchar *sess_id, const gchar *name)
+{
+ PurpleMediaBackendFs2Private *priv;
+ GList *streams, *ret = NULL;
+
+ g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND_FS2(self), NULL);
+
+ priv = PURPLE_MEDIA_BACKEND_FS2_GET_PRIVATE(self);
+ streams = priv->streams;
+
+ for (; streams; streams = g_list_next(streams)) {
+ PurpleMediaBackendFs2Stream *stream = streams->data;
+
+ if (sess_id != NULL && strcmp(stream->session->id, sess_id))
+ continue;
+ else if (name != NULL && strcmp(stream->participant, name))
+ continue;
+ else
+ ret = g_list_prepend(ret, stream);
+ }
+
+ ret = g_list_reverse(ret);
+ return ret;
+}
+
static PurpleMediaBackendFs2Session *
_get_session_from_fs_stream(PurpleMediaBackendFs2 *self, FsStream *stream)
{
@@ -964,6 +991,33 @@ _stream_info_cb(PurpleMedia *media, PurpleMediaInfoType type,
gchar *sid, gchar *name, gboolean local,
PurpleMediaBackendFs2 *self)
{
+ if (type == PURPLE_MEDIA_INFO_ACCEPT) {
+ GList *streams = _get_streams(self, sid, name);
+
+ for (; streams; streams =
+ g_list_delete_link(streams, streams)) {
+ PurpleMediaBackendFs2Stream *stream = streams->data;
+ GError *err = NULL;
+
+ g_object_set(G_OBJECT(stream->stream), "direction",
+ _session_type_to_fs_stream_direction(
+ stream->session->type), NULL);
+
+ if (stream->remote_candidates == NULL)
+ continue;
+
+ fs_stream_set_remote_candidates(stream->stream,
+ stream->remote_candidates, &err);
+
+ if (err == NULL)
+ continue;
+
+ purple_debug_error("backend-fs2", "Error adding "
+ "remote candidates: %s\n",
+ err->message);
+ g_error_free(err);
+ }
+ }
}
static gboolean
diff --git a/libpurple/media/media.c b/libpurple/media/media.c
index 767e032a12..83038f0c28 100644
--- a/libpurple/media/media.c
+++ b/libpurple/media/media.c
@@ -509,72 +509,6 @@ purple_media_get_property (GObject *object, guint prop_id, GValue *value, GParam
}
-static FsCandidate *
-purple_media_candidate_to_fs(PurpleMediaCandidate *candidate)
-{
- FsCandidate *fscandidate;
- gchar *foundation;
- guint component_id;
- gchar *ip;
- guint port;
- gchar *base_ip;
- guint base_port;
- PurpleMediaNetworkProtocol proto;
- guint32 priority;
- PurpleMediaCandidateType type;
- gchar *username;
- gchar *password;
- guint ttl;
-
- if (candidate == NULL)
- return NULL;
-
- g_object_get(G_OBJECT(candidate),
- "foundation", &foundation,
- "component-id", &component_id,
- "ip", &ip,
- "port", &port,
- "base-ip", &base_ip,
- "base-port", &base_port,
- "protocol", &proto,
- "priority", &priority,
- "type", &type,
- "username", &username,
- "password", &password,
- "ttl", &ttl,
- NULL);
-
- fscandidate = fs_candidate_new(foundation,
- component_id, type,
- proto, ip, port);
-
- fscandidate->base_ip = base_ip;
- fscandidate->base_port = base_port;
- fscandidate->priority = priority;
- fscandidate->username = username;
- fscandidate->password = password;
- fscandidate->ttl = ttl;
-
- g_free(foundation);
- g_free(ip);
- return fscandidate;
-}
-
-static GList *
-purple_media_candidate_list_to_fs(GList *candidates)
-{
- GList *new_list = NULL;
-
- for (; candidates; candidates = g_list_next(candidates)) {
- new_list = g_list_prepend(new_list,
- purple_media_candidate_to_fs(
- candidates->data));
- }
-
- new_list = g_list_reverse(new_list);
- return new_list;
-}
-
static FsMediaType
purple_media_to_fs_media_type(PurpleMediaSessionType type)
{
@@ -974,27 +908,8 @@ purple_media_stream_info(PurpleMedia *media, PurpleMediaInfoType type,
for (; streams; streams =
g_list_delete_link(streams, streams)) {
PurpleMediaStream *stream = streams->data;
- g_object_set(G_OBJECT(stream->stream), "direction",
- purple_media_to_fs_stream_direction(
- stream->session->type), NULL);
- stream->accepted = TRUE;
-
- if (stream->remote_candidates != NULL) {
- GError *err = NULL;
- GList *candidates;
-
- candidates = purple_media_candidate_list_to_fs(
- stream->remote_candidates);
- fs_stream_set_remote_candidates(stream->stream,
- candidates, &err);
- fs_candidate_list_destroy(candidates);
- if (err) {
- purple_debug_error("media", "Error adding remote"
- " candidates: %s\n", err->message);
- g_error_free(err);
- }
- }
+ stream->accepted = TRUE;
}
} else if (local == TRUE && (type == PURPLE_MEDIA_INFO_MUTE ||
type == PURPLE_MEDIA_INFO_UNMUTE)) {
@@ -1444,11 +1359,8 @@ purple_media_add_remote_candidates(PurpleMedia *media, const gchar *sess_id,
stream->remote_candidates = g_list_concat(stream->remote_candidates,
purple_media_candidate_list_copy(remote_candidates));
- if (stream->accepted == TRUE) {
- purple_media_backend_add_remote_candidates(
- media->priv->backend, sess_id, participant,
- remote_candidates);
- }
+ purple_media_backend_add_remote_candidates(media->priv->backend,
+ sess_id, participant, remote_candidates);
#endif
}