From: Christian Grothoff Date: Wed, 26 Aug 2009 09:13:06 +0000 (+0000) Subject: hxing X-Git-Tag: initial-import-from-subversion-38251~23586 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=85172474808b86fb0b11d1f2a63a88d3741d5ecb;p=oweals%2Fgnunet.git hxing --- diff --git a/src/fs/Makefile.am b/src/fs/Makefile.am index db9567fb1..5aca42ac2 100644 --- a/src/fs/Makefile.am +++ b/src/fs/Makefile.am @@ -16,10 +16,13 @@ libgnunetfs_la_SOURCES = \ fs.c \ fs_collection.c \ fs_directory.c \ + fs_download.c \ fs_file_information.c \ fs_getopt.c \ fs_publish.c \ fs_namespace.c \ + fs_search.c \ + fs_unindex.c \ fs_uri.c libgnunetfs_la_LIBADD = \ diff --git a/src/fs/fs.h b/src/fs/fs.h index 1a8a6b0f7..4743a594b 100644 --- a/src/fs/fs.h +++ b/src/fs/fs.h @@ -318,4 +318,79 @@ struct GNUNET_FS_Handle }; +/** + * Handle for controlling an upload. + */ +struct GNUNET_FS_PublishContext +{ + /** + * Handle to the global fs context. + */ + struct GNUNET_FS_Handle *h; + + /** + * Argument to pass to the client in callbacks. + */ + void *client_ctx; + + /** + * File-structure that is being shared. + */ + struct GNUNET_FS_FileInformation *fi; + + /** + * Namespace that we are publishing in, NULL if we have no namespace. + */ + struct GNUNET_FS_Namespace *namespace; + + /** + * ID of the content in the namespace, NULL if we have no namespace. + */ + char *nid; + + /** + * ID for future updates, NULL if we have no namespace or no updates. + */ + char *nuid; + + /** + * ID of the task performing the upload. NO_TASK + * if the upload has completed. + */ + GNUNET_SCHEDULER_TaskIdentifier upload_task; +}; + + +/** + * Handle for controlling an unindexing operation. + */ +struct GNUNET_FS_UnindexContext +{ +}; + + +/** + * Handle for controlling a search. + */ +struct GNUNET_FS_SearchContext +{ +}; + + +/** + * Context for controlling a download. + */ +struct GNUNET_FS_DownloadContext +{ +}; + +struct GNUNET_FS_Namespace +{ + /** + * Reference counter. + */ + unsigned int rc; +}; + + #endif diff --git a/src/fs/fs_download.c b/src/fs/fs_download.c index cb3b39995..f1954ea89 100644 --- a/src/fs/fs_download.c +++ b/src/fs/fs_download.c @@ -18,22 +18,75 @@ Boston, MA 02111-1307, USA. */ /** - * @file applications/fs/ecrs/download.c + * @file fs/fs_download.c * @brief DOWNLOAD helper methods (which do the real work). * @author Christian Grothoff */ #include "platform.h" -#include "gnunet_protocols.h" -#include "gnunet_ecrs_lib.h" -#include "gnunet_fs_lib.h" -#include "gnunet_identity_lib.h" -#include "ecrs_core.h" -#include "ecrs.h" +#include "gnunet_fs_service.h" #include "fs.h" -#include "tree.h" -#define DEBUG_DOWNLOAD GNUNET_NO +#define DEBUG_DOWNLOAD GNUNET_YES + + + +/** + * Download parts of a file. Note that this will store + * the blocks at the respective offset in the given file. Also, the + * download is still using the blocking of the underlying FS + * encoding. As a result, the download may *write* outside of the + * given boundaries (if offset and length do not match the 32k FS + * block boundaries).

+ * + * This function should be used to focus a download towards a + * particular portion of the file (optimization), not to strictly + * limit the download to exactly those bytes. + * + * @param h handle to the file sharing subsystem + * @param uri the URI of the file (determines what to download); CHK or LOC URI + * @param filename where to store the file, maybe NULL (then no file is + * created on disk and data must be grabbed from the callbacks) + * @param offset at what offset should we start the download (typically 0) + * @param length how many bytes should be downloaded starting at offset + * @param anonymity anonymity level to use for the download + * @param no_temporaries set to GNUNET_YES to disallow generation of temporary files + * @param recursive should this be a recursive download (useful for directories + * to automatically trigger download of files in the directories) + * @param parent parent download to associate this download with (use NULL + * for top-level downloads; useful for manually-triggered recursive downloads) + * @return context that can be used to control this download + */ +struct GNUNET_FS_DownloadContext * +GNUNET_FS_file_download_start (struct GNUNET_FS_Handle *h, + const struct GNUNET_FS_Uri *uri, + const char *filename, + unsigned long long offset, + unsigned long long length, + unsigned int anonymity, + int no_temporaries, + int recursive, + struct GNUNET_FS_DownloadContext *parent) +{ + return NULL; +} + +/** + * Stop a download (aborts if download is incomplete). + * + * @param rm handle for the download + * @param do_delete delete files of incomplete downloads + */ +void +GNUNET_FS_file_download_stop (struct GNUNET_FS_DownloadContext *rm, + int do_delete) +{ +} + + + + +#if 0 /** * Node-specific data (not shared, keep small!). 152 bytes. @@ -920,4 +973,6 @@ GNUNET_ECRS_file_download (struct GNUNET_GE_Context *ectx, dpcb, dpcbClosure, tt, ttClosure); } -/* end of download.c */ +#endif + +/* end of fs_download.c */ diff --git a/src/fs/fs_publish.c b/src/fs/fs_publish.c index ac71c8f21..7696dd940 100644 --- a/src/fs/fs_publish.c +++ b/src/fs/fs_publish.c @@ -34,6 +34,95 @@ #define DEBUG_PUBLISH GNUNET_YES +/** + * Main function that performs the upload. + * @param cls "struct GNUNET_FS_PublishContext" identifies the upload + * @param tc task context + */ +static void +do_upload (void *cls, + const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + struct GNUNET_FS_PublishContext *sc = cls; + + sc->upload_task = GNUNET_SCHEDULER_NO_TASK; + + // FIXME: find next block, process, schedule + // transmission to FS service +} + + +/** + * Publish a file or directory. + * + * @param h handle to the file sharing subsystem + * @param ctx initial value to use for the '*ctx' + * in the callback (for the GNUNET_FS_STATUS_PUBLISH_START event). + * @param fi information about the file or directory structure to publish + * @param namespace namespace to publish the file in, NULL for no namespace + * @param nid identifier to use for the publishd content in the namespace + * (can be NULL, must be NULL if namespace is NULL) + * @param nuid update-identifier that will be used for future updates + * (can be NULL, must be NULL if namespace or nid is NULL) + * @return context that can be used to control the publish operation + */ +struct GNUNET_FS_PublishContext * +GNUNET_FS_publish_start (struct GNUNET_FS_Handle *h, + void *ctx, + struct GNUNET_FS_FileInformation *fi, + struct GNUNET_FS_Namespace *namespace, + const char *nid, + const char *nuid) +{ + struct GNUNET_FS_PublishContext *ret; + + ret = GNUNET_malloc (sizeof (struct GNUNET_FS_PublishContext)); + ret->h = h; + ret->client_ctx = ctx; + ret->fi = fi; + ret->namespace = namespace; + if (namespace != NULL) + { + namespace->rc++; + GNUNET_assert (NULL != nid); + ret->nid = GNUNET_strdup (nid); + if (NULL != nuid) + ret->nuid = GNUNET_strdup (nuid); + } + // FIXME: make upload persistent! + ret->upload_task + = GNUNET_SCHEDULER_add_delayed (h->sched, + GNUNET_NO, + GNUNET_SCHEDULER_PRIORITY_BACKGROUND, + GNUNET_SCHEDULER_NO_TASK, + GNUNET_TIME_UNIT_ZERO, + &do_upload, + ret); + return ret; +} + + +/** + * Stop an upload. Will abort incomplete uploads (but + * not remove blocks that have already been publishd) or + * simply clean up the state for completed uploads. + * + * @param sc context for the upload to stop + */ +void +GNUNET_FS_publish_stop (struct GNUNET_FS_PublishContext *sc) +{ + if (GNUNET_SCHEDULER_NO_TASK != sc->upload_task) + GNUNET_SCHEDULER_cancel (sc->h->sched, sc->upload_task); + // FIXME: remove from persistence DB (?) --- think more about + // shutdown / persistent-resume APIs!!! + GNUNET_FS_file_information_destroy (sc->fi, NULL, NULL); + GNUNET_FS_namespace_delete (sc->namespace, GNUNET_NO); + GNUNET_free_non_null (sc->nid); + GNUNET_free_non_null (sc->nuid); + GNUNET_free (sc); +} + #if 0 diff --git a/src/fs/fs_search.c b/src/fs/fs_search.c index 56240af69..51d1fbc1f 100644 --- a/src/fs/fs_search.c +++ b/src/fs/fs_search.c @@ -19,19 +19,71 @@ */ /** - * @file applications/fs/ecrs/search.c + * @file fs/fs_search.c * @brief Helper functions for searching. * @author Christian Grothoff */ #include "platform.h" -#include "gnunet_protocols.h" -#include "gnunet_fs_lib.h" -#include "gnunet_ecrs_lib.h" -#include "ecrs_core.h" -#include "ecrs.h" +#include "gnunet_fs_service.h" +#include "fs.h" + +#define DEBUG_SEARCH GNUNET_YES + + +/** + * Start search for content. + * + * @param h handle to the file sharing subsystem + * @param uri specifies the search parameters; can be + * a KSK URI or an SKS URI. + * @param anonymity desired level of anonymity + * @return context that can be used to control the search + */ +struct GNUNET_FS_SearchContext * +GNUNET_FS_search_start (struct GNUNET_FS_Handle *h, + const struct GNUNET_FS_Uri *uri, + unsigned int anonymity) +{ + return NULL; +} + + +/** + * Pause search. + * + * @param sc context for the search that should be paused + */ +void +GNUNET_FS_search_pause (struct GNUNET_FS_SearchContext *sc) +{ +} + +/** + * Continue paused search. + * + * @param sc context for the search that should be resumed + */ +void +GNUNET_FS_search_continue (struct GNUNET_FS_SearchContext *sc) +{ +} -#define DEBUG_SEARCH GNUNET_NO + +/** + * Stop search for content. + * + * @param sc context for the search that should be stopped + */ +void +GNUNET_FS_search_stop (struct GNUNET_FS_SearchContext *sc) +{ +} + + + + +#if 0 /** * Context for an individual search. Followed @@ -568,5 +620,6 @@ GNUNET_ECRS_search (struct GNUNET_GE_Context *ectx, return GNUNET_OK; } +#endif -/* end of search.c */ +/* end of fs_search.c */ diff --git a/src/fs/fs_test.c b/src/fs/fs_test.c deleted file mode 100644 index 5eedda982..000000000 --- a/src/fs/fs_test.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - This file is part of GNUnet. - (C) 2004, 2005, 2006, 2008 Christian Grothoff (and other contributing authors) - - GNUnet is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 2, or (at your - option) any later version. - - GNUnet is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with GNUnet; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. -*/ - -/** - * @file applications/fs/fsui/basic_fsui_test.c - * @brief testcase for fsui (upload-search-download-unindex) - * @author Christian Grothoff - */ - -#include "platform.h" -#include "gnunet_util.h" -#include "gnunet_fsui_lib.h" - -#define DEBUG_VERBOSE GNUNET_NO - -#define CHECK(a) if (!(a)) { ok = GNUNET_NO; GNUNET_GE_BREAK(NULL, 0); goto FAILURE; } - -static char * -makeName (unsigned int i) -{ - char *fn; - - fn = - GNUNET_malloc (strlen ("/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST") + - 14); - GNUNET_snprintf (fn, - strlen ("/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST") + - 14, "/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST%u", i); - GNUNET_disk_directory_create_for_file (NULL, fn); - return fn; -} - -static volatile enum GNUNET_FSUI_EventType lastEvent; - -static struct GNUNET_MetaData *search_meta; - -static struct GNUNET_ECRS_URI *search_uri; - -static struct GNUNET_FSUI_Context *ctx; - -static void * -eventCallback (void *cls, const GNUNET_FSUI_Event * event) -{ - static char unused; - - switch (event->type) - { - case GNUNET_FSUI_search_resumed: - case GNUNET_FSUI_download_resumed: - case GNUNET_FSUI_upload_resumed: - case GNUNET_FSUI_unindex_resumed: - return &unused; - case GNUNET_FSUI_search_result: -#if DEBUG_VERBOSE - printf ("Received search result\n"); -#endif - search_uri = - GNUNET_ECRS_uri_duplicate (event->data.SearchResult.fi.uri); - search_meta = - GNUNET_meta_data_duplicate (event->data.SearchResult.fi.meta); - break; - case GNUNET_FSUI_upload_completed: -#if DEBUG_VERBOSE - printf ("Upload complete.\n"); -#endif - break; - case GNUNET_FSUI_download_completed: -#if DEBUG_VERBOSE - printf ("Download complete.\n"); -#endif - break; - case GNUNET_FSUI_unindex_completed: -#if DEBUG_VERBOSE - printf ("Unindex complete.\n"); -#endif - break; - default: - break; - } - lastEvent = event->type; - return NULL; -} - -#define START_DAEMON 1 - -int -main (int argc, char *argv[]) -{ -#if START_DAEMON - pid_t daemon; -#endif - int ok; - struct GNUNET_ECRS_URI *uri; - char *filename = NULL; - char *keywords[] = { - "fsui_foo", - "fsui_bar", - }; - char keyword[40]; - char *fn; - int prog; - struct GNUNET_MetaData *meta; - struct GNUNET_ECRS_URI *kuri; - struct GNUNET_GC_Configuration *cfg; - struct GNUNET_FSUI_UploadList *upload = NULL; - struct GNUNET_FSUI_SearchList *search = NULL; - struct GNUNET_FSUI_UnindexList *unindex = NULL; - struct GNUNET_FSUI_DownloadList *download = NULL; - - cfg = GNUNET_GC_create (); - if (-1 == GNUNET_GC_parse_configuration (cfg, "check.conf")) - { - GNUNET_GC_free (cfg); - return -1; - } -#if START_DAEMON - daemon = GNUNET_daemon_start (NULL, cfg, "peer.conf", GNUNET_NO); - GNUNET_GE_ASSERT (NULL, daemon > 0); - CHECK (GNUNET_OK == - GNUNET_wait_for_daemon_running (NULL, cfg, - 60 * GNUNET_CRON_SECONDS)); -#endif - GNUNET_thread_sleep (5 * GNUNET_CRON_SECONDS); /* give apps time to start */ - ok = GNUNET_YES; - - /* ACTUAL TEST CODE */ - ctx = GNUNET_FSUI_start (NULL, cfg, "basic_fsui_test", 32, /* thread pool size */ - GNUNET_NO, /* no resume */ - &eventCallback, NULL); - CHECK (ctx != NULL); - filename = makeName (42); - GNUNET_disk_file_write (NULL, - filename, - "foo bar test!", strlen ("foo bar test!"), "600"); - meta = GNUNET_meta_data_create (); - kuri = - GNUNET_ECRS_keyword_command_line_to_uri (NULL, 2, - (const char **) keywords); - /* upload */ - upload = GNUNET_FSUI_upload_start (ctx, filename, (GNUNET_FSUI_DirectoryScanCallback) & GNUNET_disk_directory_scan, NULL, 0, /* anonymity */ - 0, /* priority */ - GNUNET_YES, - GNUNET_NO, - GNUNET_NO, - GNUNET_get_time () + - 5 * GNUNET_CRON_HOURS, meta, kuri, kuri); - CHECK (upload != NULL); - GNUNET_ECRS_uri_destroy (kuri); - GNUNET_meta_data_destroy (meta); - prog = 0; - while (lastEvent != GNUNET_FSUI_upload_completed) - { - prog++; - CHECK (prog < - 10000) GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); - if (GNUNET_shutdown_test () == GNUNET_YES) - break; - } - - /* search */ - GNUNET_snprintf (keyword, 40, "+%s +%s", keywords[0], keywords[1]); - uri = GNUNET_ECRS_keyword_string_to_uri (NULL, keyword); - search = GNUNET_FSUI_search_start (ctx, 0, uri); - GNUNET_ECRS_uri_destroy (uri); - CHECK (search != NULL); - prog = 0; - while (lastEvent != GNUNET_FSUI_search_result) - { - prog++; - CHECK (prog < 10000); - GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); - if (GNUNET_shutdown_test () == GNUNET_YES) - break; - } - GNUNET_FSUI_search_abort (search); - GNUNET_FSUI_search_stop (search); - - /* download */ - fn = makeName (43); - download = GNUNET_FSUI_download_start (ctx, - 0, - GNUNET_NO, - search_uri, - search_meta, fn, NULL, NULL); - GNUNET_free (fn); - prog = 0; - while (lastEvent != GNUNET_FSUI_download_completed) - { - prog++; - CHECK (prog < 10000); - GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); - if (GNUNET_shutdown_test () == GNUNET_YES) - break; - } - GNUNET_FSUI_download_stop (download); - download = NULL; - GNUNET_ECRS_uri_destroy (search_uri); - GNUNET_meta_data_destroy (search_meta); - /* unindex */ - unindex = GNUNET_FSUI_unindex_start (ctx, filename); - prog = 0; - while (lastEvent != GNUNET_FSUI_unindex_completed) - { - prog++; - CHECK (prog < 10000); - GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); - if (GNUNET_shutdown_test () == GNUNET_YES) - break; - } - if (lastEvent != GNUNET_FSUI_unindex_completed) - GNUNET_FSUI_unindex_abort (unindex); - GNUNET_FSUI_unindex_stop (unindex); - - - /* END OF TEST CODE */ -FAILURE: - if (ctx != NULL) - GNUNET_FSUI_stop (ctx); - if (filename != NULL) - { - UNLINK (filename); - GNUNET_free (filename); - } - if (download != NULL) - { - GNUNET_FSUI_download_abort (download); - GNUNET_FSUI_download_stop (download); - } - filename = makeName (43); - /* TODO: verify file 'filename(42)' == file 'filename(43)' */ - UNLINK (filename); - GNUNET_free (filename); - -#if START_DAEMON - GNUNET_GE_ASSERT (NULL, GNUNET_OK == GNUNET_daemon_stop (NULL, daemon)); -#endif - GNUNET_GC_free (cfg); - - return (ok == GNUNET_YES) ? 0 : 1; -} - -/* end of basic_fsui_test.c */ diff --git a/src/fs/fs_unindex.c b/src/fs/fs_unindex.c index ef63e798e..8fb13a644 100644 --- a/src/fs/fs_unindex.c +++ b/src/fs/fs_unindex.c @@ -19,25 +19,62 @@ */ /** - * @file applications/fs/ecrs/unindex.c + * @file fs/fs_unindex.c * @author Krista Bennett * @author Christian Grothoff - * - * Unindex file. + * @brief Unindex file. * * TODO: * - code cleanup (share more with upload.c) */ #include "platform.h" -#include "gnunet_protocols.h" -#include "gnunet_ecrs_lib.h" -#include "gnunet_fs_lib.h" -#include "gnunet_getoption_lib.h" -#include "ecrs_core.h" -#include "ecrs.h" +#include "gnunet_fs_service.h" #include "fs.h" -#include "tree.h" + +/** + * Iterate over all indexed files. + * + * @param h handle to the file sharing subsystem + * @param iterator function to call on each indexed file + * @param iterator_cls closure for iterator + */ +void +GNUNET_FS_get_indexed_files (struct GNUNET_FS_Handle *h, + GNUNET_FS_IndexedFileProcessor iterator, + void *iterator_cls) +{ +} + + +/** + * Unindex a file. + * + * @param h handle to the file sharing subsystem + * @param filename file to unindex + * @return NULL on error, otherwise handle + */ +struct GNUNET_FS_UnindexContext * +GNUNET_FS_unindex (struct GNUNET_FS_Handle *h, + const char *filename) +{ + return NULL; +} + + +/** + * Clean up after completion of an unindex operation. + * + * @param uc handle + */ +void +GNUNET_FS_unindex_stop (struct GNUNET_FS_UnindexContext *uc) +{ +} + + + +#if 0 #define STRICT_CHECKS GNUNET_NO @@ -391,4 +428,6 @@ FAILURE: return GNUNET_SYSERR; } -/* end of unindex.c */ +#endif + +/* end of fs_unindex.c */ diff --git a/src/fs/test_fs.c b/src/fs/test_fs.c new file mode 100644 index 000000000..5eedda982 --- /dev/null +++ b/src/fs/test_fs.c @@ -0,0 +1,259 @@ +/* + This file is part of GNUnet. + (C) 2004, 2005, 2006, 2008 Christian Grothoff (and other contributing authors) + + GNUnet is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +/** + * @file applications/fs/fsui/basic_fsui_test.c + * @brief testcase for fsui (upload-search-download-unindex) + * @author Christian Grothoff + */ + +#include "platform.h" +#include "gnunet_util.h" +#include "gnunet_fsui_lib.h" + +#define DEBUG_VERBOSE GNUNET_NO + +#define CHECK(a) if (!(a)) { ok = GNUNET_NO; GNUNET_GE_BREAK(NULL, 0); goto FAILURE; } + +static char * +makeName (unsigned int i) +{ + char *fn; + + fn = + GNUNET_malloc (strlen ("/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST") + + 14); + GNUNET_snprintf (fn, + strlen ("/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST") + + 14, "/tmp/gnunet-basic_fsui_test/BASIC_FSUI_TEST%u", i); + GNUNET_disk_directory_create_for_file (NULL, fn); + return fn; +} + +static volatile enum GNUNET_FSUI_EventType lastEvent; + +static struct GNUNET_MetaData *search_meta; + +static struct GNUNET_ECRS_URI *search_uri; + +static struct GNUNET_FSUI_Context *ctx; + +static void * +eventCallback (void *cls, const GNUNET_FSUI_Event * event) +{ + static char unused; + + switch (event->type) + { + case GNUNET_FSUI_search_resumed: + case GNUNET_FSUI_download_resumed: + case GNUNET_FSUI_upload_resumed: + case GNUNET_FSUI_unindex_resumed: + return &unused; + case GNUNET_FSUI_search_result: +#if DEBUG_VERBOSE + printf ("Received search result\n"); +#endif + search_uri = + GNUNET_ECRS_uri_duplicate (event->data.SearchResult.fi.uri); + search_meta = + GNUNET_meta_data_duplicate (event->data.SearchResult.fi.meta); + break; + case GNUNET_FSUI_upload_completed: +#if DEBUG_VERBOSE + printf ("Upload complete.\n"); +#endif + break; + case GNUNET_FSUI_download_completed: +#if DEBUG_VERBOSE + printf ("Download complete.\n"); +#endif + break; + case GNUNET_FSUI_unindex_completed: +#if DEBUG_VERBOSE + printf ("Unindex complete.\n"); +#endif + break; + default: + break; + } + lastEvent = event->type; + return NULL; +} + +#define START_DAEMON 1 + +int +main (int argc, char *argv[]) +{ +#if START_DAEMON + pid_t daemon; +#endif + int ok; + struct GNUNET_ECRS_URI *uri; + char *filename = NULL; + char *keywords[] = { + "fsui_foo", + "fsui_bar", + }; + char keyword[40]; + char *fn; + int prog; + struct GNUNET_MetaData *meta; + struct GNUNET_ECRS_URI *kuri; + struct GNUNET_GC_Configuration *cfg; + struct GNUNET_FSUI_UploadList *upload = NULL; + struct GNUNET_FSUI_SearchList *search = NULL; + struct GNUNET_FSUI_UnindexList *unindex = NULL; + struct GNUNET_FSUI_DownloadList *download = NULL; + + cfg = GNUNET_GC_create (); + if (-1 == GNUNET_GC_parse_configuration (cfg, "check.conf")) + { + GNUNET_GC_free (cfg); + return -1; + } +#if START_DAEMON + daemon = GNUNET_daemon_start (NULL, cfg, "peer.conf", GNUNET_NO); + GNUNET_GE_ASSERT (NULL, daemon > 0); + CHECK (GNUNET_OK == + GNUNET_wait_for_daemon_running (NULL, cfg, + 60 * GNUNET_CRON_SECONDS)); +#endif + GNUNET_thread_sleep (5 * GNUNET_CRON_SECONDS); /* give apps time to start */ + ok = GNUNET_YES; + + /* ACTUAL TEST CODE */ + ctx = GNUNET_FSUI_start (NULL, cfg, "basic_fsui_test", 32, /* thread pool size */ + GNUNET_NO, /* no resume */ + &eventCallback, NULL); + CHECK (ctx != NULL); + filename = makeName (42); + GNUNET_disk_file_write (NULL, + filename, + "foo bar test!", strlen ("foo bar test!"), "600"); + meta = GNUNET_meta_data_create (); + kuri = + GNUNET_ECRS_keyword_command_line_to_uri (NULL, 2, + (const char **) keywords); + /* upload */ + upload = GNUNET_FSUI_upload_start (ctx, filename, (GNUNET_FSUI_DirectoryScanCallback) & GNUNET_disk_directory_scan, NULL, 0, /* anonymity */ + 0, /* priority */ + GNUNET_YES, + GNUNET_NO, + GNUNET_NO, + GNUNET_get_time () + + 5 * GNUNET_CRON_HOURS, meta, kuri, kuri); + CHECK (upload != NULL); + GNUNET_ECRS_uri_destroy (kuri); + GNUNET_meta_data_destroy (meta); + prog = 0; + while (lastEvent != GNUNET_FSUI_upload_completed) + { + prog++; + CHECK (prog < + 10000) GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); + if (GNUNET_shutdown_test () == GNUNET_YES) + break; + } + + /* search */ + GNUNET_snprintf (keyword, 40, "+%s +%s", keywords[0], keywords[1]); + uri = GNUNET_ECRS_keyword_string_to_uri (NULL, keyword); + search = GNUNET_FSUI_search_start (ctx, 0, uri); + GNUNET_ECRS_uri_destroy (uri); + CHECK (search != NULL); + prog = 0; + while (lastEvent != GNUNET_FSUI_search_result) + { + prog++; + CHECK (prog < 10000); + GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); + if (GNUNET_shutdown_test () == GNUNET_YES) + break; + } + GNUNET_FSUI_search_abort (search); + GNUNET_FSUI_search_stop (search); + + /* download */ + fn = makeName (43); + download = GNUNET_FSUI_download_start (ctx, + 0, + GNUNET_NO, + search_uri, + search_meta, fn, NULL, NULL); + GNUNET_free (fn); + prog = 0; + while (lastEvent != GNUNET_FSUI_download_completed) + { + prog++; + CHECK (prog < 10000); + GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); + if (GNUNET_shutdown_test () == GNUNET_YES) + break; + } + GNUNET_FSUI_download_stop (download); + download = NULL; + GNUNET_ECRS_uri_destroy (search_uri); + GNUNET_meta_data_destroy (search_meta); + /* unindex */ + unindex = GNUNET_FSUI_unindex_start (ctx, filename); + prog = 0; + while (lastEvent != GNUNET_FSUI_unindex_completed) + { + prog++; + CHECK (prog < 10000); + GNUNET_thread_sleep (50 * GNUNET_CRON_MILLISECONDS); + if (GNUNET_shutdown_test () == GNUNET_YES) + break; + } + if (lastEvent != GNUNET_FSUI_unindex_completed) + GNUNET_FSUI_unindex_abort (unindex); + GNUNET_FSUI_unindex_stop (unindex); + + + /* END OF TEST CODE */ +FAILURE: + if (ctx != NULL) + GNUNET_FSUI_stop (ctx); + if (filename != NULL) + { + UNLINK (filename); + GNUNET_free (filename); + } + if (download != NULL) + { + GNUNET_FSUI_download_abort (download); + GNUNET_FSUI_download_stop (download); + } + filename = makeName (43); + /* TODO: verify file 'filename(42)' == file 'filename(43)' */ + UNLINK (filename); + GNUNET_free (filename); + +#if START_DAEMON + GNUNET_GE_ASSERT (NULL, GNUNET_OK == GNUNET_daemon_stop (NULL, daemon)); +#endif + GNUNET_GC_free (cfg); + + return (ok == GNUNET_YES) ? 0 : 1; +} + +/* end of basic_fsui_test.c */ diff --git a/src/include/gnunet_fs_service.h b/src/include/gnunet_fs_service.h index 7c6fc0549..4664c4cee 100644 --- a/src/include/gnunet_fs_service.h +++ b/src/include/gnunet_fs_service.h @@ -1763,11 +1763,11 @@ GNUNET_FS_file_information_destroy (struct GNUNET_FS_FileInformation *fi, */ struct GNUNET_FS_PublishContext * GNUNET_FS_publish_start (struct GNUNET_FS_Handle *h, - void *ctx, - const struct GNUNET_FS_FileInformation *fi, - struct GNUNET_FS_Namespace *namespace, - const char *nid, - const char *nuid); + void *ctx, + struct GNUNET_FS_FileInformation *fi, + struct GNUNET_FS_Namespace *namespace, + const char *nid, + const char *nuid); /**