jingle-filetransfer/filetransfer.c
changeset 119 0b9a7b505079
parent 115 cae0cb7eff45
child 120 3e2085a44a5c
equal deleted inserted replaced
118:f3408f4fe61a 119:0b9a7b505079
   150   }
   150   }
   151 
   151 
   152   // check if the md5 hash is valid ([a-fA-F0-9){32})
   152   // check if the md5 hash is valid ([a-fA-F0-9){32})
   153   if (ft->hash != NULL && (strlen(ft->hash) != 32 || !is_md5_hash(ft->hash))) {
   153   if (ft->hash != NULL && (strlen(ft->hash) != 32 || !is_md5_hash(ft->hash))) {
   154     g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE,
   154     g_set_error(err, JINGLE_CHECK_ERROR, JINGLE_CHECK_ERROR_BADVALUE,
   155                 "the offered file has an invalid filename");
   155                 "the offered file has an invalid hash");
   156     g_free(ft->name);
   156     g_free(ft->name);
   157     g_free(ft);
   157     g_free(ft);
   158     return NULL;
   158     return NULL;
   159   }
   159   }
   160   ft->hash = g_strndup(ft->hash, 32);
   160   ft->hash = g_strndup(ft->hash, 32);
   161 
   161 
   162   return (gconstpointer) ft;
   162   return (gconstpointer) ft;
   163 }
   163 }
   164 
   164 
   165 gboolean jingle_ft_handle(JingleAction action, gconstpointer data, LmMessageNode *node)
   165 gboolean jingle_ft_handle(JingleAction action, gconstpointer data,
       
   166                           LmMessageNode *node)
   166 {
   167 {
   167   if (action == JINGLE_SESSION_INFO) {
   168   if (action == JINGLE_SESSION_INFO) {
   168     if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"), NS_JINGLE_APP_FT_INFO)
   169     if (!g_strcmp0(lm_message_node_get_attribute(node, "xmlns"),
       
   170                    NS_JINGLE_APP_FT_INFO)
   169         && !g_strcmp0(node->name, "hash")) {
   171         && !g_strcmp0(node->name, "hash")) {
   170       ((JingleFT *)data)->hash = lm_message_node_get_value(node);
   172       ((JingleFT *)data)->hash = g_strdup(lm_message_node_get_value(node));
   171       return TRUE;
   173       return TRUE;
   172 	}
   174 	}
   173 	return FALSE;
   175 	return FALSE;
   174   }
   176   }
   175   return FALSE;
   177   return FALSE;
   274     session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
   276     session_add_content(sess, "file", JINGLE_SESSION_STATE_PENDING);
   275 
   277 
   276     jft->desc = g_strdup(args[0]);
   278     jft->desc = g_strdup(args[0]);
   277     jft->type = JINGLE_FT_OFFER;
   279     jft->type = JINGLE_FT_OFFER;
   278     jft->name = g_path_get_basename(filename);
   280     jft->name = g_path_get_basename(filename);
       
   281     // TODO: Transform date to a good format (ios8601)
   279     jft->date = fileinfo.st_mtime;
   282     jft->date = fileinfo.st_mtime;
   280     jft->size = fileinfo.st_size;
   283     jft->size = fileinfo.st_size;
   281     jft->outfile = g_io_channel_new_file (filename, "r", NULL);
   284     jft->outfile = g_io_channel_new_file (filename, "r", NULL);
   282     if (jft->outfile == NULL) {
   285     if (jft->outfile == NULL) {
   283       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot open file %s", args[1]);
   286       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: Cannot open file %s", args[1]);
   433 // When we got a session-terminate
   436 // When we got a session-terminate
   434 void jingle_ft_stop(gconstpointer data)
   437 void jingle_ft_stop(gconstpointer data)
   435 {
   438 {
   436   JingleFT *jft = (JingleFT*)data;
   439   JingleFT *jft = (JingleFT*)data;
   437 
   440 
   438   if (jft->hash != NULL) {
   441   if (jft->hash != NULL && jft->md5 != NULL) {
   439     if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) {
   442     if (g_strcmp0(jft->hash, g_checksum_get_string(jft->md5))) {
   440       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File corrupt (%s)", jft->name);
   443       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: File corrupt (%s)", jft->name);
   441     } else {
   444     } else {
   442       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) and verified", jft->name);
   445       scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) and verified", jft->name);
   443     }
   446     }
   445     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) but not verified", jft->name);
   448     scr_LogPrint(LPRINT_LOGNORM, "Jingle File Transfer: transfer finished (%s) but not verified", jft->name);
   446   }
   449   }
   447 
   450 
   448   g_checksum_free(jft->md5);
   451   g_checksum_free(jft->md5);
   449 
   452 
   450   g_io_channel_flush(jft->outfile, NULL);
   453   if (jft->outfile != NULL) {
   451 
   454     g_io_channel_flush(jft->outfile, NULL);
   452   g_io_channel_unref(jft->outfile);
   455 
       
   456     g_io_channel_unref(jft->outfile);
       
   457   }
   453 }
   458 }
   454 
   459 
   455 static void jingle_ft_init(void)
   460 static void jingle_ft_init(void)
   456 {
   461 {
   457   jingle_register_app(NS_JINGLE_APP_FT, &funcs, JINGLE_TRANSPORT_STREAMING);
   462   jingle_register_app(NS_JINGLE_APP_FT, &funcs, JINGLE_TRANSPORT_STREAMING);