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,