jingle-filetransfer/filetransfer.c
author Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Mon, 16 Aug 2010 19:31:50 +0200
changeset 134 8c98308c139d
parent 133 361d8577ebd1
child 135 06b7c6f1c05c
permissions -rw-r--r--
Correct a bug
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     1
/*
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     2
 * filetransfer.c
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     3
 *
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     4
 * Copyrigth (C) 2010 Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     5
 *
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
     9
 * your option) any later version.
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    10
 *
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    14
 * General Public License for more details.
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    15
 *
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    19
 * USA
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    20
 */
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    22
#include "config.h"
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    23
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    24
#include <glib.h>
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
    25
#include <glib/gstdio.h>
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
    26
#include <string.h>
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    27
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    28
#include <mcabber/modules.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    29
#include <mcabber/utils.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    30
#include <mcabber/xmpp_helper.h>
56
2ee6da0e59cb Add a option with the directory where to store files transfered
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 54
diff changeset
    31
#include <mcabber/settings.h>
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
    32
#include <mcabber/logprint.h>
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
    33
#include <mcabber/compl.h>
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
    34
#include <mcabber/commands.h>
74
7f0e16bb1768 Little commit
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 72
diff changeset
    35
#include <mcabber/roster.h>
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
    36
#include <mcabber/utils.h>
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    37
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    38
#include <jingle/jingle.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    39
#include <jingle/check.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    40
#include <jingle/register.h>
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
    41
#include <jingle/sessions.h>
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
    42
#include <jingle/send.h>
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    43
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    44
#include "filetransfer.h"
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    45
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    46
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    47
static gconstpointer check(JingleContent *cn, GError **err);
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    48
static gboolean handle(JingleAction action, gconstpointer data, LmMessageNode *node);
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    49
static void tomessage(gconstpointer data, LmMessageNode *node);
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    50
static gboolean handle_data(gconstpointer data, const gchar *data2, guint len);
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    51
static void start(session_content *sc);
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    52
static void send(session_content *sc);
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    53
static void stop(gconstpointer data);
128
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
    54
static gchar* info(gconstpointer data);
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    55
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
    56
static gboolean is_md5_hash(const gchar *hash);
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    57
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    58
static void jingle_ft_init(void);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    59
static void jingle_ft_uninit(void);
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
    60
// Return must be free
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
    61
static gchar *_convert_size(guint64 size);
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    62
static int _next_index(void);
134
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
    63
static void _free(JingleFT *jft);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    64
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    65
const gchar *deps[] = { "jingle", NULL };
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    66
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
    67
static GSList *info_list = NULL;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
    68
static guint jft_cid = 0;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
    69
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    70
const gchar* strstate[] = {
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    71
  "PENDING",
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    72
  "STARTING",
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    73
  "ENDING",
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    74
  "REJECT",
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    75
  "ERROR"
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    76
};
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
    77
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
    78
static JingleAppFuncs funcs = {
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    79
  .check        = check,
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    80
  .handle       = handle,
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    81
  .tomessage    = tomessage,
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    82
  .handle_data  = handle_data,
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    83
  .start        = start,
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
    84
  .send         = send,
128
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
    85
  .stop         = stop,
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
    86
  .info         = info
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    87
};
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    88
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    89
module_info_t info_jingle_filetransfer = {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    90
  .branch          = MCABBER_BRANCH,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    91
  .api             = MCABBER_API_VERSION,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    92
  .version         = PROJECT_VERSION,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    93
  .description     = "Jingle File Transfer (XEP-0234)\n",
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    94
  .requires        = deps,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    95
  .init            = jingle_ft_init,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    96
  .uninit          = jingle_ft_uninit,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    97
  .next            = NULL,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    98
};
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    99
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   100
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   101
static gconstpointer check(JingleContent *cn, GError **err)
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   102
{
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   103
  JingleFT *ft = NULL;
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
   104
  LmMessageNode *node;
88
8b12ebd75c1a Change the size to an guint64 and use the G_GUINT64_FORMAT.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 87
diff changeset
   105
  gint64 tmpsize;
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   106
  const gchar *datestr, *sizestr;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   107
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
   108
  node = lm_message_node_get_child(cn->description, "offer");
60
05184a1846d1 IBB: Create a Lm with a gconstpointer
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 59
diff changeset
   109
 
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   110
  if (!node) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   111
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_MISSING,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   112
                "the offer element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   113
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   114
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   115
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
   116
  node = lm_message_node_get_child(node, "file");
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   117
  if (!node) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   118
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_MISSING,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   119
                "the file element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   120
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   121
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   122
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   123
  if (g_strcmp0(lm_message_node_get_attribute(node, "xmlns"), NS_SI_FT)) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   124
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_MISSING,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   125
                "the file transfer offer has an invalid/unsupported namespace");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   126
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   127
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   128
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   129
  ft = g_new0(JingleFT, 1);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   130
  datestr  = lm_message_node_get_attribute(node, "date");
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   131
  ft->hash = (gchar *) lm_message_node_get_attribute(node, "hash");
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   132
  ft->name = (gchar *) lm_message_node_get_attribute(node, "name");
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   133
  sizestr  = lm_message_node_get_attribute(node, "size");
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   134
  ft->transmit = 0;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   135
  ft->dir = JINGLE_FT_INCOMING;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   136
  
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   137
  if (!ft->name || !sizestr) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   138
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_MISSING,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   139
                "an attribute of the file element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   140
    g_free(ft);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   141
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   142
  }
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   143
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   144
  ft->date = from_iso8601(datestr, 1);
88
8b12ebd75c1a Change the size to an guint64 and use the G_GUINT64_FORMAT.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 87
diff changeset
   145
  tmpsize = g_ascii_strtoll(sizestr, NULL, 10);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   146
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   147
  // the size attribute is a xs:integer an therefore can be negative.
88
8b12ebd75c1a Change the size to an guint64 and use the G_GUINT64_FORMAT.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 87
diff changeset
   148
  if (tmpsize < 0) {
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   149
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   150
                "the offered file has a negative size");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   151
    g_free(ft);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   152
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   153
  }
88
8b12ebd75c1a Change the size to an guint64 and use the G_GUINT64_FORMAT.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 87
diff changeset
   154
  ft->size = tmpsize;
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   155
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   156
  ft->name = g_path_get_basename(ft->name);
58
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   157
  
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   158
  if (settings_opt_get("jingle_ft_dir") != NULL)
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   159
    ft->name = g_build_filename(settings_opt_get("jingle_ft_dir"), ft->name, NULL);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   160
  else
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   161
    ft->name = g_build_filename("/tmp", ft->name, NULL);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   162
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   163
  if (!g_strcmp0(ft->name, ".")) {
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   164
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE,
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   165
                "the offered file has an invalid filename");
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   166
    g_free(ft->name);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   167
    g_free(ft);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   168
    return NULL;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   169
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   170
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   171
  // check if the md5 hash is valid ([a-fA-F0-9){32})
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   172
  if (ft->hash != NULL && (strlen(ft->hash) != 32 || !is_md5_hash(ft->hash))) {
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   173
    g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE,
119
0b9a7b505079 create the session when receiving a session-initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 115
diff changeset
   174
                "the offered file has an invalid hash");
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   175
    g_free(ft->name);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   176
    g_free(ft);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   177
    return NULL;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   178
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   179
  ft->hash = g_strndup(ft->hash, 32);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   180
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   181
  {
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   182
    JingleFTInfo *jfti = g_new0(JingleFTInfo, 1);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   183
    jfti->index = _next_index();
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   184
    jfti->jft = ft;
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   185
    info_list = g_slist_append(info_list, jfti);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   186
  }
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   187
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   188
  return (gconstpointer) ft;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   189
}
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   190
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   191
static gboolean handle(JingleAction action, gconstpointer data,
119
0b9a7b505079 create the session when receiving a session-initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 115
diff changeset
   192
                          LmMessageNode *node)
111
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   193
{
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   194
  if (action == JINGLE_SESSION_INFO) {
119
0b9a7b505079 create the session when receiving a session-initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 115
diff changeset
   195
    if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"),
0b9a7b505079 create the session when receiving a session-initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 115
diff changeset
   196
                   NS_JINGLE_APP_FT_INFO)
111
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   197
        && !g_strcmp0(node->name, "hash")) {
119
0b9a7b505079 create the session when receiving a session-initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 115
diff changeset
   198
      ((JingleFT *)data)->hash = g_strdup(lm_message_node_get_value(node));
115
cae0cb7eff45 JS5: Add a CMakeList
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 114
diff changeset
   199
      return TRUE;
111
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   200
	}
115
cae0cb7eff45 JS5: Add a CMakeList
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 114
diff changeset
   201
	return FALSE;
111
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   202
  }
115
cae0cb7eff45 JS5: Add a CMakeList
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 114
diff changeset
   203
  return FALSE;
111
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   204
}
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   205
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   206
static gboolean is_md5_hash(const gchar *hash)
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   207
{
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   208
  int i = 0;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   209
  for (i = 0; i < 32 && hash[i]; i++)
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   210
    if (!g_ascii_isxdigit(hash[i])) break;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   211
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
   212
  if (i == 32)
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   213
    return TRUE;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   214
  else
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   215
    return FALSE;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   216
}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   217
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   218
static gboolean handle_data(gconstpointer jingleft, const gchar *data, guint len)
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   219
{
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   220
  JingleFT *jft = (JingleFT *) jingleft;
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   221
  GError *err = NULL;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   222
  GIOStatus status;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   223
  gsize bytes_written = 0;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   224
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   225
  if (jft->dir != JINGLE_FT_INCOMING)
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   226
    return FALSE;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   227
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   228
  if (jft->md5 == NULL) {
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   229
    jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   230
  }
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   231
  
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   232
  g_checksum_update(jft->md5, (guchar*)data, (gsize)len);
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   233
    
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   234
  // TODO: check if the file already exist or if it was created
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   235
  // during the call to jingle_ft_check and handle_data
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   236
  if (jft->outfile == NULL) {
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   237
    jft->outfile = g_io_channel_new_file(jft->name, "w", &err);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   238
    if (jft->outfile == NULL || err != NULL) {
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   239
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   240
                   jft->name);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   241
    //TODO: propagate the GError ?
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   242
      g_error_free(err);
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   243
      return FALSE;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   244
	}
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   245
	jft->state = JINGLE_FT_STARTING;
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   246
	status = g_io_channel_set_encoding(jft->outfile, NULL, &err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   247
	if (status != G_IO_STATUS_NORMAL || err != NULL) {
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   248
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   249
                  jft->name);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   250
     g_error_free(err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   251
     return FALSE;
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   252
   }
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   253
  }
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   254
  
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   255
  jft->state = JINGLE_FT_STARTING;
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   256
	
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   257
  status = g_io_channel_write_chars(jft->outfile, data, (gssize) len,
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   258
                                    &bytes_written, &err);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   259
  if (status != G_IO_STATUS_NORMAL || err != NULL) {
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   260
     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   261
                  jft->name);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   262
    g_error_free(err);
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   263
    return FALSE;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   264
  }
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   265
  status = g_io_channel_flush(jft->outfile, &err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   266
  if (status != G_IO_STATUS_NORMAL || err != NULL) {
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   267
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   268
                 jft->name);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   269
    g_error_free(err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   270
    return FALSE;
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   271
  }
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   272
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   273
  if (bytes_written != len) {
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   274
    // not supposed to happen if status is normal, unless outfile is non-blocking
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   275
    return FALSE;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   276
  }
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   277
  
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   278
  jft->transmit += len;
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   279
  return TRUE;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   280
}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   281
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   282
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   283
static int _next_index(void)
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   284
{
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   285
  static int a = 0;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   286
  return a++;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   287
}
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   288
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   289
static void do_sendfile(char *arg)
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   290
{
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   291
  char **args = split_arg(arg, 3, 0);
93
4038cce7fd80 Expand ~ in /sendfile, fix the way we handle creator and senders.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 89
diff changeset
   292
  gchar *filename;
112
77d68793ce61 JFT: check if it's a regular file with g_stat
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 111
diff changeset
   293
  struct stat fileinfo;
77d68793ce61 JFT: check if it's a regular file with g_stat
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 111
diff changeset
   294
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   295
  if (!g_strcmp0(args[0], "send")) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   296
	  if (!args[1]) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   297
		 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a name!");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   298
		 free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   299
		 return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   300
	  }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   301
	  
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   302
	  filename = expand_filename(args[1]); // expand ~ to HOME
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   303
	  
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   304
	  if (g_stat(filename, &fileinfo) != 0) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   305
		 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: unable to stat %s",
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   306
		              args[1]);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   307
		 free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   308
		 return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   309
	  }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   310
	  
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   311
	  if (!S_ISREG(fileinfo.st_mode) && !S_ISLNK(fileinfo.st_mode)) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   312
		 scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File doesn't exist!");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   313
		 free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   314
		 return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   315
	  }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   316
	  
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   317
	  scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Trying to send %s",
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   318
		            args[1]);
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   319
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   320
	  {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   321
		 JingleSession *sess;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   322
		 gchar *sid = jingle_generate_sid();
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   323
		 gchar *ressource, *recipientjid;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   324
		 const gchar *namespaces[] = {NS_JINGLE, NS_JINGLE_APP_FT, NULL};
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   325
		 const gchar *myjid = g_strdup(lm_connection_get_jid(lconnection));
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   326
		 JingleFT *jft = g_new0(JingleFT, 1);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   327
		 GError *err = NULL;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   328
		 
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   329
		 if (CURRENT_JID == NULL) { // CURRENT_JID = the jid of the user which has focus
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   330
		   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Please, choose a valid JID in the roster");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   331
		   free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   332
		   return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   333
		 }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   334
		 ressource = jingle_find_compatible_res(CURRENT_JID, namespaces);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   335
		 if (ressource == NULL) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   336
		   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot send file, because there is no ressource available");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   337
		   free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   338
		   return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   339
		 }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   340
		 
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   341
		 recipientjid = g_strdup_printf("%s/%s", CURRENT_JID, ressource);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   342
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   343
		 sess = session_new(sid, myjid, recipientjid, JINGLE_SESSION_OUTGOING);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   344
		 session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   345
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   346
		 jft->desc = g_strdup(args[1]);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   347
		 jft->type = JINGLE_FT_OFFER;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   348
		 jft->name = g_path_get_basename(filename);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   349
		 jft->date = fileinfo.st_mtime;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   350
		 jft->size = fileinfo.st_size;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   351
		 jft->transmit = 0;
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   352
		 jft->state = JINGLE_FT_PENDING;
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   353
		 jft->dir = JINGLE_FT_OUTGOING;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   354
		 jft->outfile = g_io_channel_new_file (filename, "r", &err);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   355
		 if (jft->outfile == NULL || err != NULL) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   356
		   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   357
		                args[1]);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   358
		   g_error_free(err);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   359
		   free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   360
		   return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   361
		 }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   362
		 
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   363
		 g_io_channel_set_encoding(jft->outfile, NULL, &err);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   364
		 if (jft->outfile == NULL || err != NULL) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   365
		   scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s %s", err->message,
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   366
		                args[1]);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   367
		   g_error_free(err);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   368
		   free_arg_lst(args);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   369
		   return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   370
		 }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   371
		 
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   372
		 session_add_app(sess, "file", NS_JINGLE_APP_FT, jft);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   373
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   374
		 {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   375
		   JingleFTInfo *jfti = g_new0(JingleFTInfo, 1);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   376
		   jfti->index = _next_index();
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   377
		   jfti->jft = jft;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   378
		   info_list = g_slist_append(info_list, jfti);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   379
		 }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   380
		 
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   381
		 jingle_handle_app(sess, "file", NS_JINGLE_APP_FT, jft, recipientjid);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   382
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   383
		 g_free(ressource);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   384
		 g_free(sid);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   385
	  }
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   386
  } else if (!g_strcmp0(args[0], "info")) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   387
    GSList *el = info_list;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   388
    
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   389
    if (!info_list)
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   390
      scr_LogPrint(LPRINT_LOGNORM, "JFT: no file");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   391
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   392
    for (el = info_list; el; el = el->next) {
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   393
      JingleFTInfo *jftio = el->data;
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   394
      gchar *strsize = _convert_size(jftio->jft->size);
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   395
      scr_LogPrint(LPRINT_LOGNORM, "[%i]%s %s %s %.2f%%: %s %s", jftio->index, 
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   396
                   (jftio->jft->dir == JINGLE_FT_INCOMING)?"<==":"-->",
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   397
                   jftio->jft->name, strsize,
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   398
                   (gfloat)jftio->jft->transmit/(gfloat)jftio->jft->size * 100,
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   399
                   jftio->jft->desc?jftio->jft->desc:"",
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   400
                   strstate[jftio->jft->state]);
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   401
      g_free(strsize);
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   402
    }
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   403
  } else if (!g_strcmp0(args[0], "flush")) {
134
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   404
    GSList *el, *el2 = info_list;
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   405
    int count = 0;
134
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   406
    el = info_list;
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   407
    while (el) {
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   408
      JingleFTInfo *jftinf;
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   409
      jftinf = el->data;
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   410
      if (jftinf->jft->state == JINGLE_FT_ERROR ||
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   411
          jftinf->jft->state == JINGLE_FT_REJECT ||
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   412
          jftinf->jft->state == JINGLE_FT_ENDING) {
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   413
        count++;
134
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   414
        _free(jftinf->jft);
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   415
        info_list = g_slist_delete_link(info_list, el);
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   416
        if (info_list == NULL)
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   417
          break;
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   418
        el = el2;
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   419
        continue;
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   420
      }
134
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   421
      el2 = el;
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   422
      el = el->next;
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   423
    }
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   424
    scr_LogPrint(LPRINT_LOGNORM, "JFT: %i files removed", count);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   425
  } else {
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   426
    scr_LogPrint(LPRINT_LOGNORM, "/jft: %s is not a correct option.", args[1]);
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   427
  }
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   428
  
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   429
  free_arg_lst(args);
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   430
}
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   431
134
8c98308c139d Correct a bug
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 133
diff changeset
   432
static void _free(JingleFT *jft)
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   433
{
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   434
  g_free(jft->hash);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   435
  g_free(jft->name);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   436
  g_free(jft->desc);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   437
  g_io_channel_unref(jft->outfile);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   438
  if (jft->dir == JINGLE_FT_INCOMING)
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   439
    g_checksum_free(jft->md5);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   440
  g_free(jft);
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   441
}
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   442
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   443
static void tomessage(gconstpointer data, LmMessageNode *node)
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   444
{
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   445
  JingleFT *jft = (JingleFT*) data;
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   446
  gchar *size = NULL;
120
3e2085a44a5c Last strdup
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 119
diff changeset
   447
  gchar date[19];
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   448
  
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   449
  if (lm_message_node_get_child(node, "description") != NULL)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   450
    return;
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   451
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   452
  LmMessageNode *node2 = lm_message_node_add_child(node, "description", NULL);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   453
  lm_message_node_set_attribute(node2, "xmlns", NS_JINGLE_APP_FT);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   454
  if (jft->type == JINGLE_FT_OFFER)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   455
    node2 = lm_message_node_add_child(node2, "offer", NULL);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   456
  else
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   457
    node2 = lm_message_node_add_child(node2, "request", NULL);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   458
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   459
  node2 = lm_message_node_add_child(node2, "file", NULL);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   460
88
8b12ebd75c1a Change the size to an guint64 and use the G_GUINT64_FORMAT.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 87
diff changeset
   461
  size = g_strdup_printf("%" G_GUINT64_FORMAT, jft->size);
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   462
  
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   463
  lm_message_node_set_attributes(node2, "xmlns", NS_SI_FT,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   464
                                 "name", jft->name,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   465
                                 "size", size,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   466
                                 NULL);
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   467
  g_free(size);
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   468
  
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   469
  if (jft->hash != NULL)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   470
    lm_message_node_set_attribute(node2, "hash", jft->hash);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   471
120
3e2085a44a5c Last strdup
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 119
diff changeset
   472
  if (jft->date)
3e2085a44a5c Last strdup
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 119
diff changeset
   473
    if (!to_iso8601(date, jft->date))
3e2085a44a5c Last strdup
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 119
diff changeset
   474
      lm_message_node_set_attribute(node2, "date", date);
3e2085a44a5c Last strdup
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 119
diff changeset
   475
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   476
  if (jft->desc != NULL)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   477
    lm_message_node_add_child(node2, "desc", jft->desc);
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   478
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   479
  //if (jft->data != 0)
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   480
}
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   481
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   482
static void send_hash(const gchar *sid, const gchar *to, const gchar *hash)
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   483
{
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   484
  JingleAckHandle *ackhandle;
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   485
  GError *err = NULL;
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   486
  gboolean ret;
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   487
  
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   488
  LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   489
                                              LM_MESSAGE_SUB_TYPE_SET);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   490
  LmMessageNode *node = lm_message_get_node(r);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   491
  lm_message_node_add_child(node, "jingle", NULL);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   492
  node = lm_message_node_get_child(node, "jingle");
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   493
  lm_message_node_set_attributes(node, "xmlns", NS_JINGLE,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   494
                                 "sid", sid,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   495
                                 "action", "session-info",
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   496
                                 NULL);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   497
  lm_message_node_add_child(node, "hash", hash);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   498
  node = lm_message_node_get_child(node, "hash");
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   499
  lm_message_node_set_attribute(node, "xmlns", NS_JINGLE_APP_FT_INFO);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   500
  
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   501
  ackhandle = g_new0(JingleAckHandle, 1);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   502
  ackhandle->callback = NULL;
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   503
  ackhandle->user_data = NULL;
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   504
  
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   505
  ret = lm_connection_send_with_reply(lconnection, r,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   506
                                      jingle_new_ack_handler(ackhandle), &err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   507
  
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   508
  // It's not really a problem, but we must tell it!
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   509
  if (ret == FALSE || err != NULL) {
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   510
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: cannot send hash: %s",
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   511
                 err->message);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   512
    g_error_free(err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   513
  }
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   514
  
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   515
  lm_message_unref(r);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   516
}
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   517
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   518
static void send(session_content *sc)
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   519
{
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   520
  JingleFT *jft;
123
58bd57666ef9 Add a end function to transport
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 120
diff changeset
   521
  gchar buf[JINGLE_FT_SIZE_READ];
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   522
  gsize read;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   523
  GIOStatus status;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   524
  int count = 0;
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   525
  GError *err = NULL;
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   526
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   527
  JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
105
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   528
  if (sess == NULL) {
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   529
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   530
    // We haven't LmMessage: jingle_send_iq_error(jn->message, "cancel", "item-not-found", "unknown-session");
105
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   531
    return;
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   532
  }
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   533
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   534
  SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   535
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   536
  jft = (JingleFT*)sc2->description;
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   537
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   538
  if (jft->dir != JINGLE_FT_OUTGOING)
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   539
    return;
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   540
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   541
  do {
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   542
    count++;
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   543
    status = g_io_channel_read_chars(jft->outfile, (gchar*)buf,
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   544
                                     JINGLE_FT_SIZE_READ, &read, &err);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   545
  } while (status == G_IO_STATUS_AGAIN && count < 10);
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   546
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   547
  if (status == G_IO_STATUS_AGAIN) {
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   548
    // TODO: something better
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   549
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: file unavailable");
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   550
    return;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   551
  }
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   552
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   553
  if (status == G_IO_STATUS_ERROR || err != NULL) {
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   554
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s", err->message);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   555
    g_error_free(err);
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   556
    return;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   557
  }
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   558
  
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   559
  if (status == G_IO_STATUS_NORMAL) {
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   560
    jft->transmit += read;
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   561
    g_checksum_update(jft->md5, (guchar*)buf, read);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   562
    // Call a handle in jingle who will call the trans
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   563
    handle_app_data(sc->sid, sc->from, sc->name, buf, read);
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   564
  }
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   565
  
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   566
  if (status == G_IO_STATUS_EOF) {
123
58bd57666ef9 Add a end function to transport
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 120
diff changeset
   567
    handle_app_data(sc->sid, sc->from, sc->name, NULL, 0);
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   568
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)",
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   569
                 jft->name);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   570
    jft->hash = g_strdup(g_checksum_get_string(jft->md5));
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   571
    // Call a function to say state is ended
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   572
    session_changestate_sessioncontent(sess, sc2->name, 
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   573
                                       JINGLE_SESSION_STATE_ENDED);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   574
    // Send the hash
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   575
    send_hash(sess->sid, sess->to, jft->hash);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   576
    g_checksum_free(jft->md5);
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   577
    
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   578
    if (!session_remove_sessioncontent(sess, sc2->name)) {
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   579
      jingle_send_session_terminate(sess, "success");
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   580
      session_delete(sess);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   581
    }
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   582
  }
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   583
}
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   584
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   585
static void start(session_content *sc)
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   586
{
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   587
  JingleFT *jft;
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   588
  
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   589
  JingleSession *sess = session_find_by_sid(sc->sid, sc->from);
105
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   590
  if (sess == NULL) {
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   591
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: error before transfer");
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   592
    return;
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   593
  }
103
c34b513be8d9 JFT: handle data app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 102
diff changeset
   594
  
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   595
  SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
103
c34b513be8d9 JFT: handle data app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 102
diff changeset
   596
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   597
  jft = (JingleFT*)sc2->description;
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   598
  jft->state = JINGLE_FT_STARTING;
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   599
  jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   600
  
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   601
  scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Transfer start (%s)",
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   602
               jft->name);
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   603
123
58bd57666ef9 Add a end function to transport
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 120
diff changeset
   604
  sc2->appfuncs->send(sc);
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   605
}
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   606
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   607
// When we got a session-terminate
125
3b640eb09fbd JFT: funcs become static
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 124
diff changeset
   608
static void stop(gconstpointer data)
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   609
{
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   610
  JingleFT *jft = (JingleFT*)data;
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   611
  GError *err = NULL;
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   612
  GIOStatus status;
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   613
  
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   614
  jft->state = JINGLE_FT_ENDING;
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   615
  if (jft->outfile != NULL) {
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   616
    status = g_io_channel_shutdown(jft->outfile, TRUE, &err);
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   617
    if (status != G_IO_STATUS_NORMAL || err != NULL) {
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   618
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: %s",
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   619
                   err->message);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   620
      g_error_free(err);
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   621
    }
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   622
  }
111
76ce876f7935 Handle incoming session-info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 110
diff changeset
   623
119
0b9a7b505079 create the session when receiving a session-initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 115
diff changeset
   624
  if (jft->hash != NULL && jft->md5 != NULL) {
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   625
    if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) {
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   626
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File corrupt (%s)",
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   627
                   jft->name);
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   628
    } else {
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   629
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s)"
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   630
                   " and verified", jft->name);
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   631
    }
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   632
  } else {
126
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   633
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s)"
059a6737f6a4 Error are better handle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 125
diff changeset
   634
                 " but not verified", jft->name);
110
c0341c164405 JFT: compute the md5 when receiving
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 109
diff changeset
   635
  }
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   636
}
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   637
128
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   638
static gchar *_convert_size(guint64 size)
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   639
{
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   640
  gchar *strsize;
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   641
 
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   642
  if (size < 1024)
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   643
    strsize = g_strdup_printf("%" G_GUINT64_FORMAT " B", size);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   644
  else if (size < 1048576)
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   645
    strsize = g_strdup_printf("%.2lf KiB", size/1024.0);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   646
  else if (size < 1073741824)
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   647
    strsize = g_strdup_printf("%.2lf MiB", size/1048576.0);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   648
  else if (size < 1099511627776)
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   649
    strsize = g_strdup_printf("%.2lf GiB", size/1073741824.0);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   650
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   651
  return strsize;
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   652
}
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   653
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   654
static gchar* info(gconstpointer data)
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   655
{
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   656
  JingleFT *jft = (JingleFT *)data;
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   657
  gchar *info, *strsize = _convert_size(jft->size);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   658
  info = g_strdup_printf("JFT: Receive %s (%s)", jft->name, strsize);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   659
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   660
  g_free(strsize);
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   661
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   662
  return info;
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   663
}
cded9f40039e Give info when asking for events
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 126
diff changeset
   664
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   665
static void jingle_ft_init(void)
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   666
{
63
b56853071a09 Add a new function that find the best transport method for an app.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 62
diff changeset
   667
  jingle_register_app(NS_JINGLE_APP_FT, &funcs, JINGLE_TRANSPORT_STREAMING);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   668
  xmpp_add_feature(NS_JINGLE_APP_FT);
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   669
  jft_cid = compl_new_category();
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   670
  if (jft_cid) {
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   671
    compl_add_category_word(jft_cid, "send");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   672
    //compl_add_category_word(jft_cid, "request");
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   673
    compl_add_category_word(jft_cid, "info");
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   674
    compl_add_category_word(jft_cid, "flush");
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   675
  }
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   676
  /* Add command */
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   677
  cmd_add("jft", "Manage file transfer", jft_cid, 0, do_sendfile, NULL);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   678
}
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   679
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   680
static void jingle_ft_uninit(void)
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   681
{
133
361d8577ebd1 Change the way IBB work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 131
diff changeset
   682
  g_slist_free(info_list);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   683
  xmpp_del_feature(NS_JINGLE_APP_FT);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   684
  jingle_unregister_app(NS_JINGLE_APP_FT);
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   685
  cmd_del("file");
131
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   686
  if (jft_cid)
943c3f938cb4 JFT: add a command info
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 128
diff changeset
   687
    compl_del_category(jft_cid);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   688
}