From: Michael Tremer Date: Sun, 11 Apr 2021 17:37:05 +0000 (+0000) Subject: downloader: Show transfer speed X-Git-Tag: 0.9.28~1285^2~368 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=68d26a6a1af60a8feb07e46f34d4c078d6c02c88;p=pakfire.git downloader: Show transfer speed Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index 683c15363..6314e6496 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -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) diff --git a/src/libpakfire/include/pakfire/progressbar.h b/src/libpakfire/include/pakfire/progressbar.h index f0259ba0d..248613727 100644 --- a/src/libpakfire/include/pakfire/progressbar.h +++ b/src/libpakfire/include/pakfire/progressbar.h @@ -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 diff --git a/src/libpakfire/include/pakfire/util.h b/src/libpakfire/include/pakfire/util.h index c46bf9bbd..3655d81d2 100644 --- a/src/libpakfire/include/pakfire/util.h +++ b/src/libpakfire/include/pakfire/util.h @@ -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); diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index 80e0ba22f..fe604bd46 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -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); +} diff --git a/src/libpakfire/util.c b/src/libpakfire/util.c index 36cc21e1f..3982b0a1e 100644 --- a/src/libpakfire/util.c +++ b/src/libpakfire/util.c @@ -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 }