示例#1
0
文件: obex.c 项目: merrykid/libexword
static int obex_bulk_read(obex_t *self, buf_t *msg)
{
	int retval, actual_length;
	int expected_length;
	char * buffer;
	DEBUG(self, 4, "Read from endpoint %d\n", self->read_endpoint_address);
	do {
		buffer = buf_reserve_end(msg, self->mtu_rx);
		retval = libusb_bulk_transfer(self->usb_dev, self->read_endpoint_address, buffer, self->mtu_rx, &actual_length, 1245);
		buf_remove_end(msg, self->mtu_rx - actual_length);
		expected_length = ntohs(*((uint16_t*)(msg->data + 1)));
	} while (expected_length != msg->data_size && actual_length > 0);
	if (retval == 0)
		retval = msg->data_size;
	return retval;
}
示例#2
0
文件: obex.c 项目: brijohn/libexword
static int obex_verify_seq(obex_t *self, uint8_t seq) {
	int retval, actual_length = 0, count = 0;
	char * buffer;
	buffer = buf_reserve_end(self->rx_msg, self->mtu_rx);
	do {
		retval = libusb_bulk_transfer(self->usb_dev, self->read_endpoint_address, buffer, self->mtu_rx, &actual_length, 1245);
		if (retval < 0)
			break;
		count++;
	} while (count < 100 && actual_length == 0);
	buf_remove_end(self->rx_msg, self->mtu_rx - actual_length);
	if (retval < 0 || actual_length == 0) {
		DEBUG(self, 4, "Error reading seq number (%d)\n",
		      retval);
		return 0;
	}
	if ((uint8_t)buffer[0] != seq) {
		DEBUG(self, 4, "Sequence mismatch %u != %u\n",
		      (uint8_t)buffer[0], seq);
		return 0;
	}
	buf_remove_begin(self->rx_msg, 1);
	return 1;
}
示例#3
0
/*
 * Function obex_transport_read ()
 *
 *    Do the reading
 *
 */
int obex_transport_read(obex_t *self, int max, uint8_t *buf, int buflen)
{
	int actual = -1;
	buf_t *msg = self->rx_msg;
#if defined(HAVE_USB) && defined(HAVE_USB1)
	int usberror;
#endif

	DEBUG(4, "Request to read max %d bytes\n", max);

	switch (self->trans.type) {
#ifdef HAVE_IRDA
	case OBEX_TRANS_IRDA:
#endif /*HAVE_IRDA*/
#ifdef HAVE_BLUETOOTH
	case OBEX_TRANS_BLUETOOTH:
#endif /*HAVE_BLUETOOTH*/
	case OBEX_TRANS_INET:
		actual = recv(self->fd, buf_reserve_end(msg, max), max, 0);
		if (actual > 0)
			buf_remove_end(msg, max - actual);
		break;
	case OBEX_TRANS_FD:
#ifdef _WIN32
		actual = _read(self->fd, buf_reserve_end(msg, max), max);
#else
		actual = read(self->fd, buf_reserve_end(msg, max), max);
#endif
		if (actual > 0)
			buf_remove_end(msg, max - actual);
		break;
#ifdef HAVE_USB
	case OBEX_TRANS_USB:
		if (self->trans.connected != TRUE)
			break;
		DEBUG(4, "Endpoint %d\n", self->trans.self.usb.data_endpoint_read);
#ifdef HAVE_USB1
		usberror = libusb_bulk_transfer(self->trans.self.usb.dev,
					self->trans.self.usb.data_endpoint_read,
					buf_reserve_end(msg, self->mtu_rx),
					self->mtu_rx, &actual,
					USB_OBEX_TIMEOUT);
		if (usberror)
			actual = usberror;
#else
		actual = usb_bulk_read(self->trans.self.usb.dev,
					self->trans.self.usb.data_endpoint_read,
					buf_reserve_end(msg, self->mtu_rx),
					self->mtu_rx, USB_OBEX_TIMEOUT);
#endif
		buf_remove_end(msg, self->mtu_rx - actual);
		break;
#endif /*HAVE_USB*/
	case OBEX_TRANS_CUSTOM:
		if (buflen > max) {
			memcpy(buf_reserve_end(msg, max), buf, max);
			actual = max;
		} else {
			memcpy(buf_reserve_end(msg, buflen), buf, buflen);
			actual = buflen;
		}
		break;
	default:
		DEBUG(4, "Transport not implemented!\n");
		break;
	}

	return actual;
}