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; }
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; }
/* * 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; }