--- a/jingle/sessions.c Thu Aug 19 14:05:08 2010 +0200
+++ b/jingle/sessions.c Fri Aug 20 21:10:23 2010 +0200
@@ -22,6 +22,7 @@
#include <glib.h>
#include <mcabber/logprint.h>
+#include <mcabber/xmpp.h>
#include <jingle/jingle.h>
#include <jingle/sessions.h>
@@ -176,7 +177,39 @@
return NULL;
}
-SessionContent *session_find_by_transport(gconstpointer data)
+JingleSession *session_find_by_transport(gconstpointer data)
+{
+ GSList *el, *el1;
+ JingleSession *sess;
+ SessionContent *sc;
+ for (el1 = sessions; el1; el1 = el1->next) {
+ sess = (JingleSession*) el1->data;
+ for (el = sess->content; el; el = el->next) {
+ sc = (SessionContent*) el->data;
+ if (data == sc->transport)
+ return sess;
+ }
+ }
+ return NULL;
+}
+
+JingleSession *session_find_by_app(gconstpointer data)
+{
+ GSList *el, *el1;
+ JingleSession *sess;
+ SessionContent *sc;
+ for (el1 = sessions; el1; el1 = el1->next) {
+ sess = (JingleSession*) el1->data;
+ for (el = sess->content; el; el = el->next) {
+ sc = (SessionContent*) el->data;
+ if (data == sc->description)
+ return sess;
+ }
+ }
+ return NULL;
+}
+
+SessionContent *sessioncontent_find_by_transport(gconstpointer data)
{
GSList *el, *el1;
JingleSession *sess;
@@ -192,7 +225,7 @@
return NULL;
}
-SessionContent *session_find_by_app(gconstpointer data)
+SessionContent *sessioncontent_find_by_app(gconstpointer data)
{
GSList *el, *el1;
JingleSession *sess;
@@ -208,6 +241,22 @@
return NULL;
}
+JingleSession *session_find_by_sessioncontent(SessionContent *data)
+{
+ GSList *el, *el1;
+ JingleSession *sess;
+ SessionContent *sc;
+ for (el1 = sessions; el1; el1 = el1->next) {
+ sess = (JingleSession*) el1->data;
+ for (el = sess->content; el; el = el->next) {
+ sc = (SessionContent*) el->data;
+ if (data == sc)
+ return sess;
+ }
+ }
+ return NULL;
+}
+
gint session_remove_sessioncontent(JingleSession *sess, const gchar *name)
{
SessionContent *sc;
@@ -270,10 +319,11 @@
g_free(sess);
}
-void jingle_handle_app(JingleSession *sess, const gchar *name,
+void jingle_handle_app(const gchar *name,
const gchar *xmlns_app, gconstpointer app,
const gchar *to)
{
+ JingleSession *sess = session_find_by_app(app);
const gchar *xmlns = jingle_transport_for_app(xmlns_app, NULL);
JingleTransportFuncs *trans = jingle_get_transportfuncs(xmlns);
@@ -346,3 +396,21 @@
else
sc->transfuncs->end(sc2, sc->transport);
}
+
+void new_session_with_apps(const gchar *recipientjid, const gchar **names,
+ gconstpointer *datas, const gchar **ns)
+{
+ const gchar *myjid = g_strdup(lm_connection_get_jid(lconnection));
+ gchar *sid = jingle_generate_sid();
+ JingleSession *sess = session_new(sid, myjid, recipientjid, JINGLE_SESSION_OUTGOING);
+ const gchar **name, **el1 = ns;
+ gconstpointer *data1 = datas;
+
+ for (name = names; name; ++name) {
+ session_add_content(sess, *name, JINGLE_SESSION_STATE_PENDING);
+ session_add_app(sess, *name, *el1, *data1);
+ if (!++data1 || !++el1)
+ break;
+ }
+ g_free(sid);
+}