# HG changeset patch # User Mike Ruprecht # Date 1226809416 0 # Node ID aa50b1f05145b05fc7730ec118492ab68f961980 # Parent 403453f8b6431da0bc2aff71ffe8d8e33a8e186a Added PurpleMediaStream to wrap FsStream. diff -r 403453f8b643 -r aa50b1f05145 libpurple/media.c --- a/libpurple/media.c Thu Nov 13 04:00:29 2008 +0000 +++ b/libpurple/media.c Sun Nov 16 04:23:36 2008 +0000 @@ -40,6 +40,11 @@ #include #include +/** @copydoc _PurpleMediaSession */ +typedef struct _PurpleMediaSession PurpleMediaSession; +/** @copydoc _PurpleMediaStream */ +typedef struct _PurpleMediaStream PurpleMediaStream; + struct _PurpleMediaSession { gchar *id; @@ -47,8 +52,7 @@ GstElement *src; GstElement *sink; FsSession *session; - /* FsStream table. Mapped by participant's name */ - GHashTable *streams; + PurpleMediaSessionType type; /* GList of FsCandidates table. Mapped by participant's name */ GHashTable *local_candidates; @@ -61,6 +65,20 @@ FsCandidate *remote_candidate; }; +struct _PurpleMediaStream +{ + PurpleMediaSession *session; + gchar *participant; + FsStream *stream; + + GList *local_candidates; + + gboolean candidates_prepared; + + FsCandidate *local_candidate; + FsCandidate *remote_candidate; +}; + struct _PurpleMediaPrivate { FsConference *conference; @@ -71,7 +89,10 @@ GHashTable *sessions; /* PurpleMediaSession table */ GHashTable *participants; /* FsParticipant table */ + GList *streams; /* PurpleMediaStream table */ + GstElement *pipeline; + }; #define PURPLE_MEDIA_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEDIA, PurpleMediaPrivate)) @@ -233,6 +254,44 @@ } static void +purple_media_stream_free(PurpleMediaStream *stream) +{ + g_free(stream->participant); + g_object_unref(stream->stream); + + if (stream->local_candidates) + fs_candidate_list_destroy(stream->local_candidates); + + if (stream->local_candidate) + fs_candidate_destroy(stream->local_candidate); + if (stream->remote_candidate) + fs_candidate_destroy(stream->remote_candidate); + + g_free(stream); +} + +static void +purple_media_session_free(PurpleMediaSession *session) +{ + g_free(session->id); + + if (session->local_candidates) { + GList *candidates = g_hash_table_get_values(session->local_candidates); + for (; candidates; candidates = + g_list_delete_link(candidates, candidates)) + fs_candidate_list_destroy(candidates->data); + g_hash_table_destroy(session->local_candidates); + } + + if (session->local_candidate) + fs_candidate_destroy(session->local_candidate); + if (session->remote_candidate) + fs_candidate_destroy(session->remote_candidate); + + g_free(session); +} + +static void purple_media_finalize (GObject *media) { PurpleMediaPrivate *priv = PURPLE_MEDIA_GET_PRIVATE(media); @@ -246,34 +305,14 @@ if (priv->sessions) { GList *sessions = g_hash_table_get_values(priv->sessions); for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { - PurpleMediaSession *session = sessions->data; - g_free(session->id); - - if (session->streams) { - GList *streams = g_hash_table_get_values(session->streams); - for (; streams; streams = g_list_delete_link(streams, streams)) - g_object_unref(streams->data); - g_hash_table_destroy(session->streams); - } - - if (session->local_candidates) { - GList *candidates = g_hash_table_get_values(session->local_candidates); - for (; candidates; candidates = - g_list_delete_link(candidates, candidates)) - fs_candidate_list_destroy(candidates->data); - g_hash_table_destroy(session->local_candidates); - } - - if (session->local_candidate) - fs_candidate_destroy(session->local_candidate); - if (session->remote_candidate) - fs_candidate_destroy(session->remote_candidate); - - g_free(session); + purple_media_session_free(sessions->data); } g_hash_table_destroy(priv->sessions); } + for (; priv->streams; priv->streams = g_list_delete_link(priv->streams, priv->streams)) + purple_media_stream_free(priv->streams->data); + if (priv->participants) { GList *participants = g_hash_table_get_values(priv->participants); for (; participants; participants = g_list_delete_link(participants, participants)) @@ -423,8 +462,16 @@ static FsStream* purple_media_session_get_stream(PurpleMediaSession *session, const gchar *name) { - return (FsStream*) (session->streams) ? - g_hash_table_lookup(session->streams, name) : NULL; + GList *streams = session->media->priv->streams; + + for (; streams; streams = g_list_next(streams)) { + PurpleMediaStream *stream = streams->data; + if (session == stream->session && + !strcmp(stream->participant, name)) + return stream->stream; + } + + return NULL; } static GList* @@ -483,13 +530,13 @@ static void purple_media_insert_stream(PurpleMediaSession *session, const gchar *name, FsStream *stream) { - if (!session->streams) { - purple_debug_info("media", "Creating hash table for streams\n"); - session->streams = g_hash_table_new_full(g_str_hash, - g_str_equal, g_free, NULL); - } + PurpleMediaStream *media_stream = g_new0(PurpleMediaStream, 1); + media_stream->stream = stream; + media_stream->participant = g_strdup(name); + media_stream->session = session; - g_hash_table_insert(session->streams, g_strdup(name), stream); + session->media->priv->streams = + g_list_append(session->media->priv->streams, media_stream); } static void diff -r 403453f8b643 -r aa50b1f05145 libpurple/media.h --- a/libpurple/media.h Thu Nov 13 04:00:29 2008 +0000 +++ b/libpurple/media.h Sun Nov 16 04:23:36 2008 +0000 @@ -51,8 +51,6 @@ typedef struct _PurpleMediaClass PurpleMediaClass; /** @copydoc _PurpleMediaPrivate */ typedef struct _PurpleMediaPrivate PurpleMediaPrivate; -/** @copydoc _PurpleMediaSession */ -typedef struct _PurpleMediaSession PurpleMediaSession; #else