jingle-filetransfer/filetransfer.c
author Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 13 Aug 2010 18:39:25 +0200
changeset 109 d4d50e62098b
parent 108 7df2fb9a2365
child 110 c0341c164405
permissions -rw-r--r--
debug 3
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
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    47
gconstpointer jingle_ft_check(JingleContent *cn, GError **err);
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
    48
void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node);
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    49
gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len);
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
    50
void jingle_ft_start(session_content *sc, gsize size);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
    51
void jingle_ft_send(session_content *sc, gsize size);
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    52
void jingle_ft_stop(gconstpointer data);
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    53
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
    54
static gboolean is_md5_hash(const gchar *hash);
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    55
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    56
static void jingle_ft_init(void);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    57
static void jingle_ft_uninit(void);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    58
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    59
const gchar *deps[] = { "jingle", NULL };
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    60
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
    61
static JingleAppFuncs funcs = {
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    62
  jingle_ft_check,
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
    63
  jingle_ft_tomessage,
103
c34b513be8d9 JFT: handle data app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 102
diff changeset
    64
  jingle_ft_handle_data,
c34b513be8d9 JFT: handle data app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 102
diff changeset
    65
  jingle_ft_start,
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    66
  jingle_ft_send,
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
    67
  jingle_ft_stop
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    68
};
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    69
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    70
module_info_t info_jingle_filetransfer = {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    71
  .branch          = MCABBER_BRANCH,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    72
  .api             = MCABBER_API_VERSION,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    73
  .version         = PROJECT_VERSION,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    74
  .description     = "Jingle File Transfer (XEP-0234)\n",
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    75
  .requires        = deps,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    76
  .init            = jingle_ft_init,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    77
  .uninit          = jingle_ft_uninit,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    78
  .next            = NULL,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    79
};
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    80
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    81
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    82
gconstpointer jingle_ft_check(JingleContent *cn, GError **err)
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    83
{
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    84
  JingleFT *ft = NULL;
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    85
  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
    86
  gint64 tmpsize;
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    87
  const gchar *datestr, *sizestr;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    88
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    89
  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
    90
 
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    91
  if (!node) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    92
    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
    93
                "the offer element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    94
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    95
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    96
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
    97
  node = lm_message_node_get_child(node, "file");
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    98
  if (!node) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    99
    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
   100
                "the file element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   101
    return NULL;
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
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   104
  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
   105
    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
   106
                "the file transfer offer has an invalid/unsupported namespace");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   107
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   108
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   109
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   110
  ft = g_new0(JingleFT, 1);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   111
  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
   112
  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
   113
  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
   114
  sizestr  = lm_message_node_get_attribute(node, "size");
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   115
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   116
  if (!ft->name || !sizestr) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   117
    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
   118
                "an attribute of the file element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   119
    g_free(ft);
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
  }
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   122
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   123
  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
   124
  tmpsize = g_ascii_strtoll(sizestr, NULL, 10);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   125
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   126
  // 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
   127
  if (tmpsize < 0) {
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   128
    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
   129
                "the offered file has a negative size");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   130
    g_free(ft);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   131
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   132
  }
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
   133
  ft->size = tmpsize;
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   134
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   135
  ft->name = g_path_get_basename(ft->name);
58
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   136
  
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   137
  if (settings_opt_get("jingle_ft_dir") != NULL)
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   138
    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
   139
  else
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   140
    ft->name = g_build_filename("/tmp", ft->name, NULL);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   141
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   142
  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
   143
    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
   144
                "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
   145
    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
   146
    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
   147
    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
   148
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   149
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   150
  // 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
   151
  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
   152
    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
   153
                "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
   154
    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
   155
    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
   156
    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
   157
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   158
  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
   159
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   160
  return (gconstpointer) ft;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   161
}
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   162
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   163
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
   164
{
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   165
  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
   166
  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
   167
    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
   168
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
   169
  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
   170
    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
   171
  else
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   172
    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
   173
}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   174
106
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   175
gboolean jingle_ft_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
   176
{
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   177
  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
   178
  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
   179
  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
   180
  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
   181
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   182
  // 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
   183
  // during the call to jingle_ft_check and handle_data
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   184
  if (jft->outfile == NULL) {
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   185
    jft->outfile = g_io_channel_new_file(jft->name, "w", &err);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   186
    if (jft->outfile == NULL || err != NULL) {
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   187
      // propagate the GError ?
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   188
      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
   189
	}
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   190
	g_io_channel_set_encoding(jft->outfile, NULL, NULL);
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   191
  }
106
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   192
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   193
  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
   194
                                    &bytes_written, &err);
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   195
  g_io_channel_flush(jft->outfile, NULL);
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   196
  if (status != G_IO_STATUS_NORMAL || 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
   197
    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
   198
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   199
  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
   200
    // 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
   201
    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
   202
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   203
  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
   204
}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   205
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   206
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
   207
{
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   208
  char **args = split_arg(arg, 1, 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
   209
  gchar *filename;
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   210
  
83
d5c5e9be53cb modify send_session_initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 81
diff changeset
   211
  if (!args[0]) {
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   212
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: give me a name!");
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   213
    return;
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   214
  }
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   215
  
93
4038cce7fd80 Expand ~ in /sendfile, fix the way we handle creator and senders.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 89
diff changeset
   216
  filename = expand_filename(args[0]); // expand ~ to HOME
4038cce7fd80 Expand ~ in /sendfile, fix the way we handle creator and senders.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 89
diff changeset
   217
  
4038cce7fd80 Expand ~ in /sendfile, fix the way we handle creator and senders.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 89
diff changeset
   218
  if (!g_file_test(filename, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS)) {
85
0113d55cada6 Fix a segfault when using /sendfile while not in chatmode.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 84
diff changeset
   219
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File doesn't exist!");
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   220
    return;
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   221
  }
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   222
  
85
0113d55cada6 Fix a segfault when using /sendfile while not in chatmode.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 84
diff changeset
   223
  scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Trying to send %s",
83
d5c5e9be53cb modify send_session_initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 81
diff changeset
   224
               args[0]);
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   225
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   226
  {
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   227
    JingleSession *sess;
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   228
    gchar *sid = jingle_generate_sid();
87
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   229
    gchar *ressource, *recipientjid;
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   230
    const gchar *namespaces[] = {NS_JINGLE, NS_JINGLE_APP_FT, NULL};
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   231
    struct stat fileinfo;
94
a49f78cada29 Fix bugs. Use directly the JingleSession to determine the recipient.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 93
diff changeset
   232
    const gchar *myjid = g_strdup(lm_connection_get_jid(lconnection));
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   233
    JingleFT *jft = g_new0(JingleFT, 1);
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   234
87
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   235
    if (CURRENT_JID == NULL) { // CURRENT_JID = the jid of the user which has focus
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   236
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Please, choose a valid JID in the roster");
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   237
      return;
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   238
    }
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   239
    ressource = jingle_find_compatible_res(CURRENT_JID, namespaces);
89
88bb2d0f9ff8 add an namespace to a jingle node
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 88
diff changeset
   240
    if (ressource == NULL) {
88bb2d0f9ff8 add an namespace to a jingle node
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 88
diff changeset
   241
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot send file, because there is no ressource available");
87
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   242
      return;
89
88bb2d0f9ff8 add an namespace to a jingle node
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 88
diff changeset
   243
    }
88bb2d0f9ff8 add an namespace to a jingle node
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 88
diff changeset
   244
    
87
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   245
    recipientjid = g_strdup_printf("%s/%s", CURRENT_JID, ressource);
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   246
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   247
    sess = session_new(sid, myjid, recipientjid, JINGLE_SESSION_OUTGOING);
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   248
    session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
77
56c6ab96026f start disco
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 76
diff changeset
   249
94
a49f78cada29 Fix bugs. Use directly the JingleSession to determine the recipient.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 93
diff changeset
   250
    if (g_stat(filename, &fileinfo) != 0) {
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   251
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: unable to stat %s", args[1]);
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   252
      return;
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   253
    }
83
d5c5e9be53cb modify send_session_initiate
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 81
diff changeset
   254
    jft->desc = g_strdup(args[0]);
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   255
    jft->type = JINGLE_FT_OFFER;
93
4038cce7fd80 Expand ~ in /sendfile, fix the way we handle creator and senders.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 89
diff changeset
   256
    jft->name = g_path_get_basename(filename);
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   257
    jft->date = fileinfo.st_mtime;
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   258
    jft->size = fileinfo.st_size;
93
4038cce7fd80 Expand ~ in /sendfile, fix the way we handle creator and senders.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 89
diff changeset
   259
    jft->outfile = g_io_channel_new_file (filename, "r", NULL);
106
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   260
    if (jft->outfile == NULL) {
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   261
      scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot open file %s", args[1]);
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   262
      return;
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   263
    }
2942c71f434a transfer work
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 105
diff changeset
   264
    
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   265
    g_io_channel_set_encoding(jft->outfile, NULL, NULL);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   266
    
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   267
    session_add_app(sess, "file", NS_JINGLE_APP_FT, jft);
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   268
87
43e7d48f6d84 Fix bugs. The module should now be able to send session-initiate.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 85
diff changeset
   269
    jingle_handle_app(sess, "file", NS_JINGLE_APP_FT, jft, recipientjid);
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   270
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   271
    g_free(ressource);
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   272
    g_free(sid);
105
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   273
    //g_io_channel_unref(jft->outfile);
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   274
    //g_io_channel_shutdown(jft->outfile, TRUE, NULL);
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   275
  }
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   276
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   277
  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
   278
}
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   279
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   280
void jingle_ft_tomessage(gconstpointer data, LmMessageNode *node)
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   281
{
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   282
  JingleFT *jft = (JingleFT*) data;
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   283
  gchar *size = NULL;
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   284
  
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   285
  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
   286
    return;
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   287
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   288
  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
   289
  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
   290
  if (jft->type == JINGLE_FT_OFFER)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   291
    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
   292
  else
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   293
    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
   294
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   295
  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
   296
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
   297
  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
   298
  
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   299
  lm_message_node_set_attributes(node2, "xmlns", NS_SI_FT, "name", jft->name,
84
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   300
                                 "size", size, NULL);
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   301
  g_free(size);
cdff1771155d commit without segfault it's better
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 83
diff changeset
   302
  
81
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   303
  if (jft->hash != NULL)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   304
    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
   305
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   306
  if (jft->desc != NULL)
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   307
    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
   308
8b6320ad470b Add comments, change some function names...
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 80
diff changeset
   309
  //if (jft->data != 0)
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   310
}
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   311
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   312
void jingle_ft_send_hash(gchar *sid, gchar *to, gchar *hash)
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   313
{
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   314
  JingleAckHandle *ackhandle;
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   315
  
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   316
  LmMessage *r = lm_message_new_with_sub_type(to, LM_MESSAGE_TYPE_IQ, LM_MESSAGE_SUB_TYPE_SET);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   317
  LmMessageNode *node = lm_message_get_node(r);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   318
  lm_message_node_add_child(node, "jingle", NULL);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   319
  node = lm_message_node_get_child(node, "jingle");
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   320
  lm_message_node_set_attributes(node, "xmlns", NS_JINGLE, "sid", sid, "action", "session-info", NULL);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   321
  lm_message_node_add_child(node, "hash", hash);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   322
  node = lm_message_node_get_child(node, "hash");
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   323
  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
   324
  
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   325
  ackhandle = g_new0(JingleAckHandle, 1);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   326
  ackhandle->callback = NULL;
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   327
  ackhandle->user_data = NULL;
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   328
  
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   329
  lm_connection_send_with_reply(lconnection, r,
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   330
                                jingle_new_ack_handler(ackhandle), NULL);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   331
  lm_message_unref(r);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   332
}
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   333
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   334
void jingle_ft_send(session_content *sc, gsize size)
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   335
{
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   336
  JingleFT *jft;
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   337
  gchar *buf = g_new0(gchar, size);
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   338
  gsize read;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   339
  GIOStatus status;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   340
  int count = 0;
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   341
  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
   342
  if (sess == NULL) {
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   343
    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
   344
    // 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
   345
    return;
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   346
  }
103
c34b513be8d9 JFT: handle data app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 102
diff changeset
   347
  
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   348
  SessionContent *sc2 = session_find_sessioncontent(sess, sc->name);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   349
  
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   350
  jft = (JingleFT*)sc2->description;
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   351
  
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   352
  do {
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   353
    count++;
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   354
    status = g_io_channel_read_chars(jft->outfile, (gchar*)buf, size, &read, NULL);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   355
  } while (status == G_IO_STATUS_AGAIN && count < 10);
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   356
  
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   357
  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
   358
    // TODO: something better
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   359
    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
   360
    return;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   361
  }
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   362
  
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   363
  if (status == G_IO_STATUS_ERROR) {
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   364
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: an error occured");
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   365
    return;
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   366
  }
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   367
  
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   368
  if (status == G_IO_STATUS_NORMAL) {
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   369
    g_checksum_update(jft->md5, (guchar*)buf, read);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   370
    // Call a handle in jingle who will call the trans
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   371
    handle_app_data(sc->sid, sc->from, sc->name, buf, read);
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   372
    g_free(buf);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   373
  }
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   374
  
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   375
  if (status == G_IO_STATUS_EOF) {
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   376
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   377
    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
   378
    // Call a function to say state is ended
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   379
    session_changestate_sessioncontent(sess, sc2->name, JINGLE_SESSION_STATE_ENDED);
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   380
    // Send the hash
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   381
    jingle_ft_send_hash(sess->sid, sess->to, jft->hash);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   382
    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
   383
    
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   384
    if (!session_remove_sessioncontent(sess, sc2->name)) {
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   385
      jingle_send_session_terminate(sess, "success");
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   386
      session_delete(sess);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   387
    }
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   388
  }
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   389
}
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   390
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   391
void jingle_ft_start(session_content *sc, gsize size)
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   392
{
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   393
  JingleFT *jft;
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   394
  
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   395
  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
   396
  if (sess == NULL) {
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   397
    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
   398
    return;
c31988e107b3 ibb handle new data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 103
diff changeset
   399
  }
103
c34b513be8d9 JFT: handle data app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 102
diff changeset
   400
  
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   401
  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
   402
107
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   403
  jft = (JingleFT*)sc2->description;
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 106
diff changeset
   404
  
102
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   405
  jft->md5 = g_checksum_new(G_CHECKSUM_MD5);
ec430b98c115 send hash
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 101
diff changeset
   406
  
108
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 107
diff changeset
   407
  sc2->appfuncs->send(sc, size);
101
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   408
}
4235aa1a7664 JFT: add a func to send data
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 94
diff changeset
   409
109
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   410
void jingle_ft_stop(gconstpointer data)
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   411
{
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   412
  JingleFT *jft = (JingleFT*)data;
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   413
  
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   414
  scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finish (%s)", jft->name);
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   415
  
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   416
  g_io_channel_flush(jft->outfile, NULL);
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   417
  
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   418
  g_io_channel_unref(jft->outfile);
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   419
}
d4d50e62098b debug 3
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 108
diff changeset
   420
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   421
static void jingle_ft_init(void)
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   422
{
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
   423
  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
   424
  xmpp_add_feature(NS_JINGLE_APP_FT);
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   425
  /*file_cid = compl_new_category();
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   426
  if (file_cid) {
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   427
    compl_add_category_word(sendfile_cid, "send");
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   428
    compl_add_category_word(send file_cid, "request");
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   429
  }*/
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   430
  /* Add command */
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   431
  cmd_add("sendfile", "Send a file", 0, 0, do_sendfile, NULL);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   432
}
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   433
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   434
static void jingle_ft_uninit(void)
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   435
{
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   436
  xmpp_del_feature(NS_JINGLE_APP_FT);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   437
  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
   438
  cmd_del("file");
79
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   439
  /*if (file_cid)
a654afc4a74a Function to detect which jid resource support jingle.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 77
diff changeset
   440
    compl_del_category(file_cid);*/
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   441
}