]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Add a progressbar to single downloads
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 12:37:31 +0000 (12:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 12:37:31 +0000 (12:37 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/libpakfire/downloader.c
src/libpakfire/progressbar.c

index c3599938f0a255986cd4e85304b67a8ee4d70c73..745b14c413f9f84c915e3e28a76ef44eb157b95d 100644 (file)
@@ -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 = \
index ce558380f2af5019b842e631e0e690c8f0287860..c53b76e853b2706e90f853b81153ec578e8daf11 100644 (file)
@@ -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);
 
index d856a8177b564e2d7a9813790c64b63f62eefb10..215492537d99c32558b4ac31c7cc47ac0e3da2da 100644 (file)
@@ -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,