]> git.ipfire.org Git - pakfire.git/commitdiff
progress: Implement child progress
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 2 Oct 2023 10:14:00 +0000 (10:14 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 2 Oct 2023 10:14:00 +0000 (10:14 +0000)
This can be used if we need to propagate progress to an upstream
progress indicator.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/compress.c
src/libpakfire/filelist.c
src/libpakfire/include/pakfire/progress.h
src/libpakfire/progress.c
src/libpakfire/repo.c

index da197aab39288088ecd6633618b1a7a9c64c2c9e..f850f72943ed899068a377abf70957dc8578574e 100644 (file)
@@ -818,7 +818,7 @@ int pakfire_extract(struct pakfire* pakfire, struct archive* archive,
                progress_flags |= PAKFIRE_PROGRESS_SHOW_TRANSFER_SPEED;
 
        // Create the progress indicator
-       r = pakfire_progress_create(&data.progress, pakfire, progress_flags);
+       r = pakfire_progress_create(&data.progress, pakfire, progress_flags, NULL);
        if (r)
                goto ERROR;
 
@@ -1026,7 +1026,7 @@ int pakfire_compress(struct pakfire* pakfire, struct archive* archive,
        const size_t size = pakfire_filelist_total_size(filelist);
 
        // Create the progress indicator
-       r = pakfire_progress_create(&data.progress, pakfire, progress_flags);
+       r = pakfire_progress_create(&data.progress, pakfire, progress_flags, NULL);
        if (r)
                goto ERROR;
 
index 2cb42869fce64078fd63548f1019da3ebb60859d..08738a6565605ae1e12dd307a5c1415d1789b5fe 100644 (file)
@@ -426,7 +426,7 @@ int pakfire_filelist_walk(struct pakfire_filelist* list,
        // Show progress when iterating over the filelist
        if (flags & PAKFIRE_FILELIST_SHOW_PROGRESS) {
                r = pakfire_progress_create(&progress, list->pakfire,
-                       PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA);
+                       PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA, NULL);
                if (r)
                        goto ERROR;
 
@@ -502,7 +502,7 @@ int pakfire_filelist_verify(struct pakfire_filelist* list, struct pakfire_fileli
 
        // Setup progress
        r = pakfire_progress_create(&progress, list->pakfire,
-               PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA);
+               PAKFIRE_PROGRESS_SHOW_PERCENTAGE|PAKFIRE_PROGRESS_SHOW_ETA, NULL);
        if (r)
                goto ERROR;
 
index 3d2224287181f529cc3058c648c20670e45142b5..d62e2d2a286c6bc3b6b7d7726ca156c91b61c04e 100644 (file)
@@ -60,6 +60,7 @@ void pakfire_progress_set_update_callback(
 void pakfire_progress_set_free_callback(
        struct pakfire_progress* p, pakfire_progress_free_callback callback);
 
+struct pakfire_progress* pakfire_progress_get_parent(struct pakfire_progress* p);
 unsigned long int pakfire_progress_get_value(struct pakfire_progress* p);
 unsigned long int pakfire_progress_get_max_value(struct pakfire_progress* p);
 const char* pakfire_progress_get_title(struct pakfire_progress* p);
@@ -73,7 +74,7 @@ double pakfire_progress_get_transfer_speed(struct pakfire_progress* p);
 #include <pakfire/pakfire.h>
 
 int pakfire_progress_create(struct pakfire_progress** progress,
-       struct pakfire* pakfire, int flags);
+       struct pakfire* pakfire, int flags, struct pakfire_progress* parent);
 
 struct pakfire_progress* pakfire_progress_ref(struct pakfire_progress* p);
 struct pakfire_progress* pakfire_progress_unref(struct pakfire_progress* p);
index a3c6b64b5cba18501cf4192d383ffd32f24e315f..312826cb7f34b3bbf9c1a8ba4b16255870013cac 100644 (file)
@@ -37,6 +37,9 @@ struct pakfire_progress {
        // Flags what to show
        int flags;
 
+       // Parent
+       struct pakfire_progress* parent;
+
        // Status
        enum pakfire_progress_status {
                PAKFIRE_PROGRESS_INIT = 0,
@@ -71,6 +74,8 @@ static void pakfire_progress_free(struct pakfire_progress* p) {
        if (p->callbacks.free)
                p->callbacks.free(p->pakfire, p, p->callbacks.data);
 
+       if (p->parent)
+               pakfire_progress_unref(p->parent);
        if (p->title)
                free(p->title);
        pakfire_unref(p->pakfire);
@@ -90,7 +95,7 @@ static int pakfire_progress_default_start_callback(struct pakfire* pakfire,
 }
 
 int pakfire_progress_create(struct pakfire_progress** progress,
-               struct pakfire* pakfire, int flags) {
+               struct pakfire* pakfire, int flags, struct pakfire_progress* parent) {
        struct pakfire_progress* p = NULL;
        int r;
 
@@ -111,6 +116,10 @@ int pakfire_progress_create(struct pakfire_progress** progress,
        // Initialize status
        p->status = PAKFIRE_PROGRESS_INIT;
 
+       // Store a reference to the parent
+       if (parent)
+               p->parent = pakfire_progress_ref(parent);
+
        // Configure some default callbacks
        p->callbacks.start = pakfire_progress_default_start_callback;
 
@@ -240,6 +249,13 @@ int pakfire_progress_finish(struct pakfire_progress* p) {
 int pakfire_progress_update(struct pakfire_progress* p, unsigned long int value) {
        int r;
 
+       // Report the change to the parent progress
+       if (p->parent) {
+               r = pakfire_progress_increment(p->parent, value - p->value);
+               if (r)
+                       return r;
+       }
+
        // Store the new value
        p->value = value;
 
@@ -281,11 +297,23 @@ int pakfire_progress_reset(struct pakfire_progress* p) {
        }
 
        // Reset values
-       p->value = p->max_value = 0;
+       r = pakfire_progress_update(p, 0);
+       if (r)
+               return r;
+
+       // Reset max value
+       pakfire_progress_set_max_value(p, 0);
 
        return 0;
 }
 
+PAKFIRE_EXPORT struct pakfire_progress* pakfire_progress_get_parent(struct pakfire_progress* p) {
+       if (p->parent)
+               return pakfire_progress_ref(p->parent);
+
+       return NULL;
+}
+
 PAKFIRE_EXPORT unsigned long int pakfire_progress_get_value(struct pakfire_progress* p) {
        return p->value;
 }
index 2c89269d64cc95e9c180be32eea679470cd0a3aa..ab70091aada0bedffc882028b9139ef5e1d9d3a2 100644 (file)
@@ -1370,7 +1370,7 @@ PAKFIRE_EXPORT int pakfire_repo_scan(struct pakfire_repo* repo, int flags) {
 
        // Create progress indicator
        r = pakfire_progress_create(&progress, repo->pakfire,
-               PAKFIRE_PROGRESS_SHOW_COUNTER|PAKFIRE_PROGRESS_SHOW_ELAPSED_TIME);
+               PAKFIRE_PROGRESS_SHOW_COUNTER|PAKFIRE_PROGRESS_SHOW_ELAPSED_TIME, NULL);
        if (r)
                goto ERROR;