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)
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
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);
// 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);
}
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);
+}
#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
}