]> git.ipfire.org Git - pakfire.git/commitdiff
transactions: Create a pick solution callback
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 23 Sep 2023 10:03:16 +0000 (10:03 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 23 Sep 2023 10:03:16 +0000 (10:03 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/transaction.h
src/libpakfire/libpakfire.sym
src/libpakfire/transaction.c

index b1efabb03ed35c45558479646b5f40a3abd3a0b0..264f2722d051f251b6436889813b28c0c38236c1 100644 (file)
@@ -55,6 +55,9 @@ enum pakfire_job_flags {
        PAKFIRE_JOB_BEST                = 1 << 3,
 };
 
+typedef int (*pakfire_transaction_pick_solution_callback)
+       (struct pakfire_transaction* transaction, void* data);
+
 int pakfire_transaction_create(struct pakfire_transaction** transaction,
        struct pakfire* pakfire, int flags);
 
@@ -64,6 +67,8 @@ struct pakfire_transaction* pakfire_transaction_unref(struct pakfire_transaction
 // Callbacks
 void pakfire_transaction_set_status_callback(
        struct pakfire_transaction* transaction, pakfire_status_callback callback, void* data);
+void pakfire_transaction_set_pick_solution_callback(
+       struct pakfire_transaction* transaction, pakfire_transaction_pick_solution_callback callback, void* data);
 
 int pakfire_transaction_solve(struct pakfire_transaction* transaction, int flags, char** problems);
 
index 4c02a57f516c8cd4a6abf4d86d9d1e27721bf097..106a0b8d4c71ead4c2b9662c8e5fd54c2095a29d 100644 (file)
@@ -283,6 +283,7 @@ global:
        pakfire_transaction_request;
        pakfire_transaction_request_package;
        pakfire_transaction_run;
+       pakfire_transaction_set_pick_solution_callback;
        pakfire_transaction_set_status_callback;
        pakfire_transaction_unref;
 
index 765ceb7a05b05938684b6b61fba6e485795b40c6..1a169ef0a3a22c3842b79fd1e402e9aba334b166 100644 (file)
@@ -74,6 +74,10 @@ struct pakfire_transaction {
                // Status
                pakfire_status_callback status;
                void* status_data;
+
+               // Pick Solution
+               pakfire_transaction_pick_solution_callback pick_solution;
+               void* pick_solution_data;
        } callbacks;
 };
 
@@ -376,6 +380,12 @@ PAKFIRE_EXPORT void pakfire_transaction_set_status_callback(
        transaction->callbacks.status_data = data;
 }
 
+PAKFIRE_EXPORT void pakfire_transaction_set_pick_solution_callback(
+               struct pakfire_transaction* transaction, pakfire_transaction_pick_solution_callback callback, void* data) {
+       transaction->callbacks.pick_solution = callback;
+       transaction->callbacks.pick_solution_data = data;
+}
+
 static int pakfire_transaction_get_progress(struct pakfire_transaction* transaction) {
        return transaction->progress * 100 / transaction->num;
 }
@@ -556,6 +566,17 @@ Solver* pakfire_transaction_get_solver(struct pakfire_transaction* transaction)
        return transaction->solver;
 }
 
+static int pakfire_transaction_pick_solution(struct pakfire_transaction* transaction) {
+       int r = 1;
+
+       // Call the callback
+       if (transaction->callbacks.pick_solution)
+               r = transaction->callbacks.pick_solution(
+                       transaction, transaction->callbacks.pick_solution_data);
+
+       return r;
+}
+
 PAKFIRE_EXPORT int pakfire_transaction_solve(struct pakfire_transaction* transaction,
                int flags, char** problems) {
        char* p = NULL;
@@ -624,18 +645,13 @@ RETRY:
                        }
 
                        // Ask the user to pick a solution
-                       if (flags & PAKFIRE_REQ_SOLVE_INTERACTIVE) {
-                               r = pakfire_ui_pick_solution(transaction->pakfire, transaction);
-                               if (r)
-                                       goto ERROR;
+                       r = pakfire_transaction_pick_solution(transaction);
+                       switch (r) {
+                               case 0:
+                                       goto RETRY;
 
-                               // Retry solving
-                               goto RETRY;
-
-                       } else {
-                               char* s = pakfire_transaction_get_problem_string(transaction, 0);
-                               if (s)
-                                       ERROR(transaction->pakfire, "%s\n", s);
+                               default:
+                                       goto ERROR;
                        }
                        break;
        }