jingle-filetransfer/filetransfer.c
author Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Mon, 26 Jul 2010 02:33:27 +0200
changeset 74 7f0e16bb1768
parent 72 277778138b4b
child 76 42b487daee7d
permissions -rw-r--r--
Little commit
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>
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
    25
#include <string.h>
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    26
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    27
#include <mcabber/modules.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    28
#include <mcabber/utils.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    29
#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
    30
#include <mcabber/settings.h>
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
    31
#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
    32
#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
    33
#include <mcabber/commands.h>
74
7f0e16bb1768 Little commit
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 72
diff changeset
    34
#include <mcabber/roster.h>
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    35
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    36
#include <jingle/jingle.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    37
#include <jingle/check.h>
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    38
#include <jingle/register.h>
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
    39
#include <jingle/sessions.h>
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    40
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    41
#include "filetransfer.h"
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    42
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    43
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    44
gconstpointer jingle_ft_check(JingleContent *cn, GError **err);
68
ae8b0d03887e Start the send_session_initiate function
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 67
diff changeset
    45
void jingle_ft_handle(JingleAction act, 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
    46
gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, 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
    47
static gboolean is_md5_hash(const gchar *hash);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    48
static void jingle_ft_init(void);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    49
static void jingle_ft_uninit(void);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    50
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
    51
static guint file_cid = 0;
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    52
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    53
const gchar *deps[] = { "jingle", NULL };
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    54
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    55
JingleAppFuncs funcs = {
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    56
  jingle_ft_check,
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    57
  jingle_ft_handle,
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    58
  jingle_ft_handle_data
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
    59
};
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    60
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    61
module_info_t info_jingle_filetransfer = {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    62
  .branch          = MCABBER_BRANCH,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    63
  .api             = MCABBER_API_VERSION,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    64
  .version         = PROJECT_VERSION,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    65
  .description     = "Jingle File Transfer (XEP-0234)\n",
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    66
  .requires        = deps,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    67
  .init            = jingle_ft_init,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    68
  .uninit          = jingle_ft_uninit,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    69
  .next            = NULL,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    70
};
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    71
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    72
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    73
gconstpointer jingle_ft_check(JingleContent *cn, GError **err)
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    74
{
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    75
  JingleFT *ft = NULL;
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    76
  LmMessageNode *node;
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    77
  const gchar *datestr, *sizestr;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    78
32
72bbe33f151a Modify the session-initiate handler among other things.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 31
diff changeset
    79
  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
    80
 
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    81
  if (!node) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    82
    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
    83
                "the offer element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    84
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    85
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    86
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
    87
  node = lm_message_node_get_child(node, "file");
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    88
  if (!node) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    89
    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
    90
                "the file element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    91
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    92
  }
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    93
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    94
  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
    95
    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
    96
                "the file transfer offer has an invalid/unsupported namespace");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
    97
    return 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
  ft = g_new0(JingleFT, 1);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   101
  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
   102
  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
   103
  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
   104
  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
   105
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   106
  if (!ft->name || !sizestr) {
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   107
    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
   108
                "an attribute of the file element is missing");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   109
    g_free(ft);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   110
    return NULL;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   111
  }
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
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   113
  ft->date = from_iso8601(datestr, 1);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   114
  ft->size = g_ascii_strtoll(sizestr, NULL, 10);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   115
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   116
  // the size attribute is a xs:integer an therefore can be negative.
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   117
  if (ft->size < 0) {
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_BADVALUE,
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   119
                "the offered file has a negative size");
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   120
    g_free(ft);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   121
    return NULL;
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
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   124
  ft->name = g_path_get_basename(ft->name);
58
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   125
  
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   126
  if (settings_opt_get("jingle_ft_dir") != NULL)
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   127
    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
   128
  else
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   129
    ft->name = g_build_filename("/tmp", ft->name, NULL);
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 56
diff changeset
   130
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
  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
   132
    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
   133
                "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
   134
    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
   135
    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
   136
    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
   137
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   138
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   139
  // 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
   140
  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
   141
    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
   142
                "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
   143
    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
   144
    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
   145
    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
   146
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   147
  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
   148
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   149
  return (gconstpointer) ft;
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   150
}
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   151
62
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   152
gboolean jingle_ft_handle_data(gconstpointer data, const gchar *data2, guint len)
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   153
{
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   154
  return FALSE;
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   155
}
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   156
e7915504da33 Add dummy handle functions in the FT module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 60
diff changeset
   157
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
   158
{
53
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   159
  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
   160
  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
   161
    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
   162
59
69985ccda25a We send a session-accept \o/... Endly
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 58
diff changeset
   163
  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
   164
    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
   165
  else
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   166
    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
   167
}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   168
54
1c1153f9f945 Handle for jingle
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 53
diff changeset
   169
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
   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
  JingleFT *ft = (JingleFT *) jingleft;
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   172
  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
   173
  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
   174
  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
   175
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   176
  // 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
   177
  // during the call to jingle_ft_check and handle_data
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   178
  if (ft->outfile == 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
    ft->outfile = g_io_channel_new_file(ft->name, "w", &err);
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   180
    if (ft->outfile == NULL || 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
   181
      // 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
   182
      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
   183
	}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   184
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   185
  status = g_io_channel_write_chars(ft->outfile, data, (gssize) len,
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   186
                                    &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
   187
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   188
  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
   189
    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
   190
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   191
  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
   192
    // 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
   193
    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
   194
  }
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   195
  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
   196
}
64a47491c068 Add a function to handle incoming data in the filetransfert module.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 49
diff changeset
   197
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   198
static void do_file(char *arg)
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   199
{
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   200
  char **args = split_arg(arg, 2, 0);
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   201
  
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   202
  if (!args[1]) {
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   203
    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
   204
    return;
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   205
  }
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   206
  
70
54e86a92fe7f create a LM from a jinglesession
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 69
diff changeset
   207
  if (!g_file_test (args[1], G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS)) {
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   208
    scr_LogPrint(LPRINT_LOGNORM, "File doesn't exist!");
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   209
    return;
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   210
  }
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   211
  
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
  if (!g_strcmp0(args[0], "send")) {
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   213
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: try to sent %s!",
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   214
                 args[1]);
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   215
    // Create a new session for send a file
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   216
    {
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   217
      JingleSession *sess;
69
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   218
      GChecksum *md5 = g_checksum_new(G_CHECKSUM_MD5);
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   219
      gchar *sid = new_sid();
69
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   220
      guchar data[1024];
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   221
      gsize bytes_read;
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   222
      const gchar *jid = settings_opt_get("jid");
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   223
      JingleFT *jft = g_new0(JingleFT, 1);
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   224
      sess = session_new(sid, jid, jid);
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   225
      session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   226
      
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   227
      jft->desc = g_strdup(args[2]);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   228
      jft->type = JINGLE_FT_OFFER;
69
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   229
      jft->name = g_path_get_basename(args[1]);
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   230
      jft->date = 0;
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   231
      jft->size = 0;
69
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   232
      jft->outfile = g_io_channel_new_file (args[1], "r", NULL);
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   233
      g_io_channel_set_encoding(jft->outfile, NULL, NULL);
70
54e86a92fe7f create a LM from a jinglesession
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 69
diff changeset
   234
      // For the md5 and the size
54e86a92fe7f create a LM from a jinglesession
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 69
diff changeset
   235
      while (g_io_channel_read_chars(jft->outfile,
54e86a92fe7f create a LM from a jinglesession
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 69
diff changeset
   236
                                     (gchar*)data, 1024, &bytes_read, NULL)
54e86a92fe7f create a LM from a jinglesession
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 69
diff changeset
   237
             != G_IO_STATUS_EOF) {
69
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   238
        jft->size+=bytes_read;
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   239
        g_checksum_update(md5, data, bytes_read);
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   240
      }
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   241
      jft->hash = g_strdup(g_checksum_get_string(md5));
70
54e86a92fe7f create a LM from a jinglesession
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 69
diff changeset
   242
      g_io_channel_seek_position (jft->outfile, 0, G_SEEK_SET, NULL);
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   243
      session_add_app(sess, "file", NS_JINGLE_APP_FT, jft);
74
7f0e16bb1768 Little commit
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 72
diff changeset
   244
      
7f0e16bb1768 Little commit
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 72
diff changeset
   245
      jingle_handle_app(sess, "file", NS_JINGLE_APP_FT, jft, CURRENT_JID);
7f0e16bb1768 Little commit
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 72
diff changeset
   246
      
69
a56a2535ab2e JFT: Compute md5
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 68
diff changeset
   247
      g_checksum_free(md5);
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   248
      g_free(sid);
72
277778138b4b Handle for the app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 71
diff changeset
   249
      
277778138b4b Handle for the app
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 71
diff changeset
   250
      
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   251
    }  
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   252
  } else if (!g_strcmp0(args[0], "request")) {
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   253
    scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: try to request %s!",
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   254
                 args[1]);
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   255
    //later
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   256
  }
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   257
  
67
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   258
  
c12618793df0 New functions in sessions
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 64
diff changeset
   259
  
64
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   260
  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
   261
}
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   262
71
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   263
void jingle_ft_handle(JingleAction act, gconstpointer data, LmMessageNode *node)
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   264
{
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   265
  if (act == JINGLE_SESSION_INITIATE) {
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   266
    JingleFT *jft = (JingleFT*) data;
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   267
    if (lm_message_node_get_child(node, "description") != NULL)
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   268
      return;
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   269
  
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   270
    LmMessageNode *node2 = lm_message_node_add_child(node, "description", NULL);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   271
    lm_message_node_set_attribute(node2, "xmlns", NS_JINGLE_APP_FT);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   272
    if (jft->type == JINGLE_FT_OFFER)
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   273
      node2 = lm_message_node_add_child(node2, "offer", NULL);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   274
    else
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   275
      node2 = lm_message_node_add_child(node2, "request", NULL);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   276
    
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   277
    node2 = lm_message_node_add_child(node2, "file", NULL);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   278
    
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   279
    lm_message_node_set_attributes(node2, "xmlns", NS_SI_FT, "name", jft->name,
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   280
                                   "size", jft->size, NULL);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   281
    if (jft->hash != NULL)
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   282
      lm_message_node_set_attribute(node2, "hash", jft->hash);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   283
    
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   284
    if (jft->desc != NULL)
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   285
      lm_message_node_add_child(node2, "desc", jft->desc);
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   286
    
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   287
    //if (jft->data != 0)
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   288
      
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   289
  }
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   290
}
53ee5d729367 Handle JFT
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 70
diff changeset
   291
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   292
static void jingle_ft_init(void)
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   293
{
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
   294
  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
   295
  xmpp_add_feature(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
   296
  /* Create completions */
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   297
  file_cid = compl_new_category();
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   298
  if (file_cid) {
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   299
    compl_add_category_word(file_cid, "send");
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   300
    compl_add_category_word(file_cid, "request");
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   301
  }
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   302
  /* Add command */
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   303
  cmd_add("file", "Send / Request a file", file_cid, 0, do_file, NULL);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   304
}
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   305
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   306
static void jingle_ft_uninit(void)
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   307
{
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   308
  xmpp_del_feature(NS_JINGLE_APP_FT);
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   309
  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
   310
  cmd_del("file");
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   311
  if (file_cid)
63d4f434abbc Add a command to JFT to send or request a file
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents: 63
diff changeset
   312
    compl_del_category(file_cid);
21
147f131382dd Some sessions management code.
Nicolas Cornu <nicolas.cornu@ensi-bourges.fr>
parents:
diff changeset
   313
}