#include <sys/queue.h>
#include <time.h>
+#include <pakfire/i18n.h>
#include <pakfire/logging.h>
#include <pakfire/pakfire.h>
#include <pakfire/progressbar.h>
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,