# HG changeset patch # User Nicolas Cornu # Date 1282167482 -7200 # Node ID 2200a1c96af3b0f0a30554ad7cfdaac170036ae7 # Parent bde23b68e126c2f0fb33a3dfa02bdd137b3a7e06 JFT: explode _jft_send diff -r bde23b68e126 -r 2200a1c96af3 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;