diff options
Diffstat (limited to 'src/idevice.c')
| -rw-r--r-- | src/idevice.c | 92 | 
1 files changed, 71 insertions, 21 deletions
| diff --git a/src/idevice.c b/src/idevice.c index 06991c5..d23c5b5 100644 --- a/src/idevice.c +++ b/src/idevice.c @@ -190,7 +190,14 @@ static void usbmux_event_cb(const usbmuxd_event_t *event, void *user_data)  	ev.event = event->event;  	ev.udid = event->device.udid; -	ev.conn_type = CONNECTION_USBMUXD; +	ev.conn_type = 0; +	if (event->device.conn_type == CONNECTION_TYPE_USB) { +		ev.conn_type = CONNECTION_USBMUXD; +	} else if (event->device.conn_type == CONNECTION_TYPE_NETWORK) { +		ev.conn_type = CONNECTION_NETWORK; +	} else { +		debug_info("Unknown connection type %d", event->device.conn_type); +	}  	if (event_cb) {  		event_cb(&ev, user_data); @@ -236,9 +243,11 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_get_device_list(char ***devices, in  	int i, newcount = 0;  	for (i = 0; dev_list[i].handle > 0; i++) { -		newlist = realloc(*devices, sizeof(char*) * (newcount+1)); -		newlist[newcount++] = strdup(dev_list[i].udid); -		*devices = newlist; +		if (dev_list[i].conn_type == CONNECTION_TYPE_USB) { +			newlist = realloc(*devices, sizeof(char*) * (newcount+1)); +			newlist[newcount++] = strdup(dev_list[i].udid); +			*devices = newlist; +		}  	}  	usbmuxd_device_list_free(&dev_list); @@ -268,25 +277,66 @@ LIBIMOBILEDEVICE_API void idevice_set_debug_level(int level)  	internal_set_debug_level(level);  } -LIBIMOBILEDEVICE_API idevice_error_t idevice_new(idevice_t * device, const char *udid) +static idevice_t idevice_from_mux_device(usbmuxd_device_info_t *muxdev) +{ +	if (!muxdev) +		return NULL; + +	idevice_t device = (idevice_t)malloc(sizeof(struct idevice_private)); +	if (!device) +		return NULL; + +	device->udid = strdup(muxdev->udid); +	device->mux_id = muxdev->handle; +	device->version = 0; +	switch (muxdev->conn_type) { +	case CONNECTION_TYPE_USB: +		device->conn_type = CONNECTION_USBMUXD; +		device->conn_data = NULL; +		break; +	case CONNECTION_TYPE_NETWORK: +		device->conn_type = CONNECTION_NETWORK; +		size_t len = ((uint8_t*)muxdev->conn_data)[0]; +		device->conn_data = malloc(len); +		memcpy(device->conn_data, muxdev->conn_data, len); +		break; +	default: +		device->conn_type = 0; +		device->conn_data = NULL; +		break; +	} +	return device; +} + +LIBIMOBILEDEVICE_API idevice_error_t idevice_new_with_options(idevice_t * device, const char *udid, enum idevice_options options)  {  	usbmuxd_device_info_t muxdev; -	int res = usbmuxd_get_device_by_udid(udid, &muxdev); +	int usbmux_options = 0; +	if (options & IDEVICE_LOOKUP_USBMUX) { +		usbmux_options |= DEVICE_LOOKUP_USBMUX; +	} +	if (options & IDEVICE_LOOKUP_NETWORK) { +		usbmux_options |= DEVICE_LOOKUP_NETWORK; +	} +	if (options & IDEVICE_LOOKUP_PREFER_NETWORK) { +		usbmux_options |= DEVICE_LOOKUP_PREFER_NETWORK; +	} +	int res = usbmuxd_get_device(udid, &muxdev, usbmux_options);  	if (res > 0) { -		idevice_t dev = (idevice_t) malloc(sizeof(struct idevice_private)); -		dev->udid = strdup(muxdev.udid); -		dev->mux_id = muxdev.handle; -		dev->conn_type = CONNECTION_USBMUXD; -		dev->conn_data = NULL; -		dev->version = 0; -		*device = dev; +		*device = idevice_from_mux_device(&muxdev); +		if (!*device) { +			return IDEVICE_E_UNKNOWN_ERROR; +		}  		return IDEVICE_E_SUCCESS;  	} -	/* other connection types could follow here */ -  	return IDEVICE_E_NO_DEVICE;  } +LIBIMOBILEDEVICE_API idevice_error_t idevice_new(idevice_t * device, const char *udid) +{ +	return idevice_new_with_options(device, udid, 0); +} +  LIBIMOBILEDEVICE_API idevice_error_t idevice_free(idevice_t device)  {  	if (!device) @@ -310,7 +360,7 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connect(idevice_t device, uint16_t  		return IDEVICE_E_INVALID_ARG;  	} -	if (device->conn_type == CONNECTION_USBMUXD) { +	if (device->conn_type == CONNECTION_USBMUXD || device->conn_type == CONNECTION_NETWORK) {  		int sfd = usbmuxd_connect(device->mux_id, port);  		if (sfd < 0) {  			debug_info("ERROR: Connecting to usbmuxd failed: %d (%s)", sfd, strerror(-sfd)); @@ -340,7 +390,7 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_disconnect(idevice_connection_t con  		idevice_connection_disable_ssl(connection);  	}  	idevice_error_t result = IDEVICE_E_UNKNOWN_ERROR; -	if (connection->type == CONNECTION_USBMUXD) { +	if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) {  		usbmuxd_disconnect((int)(long)connection->data);  		connection->data = NULL;  		result = IDEVICE_E_SUCCESS; @@ -363,7 +413,7 @@ static idevice_error_t internal_connection_send(idevice_connection_t connection,  		return IDEVICE_E_INVALID_ARG;  	} -	if (connection->type == CONNECTION_USBMUXD) { +	if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) {  		int res = usbmuxd_send((int)(long)connection->data, data, len, sent_bytes);  		if (res < 0) {  			debug_info("ERROR: usbmuxd_send returned %d (%s)", res, strerror(-res)); @@ -434,7 +484,7 @@ static idevice_error_t internal_connection_receive_timeout(idevice_connection_t  		return IDEVICE_E_INVALID_ARG;  	} -	if (connection->type == CONNECTION_USBMUXD) { +	if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) {  		int conn_error = usbmuxd_recv_timeout((int)(long)connection->data, data, len, recv_bytes, timeout);  		idevice_error_t error = socket_recv_to_idevice_error(conn_error, len, *recv_bytes); @@ -510,7 +560,7 @@ static idevice_error_t internal_connection_receive(idevice_connection_t connecti  		return IDEVICE_E_INVALID_ARG;  	} -	if (connection->type == CONNECTION_USBMUXD) { +	if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) {  		int res = usbmuxd_recv((int)(long)connection->data, data, len, recv_bytes);  		if (res < 0) {  			debug_info("ERROR: usbmuxd_recv returned %d (%s)", res, strerror(-res)); @@ -554,7 +604,7 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connection_get_fd(idevice_connectio  	}  	idevice_error_t result = IDEVICE_E_UNKNOWN_ERROR; -	if (connection->type == CONNECTION_USBMUXD) { +	if (connection->type == CONNECTION_USBMUXD || connection->type == CONNECTION_NETWORK) {  		*fd = (int)(long)connection->data;  		result = IDEVICE_E_SUCCESS;  	} else { | 
