JFT: handle data app
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Thu, 12 Aug 2010 23:49:48 +0200
changeset 103 c34b513be8d9
parent 102 ec430b98c115
child 104 060e69633902
JFT: handle data app
jingle-filetransfer/filetransfer.c
jingle/register.h
jingle/send.c
jingle/sessions.c
jingle/sessions.h
--- a/jingle-filetransfer/filetransfer.c	Thu Aug 12 01:14:03 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c	Thu Aug 12 23:49:48 2010 +0200
@@ -46,7 +46,8 @@
 gconstpointer jingle_ft_check(JingleContent *cn, GError **err);
 void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node);
 gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len);
-void jingle_ft_start(gconstpointer data, gsize size);
+void jingle_ft_start(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
+void jingle_ft_send(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
 static gboolean is_md5_hash(const gchar *hash);
 static void jingle_ft_init(void);
 static void jingle_ft_uninit(void);
@@ -56,7 +57,9 @@
 static JingleAppFuncs funcs = {
   jingle_ft_check,
   jingle_ft_tomessage,
-  jingle_ft_handle_data
+  jingle_ft_handle_data,
+  jingle_ft_start,
+  jingle_ft_send
 };
 
 module_info_t info_jingle_filetransfer = {
@@ -322,13 +325,17 @@
   lm_message_unref(r);
 }
 
-void jingle_ft_send(JingleSession *sess, SessionContent *sc, gsize size)
+void jingle_ft_send(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size)
 {
-  JingleFT *jft = (JingleFT*)(sc->description);
+  JingleFT *jft = (JingleFT*)(data);
   gchar *buf = g_new0(gchar, size);
   gsize read;
   GIOStatus status;
   int count = 0;
+  JingleSession *sess = session_find_by_sid(sid, from);
+  // TODO: sess == NULL
+  
+  SessionContent *sc = session_find_sessioncontent(sess, name);
   
   do {
     count++;
@@ -349,7 +356,7 @@
   g_checksum_update(jft->md5, (guchar*)buf, read);
   
   // Call a handle in jingle who will call the trans
-  handle_app_data(sess, sc, buf, read);
+  handle_app_data(sid, name, from, buf, read);
   
   g_free(buf);
   
@@ -357,21 +364,28 @@
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name);
     jft->hash = g_strdup(g_checksum_get_string(jft->md5));
     // Call a function to say state is ended
+    session_changestate_sessioncontent(sess, sc->name, JINGLE_SESSION_STATE_ENDED);
     // Send the hash
     jingle_ft_send_hash(sess->sid, sess->to, jft->hash);
     g_checksum_free(jft->md5);
     
-    // Wait the session-terminate
+    // Send a session-terminate (success)
+    
   }
 }
 
-void jingle_ft_start(gchar *sid, gchar *name, gconstpointer data, gsize size)
+void jingle_ft_start(const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size)
 {
   JingleFT *jft = (JingleFT*)data;
   
+  JingleSession *sess = session_find_by_sid(sid, from);
+  // TODO: sess == NULL
+  
+  SessionContent *sc = session_find_sessioncontent(sess, name);
+
   jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
   
-  jingle_ft_send(sid, name, data, size);
+  sc->appfuncs->send(sid, name, from, data, size);
 }
 
 static void jingle_ft_init(void)
--- a/jingle/register.h	Thu Aug 12 01:14:03 2010 +0200
+++ b/jingle/register.h	Thu Aug 12 23:49:48 2010 +0200
@@ -3,7 +3,6 @@
 
 #include <jingle/jingle.h>
 
-
 #define NS_JINGLE_APP_PREFIX       "urn:xmpp:jingle:apps:"
 #define NS_JINGLE_TRANSPORT_PREFIX "urn:xmpp:jingle:transports:"
 
@@ -38,7 +37,8 @@
 typedef gconstpointer (*JingleAppCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleAppToMessage) (gconstpointer data, LmMessageNode *node);
 typedef gboolean (*JingleAppHandleData) (gconstpointer data, const gchar *data2, guint len);
-typedef void (*JingleAppStart) (gconstpointer data, gsize size);
+typedef void (*JingleAppStart) (const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
+typedef void (*JingleAppSend) (const gchar *sid, const gchar *from, const gchar *name, gconstpointer data, gsize size);
 
 typedef gconstpointer (*JingleTransportCheck) (JingleContent *cn, GError **err);
 typedef void (*JingleTransportToMessage) (gconstpointer data, LmMessageNode *node);
@@ -57,6 +57,8 @@
   JingleAppHandleData handle_data;
   
   JingleAppStart start;
+  
+  JingleAppSend send;
 
 } JingleAppFuncs;
 
--- a/jingle/send.c	Thu Aug 12 01:14:03 2010 +0200
+++ b/jingle/send.c	Thu Aug 12 23:49:48 2010 +0200
@@ -74,7 +74,7 @@
     for (child = sess->content; child; child = child->next) {
       sc = (SessionContent*)child->data;
       // TODO size!
-      sc->appfuncs->start(sc, 2048); 
+      sc->appfuncs->start(sess->sid, sess->from, sc->name, sc->description, 2048);
     }
     return;
   }
--- a/jingle/sessions.c	Thu Aug 12 01:14:03 2010 +0200
+++ b/jingle/sessions.c	Thu Aug 12 23:49:48 2010 +0200
@@ -21,10 +21,11 @@
 
 #include <glib.h>
 
+#include <mcabber/logprint.h>
+
 #include <jingle/jingle.h>
 #include <jingle/sessions.h>
 #include <jingle/register.h>
-#include <mcabber/logprint.h>
 
 static GSList *sessions;
 
@@ -271,8 +272,10 @@
   content->appfuncs->tomessage(content->description, node);
 }
 
-void handle_app_data(JingleSession *sess, SessionContent *sc, gchar *data, gsize size)
+void handle_app_data(const gchar *sid, const gchar *from, const gchar *name, gchar *data, gsize size)
 {
   // TODO: verify that the module is always loaded
-  sc->transfuncs->send(sess->to, sc->transport, data, size);
+  JingleSession *sess = session_find_by_sid(sid, from);
+  SessionContent *sc = session_find_sessioncontent(sess, name);
+sc->transfuncs->send(sess->to, sc->transport, data, size);
 }
--- a/jingle/sessions.h	Thu Aug 12 01:14:03 2010 +0200
+++ b/jingle/sessions.h	Thu Aug 12 23:49:48 2010 +0200
@@ -98,6 +98,6 @@
 LmMessage *lm_message_from_jinglesession(const JingleSession *js,
                                          JingleAction action);
 
-void handle_app_data(JingleSession *sess, SessionContent *sc, gchar *data, gsize size);
+void handle_app_data(const gchar *sid, const gchar* from, const gchar *name, gchar *data, gsize size);
 
 #endif