From: Michael Tremer Date: Sun, 11 Apr 2021 12:37:31 +0000 (+0000) Subject: downloader: Add a progressbar to single downloads X-Git-Tag: 0.9.28~1285^2~373 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=38561d720bb7b8c5e5c76d88782df55db7b973ec;p=pakfire.git downloader: Add a progressbar to single downloads Signed-off-by: Michael Tremer --- diff --git a/Makefile.am b/Makefile.am index c3599938f..745b14c41 100644 --- a/Makefile.am +++ b/Makefile.am @@ -461,6 +461,7 @@ tests_libpakfire_db_LDADD = \ dist_tests_libpakfire_downloader_SOURCES = \ tests/libpakfire/downloader.c \ src/libpakfire/downloader.c \ + src/libpakfire/progressbar.c \ src/libpakfire/util.c tests_libpakfire_downloader_CPPFLAGS = \ diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index ce558380f..c53b76e85 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -298,7 +298,7 @@ static struct pakfire_transfer* pakfire_downloader_create_transfer( goto ERROR; // Enable logging/debugging - curl_easy_setopt(transfer->handle, CURLOPT_VERBOSE, 1); + curl_easy_setopt(transfer->handle, CURLOPT_VERBOSE, 0); #ifdef ENABLE_DEBUG curl_easy_setopt(transfer->handle, CURLOPT_DEBUGFUNCTION, debug_callback); @@ -577,6 +577,62 @@ static int pakfire_downloader_prepare_transfer(struct pakfire_downloader* downlo return 0; } +static int pakfire_downloader_update_single_progressbar(void* data, + curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { + struct pakfire_downloader* downloader = (struct pakfire_downloader*)data; + + // Set maximum (because this might have changed) + pakfire_progressbar_set_max(downloader->progressbar, dltotal); + + // Update current value + return pakfire_progressbar_update(downloader->progressbar, dlnow); +} + +static int pakfire_downloader_make_single_progressbar( + struct pakfire_downloader* downloader, struct pakfire_transfer* transfer) { + int r; + + // Reset the progressbar + pakfire_progressbar_reset(downloader->progressbar); + + // Add title + char* filename = pakfire_basename(transfer->url); + if (filename) { + r = pakfire_progressbar_add_string(downloader->progressbar, "%s", filename); + free(filename); + if (r) + return r; + } + + // Add the bar + r = pakfire_progressbar_add_bar(downloader->progressbar); + if (r) + return r; + + // Add percentage + r = pakfire_progressbar_add_percentage(downloader->progressbar); + if (r) + return r; + + // Add timer + r = pakfire_progressbar_add_timer(downloader->progressbar); + if (r) + return r; + + // Update the progressbar + curl_easy_setopt(transfer->handle, CURLOPT_XFERINFOFUNCTION, + pakfire_downloader_update_single_progressbar); + curl_easy_setopt(transfer->handle, CURLOPT_XFERINFODATA, downloader); + curl_easy_setopt(transfer->handle, CURLOPT_NOPROGRESS, 0L); + + // Start the progressbar + r = pakfire_progressbar_start(downloader->progressbar, 0); + if (r) + return r; + + return 0; +} + /* This function performs one single transfer in blocking mode. */ @@ -584,6 +640,11 @@ static int pakfire_downloader_perform( struct pakfire_downloader* downloader, struct pakfire_transfer* transfer) { int r; + // Create progressbar + r = pakfire_downloader_make_single_progressbar(downloader, transfer); + if (r) + return r; + // Prepare the transfer r = pakfire_downloader_prepare_transfer(downloader, transfer); if (r) @@ -592,6 +653,9 @@ static int pakfire_downloader_perform( // Perform the download r = curl_easy_perform(transfer->handle); + // Finish the progressbar + pakfire_progressbar_finish(downloader->progressbar); + if (r == CURLE_OK) return pakfire_transfer_done(downloader, transfer, r); diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index d856a8177..215492537 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -209,9 +209,6 @@ int pakfire_progressbar_start(struct pakfire_progressbar* p, unsigned long value return r; } - // Calculate update interval - p->update_interval = p->value_max / p->terminal.cols; - return pakfire_progressbar_update(p, 0); } @@ -268,11 +265,18 @@ int pakfire_progressbar_reset(struct pakfire_progressbar* p) { } void pakfire_progressbar_set_max(struct pakfire_progressbar* p, unsigned long value) { + // Do nothing if nothing has changed + if (p->value_max == value) + return; + // Store maximum value p->value_max = value; // Redraw immediately p->value_redraw = 0; + + // Calculate update interval + p->update_interval = p->value_max / p->terminal.cols; } static int pakfire_progressbar_add_widget(struct pakfire_progressbar* p,