diff libpurple/media/backend-fs2.c @ 29169:98a1b62a0f7e

Add participant creation and destruction to the Fs2 media backend.
author maiku@pidgin.im
date Mon, 26 Oct 2009 20:00:00 +0000
parents 1fdc75c94c22
children 7b0931b3e060
line wrap: on
line diff
--- a/libpurple/media/backend-fs2.c	Mon Oct 26 19:11:29 2009 +0000
+++ b/libpurple/media/backend-fs2.c	Mon Oct 26 20:00:00 2009 +0000
@@ -110,6 +110,7 @@
 	gchar *conference_type;
 
 	GHashTable *sessions;
+	GHashTable *participants;
 };
 
 enum {
@@ -176,6 +177,15 @@
 		}
 	}
 
+	if (priv->participants) {
+		GList *participants =
+				g_hash_table_get_values(priv->participants);
+		for (; participants; participants = g_list_delete_link(
+				participants, participants))
+			g_object_unref(participants->data);
+		priv->participants = NULL;
+	}
+
 	if (priv->media) {
 		g_object_remove_weak_pointer(G_OBJECT(priv->media),
 				(gpointer*)&priv->media);
@@ -437,6 +447,22 @@
 	return session;
 }
 
+static FsParticipant *
+_get_participant(PurpleMediaBackendFs2 *self, const gchar *name)
+{
+	PurpleMediaBackendFs2Private *priv;
+	FsParticipant *participant = NULL;
+
+	g_return_val_if_fail(PURPLE_IS_MEDIA_BACKEND_FS2(self), NULL);
+
+	priv = PURPLE_MEDIA_BACKEND_FS2_GET_PRIVATE(self);
+
+	if (priv->participants != NULL)
+		participant = g_hash_table_lookup(priv->participants, name);
+
+	return participant;
+}
+
 static PurpleMediaBackendFs2Session *
 _get_session_from_fs_stream(PurpleMediaBackendFs2 *self, FsStream *stream)
 {
@@ -963,6 +989,40 @@
 }
 
 static gboolean
+_create_participant(PurpleMediaBackendFs2 *self, const gchar *name)
+{
+	PurpleMediaBackendFs2Private *priv =
+			PURPLE_MEDIA_BACKEND_FS2_GET_PRIVATE(self);
+	FsParticipant *participant;
+	GError *err = NULL;
+
+	participant = fs_conference_new_participant(
+			priv->conference, name, &err);
+
+	if (err) {
+		purple_debug_error("backend-fs2",
+				"Error creating participant: %s\n",
+				err->message);
+		g_error_free(err);
+		return FALSE;
+	}
+
+	if (!priv->participants) {
+		purple_debug_info("backend-fs2",
+				"Creating hash table for participants\n");
+		priv->participants = g_hash_table_new_full(g_str_hash,
+				g_str_equal, g_free, NULL);
+	}
+
+	g_hash_table_insert(priv->participants, g_strdup(name), participant);
+
+	g_signal_emit_by_name(priv->media, "state-changed",
+			PURPLE_MEDIA_STATE_NEW, NULL, name);
+
+	return TRUE;
+}
+
+static gboolean
 purple_media_backend_fs2_add_stream(PurpleMediaBackend *self,
 		const gchar *sess_id, const gchar *who,
 		PurpleMediaSessionType type, gboolean initiator,
@@ -987,6 +1047,13 @@
 		return FALSE;
 	}
 
+	if (_get_participant(backend, who) == NULL &&
+			!_create_participant(backend, who)) {
+		purple_debug_error("backend-fs2",
+				"Error creating the participant.\n");
+		return FALSE;
+	}
+
 	return TRUE;
 }
 
@@ -1039,3 +1106,10 @@
 	PurpleMediaBackendFs2Session *session = _get_session(self, sess_id);
 	return session != NULL? session->session : NULL;
 }
+
+FsParticipant *
+purple_media_backend_fs2_get_participant(PurpleMediaBackendFs2 *self,
+		const gchar *name)
+{
+	return _get_participant(self, name);
+}