diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/InstallationProxy.c | 138 | 
1 files changed, 27 insertions, 111 deletions
| diff --git a/src/InstallationProxy.c b/src/InstallationProxy.c index 917886d..387f9ca 100644 --- a/src/InstallationProxy.c +++ b/src/InstallationProxy.c @@ -56,112 +56,28 @@ static void instproxy_unlock(instproxy_client_t client)  }  /** - * Sends an xml plist to the device using the connection specified in client. - * This function is only used internally. + * Convert an iphone_error_t value to an instproxy_error_t value. + * Used internally to get correct error codes when using plist helper + * functions.   * - * @param client The installation_proxy to send data to - * @param plist plist to send + * @param err An iphone_error_t error code   * - * @return INSTPROXY_E_SUCCESS on success, INSTPROXY_E_INVALID_ARG when client - *      or plist are NULL, INSTPROXY_E_PLIST_ERROR when dict is not a valid - *      plist, or INSTPROXY_E_UNKNOWN_ERROR when an unspecified error occurs. + * @return A matching instproxy_error_t error code, + *     INSTPROXY_E_UNKNOWN_ERROR otherwise.   */ -static instproxy_error_t instproxy_plist_send(instproxy_client_t client, plist_t plist) +static instproxy_error_t iphone_to_instproxy_error(iphone_error_t err)  { -	instproxy_error_t res = INSTPROXY_E_UNKNOWN_ERROR; -	char *XML_content = NULL; -	uint32_t length = 0; -	uint32_t nlen = 0; -	int bytes = 0; - -	if (!client || !plist) { -		return INSTPROXY_E_INVALID_ARG; -	} - -	plist_to_xml(plist, &XML_content, &length); - -	if (!XML_content || length == 0) { -		return INSTPROXY_E_PLIST_ERROR; -	} - -	nlen = htonl(length); -	log_debug_msg("%s: sending %d bytes\n", __func__, length); -	iphone_device_send(client->connection, (const char*)&nlen, sizeof(nlen), (uint32_t*)&bytes); -	if (bytes == sizeof(nlen)) { -		iphone_device_send(client->connection, XML_content, length, (uint32_t*)&bytes); -		if (bytes > 0) { -			log_debug_msg("%s: received %d bytes\n", __func__, bytes); -			log_debug_buffer(XML_content, bytes); -			if ((uint32_t)bytes == length) { -				res = INSTPROXY_E_SUCCESS; -			} else { -				log_debug_msg("%s: ERROR: Could not send all data (%d of %d)!\n", __func__, bytes, length); -			} -		} -	} -	if (bytes <= 0) { -		log_dbg_msg(DBGMASK_INSTPROXY, "%s: ERROR: sending to device failed.\n", __func__); -	} - -	free(XML_content); - -	return res; -} - -/** - * Receives an xml plist from the device using the connection specified in - *  client. - * This function is only used internally. - * - * @param client The installation_proxy to receive data from - * @param plist pointer to a plist_t that will point to the received plist - *              upon successful return - * - * @return INSTPROXY_E_SUCCESS on success, INSTPROXY_E_INVALID_ARG when client - *      or *plist are NULL, INSTPROXY_E_PLIST_ERROR when dict is not a valid - *      plist, or INSTPROXY_E_UNKNOWN_ERROR when an unspecified error occurs. - */ -static instproxy_error_t instproxy_plist_recv(instproxy_client_t client, plist_t *plist) -{ -	instproxy_error_t res = INSTPROXY_E_UNKNOWN_ERROR; -	char *XML_content = NULL; -	uint32_t pktlen = 0; -	uint32_t bytes = 0; - -	if (!client || !plist) { -		return INSTPROXY_E_INVALID_ARG; -	} - -	iphone_device_recv_timeout(client->connection, (char*)&pktlen, sizeof(pktlen), &bytes, 300000); /* 5 minute timeout should be enough */ -	log_debug_msg("%s: initial read=%i\n", __func__, bytes); -	if (bytes < 4) { -		log_dbg_msg(DBGMASK_INSTPROXY, "%s: initial read failed!\n"); -	} else { -		if ((char)pktlen == 0) { -			uint32_t curlen = 0; -			pktlen = ntohl(pktlen); -			log_debug_msg("%s: %d bytes following\n", __func__, pktlen); -			XML_content = (char*)malloc(pktlen); - -			while (curlen < pktlen) { -				iphone_device_recv(client->connection, XML_content+curlen, pktlen-curlen, &bytes); -				if (bytes <= 0) { -					res = INSTPROXY_E_UNKNOWN_ERROR; -					break; -				} -				log_debug_msg("%s: received %d bytes\n", __func__, bytes); -				curlen += bytes; -			} -			log_debug_buffer(XML_content, pktlen); -			plist_from_xml(XML_content, pktlen, plist); -			res = INSTPROXY_E_SUCCESS; -			free(XML_content); -			XML_content = NULL; -		} else { -			res = INSTPROXY_E_UNKNOWN_ERROR; -		} +	switch (err) { +		case IPHONE_E_SUCCESS: +			return INSTPROXY_E_SUCCESS; +		case IPHONE_E_INVALID_ARG: +			return INSTPROXY_E_INVALID_ARG; +		case IPHONE_E_PLIST_ERROR: +			return INSTPROXY_E_PLIST_ERROR; +		default: +			break;  	} -	return res; +	return INSTPROXY_E_UNKNOWN_ERROR;  }  /** @@ -268,7 +184,7 @@ instproxy_error_t instproxy_browse(instproxy_client_t client, instproxy_apptype_  	plist_dict_insert_item(dict, "Command", plist_new_string("Browse"));  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	plist_free(dict);  	if (res != INSTPROXY_E_SUCCESS) {  		log_dbg_msg(DBGMASK_INSTPROXY, "%s: could not send plist\n", __func__); @@ -280,7 +196,7 @@ instproxy_error_t instproxy_browse(instproxy_client_t client, instproxy_apptype_  	do {  		browsing = 0;  		dict = NULL; -		res = instproxy_plist_recv(client, &dict); +		res = iphone_to_instproxy_error(iphone_device_receive_plist(client->connection, &dict));  		if (res != INSTPROXY_E_SUCCESS) {  			break;  		} @@ -345,7 +261,7 @@ static instproxy_error_t instproxy_perform_operation(instproxy_client_t client,  	do {  		instproxy_lock(client); -		res = instproxy_plist_recv(client, &dict); +		res = iphone_to_instproxy_error(iphone_device_receive_plist_with_timeout(client->connection, &dict, 30000));  		instproxy_unlock(client);  		if (res != INSTPROXY_E_SUCCESS) {  			log_dbg_msg(DBGMASK_INSTPROXY, "%s: could not receive plist, error %d\n", __func__, res); @@ -517,7 +433,7 @@ static instproxy_error_t instproxy_install_or_upgrade(instproxy_client_t client,  	plist_dict_insert_item(dict, "PackagePath", plist_new_string(pkg_path));  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	instproxy_unlock(client);  	plist_free(dict); @@ -610,7 +526,7 @@ instproxy_error_t instproxy_uninstall(instproxy_client_t client, const char *app  	plist_dict_insert_item(dict, "Command", plist_new_string("Uninstall"));  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	instproxy_unlock(client);  	plist_free(dict); @@ -647,7 +563,7 @@ instproxy_error_t instproxy_lookup_archives(instproxy_client_t client, plist_t *  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	plist_free(dict);  	if (res != INSTPROXY_E_SUCCESS) { @@ -655,7 +571,7 @@ instproxy_error_t instproxy_lookup_archives(instproxy_client_t client, plist_t *  		goto leave_unlock;  	} -	res = instproxy_plist_recv(client, result); +	res = iphone_to_instproxy_error(iphone_device_receive_plist(client->connection, result));  	if (res != INSTPROXY_E_SUCCESS) {  		log_dbg_msg(DBGMASK_INSTPROXY, "%s: could not receive plist, error %d\n", __func__, res);  		goto leave_unlock; @@ -718,7 +634,7 @@ instproxy_error_t instproxy_archive(instproxy_client_t client, const char *appid  	plist_dict_insert_item(dict, "Command", plist_new_string("Archive"));  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	instproxy_unlock(client);  	plist_free(dict); @@ -764,7 +680,7 @@ instproxy_error_t instproxy_restore(instproxy_client_t client, const char *appid  	plist_dict_insert_item(dict, "Command", plist_new_string("Restore"));  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	instproxy_unlock(client);  	plist_free(dict); @@ -810,7 +726,7 @@ instproxy_error_t instproxy_remove_archive(instproxy_client_t client, const char  	plist_dict_insert_item(dict, "Command", plist_new_string("RemoveArchive"));  	instproxy_lock(client); -	res = instproxy_plist_send(client, dict); +	res = iphone_to_instproxy_error(iphone_device_send_xml_plist(client->connection, dict));  	instproxy_unlock(client);  	plist_free(dict); | 
