diff options
-rw-r--r-- | include/libimobiledevice/restore.h | 1 | ||||
-rw-r--r-- | src/restore.c | 51 |
2 files changed, 52 insertions, 0 deletions
diff --git a/include/libimobiledevice/restore.h b/include/libimobiledevice/restore.h index aa8233f..a0a1b77 100644 --- a/include/libimobiledevice/restore.h +++ b/include/libimobiledevice/restore.h @@ -54,6 +54,7 @@ restored_error_t restored_client_new(idevice_t device, restored_client_t *client restored_error_t restored_client_free(restored_client_t client); restored_error_t restored_query_type(restored_client_t client, char **type, uint64_t *version); +restored_error_t restored_query_value(restored_client_t client, const char *key, plist_t *value); restored_error_t restored_get_value(restored_client_t client, const char *key, plist_t *value) ; restored_error_t restored_send(restored_client_t client, plist_t plist); restored_error_t restored_receive(restored_client_t client, plist_t *plist); diff --git a/src/restore.c b/src/restore.c index 10642da..031eaea 100644 --- a/src/restore.c +++ b/src/restore.c @@ -268,6 +268,57 @@ restored_error_t restored_query_type(restored_client_t client, char **type, uint } /** + * Queries a value from the device specified by a key. + * + * @param client An initialized restored client. + * @param key The key name to request + * @param value A plist node representing the result value node + * + * @return RESTORE_E_SUCCESS on success, NP_E_INVALID_ARG when client is NULL, RESTORE_E_PLIST_ERROR if value for key can't be found + */ +restored_error_t restored_query_value(restored_client_t client, const char *key, plist_t *value) +{ + if (!client || !key) + return RESTORE_E_INVALID_ARG; + + plist_t dict = NULL; + restored_error_t ret = RESTORE_E_UNKNOWN_ERROR; + + /* setup request plist */ + dict = plist_new_dict(); + plist_dict_add_label(dict, client->label); + if (key) { + plist_dict_insert_item(dict,"QueryKey", plist_new_string(key)); + } + plist_dict_insert_item(dict,"Request", plist_new_string("QueryValue")); + + /* send to device */ + ret = restored_send(client, dict); + + plist_free(dict); + dict = NULL; + + if (ret != RESTORE_E_SUCCESS) + return ret; + + /* Now get device's answer */ + ret = restored_receive(client, &dict); + if (ret != RESTORE_E_SUCCESS) + return ret; + + plist_t value_node = plist_dict_get_item(dict, key); + if (value_node) { + debug_info("has a value"); + *value = plist_copy(value_node); + } else { + ret = RESTORE_E_PLIST_ERROR; + } + + plist_free(dict); + return ret; +} + +/** * Retrieves a value from information plist specified by a key. * * @param client An initialized restored client. |