summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Ruprecht <maiku@pidgin.im>2009-11-11 02:05:01 +0000
committerMichael Ruprecht <maiku@pidgin.im>2009-11-11 02:05:01 +0000
commit43d7b04d9c00b4e89ac576662a0a408fe8de31e5 (patch)
tree1b48a55e8b0913182085a99fe45edfa1b22da1d6
parent09c8a90086dcf8fafedf3a88de577d9be868170c (diff)
downloadpidgin-43d7b04d9c00b4e89ac576662a0a408fe8de31e5.tar.gz
Handle Jingle's description-info method.
This makes Pidgin<->Empathy work more reliably, especially for video.
-rw-r--r--libpurple/protocols/jabber/jingle/rtp.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/libpurple/protocols/jabber/jingle/rtp.c b/libpurple/protocols/jabber/jingle/rtp.c
index 36aa9237f0..8896ef6a43 100644
--- a/libpurple/protocols/jabber/jingle/rtp.c
+++ b/libpurple/protocols/jabber/jingle/rtp.c
@@ -823,6 +823,65 @@ jingle_rtp_handle_action_internal(JingleContent *content, xmlnode *xmlcontent, J
g_object_unref(session);
break;
}
+ case JINGLE_DESCRIPTION_INFO: {
+ JingleSession *session =
+ jingle_content_get_session(content);
+ xmlnode *description = xmlnode_get_child(
+ xmlcontent, "description");
+ GList *codecs, *iter, *iter2, *remote_codecs =
+ jingle_rtp_parse_codecs(description);
+ gchar *name = jingle_content_get_name(content);
+ gchar *remote_jid =
+ jingle_session_get_remote_jid(session);
+ PurpleMedia *media;
+
+ media = jingle_rtp_get_media(session);
+
+ /*
+ * This may have problems if description-info is
+ * received without the optional parameters for a
+ * codec with configuration info (such as THEORA
+ * or H264). The local configuration info may be
+ * set for the remote codec.
+ *
+ * As of 2.6.3 there's no API to support getting
+ * the remote codecs specifically, just the
+ * intersection. Another option may be to cache
+ * the remote codecs received in initiate/accept.
+ */
+ codecs = purple_media_get_codecs(media, name);
+
+ for (iter = codecs; iter; iter = g_list_next(iter)) {
+ guint id;
+
+ id = purple_media_codec_get_id(iter->data);
+ iter2 = remote_codecs;
+
+ for (; iter2; iter2 = g_list_next(iter2)) {
+ if (purple_media_codec_get_id(
+ iter2->data) != id)
+ continue;
+
+ g_object_unref(iter->data);
+ iter->data = iter2->data;
+ remote_codecs = g_list_delete_link(
+ remote_codecs, iter2);
+ break;
+ }
+ }
+
+ codecs = g_list_concat(codecs, remote_codecs);
+ g_list_free (remote_codecs);
+
+ purple_media_set_remote_codecs(media,
+ name, remote_jid, codecs);
+
+ purple_media_codec_list_free (codecs);
+ g_free(remote_jid);
+ g_free(name);
+ g_object_unref(session);
+ break;
+ }
default:
break;
}