diff options
author | Michael Ruprecht <maiku@pidgin.im> | 2009-11-11 02:05:01 +0000 |
---|---|---|
committer | Michael Ruprecht <maiku@pidgin.im> | 2009-11-11 02:05:01 +0000 |
commit | 43d7b04d9c00b4e89ac576662a0a408fe8de31e5 (patch) | |
tree | 1b48a55e8b0913182085a99fe45edfa1b22da1d6 | |
parent | 09c8a90086dcf8fafedf3a88de577d9be868170c (diff) | |
download | pidgin-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.c | 59 |
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; } |