aboutsummaryrefslogtreecommitdiff
path: root/src/fs
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-04-02 15:27:48 +0000
committerChristian Grothoff <christian@grothoff.org>2010-04-02 15:27:48 +0000
commit133eed3e2375b3032e9134d7ab16a936d09c98ac (patch)
tree1f404ffbbdc72b0d7254cc93a2cf8b1616556a95 /src/fs
parentd9dda7eda6b55b311982d99885aafd82448a057e (diff)
downloadgnunet-133eed3e2375b3032e9134d7ab16a936d09c98ac.tar.gz
gnunet-133eed3e2375b3032e9134d7ab16a936d09c98ac.zip
more on directory handling
Diffstat (limited to 'src/fs')
-rw-r--r--src/fs/fs_download.c104
1 files changed, 97 insertions, 7 deletions
diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c
index aaac2f6d9..358b222aa 100644
--- a/src/fs/fs_download.c
+++ b/src/fs/fs_download.c
@@ -248,6 +248,20 @@ schedule_block_download (struct GNUNET_FS_DownloadContext *dc,
248} 248}
249 249
250 250
251
252/**
253 * Suggest a filename based on given metadata.
254 *
255 * @param md given meta data
256 * @return NULL if meta data is useless for suggesting a filename
257 */
258char *
259GNUNET_FS_meta_data_suggest_filename (const struct GNUNET_CONTAINER_MetaData *md)
260{
261 return NULL;
262}
263
264
251/** 265/**
252 * We've lost our connection with the FS service. 266 * We've lost our connection with the FS service.
253 * Re-establish it and re-transmit all of our 267 * Re-establish it and re-transmit all of our
@@ -359,6 +373,11 @@ trigger_recursive_download (void *cls,
359{ 373{
360 struct GNUNET_FS_DownloadContext *dc = cls; 374 struct GNUNET_FS_DownloadContext *dc = cls;
361 struct GNUNET_FS_DownloadContext *cpos; 375 struct GNUNET_FS_DownloadContext *cpos;
376 char *fn;
377 char *us;
378 char *ext;
379 char *dn;
380 char *full_name;
362 381
363 if (NULL == uri) 382 if (NULL == uri)
364 return; /* entry for the directory itself */ 383 return; /* entry for the directory itself */
@@ -375,26 +394,88 @@ trigger_recursive_download (void *cls,
375 } 394 }
376 if (cpos != NULL) 395 if (cpos != NULL)
377 return; /* already exists */ 396 return; /* already exists */
397 fn = NULL;
378 if (NULL == filename) 398 if (NULL == filename)
379 { 399 {
380 400 fn = GNUNET_FS_meta_data_suggest_filename (meta);
401 if (fn == NULL)
402 {
403 fn = GNUNET_FS_uri_to_string (uri);
404
405 }
406 else if (fn[0] == '.')
407 {
408 ext = fn;
409 us = GNUNET_FS_uri_to_string (uri);
410 GNUNET_asprintf (&fn,
411 "%s%s",
412 us, ext);
413 GNUNET_free (ext);
414 GNUNET_free (us);
415 }
416 filename = fn;
381 } 417 }
382 if (data != NULL) 418 if (dc->filename == NULL)
383 { 419 {
384 /* determine on-disk filename, write data! */ 420 full_name = NULL;
385 GNUNET_break (0); // FIXME: not implemented 421 }
422 else
423 {
424 dn = GNUNET_strdup (dc->filename);
425 GNUNET_break ( (strlen (dn) < strlen (GNUNET_FS_DIRECTORY_EXT)) ||
426 (NULL ==
427 strstr (dn + strlen(dn) - strlen(GNUNET_FS_DIRECTORY_EXT),
428 GNUNET_FS_DIRECTORY_EXT)) );
429 dn[strlen(dn) - strlen (GNUNET_FS_DIRECTORY_EXT)] = '\0';
430 if ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) &&
431 ( (strlen (filename) < strlen (GNUNET_FS_DIRECTORY_EXT)) ||
432 (NULL ==
433 strstr (filename + strlen(filename) - strlen(GNUNET_FS_DIRECTORY_EXT),
434 GNUNET_FS_DIRECTORY_EXT)) ) )
435 {
436 GNUNET_asprintf (&full_name,
437 "%s%s%s%s",
438 dn,
439 DIR_SEPARATOR_STR,
440 filename,
441 GNUNET_FS_DIRECTORY_EXT);
442 }
443 else
444 {
445 GNUNET_asprintf (&full_name,
446 "%s%s%s",
447 dn,
448 DIR_SEPARATOR_STR,
449 filename);
450 }
451 GNUNET_free (dn);
452 }
453 if (data != NULL)
454 {
455 if (full_name != NULL)
456 {
457 /* determine on-disk filename, write data! */
458 GNUNET_break (0); // FIXME: not implemented
459 }
460 else
461 {
462 /* FIXME: generate 'progress' events and move to
463 instant completion! */
464 GNUNET_break (0); // FIXME: not implemented
465 }
386 } 466 }
387 /* FIXME: filename MAY be NULL => make one up! */
388 GNUNET_FS_download_start (dc->h, 467 GNUNET_FS_download_start (dc->h,
389 uri, 468 uri,
390 meta, 469 meta,
391 filename, /* FIXME: prepend directory name! */ 470 full_name,
392 0, 471 0,
393 GNUNET_FS_uri_chk_get_file_size (uri), 472 GNUNET_FS_uri_chk_get_file_size (uri),
394 dc->anonymity, 473 dc->anonymity,
395 dc->options, 474 dc->options,
396 NULL, 475 NULL,
397 dc); 476 dc);
477 GNUNET_free_non_null (full_name);
478 GNUNET_free_non_null (fn);
398} 479}
399 480
400 481
@@ -612,8 +693,17 @@ process_result_with_request (void *cls,
612 } 693 }
613 dc->completed += app; 694 dc->completed += app;
614 695
696 /* do recursive download if option is set and either meta data
697 says it is a directory or if no meta data is given AND filename
698 ends in '.gnd' (top-level case) */
615 if ( (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) && 699 if ( (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) &&
616 (GNUNET_NO != GNUNET_FS_meta_data_test_for_directory (dc->meta)) ) 700 ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (dc->meta)) ||
701 ( (dc->meta == NULL) &&
702 ( (NULL == dc->filename) ||
703 ( (strlen (dc->filename) >= strlen (GNUNET_FS_DIRECTORY_EXT)) &&
704 (NULL !=
705 strstr (dc->filename + strlen(dc->filename) - strlen(GNUNET_FS_DIRECTORY_EXT),
706 GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) )
617 { 707 {
618 GNUNET_FS_directory_list_contents (prc->size, 708 GNUNET_FS_directory_list_contents (prc->size,
619 pt, 709 pt,