transfer work
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 13 Aug 2010 15:17:52 +0200
changeset 106 2942c71f434a
parent 105 c31988e107b3
child 107 a7f14a5e112c
transfer work
jingle-filetransfer/filetransfer.c
jingle-ibb/ibb.c
--- a/jingle-filetransfer/filetransfer.c	Fri Aug 13 13:53:12 2010 +0200
+++ b/jingle-filetransfer/filetransfer.c	Fri Aug 13 15:17:52 2010 +0200
@@ -155,11 +155,6 @@
   return (gconstpointer) ft;
 }
 
-gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len)
-{
-  return FALSE;
-}
-
 static gboolean is_md5_hash(const gchar *hash)
 {
   int i = 0;
@@ -172,7 +167,7 @@
     return FALSE;
 }
 
-gboolean handle_data(gconstpointer jingleft, const gchar *data, guint len)
+gboolean jingle_ft_handle_data(gconstpointer jingleft, const gchar *data, guint len)
 {
   JingleFT *ft = (JingleFT *) jingleft;
   GError *err = NULL;
@@ -188,9 +183,10 @@
       return FALSE;
 	}
   }
+
   status = g_io_channel_write_chars(ft->outfile, data, (gssize) len,
                                     &bytes_written, &err);
-
+  g_io_channel_flush (ft->outfile, NULL);
   if (status != G_IO_STATUS_NORMAL || err != NULL) {
     return FALSE;
   }
@@ -255,6 +251,11 @@
     jft->date = fileinfo.st_mtime;
     jft->size = fileinfo.st_size;
     jft->outfile = g_io_channel_new_file (filename, "r", NULL);
+    if (jft->outfile == NULL) {
+      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot open file %s", args[1]);
+      return;
+    }
+    
     g_io_channel_set_encoding(jft->outfile, NULL, NULL);
     
     session_add_app(sess, "file", NS_JINGLE_APP_FT, jft);
--- a/jingle-ibb/ibb.c	Fri Aug 13 13:53:12 2010 +0200
+++ b/jingle-ibb/ibb.c	Fri Aug 13 15:17:52 2010 +0200
@@ -23,10 +23,12 @@
 
 #include <glib.h>
 
+#include <mcabber/xmpp.h>
 #include <mcabber/modules.h>
 #include <mcabber/utils.h>
 #include <mcabber/xmpp_helper.h>
 #include <mcabber/logprint.h>
+#include <mcabber/hooks.h>
 
 #include <jingle/jingle.h>
 #include <jingle/check.h>
@@ -46,6 +48,8 @@
 static void jingle_ibb_init(void);
 static void jingle_ibb_uninit(void);
 
+static guint connect_hid = 0;
+static guint disconn_hid = 0;
 
 const gchar *deps[] = { "jingle", NULL };
 
@@ -212,7 +216,7 @@
 {
   JingleIBB *jibb = (JingleIBB*)data;
   JingleAckHandle *ackhandle;
-  gchar *base64 = g_base64_encode((const guchar *)data, size);
+  gchar *base64 = g_base64_encode((const guchar *)buf, size);
   gchar *seq = g_strdup_printf("%" G_GINT64_FORMAT, jibb->seq);
   
   LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
@@ -236,9 +240,48 @@
   g_free(base64);
 }
 
+static void jingle_ibb_unregister_lm_handlers(void)
+{
+  if (lconnection) {
+    lm_connection_unregister_message_handler(lconnection, jingle_ibb_handler,
+        LM_MESSAGE_TYPE_IQ);
+  }
+}
+
+static void jingle_ibb_register_lm_handlers(void)
+{
+  jingle_ibb_unregister_lm_handlers();
+  if (lconnection) {
+    lm_connection_register_message_handler(lconnection, jingle_ibb_handler,
+        LM_MESSAGE_TYPE_IQ,
+        LM_HANDLER_PRIORITY_FIRST);
+  }
+}
+
+static guint jingle_ibb_connect_hh(const gchar *hname, hk_arg_t *args,
+                               gpointer ignore)
+{
+  jingle_ibb_register_lm_handlers();
+  return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
+static guint jingle_ibb_disconn_hh(const gchar *hname, hk_arg_t *args,
+                               gpointer ignore)
+{
+  jingle_ibb_unregister_lm_handlers();
+  return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+}
+
 static void jingle_ibb_init(void)
 {
   jingle_ibb_handler = lm_message_handler_new(jingle_ibb_handle_iq, NULL, NULL);
+  
+  connect_hid = hk_add_handler(jingle_ibb_connect_hh, HOOK_POST_CONNECT,
+      G_PRIORITY_DEFAULT_IDLE, NULL);
+  disconn_hid = hk_add_handler(jingle_ibb_disconn_hh, HOOK_PRE_DISCONNECT,
+      G_PRIORITY_DEFAULT_IDLE, NULL);
+  jingle_ibb_register_lm_handlers();
+  
   jingle_register_transport(NS_JINGLE_TRANSPORT_IBB, &funcs,
                             JINGLE_TRANSPORT_STREAMING,
                             JINGLE_TRANSPORT_LOW);