diff options
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 @@  #include "debug.h"  /** - * Internally used function to extract the message string from a DLMessage* + * Internally used function to extract the message string from a DL* message   * plist.   *   * @param dl_msg The DeviceLink property list to parse. + * @param message A pointer that will be set to a newly allocated char* + *     containing the DLMessage* string from the given plist. It is up to + *     the caller to free the allocated memory. If this parameter is NULL + *     it will be ignored.   * - * @return An allocated char* with the DLMessage from the given plist, - *     or NULL when the plist does not contain any DLMessage. It is up to - *     the caller to free the allocated memory. + * @return 1 if the given plist is a DL* message, or 0 if the plist does not + *     contain any DL* message.   */ -static char *device_link_service_get_message(plist_t dl_msg) +static int device_link_service_get_message(plist_t dl_msg, char **message)  { -	plist_t cmd = 0; +	plist_t cmd = NULL;  	char *cmd_str = NULL;  	/* sanity check */  	if ((plist_get_node_type(dl_msg) != PLIST_ARRAY) || (plist_array_get_size(dl_msg) < 1)) { -		return NULL; +		return 0;  	}  	/* get dl command */  	cmd = plist_array_get_item(dl_msg, 0);  	if (!cmd || (plist_get_node_type(cmd) != PLIST_STRING)) { -		return NULL; +		return 0;  	}  	plist_get_string_val(cmd, &cmd_str);  	if (!cmd_str) { -		return NULL; +		return 0;  	} -	if ((strlen(cmd_str) < (strlen("DLMessage")+1)) -	    || (strncmp(cmd_str, "DLMessage", strlen("DLMessage")))) { +	if ((strlen(cmd_str) < 9) || (strncmp(cmd_str, "DL", 2))) {  		free(cmd_str); -		return NULL; +		return 0;  	} -	/* we got a DLMessage* command */ -	return cmd_str; +	if (message) +		*message = cmd_str; + +	/* we got a DL* message */ +	return 1;  }  /** @@ -153,7 +158,7 @@ device_link_service_error_t device_link_service_version_exchange(device_link_ser  		err = DEVICE_LINK_SERVICE_E_MUX_ERROR;  		goto leave;  	} -	msg = device_link_service_get_message(array); +	device_link_service_get_message(array, &msg);  	if (!msg || strcmp(msg, "DLMessageVersionExchange")) {  		debug_info("Did not receive DLMessageVersionExchange from device!");  		err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; @@ -208,7 +213,7 @@ device_link_service_error_t device_link_service_version_exchange(device_link_ser  		err = DEVICE_LINK_SERVICE_E_MUX_ERROR;  		goto leave;  	} -	msg = device_link_service_get_message(array); +	device_link_service_get_message(array, &msg);  	if (!msg || strcmp(msg, "DLMessageDeviceReady")) {  		debug_info("Did not get DLMessageDeviceReady!");  		err = DEVICE_LINK_SERVICE_E_PLIST_ERROR; @@ -313,6 +318,40 @@ device_link_service_error_t device_link_service_send_process_message(device_link  }  /** + * Receives a DL* message plist + * + * @param client The connected device link service client used for receiving. + * @param msg_plist Pointer to a plist that will be set to the contents of the + *    message plist upon successful return. + * @param dlmessage A pointer that will be set to a newly allocated char* + *     containing the DL* string from the given plist. It is up to the caller + *     to free the allocated memory. If this parameter is NULL + *     it will be ignored. + * + * @return DEVICE_LINK_SERVICE_E_SUCCESS if a DL* message was received, + *    DEVICE_LINK_SERVICE_E_INVALID_ARG if client or message is invalid, + *    DEVICE_LINK_SERVICE_E_PLIST_ERROR if the received plist is invalid + *    or is not a DL* message plist, or DEVICE_LINK_SERVICE_E_MUX_ERROR if + *    receiving from the device failed. + */ +device_link_service_error_t device_link_service_receive_message(device_link_service_client_t client, plist_t *msg_plist, char **dlmessage) +{ +	if (!client || !client->parent || !msg_plist) +		return DEVICE_LINK_SERVICE_E_INVALID_ARG; + +	*msg_plist = NULL; +	if (property_list_service_receive_plist(client->parent, msg_plist) != PROPERTY_LIST_SERVICE_E_SUCCESS) { +		return DEVICE_LINK_SERVICE_E_MUX_ERROR; +	} + +	if (!device_link_service_get_message(*msg_plist, dlmessage)) { +		debug_info("Did not receive a DL* message as expected!"); +		return DEVICE_LINK_SERVICE_E_PLIST_ERROR; +	} +	return DEVICE_LINK_SERVICE_E_SUCCESS; +} + +/**   * Receives a DLMessageProcessMessage plist.   *   * @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  	device_link_service_error_t err = DEVICE_LINK_SERVICE_E_UNKNOWN_ERROR; -	char *msg = device_link_service_get_message(pmsg); +	char *msg = NULL; +	device_link_service_get_message(pmsg, &msg);  	if (!msg || strcmp(msg, "DLMessageProcessMessage")) {  		debug_info("Did not receive DLMessageProcessMessage as expected!");  		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  device_link_service_error_t device_link_service_client_free(device_link_service_client_t client);  device_link_service_error_t device_link_service_version_exchange(device_link_service_client_t client, uint64_t version_major, uint64_t version_minor);  device_link_service_error_t device_link_service_send_ping(device_link_service_client_t client, const char *message); +device_link_service_error_t device_link_service_receive_message(device_link_service_client_t client, plist_t *msg_plist, char **dlmessage);  device_link_service_error_t device_link_service_send_process_message(device_link_service_client_t client, plist_t message);  device_link_service_error_t device_link_service_receive_process_message(device_link_service_client_t client, plist_t *message);  device_link_service_error_t device_link_service_disconnect(device_link_service_client_t client); | 
