diff options
| author | 2010-08-27 02:01:19 +0200 | |
|---|---|---|
| committer | 2010-08-27 02:01:19 +0200 | |
| commit | fdf111f87feac01ff366b8ac18f1df8262006bcd (patch) | |
| tree | 2aebabf17eea4cb3a4747d00c9b2cf219995ede5 /src | |
| parent | 52e717b63544b83855b9f0016888094d9c6bc683 (diff) | |
| download | libimobiledevice-fdf111f87feac01ff366b8ac18f1df8262006bcd.tar.gz libimobiledevice-fdf111f87feac01ff366b8ac18f1df8262006bcd.tar.bz2 | |
device_link_service: add new function device_link_service_receive_message
Diffstat (limited to 'src')
| -rw-r--r-- | src/device_link_service.c | 74 | ||||
| -rw-r--r-- | src/device_link_service.h | 1 |
2 files changed, 58 insertions, 17 deletions
diff --git a/src/device_link_service.c b/src/device_link_service.c index e9aa675..6083d80 100644 --- a/src/device_link_service.c +++ b/src/device_link_service.c | |||
| @@ -25,44 +25,49 @@ | |||
| 25 | #include "debug.h" | 25 | #include "debug.h" |
| 26 | 26 | ||
| 27 | /** | 27 | /** |
| 28 | * Internally used function to extract the message string from a DLMessage* | 28 | * Internally used function to extract the message string from a DL* message |
| 29 | * plist. | 29 | * plist. |
| 30 | * | 30 | * |
| 31 | * @param dl_msg The DeviceLink property list to parse. | 31 | * @param dl_msg The DeviceLink property list to parse. |
| 32 | * @param message A pointer that will be set to a newly allocated char* | ||
| 33 | * containing the DLMessage* string from the given plist. It is up to | ||
| 34 | * the caller to free the allocated memory. If this parameter is NULL | ||
| 35 | * it will be ignored. | ||
| 32 | * | 36 | * |
| 33 | * @return An allocated char* with the DLMessage from the given plist, | 37 | * @return 1 if the given plist is a DL* message, or 0 if the plist does not |
| 34 | * or NULL when the plist does not contain any DLMessage. It is up to | 38 | * contain any DL* message. |
| 35 | * the caller to free the allocated memory. | ||
| 36 | */ | 39 | */ |
| 37 | static char *device_link_service_get_message(plist_t dl_msg) | 40 | static int device_link_service_get_message(plist_t dl_msg, char **message) |
| 38 | { | 41 | { |
| 39 | plist_t cmd = 0; | 42 | plist_t cmd = NULL; |
| 40 | char *cmd_str = NULL; | 43 | char *cmd_str = NULL; |
| 41 | 44 | ||
| 42 | /* sanity check */ | 45 | /* sanity check */ |
| 43 | if ((plist_get_node_type(dl_msg) != PLIST_ARRAY) || (plist_array_get_size(dl_msg) < 1)) { | 46 | if ((plist_get_node_type(dl_msg) != PLIST_ARRAY) || (plist_array_get_size(dl_msg) < 1)) { |
| 44 | return NULL; | 47 | return 0; |
| 45 | } | 48 | } |
| 46 | 49 | ||
| 47 | /* get dl command */ | 50 | /* get dl command */ |
| 48 | cmd = plist_array_get_item(dl_msg, 0); | 51 | cmd = plist_array_get_item(dl_msg, 0); |
| 49 | if (!cmd || (plist_get_node_type(cmd) != PLIST_STRING)) { | 52 | if (!cmd || (plist_get_node_type(cmd) != PLIST_STRING)) { |
| 50 | return NULL; | 53 | return 0; |
| 51 | } | 54 | } |
| 52 | 55 | ||
| 53 | plist_get_string_val(cmd, &cmd_str); | 56 | plist_get_string_val(cmd, &cmd_str); |
| 54 | if (!cmd_str) { | 57 | if (!cmd_str) { |
| 55 | return NULL; | 58 | return 0; |
| 56 | } | 59 | } |
| 57 | 60 | ||
| 58 | if ((strlen(cmd_str) < (strlen("DLMessage")+1)) | 61 | if ((strlen(cmd_str) < 9) || (strncmp(cmd_str, "DL", 2))) { |
| 59 | || (strncmp(cmd_str, "DLMessage", strlen("DLMessage")))) { | ||
| 60 | free(cmd_str); | 62 | free(cmd_str); |
| 61 | return NULL; | 63 | return 0; |
| 62 | } | 64 | } |
| 63 | 65 | ||
| 64 | /* we got a DLMessage* command */ | 66 | if (message) |
| 65 | return cmd_str; | 67 | *message = cmd_str; |
| 68 | |||
| 69 | /* we got a DL* message */ | ||
| 70 | return 1; | ||
| 66 | } | 71 | } |
| 67 | 72 | ||
| 68 | /** | 73 | /** |
| @@ -153,7 +158,7 @@ device_link_service_error_t device_link_service_version_exchange(device_link_ser | |||
| 153 | err = DEVICE_LINK_SERVICE_E_MUX_ERROR; | 158 | err = DEVICE_LINK_SERVICE_E_MUX_ERROR; |
| 154 | goto leave; | 159 | goto leave; |
| 155 | } | 160 | } |
| 156 | msg = device_link_service_get_message(array); | 161 | device_link_service_get_message(array, &msg); |
| 157 | if (!msg || strcmp(msg, "DLMessageVersionExchange")) { | 162 | if (!msg || strcmp(msg, "DLMessageVersionExchange")) { |
| 158 | debug_info("Did not receive DLMessageVersionExchange from device!"); | 163 | debug_info("Did not receive DLMessageVersionExchange from device!"); |
| 159 | err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; | 164 | err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; |
| @@ -208,7 +213,7 @@ device_link_service_error_t device_link_service_version_exchange(device_link_ser | |||
| 208 | err = DEVICE_LINK_SERVICE_E_MUX_ERROR; | 213 | err = DEVICE_LINK_SERVICE_E_MUX_ERROR; |
| 209 | goto leave; | 214 | goto leave; |
| 210 | } | 215 | } |
| 211 | msg = device_link_service_get_message(array); | 216 | device_link_service_get_message(array, &msg); |
| 212 | if (!msg || strcmp(msg, "DLMessageDeviceReady")) { | 217 | if (!msg || strcmp(msg, "DLMessageDeviceReady")) { |
| 213 | debug_info("Did not get DLMessageDeviceReady!"); | 218 | debug_info("Did not get DLMessageDeviceReady!"); |
| 214 | err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; | 219 | err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; |
| @@ -313,6 +318,40 @@ device_link_service_error_t device_link_service_send_process_message(device_link | |||
| 313 | } | 318 | } |
| 314 | 319 | ||
| 315 | /** | 320 | /** |
| 321 | * Receives a DL* message plist | ||
| 322 | * | ||
| 323 | * @param client The connected device link service client used for receiving. | ||
| 324 | * @param msg_plist Pointer to a plist that will be set to the contents of the | ||
| 325 | * message plist upon successful return. | ||
| 326 | * @param dlmessage A pointer that will be set to a newly allocated char* | ||
| 327 | * containing the DL* string from the given plist. It is up to the caller | ||
| 328 | * to free the allocated memory. If this parameter is NULL | ||
| 329 | * it will be ignored. | ||
| 330 | * | ||
| 331 | * @return DEVICE_LINK_SERVICE_E_SUCCESS if a DL* message was received, | ||
| 332 | * DEVICE_LINK_SERVICE_E_INVALID_ARG if client or message is invalid, | ||
| 333 | * DEVICE_LINK_SERVICE_E_PLIST_ERROR if the received plist is invalid | ||
| 334 | * or is not a DL* message plist, or DEVICE_LINK_SERVICE_E_MUX_ERROR if | ||
| 335 | * receiving from the device failed. | ||
| 336 | */ | ||
| 337 | device_link_service_error_t device_link_service_receive_message(device_link_service_client_t client, plist_t *msg_plist, char **dlmessage) | ||
| 338 | { | ||
| 339 | if (!client || !client->parent || !msg_plist) | ||
| 340 | return DEVICE_LINK_SERVICE_E_INVALID_ARG; | ||
| 341 | |||
| 342 | *msg_plist = NULL; | ||
| 343 | if (property_list_service_receive_plist(client->parent, msg_plist) != PROPERTY_LIST_SERVICE_E_SUCCESS) { | ||
| 344 | return DEVICE_LINK_SERVICE_E_MUX_ERROR; | ||
| 345 | } | ||
| 346 | |||
| 347 | if (!device_link_service_get_message(*msg_plist, dlmessage)) { | ||
| 348 | debug_info("Did not receive a DL* message as expected!"); | ||
| 349 | return DEVICE_LINK_SERVICE_E_PLIST_ERROR; | ||
| 350 | } | ||
| 351 | return DEVICE_LINK_SERVICE_E_SUCCESS; | ||
| 352 | } | ||
| 353 | |||
| 354 | /** | ||
| 316 | * Receives a DLMessageProcessMessage plist. | 355 | * Receives a DLMessageProcessMessage plist. |
| 317 | * | 356 | * |
| 318 | * @param client The connected device link service client used for receiving. | 357 | * @param client The connected device link service client used for receiving. |
| @@ -337,7 +376,8 @@ device_link_service_error_t device_link_service_receive_process_message(device_l | |||
| 337 | 376 | ||
| 338 | device_link_service_error_t err = DEVICE_LINK_SERVICE_E_UNKNOWN_ERROR; | 377 | device_link_service_error_t err = DEVICE_LINK_SERVICE_E_UNKNOWN_ERROR; |
| 339 | 378 | ||
| 340 | char *msg = device_link_service_get_message(pmsg); | 379 | char *msg = NULL; |
| 380 | device_link_service_get_message(pmsg, &msg); | ||
| 341 | if (!msg || strcmp(msg, "DLMessageProcessMessage")) { | 381 | if (!msg || strcmp(msg, "DLMessageProcessMessage")) { |
| 342 | debug_info("Did not receive DLMessageProcessMessage as expected!"); | 382 | debug_info("Did not receive DLMessageProcessMessage as expected!"); |
| 343 | err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; | 383 | err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; |
diff --git a/src/device_link_service.h b/src/device_link_service.h index 8b58ccf..9953f77 100644 --- a/src/device_link_service.h +++ b/src/device_link_service.h | |||
| @@ -45,6 +45,7 @@ device_link_service_error_t device_link_service_client_new(idevice_t device, uin | |||
| 45 | device_link_service_error_t device_link_service_client_free(device_link_service_client_t client); | 45 | device_link_service_error_t device_link_service_client_free(device_link_service_client_t client); |
| 46 | device_link_service_error_t device_link_service_version_exchange(device_link_service_client_t client, uint64_t version_major, uint64_t version_minor); | 46 | device_link_service_error_t device_link_service_version_exchange(device_link_service_client_t client, uint64_t version_major, uint64_t version_minor); |
| 47 | device_link_service_error_t device_link_service_send_ping(device_link_service_client_t client, const char *message); | 47 | device_link_service_error_t device_link_service_send_ping(device_link_service_client_t client, const char *message); |
| 48 | device_link_service_error_t device_link_service_receive_message(device_link_service_client_t client, plist_t *msg_plist, char **dlmessage); | ||
| 48 | device_link_service_error_t device_link_service_send_process_message(device_link_service_client_t client, plist_t message); | 49 | device_link_service_error_t device_link_service_send_process_message(device_link_service_client_t client, plist_t message); |
| 49 | device_link_service_error_t device_link_service_receive_process_message(device_link_service_client_t client, plist_t *message); | 50 | device_link_service_error_t device_link_service_receive_process_message(device_link_service_client_t client, plist_t *message); |
| 50 | device_link_service_error_t device_link_service_disconnect(device_link_service_client_t client); | 51 | device_link_service_error_t device_link_service_disconnect(device_link_service_client_t client); |
