New functions in sessions
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 23 Jul 2010 03:23:23 +0200
changeset 67 c12618793df0
parent 66 cd16ab43a285
child 68 ae8b0d03887e
New functions in sessions
jingle-filetransfer/filetransfer.c
jingle/action-handlers.c
jingle/jingle.c
jingle/jingle.h
jingle/register.c
jingle/send.c
jingle/sessions.c
jingle/sessions.h
--- 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);