summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2010-08-27 02:01:19 +0200
committerGravatar Nikias Bassen2010-08-27 02:01:19 +0200
commitfdf111f87feac01ff366b8ac18f1df8262006bcd (patch)
tree2aebabf17eea4cb3a4747d00c9b2cf219995ede5 /src
parent52e717b63544b83855b9f0016888094d9c6bc683 (diff)
downloadlibimobiledevice-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.c74
-rw-r--r--src/device_link_service.h1
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 */
37static char *device_link_service_get_message(plist_t dl_msg) 40static 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 */
337device_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
45device_link_service_error_t device_link_service_client_free(device_link_service_client_t client); 45device_link_service_error_t device_link_service_client_free(device_link_service_client_t client);
46device_link_service_error_t device_link_service_version_exchange(device_link_service_client_t client, uint64_t version_major, uint64_t version_minor); 46device_link_service_error_t device_link_service_version_exchange(device_link_service_client_t client, uint64_t version_major, uint64_t version_minor);
47device_link_service_error_t device_link_service_send_ping(device_link_service_client_t client, const char *message); 47device_link_service_error_t device_link_service_send_ping(device_link_service_client_t client, const char *message);
48device_link_service_error_t device_link_service_receive_message(device_link_service_client_t client, plist_t *msg_plist, char **dlmessage);
48device_link_service_error_t device_link_service_send_process_message(device_link_service_client_t client, plist_t message); 49device_link_service_error_t device_link_service_send_process_message(device_link_service_client_t client, plist_t message);
49device_link_service_error_t device_link_service_receive_process_message(device_link_service_client_t client, plist_t *message); 50device_link_service_error_t device_link_service_receive_process_message(device_link_service_client_t client, plist_t *message);
50device_link_service_error_t device_link_service_disconnect(device_link_service_client_t client); 51device_link_service_error_t device_link_service_disconnect(device_link_service_client_t client);