#include #include "platform.h" #include "gnunet_fs_service.h" static char *client_name; static char *output_filename; static const struct GNUNET_CONFIGURATION_Handle *config; static struct GNUNET_FS_Handle *fs; static struct GNUNET_FS_DownloadContext *dc; static struct GNUNET_FS_Uri *uri; static void shutdown_task(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { FPRINTF(stderr, _("scheduler: run shutdown_task\n")); if (dc) { GNUNET_FS_download_stop (dc, 1); dc = NULL; } FPRINTF(stderr, _("scheduler: end shutdown_task\n")); } static void cleanup_task(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { FPRINTF(stderr, _("scheduler: run cleanup_task\n")); if (fs) { GNUNET_FS_stop(fs); fs = NULL; } FPRINTF(stderr, _("scheduler: end cleanup_task\n")); } static void * progress_cb(void *cls, const struct GNUNET_FS_ProgressInfo *info) { FPRINTF(stderr, _("scheduler: run progress_cb (%u)\n"), info->status); if (info->status == GNUNET_FS_STATUS_DOWNLOAD_START) { FPRINTF(stderr, _("progress_cb: download started\n")); } else if (info->status == GNUNET_FS_STATUS_DOWNLOAD_COMPLETED) { FPRINTF(stderr, _("progress_cb: download ended\n")); } else if (info->status == GNUNET_FS_STATUS_DOWNLOAD_STOPPED) { GNUNET_SCHEDULER_add_continuation (cleanup_task, NULL, GNUNET_SCHEDULER_REASON_PREREQ_DONE); } FPRINTF(stderr, _("scheduler: end progress_cb (%u)\n"), info->status); return NULL; } static void first_task(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c) { struct GNUNET_TIME_Relative fivesec = { (5 * 1000 * 1000) }; FPRINTF(stderr, _("scheduler: start first_task\n")); config = c; fs = GNUNET_FS_start(config, client_name, progress_cb, NULL, GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END); FPRINTF(stderr, _("scheduler: add download tasks\n")); dc = GNUNET_FS_download_start(fs, uri, NULL, output_filename, NULL, 0UL, GNUNET_FS_uri_chk_get_file_size(uri), 0, GNUNET_FS_DOWNLOAD_OPTION_NONE, NULL, NULL); FPRINTF(stderr, _("scheduler: add shutdown_task\n")); GNUNET_SCHEDULER_add_delayed(fivesec, shutdown_task, NULL); FPRINTF(stderr, _("scheduler: end first_task\n")); } int main (int argc, char *argv[]) { int ret; char *emsg; struct GNUNET_GETOPT_CommandLineOption options[] = { GNUNET_GETOPT_OPTION_END }; if (argc != 3) { FPRINTF(stderr, _("Invalid number of arguments")); return -1; } client_name = argv[0]; output_filename = argv[1]; uri = GNUNET_FS_uri_parse(argv[2], &emsg); FPRINTF(stderr, _("scheduler: GNUNET_PROGRAM_run\n")); ret = GNUNET_PROGRAM_run(argc, argv, "download OUTPUT URI", gettext_noop("foo"), options, first_task, NULL); return !(ret == GNUNET_OK); }