From a9e6d6f9db0767c930a9fa194d3dd777206dfc83 Mon Sep 17 00:00:00 2001 From: Klaus Reimer Date: Sat, 5 Mar 2011 16:53:59 +0100 Subject: [PATCH] Switched to version 0.3.1. FIxed missing support for custom buffer offsets and lengths. --- src/changes/changes.xml | 5 ++ src/main/c/configure.ac | 2 +- src/main/java/de/ailis/usb4java/Services.java | 2 +- .../usb4java/support/ControlIrpQueue.java | 4 +- .../de/ailis/usb4java/support/IrpQueue.java | 60 +++++++++++++------ 5 files changed, 51 insertions(+), 22 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index e71fa20..0eec0e5 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -8,6 +8,11 @@ Klaus Reimer + + + Fixed missing support for custom buffer offsets and lengths. + + Fixed problem with empty control requests on Mac OS X. diff --git a/src/main/c/configure.ac b/src/main/c/configure.ac index 59d4b97..546f1d6 100644 --- a/src/main/c/configure.ac +++ b/src/main/c/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.65]) -AC_INIT([libusb4java], [0.3.0], [k@ailis.de]) +AC_INIT([libusb4java], [0.3.1], [k@ailis.de]) AM_INIT_AUTOMAKE(foreign -Wall -Werror) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_HEADERS([config.h]) diff --git a/src/main/java/de/ailis/usb4java/Services.java b/src/main/java/de/ailis/usb4java/Services.java index 527d870..a0dd7ee 100644 --- a/src/main/java/de/ailis/usb4java/Services.java +++ b/src/main/java/de/ailis/usb4java/Services.java @@ -34,7 +34,7 @@ public final class Services implements UsbServices "usb4java JSR-80 implementation"; /** The implementation version. */ - private static final String IMP_VERSION = "0.3.0"; + private static final String IMP_VERSION = "0.3.1"; /** The API version. */ private static final String API_VERSION = "1.0.1"; diff --git a/src/main/java/de/ailis/usb4java/support/ControlIrpQueue.java b/src/main/java/de/ailis/usb4java/support/ControlIrpQueue.java index ba854e2..25d31ac 100644 --- a/src/main/java/de/ailis/usb4java/support/ControlIrpQueue.java +++ b/src/main/java/de/ailis/usb4java/support/ControlIrpQueue.java @@ -48,7 +48,7 @@ public final class ControlIrpQueue extends AbstractIrpQueue { final ByteBuffer buffer = ByteBuffer.allocateDirect(irp.getLength()); - buffer.put(irp.getData(), 0, irp.getLength()); + buffer.put(irp.getData(), irp.getOffset(), irp.getLength()); buffer.rewind(); final USB_Dev_Handle handle = this.device.open(); final int len = @@ -59,7 +59,7 @@ public final class ControlIrpQueue extends AbstractIrpQueue throw new LibUsbException( "Unable to submit control message", len); buffer.rewind(); - buffer.get(irp.getData(), 0, len); + buffer.get(irp.getData(), irp.getOffset(), len); irp.setActualLength(len); } diff --git a/src/main/java/de/ailis/usb4java/support/IrpQueue.java b/src/main/java/de/ailis/usb4java/support/IrpQueue.java index f7cf88a..1652019 100644 --- a/src/main/java/de/ailis/usb4java/support/IrpQueue.java +++ b/src/main/java/de/ailis/usb4java/support/IrpQueue.java @@ -65,8 +65,6 @@ public final class IrpQueue extends AbstractIrpQueue /** * @see AbstractIrpQueue#processIrp(javax.usb.UsbIrp) - * - * TODO Implement control IRP support. */ @Override @@ -81,11 +79,13 @@ public final class IrpQueue extends AbstractIrpQueue switch (direction) { case UsbConst.ENDPOINT_DIRECTION_OUT: - irp.setActualLength(bulkWrite(irp.getData())); + irp.setActualLength(bulkWrite(irp.getData(), + irp.getOffset(), irp.getLength())); break; case UsbConst.ENDPOINT_DIRECTION_IN: - irp.setActualLength(bulkRead(irp.getData())); + irp.setActualLength(bulkRead(irp.getData(), + irp.getOffset(), irp.getLength())); break; default: @@ -98,11 +98,13 @@ public final class IrpQueue extends AbstractIrpQueue switch (direction) { case UsbConst.ENDPOINT_DIRECTION_OUT: - irp.setActualLength(interruptWrite(irp.getData())); + irp.setActualLength(interruptWrite(irp.getData(), + irp.getOffset(), irp.getLength())); break; case UsbConst.ENDPOINT_DIRECTION_IN: - irp.setActualLength(interruptRead(irp.getData())); + irp.setActualLength(interruptRead(irp.getData(), + irp.getOffset(), irp.getLength())); break; default: @@ -135,15 +137,20 @@ public final class IrpQueue extends AbstractIrpQueue * * @param data * The data array to write the read bytes to. + * @param offset + * The offset in the data array to write the read bytes to. + * @param len + * The number of bytes to read. * @throws UsbException * When transfer fails. * @return The number of read bytes. */ - private int bulkRead(final byte[] data) throws UsbException + private int bulkRead(final byte[] data, final int offset, final int len) + throws UsbException { final UsbEndpointDescriptor descriptor = getEndpointDescriptor(); - final int size = Math.min(data.length, descriptor.wMaxPacketSize() + final int size = Math.min(len, descriptor.wMaxPacketSize() & 0xffff); final ByteBuffer buffer = ByteBuffer.allocateDirect(size); final int result = usb_bulk_read(this.device.open(), @@ -151,7 +158,7 @@ public final class IrpQueue extends AbstractIrpQueue if (result < 0) throw new LibUsbException( "Unable to read from interrupt endpoint", result); buffer.rewind(); - buffer.get(data, 0, result); + buffer.get(data, offset, result); return result; } @@ -161,22 +168,27 @@ public final class IrpQueue extends AbstractIrpQueue * * @param data * The data array with the bytes to write. + * @param offset + * The offset in the data array to write. + * @param len + * The number of bytes to write. * @throws UsbException * When transfer fails. * @return The number of written bytes. */ - private int bulkWrite(final byte[] data) throws UsbException + private int bulkWrite(final byte[] data, final int offset, final int len) + throws UsbException { final UsbEndpointDescriptor descriptor = getEndpointDescriptor(); - final int total = data.length; + final int total = len; final int size = Math.min(total, descriptor.wMaxPacketSize() & 0xffff); final ByteBuffer buffer = ByteBuffer.allocateDirect(size); final USB_Dev_Handle handle = this.device.open(); int written = 0; while (written < total) { - buffer.put(data, written, Math.min(total - written, size)); + buffer.put(data, offset + written, Math.min(total - written, size)); buffer.rewind(); final int result = usb_bulk_write(handle, descriptor.bEndpointAddress(), buffer, @@ -194,15 +206,21 @@ public final class IrpQueue extends AbstractIrpQueue * * @param data * The data array to write the read bytes to. + * @param offset + * The offset in the data array to write the read bytes to. + * @param len + * The number of bytes to read. * @throws UsbException * When transfer fails. * @return The number of read bytes. */ - private int interruptRead(final byte[] data) throws UsbException + private int + interruptRead(final byte[] data, final int offset, final int len) + throws UsbException { final UsbEndpointDescriptor descriptor = getEndpointDescriptor(); - final int size = Math.min(data.length, descriptor.wMaxPacketSize() + final int size = Math.min(len, descriptor.wMaxPacketSize() & 0xffff); final ByteBuffer buffer = ByteBuffer.allocateDirect(size); final int result = usb_interrupt_read(this.device.open(), @@ -210,7 +228,7 @@ public final class IrpQueue extends AbstractIrpQueue if (result < 0) throw new LibUsbException( "Unable to read from interrupt endpoint", result); buffer.rewind(); - buffer.get(data, 0, result); + buffer.get(data, offset, result); return result; } @@ -220,21 +238,27 @@ public final class IrpQueue extends AbstractIrpQueue * * @param data * The data array with the bytes to write. + * @param offset + * The offset in the data array to write. + * @param len + * The number of bytes to write. * @throws UsbException * When transfer fails. * @return The number of written bytes. */ - private int interruptWrite(final byte[] data) throws UsbException + private int interruptWrite(final byte[] data, final int offset, + final int len) + throws UsbException { final UsbEndpointDescriptor descriptor = getEndpointDescriptor(); - final int total = data.length; + final int total = len; final int size = Math.min(total, descriptor.wMaxPacketSize() & 0xffff); final ByteBuffer buffer = ByteBuffer.allocateDirect(size); int written = 0; while (written < total) { - buffer.put(data, written, Math.min(total - written, size)); + buffer.put(data, offset + written, Math.min(total - written, size)); buffer.rewind(); final int result = usb_interrupt_write(this.device.open(), descriptor.bEndpointAddress(), buffer,