]> git.ipfire.org Git - pakfire.git/commitdiff
downloader: Show transfer speed
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 17:37:05 +0000 (17:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 11 Apr 2021 17:37:05 +0000 (17:37 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/downloader.c
src/libpakfire/include/pakfire/progressbar.h
src/libpakfire/include/pakfire/util.h
src/libpakfire/progressbar.c
src/libpakfire/util.c

index 683c153637091e9d5f1fde1d07597a4397289630..6314e6496f5de93adec7405b29fbf8cc8f861ac7 100644 (file)
@@ -614,6 +614,11 @@ static int pakfire_downloader_make_single_progressbar(
        if (r)
                return r;
 
+       // Add transfer speed
+       r = pakfire_progressbar_add_transfer_speed(downloader->progressbar);
+       if (r)
+               return r;
+
        // Add bytes transferred
        r = pakfire_progressbar_add_bytes_transferred(downloader->progressbar);
        if (r)
index f0259ba0d777caeeaf38ab6ed391ed1419f31ef8..248613727aedadbbcefad2435c4b65ab109eabd1 100644 (file)
@@ -50,6 +50,7 @@ int pakfire_progressbar_add_bar(struct pakfire_progressbar* p);
 int pakfire_progressbar_add_timer(struct pakfire_progressbar* p);
 int pakfire_progressbar_add_bytes_transferred(struct pakfire_progressbar* p);
 int pakfire_progressbar_add_eta(struct pakfire_progressbar* p);
+int pakfire_progressbar_add_transfer_speed(struct pakfire_progressbar* p);
 
 #endif
 
index c46bf9bbd0ba6fe98a9f930dbc278df859b59a4e..3655d81d2f5bdd62f04da78ec27bd12c700e67f1 100644 (file)
@@ -40,6 +40,7 @@ char* pakfire_string_replace(const char* s, const char* pattern, const char* rep
 char** pakfire_split_string(const char* s, char delim);
 
 int pakfire_format_size(char* dst, size_t length, double value);
+int pakfire_format_speed(char* dst, size_t length, double value);
 char* pakfire_format_date(time_t t);
 
 int pakfire_path_exists(const char* path);
index 80e0ba22fb00cbc1769a4a4ea3b4f3a1714dada7..fe604bd4686e5844b49207ac9da4025198bf1cdd 100644 (file)
@@ -393,6 +393,10 @@ static int pakfire_progressbar_redraw(struct pakfire_progressbar* p) {
 
        // Print all elements
        for (unsigned int i = 0; i < p->num_widgets; i++) {
+               // Skip anything that returned nothing
+               if (!elements[i])
+                       continue;
+
                fputs(" ", p->terminal.f);
                fputs(elements[i], p->terminal.f);
        }
@@ -561,3 +565,26 @@ static const char* pakfire_progressbar_bytes_transferred(struct pakfire_progress
 int pakfire_progressbar_add_bytes_transferred(struct pakfire_progressbar* p) {
        return pakfire_progressbar_add_widget(p, pakfire_progressbar_bytes_transferred, NULL, 0, NULL);
 }
+
+// Speed
+
+static const char* pakfire_progressbar_transfer_speed(struct pakfire_progressbar* p,
+               struct pakfire_progressbar_widget* widget, unsigned int width, void* data) {
+       if (!p->value)
+               return NULL;
+
+       time_t t = pakfire_progressbar_elapsed_time(p);
+       if (t <= 0)
+               return NULL;
+
+       int r = pakfire_format_speed(widget->buffer, sizeof(widget->buffer) - 1, p->value / t);
+       if (r < 0)
+                       return NULL;
+
+       return widget->buffer;
+}
+
+int pakfire_progressbar_add_transfer_speed(struct pakfire_progressbar* p) {
+       return pakfire_progressbar_add_widget(
+               p, pakfire_progressbar_transfer_speed, NULL, 0, NULL);
+}
index 36cc21e1f5ea02a71827997372dc99c11bd4592a..3982b0a1e932ff5b749261c811e268b193536ca3 100644 (file)
@@ -244,7 +244,29 @@ int pakfire_format_size(char* dst, size_t length, double value) {
 
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
-       return snprintf(dst, length, *unit, round(value));
+       return snprintf(dst, length, *unit, value);
+#pragma GCC diagnostic pop
+}
+
+int pakfire_format_speed(char* dst, size_t length, double value) {
+       const char* units[] = {
+               "%4.0fB/s",
+               "%4.0fkB/s",
+               "%4.1fMB/s",
+               "%4.1fGB/s",
+               "%4.1fTB/s",
+               NULL
+       };
+       const char** unit = units;
+
+       while (*(unit + 1) && value >= 1024.0) {
+               value /= 1024.0;
+               unit++;
+       }
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+       return snprintf(dst, length, *unit, value);
 #pragma GCC diagnostic pop
 }