diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-04-02 15:27:48 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-04-02 15:27:48 +0000 |
commit | 133eed3e2375b3032e9134d7ab16a936d09c98ac (patch) | |
tree | 1f404ffbbdc72b0d7254cc93a2cf8b1616556a95 /src/fs | |
parent | d9dda7eda6b55b311982d99885aafd82448a057e (diff) | |
download | gnunet-133eed3e2375b3032e9134d7ab16a936d09c98ac.tar.gz gnunet-133eed3e2375b3032e9134d7ab16a936d09c98ac.zip |
more on directory handling
Diffstat (limited to 'src/fs')
-rw-r--r-- | src/fs/fs_download.c | 104 |
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 | */ | ||
258 | char * | ||
259 | GNUNET_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, |