From: Michael Tremer Date: Sun, 11 Apr 2021 13:04:09 +0000 (+0000) Subject: downloader: Show ETA instead of elapsed time X-Git-Tag: 0.9.28~1285^2~370 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b131176f34d020b5d873e410bbb87f78ccfb759a;p=pakfire.git downloader: Show ETA instead of elapsed time Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/downloader.c b/src/libpakfire/downloader.c index d6d660e0f..683c15363 100644 --- a/src/libpakfire/downloader.c +++ b/src/libpakfire/downloader.c @@ -619,8 +619,8 @@ static int pakfire_downloader_make_single_progressbar( if (r) return r; - // Add timer - r = pakfire_progressbar_add_timer(downloader->progressbar); + // Add ETA + r = pakfire_progressbar_add_eta(downloader->progressbar); if (r) return r; diff --git a/src/libpakfire/include/pakfire/progressbar.h b/src/libpakfire/include/pakfire/progressbar.h index 99a57299b..f0259ba0d 100644 --- a/src/libpakfire/include/pakfire/progressbar.h +++ b/src/libpakfire/include/pakfire/progressbar.h @@ -49,6 +49,7 @@ int pakfire_progressbar_add_percentage(struct pakfire_progressbar* p); 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); #endif diff --git a/src/libpakfire/progressbar.c b/src/libpakfire/progressbar.c index 11fddee20..80e0ba22f 100644 --- a/src/libpakfire/progressbar.c +++ b/src/libpakfire/progressbar.c @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -502,6 +503,50 @@ int pakfire_progressbar_add_timer(struct pakfire_progressbar* p) { return pakfire_progressbar_add_widget(p, pakfire_progressbar_timer, NULL, 0, NULL); } +// ETA + +static const char* pakfire_progressbar_eta(struct pakfire_progressbar* p, + struct pakfire_progressbar_widget* widget, unsigned int width, void* data) { + int r; + + time_t t = pakfire_progressbar_elapsed_time(p); + if (t < 0) + return NULL; + + // Show total time when finished + if (p->status == PAKFIRE_PROGRESSBAR_FINISHED) + return pakfire_progressbar_timer(p, widget, width, data); + + // Print a placeholder when we haven't started yet + if (p->value == 0) { + r = snprintf(widget->buffer, sizeof(widget->buffer) - 1, "%-5s: --:--:--", _("ETA")); + if (r < 0) + return NULL; + + // Show total time when finished + } else if (p->status == PAKFIRE_PROGRESSBAR_FINISHED) { + r = snprintf(widget->buffer, sizeof(widget->buffer) - 1, + "%-5s: %02lu:%02lu", _("Time"), t / 60, t % 60); + if (r < 0) + return NULL; + + // Calculate the ETA + } else { + time_t eta = t * p->value_max / p->value - t; + + r = snprintf(widget->buffer, sizeof(widget->buffer) - 1, + "%-5s: %02lu:%02lu", _("ETA"), eta / 60, eta % 60); + if (r < 0) + return NULL; + } + + return widget->buffer; +} + +int pakfire_progressbar_add_eta(struct pakfire_progressbar* p) { + return pakfire_progressbar_add_widget(p, pakfire_progressbar_eta, NULL, 0, NULL); +} + // Bytes Transferred static const char* pakfire_progressbar_bytes_transferred(struct pakfire_progressbar* p,