JFT: explode _jft_send
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Wed, 18 Aug 2010 23:38:02 +0200
changeset 146 2200a1c96af3
parent 145 bde23b68e126
child 147 c72010633a86
JFT: explode _jft_send
jingle-ft/filetransfer.c
--- a/jingle-ft/filetransfer.c	Wed Aug 18 10:42:55 2010 +0200
+++ b/jingle-ft/filetransfer.c	Wed Aug 18 23:38:02 2010 +0200
@@ -64,6 +64,7 @@
 static void _jft_send(char **args);
 static void _jft_info(char **args);
 static void _jft_flush(char **args);
+static JingleFT* _new(const gchar *name);
 
 const gchar *deps[] = { "jingle", NULL };
 
@@ -357,53 +358,84 @@
   scr_LogPrint(LPRINT_LOGNORM, "JFT: %i file%s removed", count, (count>1) ? "s" : "");
 }
 
-static void _jft_send(char **args)
+static JingleFT* _new(const gchar *name)
 {
-  gchar *filename;
   struct stat fileinfo;
-  
-  if (!args[1]) {
-  scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a name!");
-  free_arg_lst(args);
-    return;
+  GError *err = NULL;
+  gchar *filename = expand_filename(name); // expand ~ to HOME
+  JingleFT *jft = g_new0(JingleFT, 1);
+    
+  if (g_stat(filename, &fileinfo) != 0) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: unable to stat %s",
+                 filename);
+    g_free(jft);
+    return NULL;
   }
 
-  filename = expand_filename(args[1]); // expand ~ to HOME
-
-  if (g_stat(filename, &fileinfo) != 0) {
-    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: unable to stat %s",
-                 args[1]);
-    free_arg_lst(args);
-    return;
+  if (!S_ISREG(fileinfo.st_mode) || S_ISLNK(fileinfo.st_mode)) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File doesn't exist!");
+    g_free(jft);
+    return NULL;
+  }
+  
+  jft->desc = g_strdup(name);
+  jft->type = JINGLE_FT_OFFER;
+  jft->name = g_path_get_basename(filename);
+  jft->date = fileinfo.st_mtime;
+  jft->size = fileinfo.st_size;
+  jft->transmit = 0;
+  jft->state = JINGLE_FT_PENDING;
+  jft->dir = JINGLE_FT_OUTGOING;
+  jft->outfile = g_io_channel_new_file(filename, "r", &err);
+  if (jft->outfile == NULL || err != NULL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
+                 name);
+    g_error_free(err);
+    g_free(jft);
+    return NULL;
   }
 
-  if (!S_ISREG(fileinfo.st_mode) && !S_ISLNK(fileinfo.st_mode)) {
-    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File doesn't exist!");
-    free_arg_lst(args);
+  g_io_channel_set_encoding(jft->outfile, NULL, &err);
+  if (jft->outfile == NULL || err != NULL) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
+                 name);
+    g_error_free(err);
+    g_free(jft);
+    return NULL;
+  }
+  
+  return jft;
+}
+
+static void _jft_send(char **args)
+{
+  JingleFT *jft;
+
+  if (!args[1]) {
+    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a name!");
     return;
   }
 
   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Trying to send %s",
                args[1]);
 
+  if ((jft = _new(args[1])) == NULL)
+    return;
+  
   {
     JingleSession *sess;
     gchar *sid = jingle_generate_sid();
     gchar *ressource, *recipientjid;
     const gchar *namespaces[] = {NS_JINGLE, NS_JINGLE_APP_FT, NULL};
     const gchar *myjid = g_strdup(lm_connection_get_jid(lconnection));
-    JingleFT *jft = g_new0(JingleFT, 1);
-    GError *err = NULL;
 
     if (CURRENT_JID == NULL) { // CURRENT_JID = the jid of the user which has focus
       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Please, choose a valid JID in the roster");
-      free_arg_lst(args);
       return;
     }
     ressource = jingle_find_compatible_res(CURRENT_JID, namespaces);
     if (ressource == NULL) {
       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot send file, because there is no ressource available");
-      free_arg_lst(args);
       return;
     }
 
@@ -412,32 +444,6 @@
     sess = session_new(sid, myjid, recipientjid, JINGLE_SESSION_OUTGOING);
     session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
 
-    jft->desc = g_strdup(args[1]);
-    jft->type = JINGLE_FT_OFFER;
-    jft->name = g_path_get_basename(filename);
-    jft->date = fileinfo.st_mtime;
-    jft->size = fileinfo.st_size;
-    jft->transmit = 0;
-    jft->state = JINGLE_FT_PENDING;
-    jft->dir = JINGLE_FT_OUTGOING;
-    jft->outfile = g_io_channel_new_file (filename, "r", &err);
-    if (jft->outfile == NULL || err != NULL) {
-      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
-                   args[1]);
-      g_error_free(err);
-      free_arg_lst(args);
-      return;
-    }
-
-    g_io_channel_set_encoding(jft->outfile, NULL, &err);
-    if (jft->outfile == NULL || err != NULL) {
-      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
-                   args[1]);
-      g_error_free(err);
-      free_arg_lst(args);
-      return;
-    }
-
     session_add_app(sess, "file", NS_JINGLE_APP_FT, jft);
 
     {
@@ -592,7 +598,7 @@
   }
 
   if (status == G_IO_STATUS_ERROR || err != NULL) {
-    jft->statut = JINGLE_FT_ERROR;
+    jft->state = JINGLE_FT_ERROR;
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s", err->message);
     g_error_free(err);
     return;