summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libimobiledevice/installation_proxy.h6
-rw-r--r--src/installation_proxy.c43
2 files changed, 31 insertions, 18 deletions
diff --git a/include/libimobiledevice/installation_proxy.h b/include/libimobiledevice/installation_proxy.h
index 0f924d7..9ce0490 100644
--- a/include/libimobiledevice/installation_proxy.h
+++ b/include/libimobiledevice/installation_proxy.h
@@ -193,8 +193,8 @@ instproxy_error_t instproxy_browse_with_callback(instproxy_client_t client, plis
* Lookup information about specific applications from the device.
*
* @param client The connected installation_proxy client
- * @param appids A PLIST_ARRAY with PLIST_STRINGs of bundle identifiers, a
- * single PLIST_STRING for one bundle identifier or NULL to lookup all.
+ * @param appids An array of bundle identifiers that MUST have a terminating
+ * NULL entry or NULL to lookup all.
* @param client_options The client options to use, as PLIST_DICT, or NULL.
* Currently there are no known client options, so pass NULL here.
* @param result Pointer that will be set to a plist containing a PLIST_DICT
@@ -203,7 +203,7 @@ instproxy_error_t instproxy_browse_with_callback(instproxy_client_t client, plis
* @return INSTPROXY_E_SUCCESS on success or an INSTPROXY_E_* error value if
* an error occured.
*/
-instproxy_error_t instproxy_lookup(instproxy_client_t client, plist_t appids, plist_t client_options, plist_t *result);
+instproxy_error_t instproxy_lookup(instproxy_client_t client, const char** appids, plist_t client_options, plist_t *result);
/**
* Install an application on the device.
diff --git a/src/installation_proxy.c b/src/installation_proxy.c
index e4484ad..76eb0ba 100644
--- a/src/installation_proxy.c
+++ b/src/installation_proxy.c
@@ -605,25 +605,39 @@ static void instproxy_copy_lookup_result_cb(plist_t command, plist_t status, voi
}
}
-LIBIMOBILEDEVICE_API instproxy_error_t instproxy_lookup(instproxy_client_t client, plist_t appids, plist_t client_options, plist_t *result)
+LIBIMOBILEDEVICE_API instproxy_error_t instproxy_lookup(instproxy_client_t client, const char** appids, plist_t client_options, plist_t *result)
{
- if (!client || !client->parent || !result)
- return INSTPROXY_E_INVALID_ARG;
-
- if (appids && (plist_get_node_type(appids) != PLIST_ARRAY && plist_get_node_type(appids) != PLIST_STRING))
- return INSTPROXY_E_INVALID_ARG;
-
instproxy_error_t res = INSTPROXY_E_UNKNOWN_ERROR;
-
+ int i = 0;
plist_t lookup_result = NULL;
+ plist_t command = NULL;
+ plist_t appid_array = NULL;
+ plist_t node = NULL;
- plist_t command = plist_new_dict();
+ if (!client || !client->parent || !result)
+ return INSTPROXY_E_INVALID_ARG;
+
+ command = plist_new_dict();
plist_dict_set_item(command, "Command", plist_new_string("Lookup"));
+ if (client_options) {
+ node = plist_copy(client_options);
+ } else if (appids) {
+ node = plist_new_dict();
+ }
+
+ /* add bundle identifiers to client options */
if (appids) {
- plist_dict_set_item(client_options, "BundleIDs", plist_copy(appids));
+ appid_array = plist_new_array();
+ while (appids[i]) {
+ plist_array_append_item(appid_array, plist_new_string(appids[i]));
+ i++;
+ }
+ plist_dict_set_item(node, "BundleIDs", appid_array);
+ }
+
+ if (node) {
+ plist_dict_set_item(command, "ClientOptions", node);
}
- if (client_options)
- plist_dict_set_item(command, "ClientOptions", plist_copy(client_options));
res = instproxy_perform_command(client, command, INSTPROXY_COMMAND_TYPE_SYNC, instproxy_copy_lookup_result_cb, (void*)&lookup_result);
@@ -973,12 +987,11 @@ LIBIMOBILEDEVICE_API instproxy_error_t instproxy_client_get_path_for_bundle_iden
instproxy_client_options_set_return_attributes(client_opts, "CFBundleIdentifier", "CFBundleExecutable", "Path", NULL);
// only query for specific appid
- plist_t appid_node = plist_new_string(appid);
+ const char* appids[] = {appid, NULL};
// query device for list of apps
- instproxy_error_t ierr = instproxy_lookup(client, appid_node, client_opts, &apps);
+ instproxy_error_t ierr = instproxy_lookup(client, appids, client_opts, &apps);
- plist_free(appid_node);
instproxy_client_options_free(client_opts);
if (ierr != INSTPROXY_E_SUCCESS) {