From: Michael Tremer Date: Sat, 23 Sep 2023 10:03:16 +0000 (+0000) Subject: transactions: Create a pick solution callback X-Git-Tag: 0.9.30~1663 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51ae584e15da7e6d5b6e494794291f9c4f682907;p=pakfire.git transactions: Create a pick solution callback Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/transaction.h b/src/libpakfire/include/pakfire/transaction.h index b1efabb03..264f2722d 100644 --- a/src/libpakfire/include/pakfire/transaction.h +++ b/src/libpakfire/include/pakfire/transaction.h @@ -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); diff --git a/src/libpakfire/libpakfire.sym b/src/libpakfire/libpakfire.sym index 4c02a57f5..106a0b8d4 100644 --- a/src/libpakfire/libpakfire.sym +++ b/src/libpakfire/libpakfire.sym @@ -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; diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 765ceb7a0..1a169ef0a 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -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; }