This patch introduces a new progress_expect() function, and modifies
progress_update() to support "overall" progress, spanning multiple
individual transfers.

The proposed implementation only needs a suitable progress_expect()
call at the beginning, and does not require any changes to the actual
progress callbacks. Instead, modified "total" values are fed to the
callback function.

Signed-off-by: Bernhard Nortmann <[email protected]>
---
 progress.c | 38 ++++++++++++++++++++++++++++++++++----
 progress.h |  1 +
 2 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/progress.c b/progress.c
index 92a7d22..3c0b275 100644
--- a/progress.c
+++ b/progress.c
@@ -65,10 +65,12 @@ const char *format_ETA(double remaining)
 typedef struct {
        progress_cb_t callback;
        double start; /* start point (timestamp) for rate and ETA calculation */
+       size_t expected_total;
+       size_t expected_done;
 } progress_private_t;
 
 static progress_private_t progress = {
-       .callback = NULL, .start = 0.
+       .callback = NULL, .start = 0., .expected_total = 0
 };
 
 /* Exposed functions to manipulate private variables */
@@ -80,7 +82,18 @@ void set_progress_callback(progress_cb_t callback)
 
 void progress_start(void)
 {
-       progress.start = gettime(); /* reset start time */
+       /* zero "expected_done" value, reset start time */
+       progress.expected_done = 0;
+       progress.start = gettime();
+}
+
+/*
+ * Instruct the progress update logic to expect multiple transfers,
+ * which should sum up to the given overall number of bytes.
+ */
+void progress_expect(size_t total_bytes)
+{
+       progress.expected_total = total_bytes;
 }
 
 /*
@@ -92,8 +105,25 @@ void progress_start(void)
  */
 void progress_update(size_t total, size_t done, bool quick)
 {
-       if (progress.callback)
-               progress.callback(total, done, quick);
+       if (progress.expected_total) {
+               /*
+                * Override current (partial) stats, passing totals instead.
+                * Note: We also set "quick" to 'false' to enforce display.
+                */
+               if (progress.callback)
+                       progress.callback(progress.expected_total,
+                                         done + progress.expected_done, false);
+
+               if (done >= total) /* current transfer has completed */
+                       progress.expected_done += total;
+       } else {
+               /*
+                * progress.expected_total == 0, i.e. unset
+                * Just pass values through to the callback directly.
+                */
+               if (progress.callback)
+                       progress.callback(total, done, quick);
+       }
 }
 
 /* Return relative / "elapsed" time, since progress_start() */
diff --git a/progress.h b/progress.h
index 28d3443..f13f0fe 100644
--- a/progress.h
+++ b/progress.h
@@ -33,6 +33,7 @@ double estimate(size_t remaining, double rate);
 
 void set_progress_callback(progress_cb_t callback);
 void progress_start(void);
+void progress_expect(size_t total_bytes);
 void progress_update(size_t total, size_t done, bool quick);
 
 /* progress callback implementations for various display styles */
-- 
2.4.6

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to