--- a/jingle-filetransfer/filetransfer.c Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c Fri Jul 23 03:23:23 2010 +0200
@@ -35,6 +35,7 @@
#include <jingle/jingle.h>
#include <jingle/check.h>
#include <jingle/register.h>
+#include <jingle/sessions.h>
#include "filetransfer.h"
@@ -207,17 +208,41 @@
return;
}
+ if (!g_file_test (args[1], G_FILE_TEST_EXISTS)) {
+ scr_LogPrint(LPRINT_LOGNORM, "File doesn't exist!");
+ return;
+ }
+
if (!g_strcmp0(args[0], "send")) {
scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: try to sent %s!",
args[1]);
-
-
+ // Create a new session for send a file
+ {
+ JingleSession *sess;
+ gchar *sid = new_sid();
+ const gchar *jid = settings_opt_get("jid");
+ JingleFT *jft = g_new0(JingleFT, 1);
+ sess = session_new(sid, jid, jid);
+ session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
+
+ jft->name = g_strdup(args[1]);
+ jft->hash = NULL;
+ jft->date = 0;
+ jft->size = 0;
+ jft->outfile = NULL;
+ session_add_app(sess, "file", NS_JINGLE_APP_FT, jft);
+
+
+ g_free(sid);
+ }
} else if (!g_strcmp0(args[0], "request")) {
scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: try to request %s!",
args[1]);
//later
}
+
+
free_arg_lst(args);
}
--- a/jingle/action-handlers.c Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/action-handlers.c Fri Jul 23 03:23:23 2010 +0200
@@ -139,7 +139,7 @@
reject.content = g_slist_append(reject.content, cn);
continue;
}
- session_add_content(sess, cn, JINGLE_SESSION_STATE_ACTIVE);
+ session_add_content_from_jinglecontent(sess, cn, JINGLE_SESSION_STATE_ACTIVE);
accept.content = g_slist_append(accept.content, cn);
}
--- a/jingle/jingle.c Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/jingle.c Fri Jul 23 03:23:23 2010 +0200
@@ -423,3 +423,17 @@
}
sc->appfuncs->handle_data(sc->description, data2, len);
}
+
+gchar *new_sid(void)
+{
+ gchar *sid;
+ gchar car[] = "azertyuiopqsdfghjklmwxcvbn1234567890AZERTYUIOPQSDFGHJKLMWXCVBN";
+ int i;
+ sid = g_new0(gchar, 11);
+ for (i = 0; i < 10; i++)
+ sid[i] = car[g_random_int_range(0, sizeof(car)/sizeof(car[0]))];
+
+ sid[10] = '\0';
+
+ return sid;
+}
--- a/jingle/jingle.h Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/jingle.h Fri Jul 23 03:23:23 2010 +0200
@@ -137,4 +137,5 @@
void handle_trans_data(const gchar *xmlns, gconstpointer data, const gchar *data2, guint len);
+gchar *new_sid(void);
#endif
--- a/jingle/register.c Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/register.c Fri Jul 23 03:23:23 2010 +0200
@@ -127,7 +127,8 @@
if (g_slist_find_custom(*forbid, thistransport->xmlns, cmp_forbid))
continue;
- if (thistransport->priority > bestprio) {
+ if (thistransport->transtype == requestedtype &&
+ thistransport->priority > bestprio) {
bestprio = thistransport->priority;
besttransport = thistransport;
}
--- a/jingle/send.c Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/send.c Fri Jul 23 03:23:23 2010 +0200
@@ -79,7 +79,7 @@
accept.sid = jn->sid;
accept.content = NULL;
- sess = session_new(jn);
+ sess = session_new_from_jinglenode(jn);
for (child = jn->content; child; child = child->next) {
cn = (JingleContent *)(child->data);
@@ -99,7 +99,7 @@
scr_log_print(LPRINT_DEBUG, "jingle: New content accepted: %s", cn->name);
- session_add_content(sess, cn, JINGLE_SESSION_STATE_ACTIVE);
+ session_add_content_from_jinglecontent(sess, cn, JINGLE_SESSION_STATE_ACTIVE);
accept.content = g_slist_append(accept.content, cn);
}
--- a/jingle/sessions.c Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/sessions.c Fri Jul 23 03:23:23 2010 +0200
@@ -34,21 +34,29 @@
/**
* Create a new session and insert it in the linked list.
*/
-JingleSession *session_new(JingleNode *jn)
+JingleSession *session_new(const gchar *sid, const gchar *initiator,
+ const gchar *from)
{
JingleSession *js = g_new0(JingleSession, 1);
+
+ js->sid = g_strdup(sid);
+ js->initiator = g_strdup(initiator);
+ js->from = g_strdup(from);
+
+ sessions = g_slist_append(sessions, js);
+ return js;
+}
+
+JingleSession *session_new_from_jinglenode(JingleNode *jn)
+{
const gchar *from;
- js->sid = g_strdup(jn->sid);
- js->initiator = g_strdup(jn->initiator);
from = lm_message_get_from(jn->message);
if (!from) {
return NULL;
}
- js->from = g_strdup(from);
-
- sessions = g_slist_append(sessions, js);
- return js;
+
+ return session_new(jn->sid, jn->initiator, from);
}
JingleSession *session_find_by_sid(const gchar *sid, const gchar *from)
@@ -70,22 +78,48 @@
return session_find_by_sid(jn->sid, from);
}
-void session_add_content(JingleSession *sess, JingleContent *cn,
+void session_add_content(JingleSession *sess, const gchar *name,
SessionState state)
{
SessionContent *sc = g_new0(SessionContent, 1);
- sc->name = cn->name;
+ sc->name = name;
sc->state = state;
+
+ sess->content = g_slist_append(sess->content, sc);
+}
+
+void session_add_app(JingleSession *sess, const gchar *name,
+ const gchar *xmlns, gconstpointer data)
+{
+ SessionContent *sc = session_find_sessioncontent(sess, name);
- sc->xmlns_desc = lm_message_node_get_attribute(cn->description, "xmlns");
- sc->appfuncs = jingle_get_appfuncs(sc->xmlns_desc);
- sc->xmlns_trans = lm_message_node_get_attribute(cn->transport, "xmlns");
- sc->transfuncs = jingle_get_transportfuncs(sc->xmlns_trans);
- sc->description = sc->appfuncs->check(cn, NULL);
- sc->transport = sc->transfuncs->check(cn, NULL);
+ sc->xmlns_desc = xmlns;
+ sc->appfuncs = jingle_get_appfuncs(xmlns);
+ sc->description = data;
+}
+
+void session_add_trans(JingleSession *sess, const gchar *name,
+ const gchar *xmlns, gconstpointer data)
+{
+ SessionContent *sc = session_find_sessioncontent(sess, name);
- sess->content = g_slist_append(sess->content, sc);
+ sc->xmlns_trans = xmlns;
+ sc->transfuncs = jingle_get_transportfuncs(xmlns);
+ sc->transport = data;
+}
+
+void session_add_content_from_jinglecontent(JingleSession *sess, JingleContent *cn,
+ SessionState state)
+{
+ SessionContent *sc = g_new0(SessionContent, 1);
+ session_add_content(sess, cn->name, state);
+ session_add_app(sess, cn->name,
+ lm_message_node_get_attribute(cn->description, "xmlns"),
+ sc->appfuncs->check(cn, NULL));
+ session_add_trans(sess, cn->name,
+ lm_message_node_get_attribute(cn->transport, "xmlns"),
+ sc->transfuncs->check(cn, NULL));
}
SessionContent *session_find_sessioncontent(JingleSession *sess,
--- a/jingle/sessions.h Wed Jul 21 17:43:46 2010 +0200
+++ b/jingle/sessions.h Fri Jul 23 03:23:23 2010 +0200
@@ -35,10 +35,19 @@
JingleTransportFuncs *transfuncs;
} SessionContent;
-JingleSession *session_new(JingleNode *jn);
+JingleSession *session_new(const gchar *sid, const gchar *initiator,
+ const gchar *from);
+JingleSession *session_new_from_jinglenode(JingleNode *jn);
JingleSession *session_find_by_sid(const gchar *sid, const gchar *from);
JingleSession *session_find(const JingleNode *jn);
-void session_add_content(JingleSession *sess, JingleContent *cn, SessionState state);
+void session_add_content(JingleSession *sess, const gchar *name,
+ SessionState state);
+void session_add_app(JingleSession *sess, const gchar *name,
+ const gchar *xmlns, gconstpointer data);
+void session_add_trans(JingleSession *sess, const gchar *name,
+ const gchar *xmlns, gconstpointer data);
+void session_add_content_from_jinglecontent(JingleSession *sess, JingleContent *cn,
+ SessionState state);
SessionContent *session_find_sessioncontent(JingleSession *sess, const gchar *name);
SessionContent *session_find_transport(const gchar *xmlns_trans, gconstpointer data);
void session_remove_sessioncontent(JingleSession *sess, const gchar *name);