From 7759562f523a05b6372af86a66e39902a202dcd0 Mon Sep 17 00:00:00 2001 From: Bryan Forbes Date: Wed, 31 Mar 2010 12:43:15 -0500 Subject: [PATCH] Added user_data parameter to instproxy_status_cb and related functions. --- include/libimobiledevice/installation_proxy.h | 14 +++---- src/installation_proxy.c | 40 ++++++++++--------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/include/libimobiledevice/installation_proxy.h b/include/libimobiledevice/installation_proxy.h index 2bf738d..bee9a16 100644 --- a/include/libimobiledevice/installation_proxy.h +++ b/include/libimobiledevice/installation_proxy.h @@ -49,21 +49,21 @@ typedef struct instproxy_client_private instproxy_client_private; typedef instproxy_client_private *instproxy_client_t; /**< The client handle. */ /** Reports the status of the given operation */ -typedef void (*instproxy_status_cb_t) (const char *operation, plist_t status); +typedef void (*instproxy_status_cb_t) (const char *operation, plist_t status, void *user_data); /* Interface */ instproxy_error_t instproxy_client_new(idevice_t device, uint16_t port, instproxy_client_t *client); instproxy_error_t instproxy_client_free(instproxy_client_t client); instproxy_error_t instproxy_browse(instproxy_client_t client, plist_t client_options, plist_t *result); -instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb); -instproxy_error_t instproxy_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb); -instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb); +instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data); +instproxy_error_t instproxy_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data); +instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data); instproxy_error_t instproxy_lookup_archives(instproxy_client_t client, plist_t client_options, plist_t *result); -instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb); -instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb); -instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb); +instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data); +instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data); +instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data); plist_t instproxy_client_options_new(); void instproxy_client_options_add(plist_t client_options, ...) G_GNUC_NULL_TERMINATED; diff --git a/src/installation_proxy.c b/src/installation_proxy.c index 40e4bc5..b827379 100644 --- a/src/installation_proxy.c +++ b/src/installation_proxy.c @@ -33,6 +33,7 @@ struct instproxy_status_data { instproxy_client_t client; instproxy_status_cb_t cbfunc; char *operation; + void *user_data; }; /** @@ -272,7 +273,7 @@ instproxy_error_t instproxy_browse(instproxy_client_t client, plist_t client_opt * @param operation Operation name. Will be passed to the callback function * in async mode or shown in debug messages in sync mode. */ -static instproxy_error_t instproxy_perform_operation(instproxy_client_t client, instproxy_status_cb_t status_cb, const char *operation) +static instproxy_error_t instproxy_perform_operation(instproxy_client_t client, instproxy_status_cb_t status_cb, const char *operation, void *user_data) { instproxy_error_t res = INSTPROXY_E_UNKNOWN_ERROR; int ok = 1; @@ -289,7 +290,7 @@ static instproxy_error_t instproxy_perform_operation(instproxy_client_t client, if (dict) { /* invoke callback function */ if (status_cb) { - status_cb(operation, dict); + status_cb(operation, dict, user_data); } /* check for 'Error', so we can abort cleanly */ plist_t err = plist_dict_get_item(dict, "Error"); @@ -353,7 +354,7 @@ static gpointer instproxy_status_updater(gpointer arg) struct instproxy_status_data *data = (struct instproxy_status_data*)arg; /* run until the operation is complete or an error occurs */ - (void)instproxy_perform_operation(data->client, data->cbfunc, data->operation); + (void)instproxy_perform_operation(data->client, data->cbfunc, data->operation, data->user_data); /* cleanup */ instproxy_lock(data->client); @@ -383,7 +384,7 @@ static gpointer instproxy_status_updater(gpointer arg) * when the operation completed successfully (sync). * An INSTPROXY_E_* error value is returned if an error occured. */ -static instproxy_error_t instproxy_create_status_updater(instproxy_client_t client, instproxy_status_cb_t status_cb, const char *operation) +static instproxy_error_t instproxy_create_status_updater(instproxy_client_t client, instproxy_status_cb_t status_cb, const char *operation, void *user_data) { instproxy_error_t res = INSTPROXY_E_UNKNOWN_ERROR; if (status_cb) { @@ -393,6 +394,7 @@ static instproxy_error_t instproxy_create_status_updater(instproxy_client_t clie data->client = client; data->cbfunc = status_cb; data->operation = strdup(operation); + data->user_data = user_data; client->status_updater = g_thread_create(instproxy_status_updater, data, TRUE, NULL); if (client->status_updater) { @@ -401,7 +403,7 @@ static instproxy_error_t instproxy_create_status_updater(instproxy_client_t clie } } else { /* sync mode */ - res = instproxy_perform_operation(client, NULL, operation); + res = instproxy_perform_operation(client, NULL, operation, NULL); } return res; } @@ -420,7 +422,7 @@ static instproxy_error_t instproxy_create_status_updater(instproxy_client_t clie * @return INSTPROXY_E_SUCCESS on success or an INSTPROXY_E_* error value if * an error occured. */ -static instproxy_error_t instproxy_install_or_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, const char *command) +static instproxy_error_t instproxy_install_or_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, const char *command, void *user_data) { if (!client || !client->parent || !pkg_path) { return INSTPROXY_E_INVALID_ARG; @@ -438,7 +440,7 @@ static instproxy_error_t instproxy_install_or_upgrade(instproxy_client_t client, return res; } - return instproxy_create_status_updater(client, status_cb, command); + return instproxy_create_status_updater(client, status_cb, command, user_data); } /** @@ -464,9 +466,9 @@ static instproxy_error_t instproxy_install_or_upgrade(instproxy_client_t client, * created successfully; any error occuring during the operation has to be * handled inside the specified callback function. */ -instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb) +instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data) { - return instproxy_install_or_upgrade(client, pkg_path, client_options, status_cb, "Install"); + return instproxy_install_or_upgrade(client, pkg_path, client_options, status_cb, "Install", user_data); } /** @@ -494,9 +496,9 @@ instproxy_error_t instproxy_install(instproxy_client_t client, const char *pkg_p * created successfully; any error occuring during the operation has to be * handled inside the specified callback function. */ -instproxy_error_t instproxy_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb) +instproxy_error_t instproxy_upgrade(instproxy_client_t client, const char *pkg_path, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data) { - return instproxy_install_or_upgrade(client, pkg_path, client_options, status_cb, "Upgrade"); + return instproxy_install_or_upgrade(client, pkg_path, client_options, status_cb, "Upgrade", user_data); } /** @@ -517,7 +519,7 @@ instproxy_error_t instproxy_upgrade(instproxy_client_t client, const char *pkg_p * created successfully; any error occuring during the operation has to be * handled inside the specified callback function. */ -instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb) +instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data) { if (!client || !client->parent || !appid) { return INSTPROXY_E_INVALID_ARG; @@ -543,7 +545,7 @@ instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *app return res; } - return instproxy_create_status_updater(client, status_cb, "Uninstall"); + return instproxy_create_status_updater(client, status_cb, "Uninstall", user_data); } /** @@ -609,7 +611,7 @@ instproxy_error_t instproxy_lookup_archives(instproxy_client_t client, plist_t c * created successfully; any error occuring during the operation has to be * handled inside the specified callback function. */ -instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb) +instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data) { if (!client || !client->parent || !appid) return INSTPROXY_E_INVALID_ARG; @@ -626,7 +628,7 @@ instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid debug_info("could not send plist, error %d", res); return res; } - return instproxy_create_status_updater(client, status_cb, "Archive"); + return instproxy_create_status_updater(client, status_cb, "Archive", user_data); } /** @@ -649,7 +651,7 @@ instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid * created successfully; any error occuring during the operation has to be * handled inside the specified callback function. */ -instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb) +instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data) { if (!client || !client->parent || !appid) return INSTPROXY_E_INVALID_ARG; @@ -666,7 +668,7 @@ instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid debug_info("could not send plist, error %d", res); return res; } - return instproxy_create_status_updater(client, status_cb, "Restore"); + return instproxy_create_status_updater(client, status_cb, "Restore", user_data); } /** @@ -689,7 +691,7 @@ instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid * created successfully; any error occuring during the operation has to be * handled inside the specified callback function. */ -instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb) +instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char *appid, plist_t client_options, instproxy_status_cb_t status_cb, void *user_data) { if (!client || !client->parent || !appid) return INSTPROXY_E_INVALID_ARG; @@ -706,7 +708,7 @@ instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char debug_info("could not send plist, error %d", res); return res; } - return instproxy_create_status_updater(client, status_cb, "RemoveArchive"); + return instproxy_create_status_updater(client, status_cb, "RemoveArchive", user_data); } /**