JFT: add retry
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Thu, 26 Aug 2010 10:28:51 +0200
changeset 160 e149e868d501
parent 159 1df5f5e3f1e7
child 161 fa1d993d05b6
JFT: add retry
jingle-ft/filetransfer.c
jingle-ft/filetransfer.h
--- a/jingle-ft/filetransfer.c	Wed Aug 25 17:15:49 2010 +0200
+++ b/jingle-ft/filetransfer.c	Thu Aug 26 10:28:51 2010 +0200
@@ -61,7 +61,7 @@
 static void _free(JingleFT *jft);
 static gboolean _check_hash(const gchar *hash1, GChecksum *md5);
 static gboolean _is_md5_hash(const gchar *hash);
-static void _jft_send(char **args);
+static void _jft_send(char **args, JingleFT *jft);
 static void _jft_info(char **args);
 static void _jft_flush(char **args);
 static JingleFT* _new(const gchar *name);
@@ -422,11 +422,11 @@
   return jft;
 }
 
-static void _jft_send(char **args)
+static void _jft_send(char **args, JingleFT *jft2)
 {
-  JingleFT *jft;
+  JingleFT *jft = jft2;
 
-  if (!args[1]) {
+  if (jft == NULL && !args[1]) {
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a name!");
     return;
   }
@@ -434,7 +434,7 @@
   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Trying to send %s",
                args[1]);
 
-  if ((jft = _new(args[1])) == NULL)
+  if (jft == NULL && (jft = _new(args[1])) == NULL)
     return;
   
   {
@@ -465,16 +465,54 @@
   }
 }
 
+static void _jft_retry(char **args)
+{
+  GSList *el;
+  JingleFT *jft;
+  JingleFTInfo *jftinf;
+  gint index = g_ascii_strtoll(args[1], NULL, 10);
+  for (el = info_list; el; el = el->next) {
+    jftinf = el->data;
+    if (jftinf->index == index);
+      break;
+  }
+  
+  if (!args[1]) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a number!");
+    return;  
+  }
+  
+
+  
+  if (el == NULL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a correct number!");
+    return;  
+  }
+  
+  jft = jftinf->jft;
+  jft->hash = NULL;
+  jft->size = 0;
+  jft->transmit = 0;
+  jft->outfile = NULL;
+  jft->state = JINGLE_FT_PENDING;
+  jft->desc = NULL;
+  jft->md5 = NULL;
+  
+  _jft_send(args, jft);
+}
+
 static void do_sendfile(char *arg)
 {
   char **args = split_arg(arg, 3, 0);
 
   if (!g_strcmp0(args[0], "send"))
-    _jft_send(args);
+    _jft_send(args, NULL);
   else if (!g_strcmp0(args[0], "info"))
     _jft_info(args);
   else if (!g_strcmp0(args[0], "flush"))
     _jft_flush(args);
+  else if (!g_strcmp0(args[0], "retry"))
+    _jft_retry(args);
   else
     scr_LogPrint(LPRINT_LOGNORM, "/jft: %s is not a correct option.", args[0]);
 
@@ -486,7 +524,8 @@
   g_free(jft->hash);
   g_free(jft->name);
   g_free(jft->desc);
-  g_io_channel_unref(jft->outfile);
+  if (jft->outfile != NULL)
+    g_io_channel_unref(jft->outfile);
   if (jft->dir == JINGLE_FT_INCOMING)
     g_checksum_free(jft->md5);
   g_free(jft);
--- a/jingle-ft/filetransfer.h	Wed Aug 25 17:15:49 2010 +0200
+++ b/jingle-ft/filetransfer.h	Thu Aug 26 10:28:51 2010 +0200
@@ -116,7 +116,7 @@
   /**
    * An index. Not use now, but will in the futur to cancel a transfer.
    */
-  int index;
+  gint index;
   
   /**
    * The link to the JingleFT in the session.