From 5cb7ca34a4c2c9b473f0b38363172c3694330f52 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Fri, 2 Apr 2010 20:21:58 +0000 Subject: misc fixes --- src/fs/fs.h | 2 +- src/fs/fs_download.c | 169 ++++++++++++++++++++++--------------------- src/fs/fs_file_information.c | 30 +++++++- src/fs/gnunet-publish.c | 86 ---------------------- 4 files changed, 114 insertions(+), 173 deletions(-) diff --git a/src/fs/fs.h b/src/fs/fs.h index 77a73c3d6..0b3b25955 100644 --- a/src/fs/fs.h +++ b/src/fs/fs.h @@ -401,7 +401,7 @@ struct GNUNET_FS_FileInformation struct { /** - * Name of the directory. FIXME: currently never set! + * Name of the directory. */ char *dirname; diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c index 4b5af3789..b4f16518d 100644 --- a/src/fs/fs_download.c +++ b/src/fs/fs_download.c @@ -322,14 +322,19 @@ GNUNET_FS_meta_data_suggest_filename (const struct GNUNET_CONTAINER_MetaData *md {"video/x-msvideo", ".avi"}, {NULL, NULL}, }; - + char *ret; unsigned int i; char *mime; + char *base; const char *ext; - - ext = ""; - mime = NULL; - // FIXME: get mime from meta data + + ret = GNUNET_CONTAINER_meta_data_get_by_type (md, + EXTRACTOR_METATYPE_FILENAME); + if (ret != NULL) + return ret; + ext = NULL; + mime = GNUNET_CONTAINER_meta_data_get_by_type (md, + EXTRACTOR_METATYPE_MIMETYPE); if (mime != NULL) { i = 0; @@ -343,70 +348,39 @@ GNUNET_FS_meta_data_suggest_filename (const struct GNUNET_CONTAINER_MetaData *md mime); else ext = mimeMap[i][1]; + GNUNET_free (mime); } - // FIXME: try to get some base name... -#if 0 - const char *key; - const char *mime; - char *path; - unsigned int j; - char *renameTo; - char *ret; - size_t max; - struct stat filestat; - - key = EXTRACTOR_extractLast (EXTRACTOR_TITLE, list); - if (key == NULL) - key = EXTRACTOR_extractLast (EXTRACTOR_SOFTWARE, list); - if (key == NULL) - key = EXTRACTOR_extractLast (EXTRACTOR_DESCRIPTION, list); - if (key == NULL) - key = EXTRACTOR_extractLast (EXTRACTOR_COMMENT, list); - if (key == NULL) - key = EXTRACTOR_extractLast (EXTRACTOR_SUBJECT, list); - if (key == NULL) - key = EXTRACTOR_extractLast (EXTRACTOR_ALBUM, list); - if (key == NULL) - key = EXTRACTOR_extractLast (EXTRACTOR_UNKNOWN, list); - mime = EXTRACTOR_extractLast (EXTRACTOR_MIMETYPE, list); - if (mime != NULL) - { - } - if (key == NULL) - { - key = &filename[strlen (filename) - 1]; - while ((key != filename) && (key[0] != DIR_SEPARATOR)) - key--; - if (key[0] == DIR_SEPARATOR) - key++; - } - GNUNET_snprintf (renameTo, - max, - "%s%s%.*s%s", - path, - (path[strlen (path) - 1] != - DIR_SEPARATOR) ? DIR_SEPARATOR_STR : "", - GNUNET_MIN (255 - strlen (mime), - PATH_MAX - strlen (path) - 64), key, - (strcasecmp - (renameTo + strlen (renameTo) - strlen (mime), - mime) != 0) ? mime : ""); - - - } - for (i = strlen (renameTo) - 1; i >= 0; i--) - if (!isprint (renameTo[i])) - renameTo[i] = '_'; - else if (renameTo[i] == '.' && i > 0 && renameTo[i - 1] == '.') - { - /* remove .. to avoid directory traversal */ - renameTo[i - 1] = renameTo[i] = '_'; - i--; - } -#endif - - GNUNET_break (0); // FIXME: not implemented - return NULL; + base = GNUNET_CONTAINER_meta_data_get_first_by_types (md, + EXTRACTOR_METATYPE_TITLE, + EXTRACTOR_METATYPE_BOOK_TITLE, + EXTRACTOR_METATYPE_ORIGINAL_TITLE, + EXTRACTOR_METATYPE_PACKAGE_NAME, + EXTRACTOR_METATYPE_URL, + EXTRACTOR_METATYPE_URI, + EXTRACTOR_METATYPE_DESCRIPTION, + EXTRACTOR_METATYPE_ISRC, + EXTRACTOR_METATYPE_JOURNAL_NAME, + EXTRACTOR_METATYPE_AUTHOR_NAME, + EXTRACTOR_METATYPE_SUBJECT, + EXTRACTOR_METATYPE_ALBUM, + EXTRACTOR_METATYPE_ARTIST, + EXTRACTOR_METATYPE_KEYWORDS, + EXTRACTOR_METATYPE_COMMENT, + EXTRACTOR_METATYPE_UNKNOWN, + -1); + if ( (base == NULL) && + (ext == NULL) ) + return NULL; + if (base == NULL) + return GNUNET_strdup (ext); + if (ext == NULL) + return base; + GNUNET_asprintf (&ret, + "%s%s", + base, + ext); + GNUNET_free (base); + return ret; } @@ -521,6 +495,7 @@ trigger_recursive_download (void *cls, { struct GNUNET_FS_DownloadContext *dc = cls; struct GNUNET_FS_DownloadContext *cpos; + struct GNUNET_DISK_FileHandle *fh; char *fn; char *us; char *ext; @@ -573,11 +548,15 @@ trigger_recursive_download (void *cls, else { dn = GNUNET_strdup (dc->filename); - GNUNET_break ( (strlen (dn) < strlen (GNUNET_FS_DIRECTORY_EXT)) || - (NULL == + GNUNET_break ( (strlen (dn) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && + (NULL != strstr (dn + strlen(dn) - strlen(GNUNET_FS_DIRECTORY_EXT), GNUNET_FS_DIRECTORY_EXT)) ); - dn[strlen(dn) - strlen (GNUNET_FS_DIRECTORY_EXT)] = '\0'; + if ( (strlen (dn) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && + (NULL != + strstr (dn + strlen(dn) - strlen(GNUNET_FS_DIRECTORY_EXT), + GNUNET_FS_DIRECTORY_EXT)) ) + dn[strlen(dn) - strlen (GNUNET_FS_DIRECTORY_EXT)] = '\0'; if ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (meta)) && ( (strlen (filename) < strlen (GNUNET_FS_DIRECTORY_EXT)) || (NULL == @@ -617,8 +596,28 @@ trigger_recursive_download (void *cls, { if (full_name != NULL) { - /* determine on-disk filename, write data! */ - GNUNET_break (0); // FIXME: not implemented + fh = GNUNET_DISK_file_open (full_name, + GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_TRUNCATE | GNUNET_DISK_OPEN_CREATE, + GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); + if (fh == NULL) + { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, + "open", + full_name); + GNUNET_free (full_name); + GNUNET_free_non_null (fn); + return; + } + if (length != + GNUNET_DISK_file_write (fh, + data, + length)) + { + GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, + "write", + full_name); + } + GNUNET_DISK_file_close (fh); } else { @@ -866,15 +865,13 @@ process_result_with_request (void *cls, ( (strlen (dc->filename) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && (NULL != strstr (dc->filename + strlen(dc->filename) - strlen(GNUNET_FS_DIRECTORY_EXT), - GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) ) - { - GNUNET_FS_directory_list_contents (prc->size, - pt, - off, - &trigger_recursive_download, - dc); - } - + GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) ) + GNUNET_FS_directory_list_contents (prc->size, + pt, + off, + &trigger_recursive_download, + dc); + } pi.status = GNUNET_FS_STATUS_DOWNLOAD_PROGRESS; @@ -906,7 +903,13 @@ process_result_with_request (void *cls, } if ( (0 != (dc->options & GNUNET_FS_DOWNLOAD_OPTION_RECURSIVE)) && - (GNUNET_NO != GNUNET_FS_meta_data_test_for_directory (dc->meta)) ) + ( (GNUNET_YES == GNUNET_FS_meta_data_test_for_directory (dc->meta)) || + ( (dc->meta == NULL) && + ( (NULL == dc->filename) || + ( (strlen (dc->filename) >= strlen (GNUNET_FS_DIRECTORY_EXT)) && + (NULL != + strstr (dc->filename + strlen(dc->filename) - strlen(GNUNET_FS_DIRECTORY_EXT), + GNUNET_FS_DIRECTORY_EXT)) ) ) ) ) ) full_recursive_download (dc); if (dc->child_head == NULL) { diff --git a/src/fs/fs_file_information.c b/src/fs/fs_file_information.c index 88d0ca386..e0504be71 100644 --- a/src/fs/fs_file_information.c +++ b/src/fs/fs_file_information.c @@ -204,6 +204,8 @@ GNUNET_FS_file_information_create_from_file (void *client_info, struct FileInfo *fi; struct stat sbuf; struct GNUNET_FS_FileInformation *ret; + const char *fn; + const char *ss; if (0 != STAT (filename, &sbuf)) { @@ -230,6 +232,17 @@ GNUNET_FS_file_information_create_from_file (void *client_info, priority, expirationTime); ret->data.file.filename = GNUNET_strdup (filename); + fn = filename; + while (NULL != (ss = strstr (fn, + DIR_SEPARATOR_STR))) + fn = ss + 1; + GNUNET_CONTAINER_meta_data_insert (ret->meta, + "", + EXTRACTOR_METATYPE_FILENAME, + EXTRACTOR_METAFORMAT_C_STRING, + "text/plain", + fn, + strlen (fn) + 1); return ret; } @@ -622,13 +635,12 @@ GNUNET_FS_file_information_create_from_directory (void *client_info, struct EntryProcCls dc; struct GNUNET_FS_Uri *ksk; struct GNUNET_CONTAINER_MetaData *meta; - - + const char *fn; + const char *ss; dc.entries = NULL; meta = GNUNET_CONTAINER_meta_data_create (); GNUNET_FS_meta_data_make_directory (meta); - scanner (scanner_cls, filename, do_index, @@ -654,6 +666,18 @@ GNUNET_FS_file_information_create_from_directory (void *client_info, GNUNET_FS_file_information_sync (dc.entries); dc.entries = dc.entries->next; } + fn = filename; + while (NULL != (ss = strstr (fn, + DIR_SEPARATOR_STR))) + fn = ss + 1; + GNUNET_CONTAINER_meta_data_insert (ret->meta, + "", + EXTRACTOR_METATYPE_FILENAME, + EXTRACTOR_METAFORMAT_C_STRING, + "text/plain", + fn, + strlen (fn) + 1); + ret->data.dir.dirname = GNUNET_strdup (filename); GNUNET_FS_file_information_sync (ret); return ret; } diff --git a/src/fs/gnunet-publish.c b/src/fs/gnunet-publish.c index b8017886e..bcfc8967b 100644 --- a/src/fs/gnunet-publish.c +++ b/src/fs/gnunet-publish.c @@ -601,7 +601,6 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = { ("add an additional keyword for the top-level file or directory" " (this option can be specified multiple times)"), 1, &GNUNET_FS_getopt_set_keywords, &topKeywords}, - // *: option not yet used... (can handle in a pass over FI) {'m', "meta", "TYPE:VALUE", gettext_noop ("set the meta-data for the given TYPE to the given VALUE"), 1, &GNUNET_FS_getopt_set_metadata, &meta}, @@ -621,7 +620,6 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = { gettext_noop ("publish the files under the pseudonym NAME (place file into namespace)"), 1, &GNUNET_GETOPT_set_string, &pseudonym}, - // *: option not yet used... (need FS API support!) {'s', "simulate-only", NULL, gettext_noop ("only simulate the process but do not do any " "actual publishing (useful to compute URIs)"), @@ -630,7 +628,6 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = { gettext_noop ("set the ID of this version of the publication" " (for namespace insertions only)"), 1, &GNUNET_GETOPT_set_string, &this_id}, - // *: option not yet used... (need FS API support!) {'u', "uri", "URI", gettext_noop ("URI to be published (can be used instead of passing a " "file to add keywords to the file with the respective URI)"), @@ -662,86 +659,3 @@ main (int argc, char *const *argv) } /* end of gnunet-publish.c */ - -//////////////////////////////////////////////////////////////// - -#if 0 -/** - * Print progess message. - */ -static void * -printstatus (void *ctx, const GNUNET_FSUI_Event * event) -{ - unsigned long long delta; - char *fstring; - - switch (event->type) - { - case GNUNET_FSUI_upload_progress: - if (*verboselevel) - { - char *ret; - GNUNET_CronTime now; - - now = GNUNET_get_time (); - delta = event->data.UploadProgress.eta - now; - if (event->data.UploadProgress.eta < now) - delta = 0; - ret = GNUNET_get_time_interval_as_fancy_string (delta); - PRINTF (_("%16llu of %16llu bytes inserted " - "(estimating %6s to completion) - %s\n"), - event->data.UploadProgress.completed, - event->data.UploadProgress.total, - ret, event->data.UploadProgress.filename); - GNUNET_free (ret); - } - break; - case GNUNET_FSUI_upload_completed: - if (*verboselevel) - { - delta = GNUNET_get_time () - start_time; - PRINTF (_("Upload of `%s' complete, " - "%llu bytes took %llu seconds (%8.3f KiB/s).\n"), - event->data.UploadCompleted.filename, - event->data.UploadCompleted.total, - delta / GNUNET_CRON_SECONDS, - (delta == 0) - ? (double) (-1.0) - : (double) (event->data.UploadCompleted.total - / 1024.0 * GNUNET_CRON_SECONDS / delta)); - } - fstring = GNUNET_ECRS_uri_to_string (event->data.UploadCompleted.uri); - printf (_("File `%s' has URI: %s\n"), - event->data.UploadCompleted.filename, fstring); - GNUNET_free (fstring); - if (ul == event->data.UploadCompleted.uc.pos) - { - postProcess (event->data.UploadCompleted.uri); - errorCode = 0; - GNUNET_shutdown_initiate (); - } - break; - case GNUNET_FSUI_upload_aborted: - printf (_("\nUpload aborted.\n")); - errorCode = 2; - GNUNET_shutdown_initiate (); - break; - case GNUNET_FSUI_upload_error: - printf (_("\nError uploading file: %s"), - event->data.UploadError.message); - errorCode = 3; - GNUNET_shutdown_initiate (); - break; - case GNUNET_FSUI_upload_started: - case GNUNET_FSUI_upload_stopped: - break; - default: - printf (_("\nUnexpected event: %d\n"), event->type); - GNUNET_GE_BREAK (ectx, 0); - break; - } - return NULL; -} -#endif - -/* end of gnunet-publish.c */ -- cgit v1.2.3