pakfire_progress_start_callback start;
pakfire_progress_finish_callback finish;
pakfire_progress_update_callback update;
+ pakfire_progress_status_callback status;
pakfire_progress_free_callback free;
} callbacks;
p->callbacks.update = callback;
}
+void pakfire_progress_set_status_callback(
+ struct pakfire_progress* p, pakfire_progress_status_callback callback) {
+ p->callbacks.status = callback;
+}
+
void pakfire_progress_set_free_callback(
struct pakfire_progress* p, pakfire_progress_free_callback callback) {
p->callbacks.free = callback;
return r;
// Append the status
- return pakfire_strings_append(&p->status, status);
+ r = pakfire_strings_append(&p->status, status);
+ if (r < 0)
+ return r;
+
+ // Call the callback
+ if (p->callbacks.status) {
+ r = p->callbacks.status(p->ctx, p, p->callbacks.data, status);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
}
void pakfire_progress_pop_status(struct pakfire_progress* p) {
+ const char* status = NULL;
+
+ // Remove the latest status
pakfire_strings_pop(&p->status);
+
+ // Call the status callback
+ if (p->callbacks.status) {
+ // Fetch the latest status
+ status = pakfire_progress_get_status(p);
+
+ // Call the callback
+ p->callbacks.status(p->ctx, p, p->callbacks.data, status);
+ }
}
double pakfire_progress_get_percentage(struct pakfire_progress* p) {
(struct pakfire_ctx* ctx, struct pakfire_progress* progress, void* data);
typedef int (*pakfire_progress_update_callback)
(struct pakfire_ctx* ctx, struct pakfire_progress* progress, void* data, unsigned long int value);
+typedef int (*pakfire_progress_status_callback)
+ (struct pakfire_ctx* ctx, struct pakfire_progress* progress, void* data, const char* status);
typedef void (*pakfire_progress_free_callback)
(struct pakfire_ctx* ctx, struct pakfire_progress* progress, void* data);
struct pakfire_progress* p, pakfire_progress_finish_callback callback);
void pakfire_progress_set_update_callback(
struct pakfire_progress* p, pakfire_progress_update_callback callback);
+void pakfire_progress_set_status_callback(
+ struct pakfire_progress* p, pakfire_progress_status_callback callback);
void pakfire_progress_set_free_callback(
struct pakfire_progress* p, pakfire_progress_free_callback callback);
return r;
}
+static int Ctx_progress_status(struct pakfire_ctx* ctx,
+ struct pakfire_progress* progress, void* data, const char* text) {
+ PyObject* ret = NULL;
+ PyObject* p = data;
+ int r = -1;
+
+ // Acquire the GIL
+ PyGILState_STATE state = PyGILState_Ensure();
+
+ // Fetch the status method
+ PyObject* status = PyObject_GetAttrString(p, "status");
+ if (!status)
+ goto ERROR;
+
+ // Call it with the value
+ ret = PyObject_CallFunction(status, "z", text);
+ if (!ret)
+ goto ERROR;
+
+ // Success
+ r = 0;
+
+ERROR:
+ Py_XDECREF(status);
+ Py_XDECREF(ret);
+
+ // Release the GIL
+ PyGILState_Release(state);
+
+ return r;
+}
+
static void Ctx_progress_free(
struct pakfire_ctx* ctx, struct pakfire_progress* progress, void* data) {
PyObject* p = data;
// Set update callback
pakfire_progress_set_update_callback(progress, Ctx_progress_update);
+ // Set status callback
+ pakfire_progress_set_status_callback(progress, Ctx_progress_status);
+
// Set free callback
pakfire_progress_set_free_callback(progress, Ctx_progress_free);