From 5f7063041dd51f87a35121647e394870e7a88e53 Mon Sep 17 00:00:00 2001
From: Lorenzo Pavesi
Date: Fri, 17 Feb 2017 15:56:35 +0100
Subject: [PATCH 01/37] Add javadoc for LIBUSB_ERROR_INVALID_PARAM
The native function controlTransfer return a LIBUSB_ERROR_INVALID_PARAM in case the transfer size is not supported
---
src/main/java/org/usb4java/LibUsb.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index 3d8dbd1..a84cc27 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -1817,7 +1817,9 @@ public static int getStringDescriptor(final DeviceHandle handle,
* {@link #ERROR_TIMEOUT} if the transfer timed out,
* {@link #ERROR_PIPE} if the control request was not supported by
* the device, {@link #ERROR_NO_DEVICE} if the device has been
- * disconnected, another ERROR code on other failures
+ * disconnected, {@link LIBUSB_ERROR_INVALID_PARAM} if the transfer
+ * size is larger than the operating system and/or hardware can
+ * support. Another ERROR code on other failures
*/
public static native int controlTransfer(final DeviceHandle handle,
final byte bmRequestType, final byte bRequest, final short wValue,
From 47534f98bc959a4b77499b5979c60af6326c6790 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 7 Oct 2018 10:44:01 +0200
Subject: [PATCH 02/37] Update dependencies
---
pom.xml | 64 ++++++++++----------------
src/main/java/org/usb4java/Loader.java | 28 +++++++++--
2 files changed, 48 insertions(+), 44 deletions(-)
diff --git a/pom.xml b/pom.xml
index ad9d51f..5ae2ff5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
usb4javajarusb4java
- 1.2.1-SNAPSHOT
+ 1.3.0-SNAPSHOThttp://usb4java.org/
USB library for Java based on libusb and implementing javax-usb (JSR-80).
@@ -64,8 +64,8 @@
${repoBaseUrl}/${project.version}/${project.artifactId}-${project.version}${repoBaseUrl}-javax/${usb4javaJavaxVersion}/${project.artifactId}-javax-${usb4javaJavaxVersion}
- 1.2.1-SNAPSHOT
- 1.2.1-SNAPSHOT
+ 1.3.0-SNAPSHOT
+ 1.3.0-SNAPSHOT
@@ -86,7 +86,7 @@
- 3.0
+ 3.0.5
@@ -94,7 +94,7 @@
org.apache.maven.pluginsmaven-project-info-reports-plugin
- 2.8
+ 3.0.0falsefalse
@@ -119,7 +119,7 @@
org.apache.maven.pluginsmaven-changes-plugin
- 2.11
+ 2.12.1
@@ -131,7 +131,7 @@
org.apache.maven.pluginsmaven-javadoc-plugin
- 2.10.2
+ 3.0.1
@@ -149,27 +149,27 @@
org.apache.maven.pluginsmaven-surefire-plugin
- 2.18.1
+ 2.22.0org.apache.maven.pluginsmaven-clean-plugin
- 2.6.1
+ 3.1.0org.apache.maven.pluginsmaven-deploy-plugin
- 2.8.2
+ 3.0.0-M1org.apache.maven.pluginsmaven-install-plugin
- 2.5.2
+ 3.0.0-M1org.apache.maven.pluginsmaven-resources-plugin
- 2.7
+ 3.1.0
@@ -180,7 +180,7 @@
org.apache.maven.pluginsmaven-compiler-plugin
- 3.3
+ 3.8.01.61.6
@@ -192,7 +192,7 @@
org.apache.maven.pluginsmaven-site-plugin
- 3.4
+ 3.7.1falseen
@@ -201,46 +201,30 @@
-
org.apache.maven.pluginsmaven-jar-plugin
- 2.6
-
-
- org.codehaus.plexus
- plexus-archiver
- 2.4.4
-
-
+ 3.1.0maven-assembly-plugin
- 2.5.3
+ 3.1.0
+ truefalsesrc/main/assembly/tarball.xmlsrc/main/assembly/zip.xml
-
-
- 420
- 493
- 493
- package-assemblypackage
- attached
+ single
@@ -340,36 +324,36 @@
org.usb4javalibusb4java${libusb4java.version}
- linux-arm
+ windows-x86org.usb4javalibusb4java${libusb4java.version}
- windows-x86
+ windows-x86_64org.usb4javalibusb4java${libusb4java.version}
- windows-x86_64
+ macos-x86_64org.usb4javalibusb4java${libusb4java.version}
- osx-x86
+ linux-armhforg.usb4javalibusb4java${libusb4java.version}
- osx-x86_64
+ linux-arm64org.apache.commonscommons-lang3
- 3.4
+ 3.8.1
diff --git a/src/main/java/org/usb4java/Loader.java b/src/main/java/org/usb4java/Loader.java
index 4506ff9..7cf85d5 100644
--- a/src/main/java/org/usb4java/Loader.java
+++ b/src/main/java/org/usb4java/Loader.java
@@ -23,7 +23,7 @@ public final class Loader
private static final int BUFFER_SIZE = 8192;
/** Constant for OS X operating system. */
- private static final String OS_OSX = "osx";
+ private static final String OS_MACOS = "macos";
/** Constant for OS X operating system. */
private static final String OS_MACOSX = "macosx";
@@ -51,6 +51,18 @@ public final class Loader
/** Constant for amd64 architecture. */
private static final String ARCH_AMD64 = "amd64";
+
+ /** Constant for armhf architecture. */
+ private static final String ARCH_ARMHF = "armhf";
+
+ /** Constant for aarch64 architecture. */
+ private static final String ARCH_AARCH64 = "aarch64";
+
+ /** Constant for arm architecture. */
+ private static final String ARCH_ARM = "arm";
+
+ /** Constant for arm64 architecture. */
+ private static final String ARCH_ARM64 = "arm64";
/** Constant for so file extension. */
private static final String EXT_SO = "so";
@@ -77,7 +89,7 @@ private Loader()
/**
* Returns the operating system name. This could be "linux", "windows" or
- * "osx" or (for any other non-supported platform) the value of the
+ * "macos" or (for any other non-supported platform) the value of the
* "os.name" property converted to lower case and with removed space
* characters.
*
@@ -93,7 +105,7 @@ private static String getOS()
}
if (os.equals(OS_MACOSX))
{
- return OS_OSX;
+ return OS_MACOS;
}
return os;
}
@@ -118,6 +130,14 @@ private static String getArch()
{
return ARCH_X86_64;
}
+ if (arch.equals(ARCH_AARCH64))
+ {
+ return ARCH_ARM64;
+ }
+ if (arch.equals(ARCH_ARM))
+ {
+ return ARCH_ARMHF;
+ }
return arch;
}
@@ -143,7 +163,7 @@ private static String getExt()
{
return EXT_DLL;
}
- if (os.equals(OS_OSX))
+ if (os.equals(OS_MACOS))
{
return EXT_DYLIB;
}
From b2b95dae3989d27d92f46ae5d098fd79530c4130 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 7 Oct 2018 11:04:12 +0200
Subject: [PATCH 03/37] Fix site generation
---
pom.xml | 12 +++++++-----
src/changes/changes.xml | 11 +++++++++++
src/site/site.xml | 4 ++--
src/site/xdoc/index.xml.vm | 2 +-
4 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/pom.xml b/pom.xml
index 5ae2ff5..8b1d7dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -103,12 +103,11 @@
summary
- project-team
- mailing-list
- issue-tracking
+ team
+ mailing-lists
+ issue-managementscm
- cim
- license
+ licensesdependenciespluginsplugin-management
@@ -120,6 +119,9 @@
org.apache.maven.pluginsmaven-changes-plugin2.12.1
+
+ team.html
+
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b5f865f..9b1a1c2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -8,6 +8,17 @@
Klaus Reimer
+
+
+ Updated to libusb 1.0.22.
+
+
+ Dropped support for 32 bit macOS because XCode no longer supports it.
+
+
+ Added support for 64 bit ARM platform.
+
+
Split project into usb4java (Main library), usb4java-javax
diff --git a/src/site/site.xml b/src/site/site.xml
index 893a967..85b2e71 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -12,12 +12,12 @@
org.apache.maven.skinsmaven-fluido-skin
- 1.3.0
+ 1.7
-
+ ]]>
diff --git a/src/site/xdoc/index.xml.vm b/src/site/xdoc/index.xml.vm
index 9891d14..090da5c 100644
--- a/src/site/xdoc/index.xml.vm
+++ b/src/site/xdoc/index.xml.vm
@@ -76,7 +76,7 @@
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
-
+
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
From 15055c7c0e0589391c72f9397fcd49ee15f39335 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 7 Oct 2018 11:24:52 +0200
Subject: [PATCH 04/37] Fix warning in assembly
---
src/main/assembly/tarball.xml | 4 ++--
src/main/assembly/zip.xml | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/main/assembly/tarball.xml b/src/main/assembly/tarball.xml
index a37a02d..9b1d4b9 100644
--- a/src/main/assembly/tarball.xml
+++ b/src/main/assembly/tarball.xml
@@ -9,7 +9,7 @@
- /
+ LICENSE.md
@@ -18,7 +18,7 @@
src/main/assembly
- /
+ README.txtAUTHORS.txt
diff --git a/src/main/assembly/zip.xml b/src/main/assembly/zip.xml
index 7d043c1..5f37b66 100644
--- a/src/main/assembly/zip.xml
+++ b/src/main/assembly/zip.xml
@@ -9,7 +9,7 @@
- /
+ LICENSE.md
@@ -18,7 +18,7 @@
src/main/assembly
- /
+ README.txtAUTHORS.txt
From 996f4ba7fca2b068127052e3775e370926b50485 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 7 Oct 2018 11:59:42 +0200
Subject: [PATCH 05/37] Get rid of pluginManagement section
---
pom.xml | 66 +++++++++++++++++++++++++++------------------------------
1 file changed, 31 insertions(+), 35 deletions(-)
diff --git a/pom.xml b/pom.xml
index 8b1d7dc..0453028 100644
--- a/pom.xml
+++ b/pom.xml
@@ -146,36 +146,6 @@
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.22.0
-
-
- org.apache.maven.plugins
- maven-clean-plugin
- 3.1.0
-
-
- org.apache.maven.plugins
- maven-deploy-plugin
- 3.0.0-M1
-
-
- org.apache.maven.plugins
- maven-install-plugin
- 3.0.0-M1
-
-
- org.apache.maven.plugins
- maven-resources-plugin
- 3.1.0
-
-
-
-
@@ -203,11 +173,6 @@
-
- org.apache.maven.plugins
- maven-jar-plugin
- 3.1.0
-
@@ -231,6 +196,37 @@
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.22.0
+
+
+ org.apache.maven.plugins
+ maven-clean-plugin
+ 3.1.0
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 3.0.0-M1
+
+
+ org.apache.maven.plugins
+ maven-install-plugin
+ 3.0.0-M1
+
+
+ org.apache.maven.plugins
+ maven-resources-plugin
+ 3.1.0
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.1.0
+
From ee67671559ff4841e0e6537d251a1427a852cc56 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 19:54:58 +0200
Subject: [PATCH 06/37] Fix logic bug preventing many unit tests to run on test
systems
---
src/test/java/org/usb4java/LibUsbDeviceTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/org/usb4java/LibUsbDeviceTest.java b/src/test/java/org/usb4java/LibUsbDeviceTest.java
index 0fa9e6e..5b6a402 100644
--- a/src/test/java/org/usb4java/LibUsbDeviceTest.java
+++ b/src/test/java/org/usb4java/LibUsbDeviceTest.java
@@ -120,7 +120,7 @@ private Device findTestDevice()
{
final InterfaceDescriptor ifaceDescriptor = iface
.altsetting()[k];
- if (ifaceDescriptor.bNumEndpoints() > 1)
+ if (ifaceDescriptor.bNumEndpoints() > 0)
{
this.endpoint = ifaceDescriptor.endpoint()[0]
.bEndpointAddress();
From 0172799fcb43d737f890e5299d4a1dfad469ae17 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 20:06:38 +0200
Subject: [PATCH 07/37] 0 port numbers is also ok
---
src/test/java/org/usb4java/LibUsbDeviceTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/org/usb4java/LibUsbDeviceTest.java b/src/test/java/org/usb4java/LibUsbDeviceTest.java
index 5b6a402..0bdb523 100644
--- a/src/test/java/org/usb4java/LibUsbDeviceTest.java
+++ b/src/test/java/org/usb4java/LibUsbDeviceTest.java
@@ -193,7 +193,7 @@ public void testGetPortNumbers()
assumeNotNull(this.device);
final ByteBuffer path = BufferUtils.allocateByteBuffer(8);
final int result = LibUsb.getPortNumbers(this.device, path);
- assertTrue(result > 0);
+ assertTrue(result >= 0);
assertTrue(result <= path.capacity());
}
From a68a6f33c3ec48c271636e785726e6621c9ba806 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 20:59:42 +0200
Subject: [PATCH 08/37] Implement setOption
---
src/changes/changes.xml | 37 +++++----
src/main/java/org/usb4java/LibUsb.java | 92 ++++++++++++++++++++--
src/test/java/org/usb4java/LibUsbTest.java | 47 ++++++++++-
3 files changed, 152 insertions(+), 24 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 9b1a1c2..e24d8e1 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -1,14 +1,17 @@
-ChangelogKlaus Reimer
-
+
+
+ Wrap new libusb functions: setOption.
+
Updated to libusb 1.0.22.
@@ -25,23 +28,23 @@
(javax-usb extension) and libusb4java (Native code).
- Add hotplug support to low-level API.
+ Add hotplug support to low-level API.
- Add asynchronous I/O support to low-level API.
+ Add asynchronous I/O support to low-level API.
- Using reunited libusb/libusbx 1.0.16 as backend.
+ Using reunited libusb/libusbx 1.0.16 as backend.
- Add new libusb constants: LOW_SPEED_OPERATION, FULL_SPEED_OPERATION,
+ Add new libusb constants: LOW_SPEED_OPERATION, FULL_SPEED_OPERATION,
HIGH_SPEED_OPERATION, SUPER_SPEED_OPERATION, BM_LPM_SUPPORT,
BM_LTM_SUPPORT, BT_WIRELESS_USB_DEVICE_CAPABILITY, BT_USB_2_0_EXTENSION,
BT_SS_USB_DEVICE_CAPABILITY, BT_CONTAINER_ID, CAP_HAS_HOTPLUG,
CAP_HAS_HID_ACCESS, CAP_SUPPORTS_DETACH_KERNEL_DRIVER, DT_BOS,
- DT_DEVICE_CAPABILITY, DT_SS_ENDPOINT_COMPANION
+ DT_DEVICE_CAPABILITY, DT_SS_ENDPOINT_COMPANION
Wrap new libusb methods: getPortNumbers, setAutoDetachKernelDriver,
@@ -62,26 +65,26 @@
- Rewritten library to use libusb 1.0 as backend.
+ Rewritten library to use libusb 1.0 as backend.
Made library loading more universal to support loading shared libraries
- for platforms not officially supported by usb4java.
+ for platforms not officially supported by usb4java.
- Add native library for linux-arm platform (Raspberry Pi).
+ Add native library for linux-arm platform (Raspberry Pi).
Native libraries are no longer extracted to a temporary directory when
they are not in a JAR file.
-
+
Improve error handling during native lib loading so javax-usb no
longer hides the important exceptions.
-
+
Fix logic error in AbstractIrpQueue#isBusy().
-
+
@@ -108,7 +111,7 @@
- Fixed library paths in dylibs so they can be placed in
+ Fixed library paths in dylibs so they can be placed in
*.app/Contents/MacOS.
@@ -141,7 +144,7 @@
libusb reports broken bus root devices when detaching USB devices
and when user has no root permissions on linux. Fixed it by
- only trusting root devices which are also in the device list of a bus.
+ only trusting root devices which are also in the device list of a bus.
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index 3d8dbd1..cf236b8 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -59,6 +59,44 @@ public final class LibUsb
*/
public static final int LOG_LEVEL_DEBUG = 4;
+
+ // Available option values for {@link #setOption()}
+
+ /**
+ * Set the log message verbosity.
+ *
+ * The default level is {@link #LOG_LEVEL_NONE}, which means no messages are ever
+ * printed. If you choose to increase the message verbosity level, ensure
+ * that your application does not close the stderr file descriptor.
+ *
+ * You are advised to use level {@link #LOG_LEVEL_WARNING}. libusb is conservative
+ * with its message logging and most of the time, will only log messages that
+ * explain error conditions and other oddities. This will help you debug
+ * your software.
+ *
+ * If the LIBUSB_DEBUG environment variable was set when libusb was
+ * initialized, this function does nothing: the message verbosity is fixed
+ * to the value in the environment variable.
+ *
+ * If libusb was compiled without any message logging, this function does
+ * nothing: you'll never get any messages.
+ *
+ * If libusb was compiled with verbose debug message logging, this function
+ * does nothing: you'll always get messages from all levels.
+ */
+ public static final int OPTION_LOG_LEVEL = 0;
+
+ /**
+ * Use the UsbDk backend for a specific context, if available.
+ *
+ * This option should be set immediately after calling {@link #init()}, otherwise
+ * unspecified behavior may occur.
+ *
+ * Only valid on Windows.
+ */
+ public static final int OPTION_USE_USBDK = 1;
+
+
// Error codes. Most libusb functions return 0 on success or one of these
// codes on failure. You can call errorName() to retrieve a string
// representation of an error code.
@@ -720,9 +758,53 @@ private LibUsb()
* context.
* @param level
* The log level to set.
+ *
+ * @deprecated Use {@link #setOption()} instead using the {@link #OPTION_LOG_LEVEL} option.
*/
public static native void setDebug(final Context context, final int level);
+ /**
+ * Set an option in the library.
+ *
+ * Use this function to configure a specific option within the library.
+ *
+ * Some options require one or more arguments to be provided. Consult each option's documentation for specific
+ * requirements.
+ *
+ * Since libusb version 1.0.22, LIBUSB_API_VERSION >= 0x01000106
+ *
+ * @param context
+ * The {@link Context} on which to operate.
+ * @param option
+ * Which option to set.
+ * @return {@link #SUCCESS} on success, {@link #ERROR_INVALID_PARAM} if the option or arguments are invalid,
+ * {@link #ERROR_NOT_SUPPORTED} if the option is valid but not supported on this platform.
+ */
+ public static int setOption(final Context context, final int option) {
+ return setOption(context, option, 0);
+ }
+
+ /**
+ * Set an option in the library.
+ *
+ * Use this function to configure a specific option within the library.
+ *
+ * Some options require one or more arguments to be provided. Consult each option's documentation for specific
+ * requirements.
+ *
+ * Since libusb version 1.0.22, LIBUSB_API_VERSION >= 0x01000106
+ *
+ * @param context
+ * The {@link Context} on which to operate.
+ * @param option
+ * Which option to set.
+ * @param value
+ * Required argument for the specified option.
+ * @return {@link #SUCCESS} on success, {@link #ERROR_INVALID_PARAM} if the option or arguments are invalid,
+ * {@link #ERROR_NOT_SUPPORTED} if the option is valid but not supported on this platform.
+ */
+ public static native int setOption(final Context context, final int option, final int value);
+
/**
* Returns the version of the libusb runtime.
*
@@ -1462,7 +1544,7 @@ public static native int getStringDescriptorAscii(
* A simple wrapper around
* {@link #getStringDescriptorAscii(DeviceHandle, byte, StringBuffer)}.
* It simply returns the string (maximum length of 127) if possible. If not
- * possible (NULL handle or 0-index specified or error occured) then null is
+ * possible (NULL handle or 0-index specified or error occurred) then null is
* returned.
*
* This method is not part of libusb.
@@ -1810,7 +1892,7 @@ public static int getStringDescriptor(final DeviceHandle handle,
* A suitably-sized data buffer for either input or output
* (depending on direction bits within bmRequestType).
* @param timeout
- * Timeout (in millseconds) that this function should wait before
+ * Timeout (in milliseconds) that this function should wait before
* giving up due to no response being received. For an unlimited
* timeout, use value 0.
* @return on success the number of bytes actually transferred,
@@ -1854,7 +1936,7 @@ public static native int controlTransfer(final DeviceHandle handle,
* @param transferred
* Output location for the number of bytes actually transferred.
* @param timeout
- * timeout (in millseconds) that this function should wait before
+ * timeout (in milliseconds) that this function should wait before
* giving up due to no response being received. For an unlimited
* timeout, use value 0.
* @return 0 on success (and populates transferred), {@link #ERROR_TIMEOUT}
@@ -1901,7 +1983,7 @@ public static native int bulkTransfer(final DeviceHandle handle,
* @param transferred
* Output location for the number of bytes actually transferred.
* @param timeout
- * Timeout (in millseconds) that this function should wait before
+ * Timeout (in milliseconds) that this function should wait before
* giving up due to no response being received. For an unlimited
* timeout, use value 0.
* @return 0 on success (and populates transferred), {@link #ERROR_TIMEOUT}
@@ -2018,7 +2100,7 @@ public static native int interruptTransfer(final DeviceHandle handle,
*
* You only need to use this lock if you are developing an application which
* calls poll() or select() on libusb's file descriptors directly, and may
- * potentially be handling events from 2 threads simultaenously. If you
+ * potentially be handling events from 2 threads simultaneously. If you
* stick to libusb's event handling loop functions (e.g.
* {@link #handleEvents(Context)}) then you do not need to be concerned with
* this locking.
diff --git a/src/test/java/org/usb4java/LibUsbTest.java b/src/test/java/org/usb4java/LibUsbTest.java
index 34cd154..90fd453 100644
--- a/src/test/java/org/usb4java/LibUsbTest.java
+++ b/src/test/java/org/usb4java/LibUsbTest.java
@@ -192,6 +192,37 @@ public void testGetApiVersion()
assertTrue(LibUsb.getApiVersion() >= 0x1000102);
}
+ /**
+ * Tests the {@link LibUsb#setOption(Context, int, int)} method with valid options and values.
+ */
+ @Test
+ public void testSetOption()
+ {
+ assumeUsbTestsEnabled();
+ final Context context = new Context();
+ assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_NONE));
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_DEBUG));
+ if (System.getProperty("os.name").toLowerCase().contains("windows")) {
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK));
+ } else {
+ assertEquals(LibUsb.ERROR_NOT_SUPPORTED, LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK));
+ }
+ }
+
+ /**
+ * Tests the {@link LibUsb#setOption(Context, int, int)} method with invalid options and values.
+ */
+ @Test
+ public void testSetOptionWithInvalidParameters()
+ {
+ assumeUsbTestsEnabled();
+ final Context context = new Context();
+ assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
+ assertEquals(LibUsb.ERROR_INVALID_PARAM, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, 234));
+ assertEquals(LibUsb.ERROR_INVALID_PARAM, LibUsb.setOption(context, 123));
+ }
+
/**
* Tests the initialization and deinitialization of libusb with default
* context.
@@ -254,6 +285,7 @@ public void testExitWithUninitializedContext()
* context
*/
@Test(expected = IllegalStateException.class)
+ @Deprecated
public void testSetDebugWithUninitializedContext()
{
assumeUsbTestsEnabled();
@@ -262,8 +294,19 @@ public void testSetDebugWithUninitializedContext()
}
/**
- * Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method with
- * uninitialized USB context.
+ * Tests {@link LibUsb#setOption(Context, int, int)} method with uninitialized USB context.
+ */
+ @Test(expected = IllegalStateException.class)
+ @Deprecated
+ public void testSetOptionWithUninitializedContext()
+ {
+ assumeUsbTestsEnabled();
+ final Context context = new Context();
+ LibUsb.setOption(context, 0);
+ }
+
+ /**
+ * Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method with uninitialized USB context.
*/
@Test(expected = IllegalStateException.class)
public void testGetDeviceListWithUninitializedContext()
From b0ef2ea31366754d40c013b2182b00c08bbf06b3 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 20:59:53 +0200
Subject: [PATCH 09/37] Fix typos
---
.gitignore | 1 +
src/main/assembly/README.txt | 2 +-
.../java/org/usb4java/DescriptorUtils.java | 9 ++--
.../java/org/usb4java/DeviceDescriptor.java | 46 +++++++++----------
.../SsEndpointCompanionDescriptor.java | 4 +-
.../org/usb4java/DeviceListIteratorTest.java | 2 +-
.../java/org/usb4java/DeviceListTest.java | 6 +--
.../java/org/usb4java/LibUsbDeviceTest.java | 4 +-
.../java/org/usb4java/LibUsbGlobalTest.java | 3 +-
.../java/org/usb4java/LibUsbHotplugTest.java | 6 +--
src/test/java/org/usb4java/TransferTest.java | 2 +-
.../java/org/usb4java/test/UsbAssume.java | 12 ++---
12 files changed, 49 insertions(+), 48 deletions(-)
diff --git a/.gitignore b/.gitignore
index 5a3ecc8..351afa7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,6 @@ target
.classpath
.project
.idea
+.vscode
*.iml
hs_err_*.log
diff --git a/src/main/assembly/README.txt b/src/main/assembly/README.txt
index 62f3f9b..e6b9c1c 100644
--- a/src/main/assembly/README.txt
+++ b/src/main/assembly/README.txt
@@ -11,6 +11,6 @@ libusb4java-*.jar (The native libraries for the various platforms)
commons-lang3-*.jar (Apache Commons Lang library needed by usb4java)
If you don't want usb4java to extract the native libraries into a temporary
-directoy on each program start then you might want to distribute them in
+directory on each program start then you might want to distribute them in
extracted form with your application. Just make sure your classpath points
to the directory where you extracted the JARs.
diff --git a/src/main/java/org/usb4java/DescriptorUtils.java b/src/main/java/org/usb4java/DescriptorUtils.java
index a30d1b6..75f281f 100644
--- a/src/main/java/org/usb4java/DescriptorUtils.java
+++ b/src/main/java/org/usb4java/DescriptorUtils.java
@@ -17,7 +17,7 @@
public final class DescriptorUtils
{
/** Mapping from USB class id to USB class name. */
- private static final Map CLASS_NAMES =
+ private static final Map CLASS_NAMES =
new HashMap();
static
@@ -35,8 +35,7 @@ public final class DescriptorUtils
CLASS_NAMES.put(LibUsb.CLASS_SMART_CARD, "Smart Card");
CLASS_NAMES.put(LibUsb.CLASS_CONTENT_SECURITY, "Content Security");
CLASS_NAMES.put(LibUsb.CLASS_VIDEO, "Video");
- CLASS_NAMES.put(LibUsb.CLASS_PERSONAL_HEALTHCARE,
- "Personal Healthcare");
+ CLASS_NAMES.put(LibUsb.CLASS_PERSONAL_HEALTHCARE, "Personal Healthcare");
CLASS_NAMES.put(LibUsb.CLASS_DIAGNOSTIC_DEVICE, "Diagnostic Device");
CLASS_NAMES.put(LibUsb.CLASS_WIRELESS, "Wireless");
CLASS_NAMES.put(LibUsb.CLASS_APPLICATION, "Application");
@@ -137,7 +136,7 @@ public static String dump(final DeviceDescriptor descriptor)
* @param product
* The product string or null if unknown.
* @param serial
- * The serial number strsing or null if unknown.
+ * The serial number string or null if unknown.
* @return The descriptor dump.
*/
public static String dump(final DeviceDescriptor descriptor,
@@ -348,7 +347,7 @@ public static String getUsageTypeName(final byte bmAttributes)
return "Feedback";
case LibUsb.ISO_USAGE_TYPE_IMPLICIT:
return "Implicit Feedback Data";
- case 3:
+ case 3:
// b11 is considered "Reserved" according to USB 3.0 spec.
return "Reserved";
default:
diff --git a/src/main/java/org/usb4java/DeviceDescriptor.java b/src/main/java/org/usb4java/DeviceDescriptor.java
index a79244d..81804f4 100644
--- a/src/main/java/org/usb4java/DeviceDescriptor.java
+++ b/src/main/java/org/usb4java/DeviceDescriptor.java
@@ -59,11 +59,11 @@ public long getPointer()
{
return this.deviceDescriptorPointer;
}
-
+
/**
* Returns the Java byte buffer which contains the descriptor structure.
*
- * @return The descriptor structur buffer.
+ * @return The descriptor structure buffer.
*/
public ByteBuffer getBuffer()
{
@@ -72,15 +72,15 @@ public ByteBuffer getBuffer()
/**
* Returns the size of this descriptor (in bytes).
- *
- * @return The size of this descriptor (in bytes).
+ *
+ * @return The size of this descriptor (in bytes).
*/
public native byte bLength();
/**
* Returns the descriptor type. Will have value {@link LibUsb#DT_DEVICE}
- * in this context.
- *
+ * in this context.
+ *
* @return The descriptor type.
*/
public native byte bDescriptorType();
@@ -88,88 +88,88 @@ public ByteBuffer getBuffer()
/**
* Returns the USB specification release number in binary-coded decimal.
* A value of 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc.
- *
+ *
* @return The USB specification release number.
- */
+ */
public native short bcdUSB();
/**
* Returns the USB-IF class code for the device. See LibUSB.CLASS_*
* constants.
- *
+ *
* @return The USB-IF class code.
*/
public native byte bDeviceClass();
/**
- * Returns the USB-IF subclass code for the device, qualified by the
+ * Returns the USB-IF subclass code for the device, qualified by the
* bDeviceClass value.
- *
+ *
* @return The USB-IF subclass code.
- */
+ */
public native byte bDeviceSubClass();
/**
- * Returns the USB-IF protocol code for the device, qualified by the
+ * Returns the USB-IF protocol code for the device, qualified by the
* bDeviceClass and bDeviceSubClass values.
- *
+ *
* @return The USB-IF protocol code.
*/
public native byte bDeviceProtocol();
/**
* Returns the maximum packet size for endpoint 0.
- *
+ *
* @return The maximum packet site for endpoint 0.
*/
public native byte bMaxPacketSize0();
/**
* Returns the USB-IF vendor ID.
- *
+ *
* @return The vendor ID
*/
public native short idVendor();
/**
* Returns the USB-IF product ID.
- *
+ *
* @return The product ID.
*/
public native short idProduct();
/**
* Returns the device release number in binary-coded decimal.
- *
+ *
* @return The device release number.
*/
public native short bcdDevice();
/**
* Returns the index of the string descriptor describing manufacturer.
- *
+ *
* @return The manufacturer string descriptor index.
*/
public native byte iManufacturer();
/**
* Returns the index of the string descriptor describing product.
- *
+ *
* @return The product string descriptor index.
*/
public native byte iProduct();
/**
- * Returns the index of the string descriptor containing device serial
+ * Returns the index of the string descriptor containing device serial
* number.
- *
+ *
* @return The serial number string descriptor index.
*/
public native byte iSerialNumber();
/**
* Returns the number of possible configurations.
- *
+ *
* @return The number of possible configurations.
*/
public native byte bNumConfigurations();
diff --git a/src/main/java/org/usb4java/SsEndpointCompanionDescriptor.java b/src/main/java/org/usb4java/SsEndpointCompanionDescriptor.java
index 9a63d3a..2093463 100644
--- a/src/main/java/org/usb4java/SsEndpointCompanionDescriptor.java
+++ b/src/main/java/org/usb4java/SsEndpointCompanionDescriptor.java
@@ -36,7 +36,7 @@ public final class SsEndpointCompanionDescriptor
/**
* Constructs a new descriptor which can be passed to the
- * {@link LibUsb#getSsEndpointCompanionDescriptor(Context,
+ * {@link LibUsb#getSsEndpointCompanionDescriptor(Context,
* EndpointDescriptor, SsEndpointCompanionDescriptor)}
* method.
*/
@@ -144,7 +144,7 @@ public boolean equals(final Object obj)
return false;
}
- final SsEndpointCompanionDescriptor other =
+ final SsEndpointCompanionDescriptor other =
(SsEndpointCompanionDescriptor) obj;
return new EqualsBuilder()
diff --git a/src/test/java/org/usb4java/DeviceListIteratorTest.java b/src/test/java/org/usb4java/DeviceListIteratorTest.java
index dd16e17..212735a 100644
--- a/src/test/java/org/usb4java/DeviceListIteratorTest.java
+++ b/src/test/java/org/usb4java/DeviceListIteratorTest.java
@@ -82,7 +82,7 @@ public void testNext()
* a {@link NoSuchElementException} when accessing elements after the end
*/
@Test(expected = NoSuchElementException.class)
- public void testNextAfterend()
+ public void testNextAfterEnd()
{
assumeUsbTestsEnabled();
while (this.iterator.hasNext()) {
diff --git a/src/test/java/org/usb4java/DeviceListTest.java b/src/test/java/org/usb4java/DeviceListTest.java
index 090abdc..5a0bd1b 100644
--- a/src/test/java/org/usb4java/DeviceListTest.java
+++ b/src/test/java/org/usb4java/DeviceListTest.java
@@ -76,7 +76,7 @@ public void testEquals()
LibUsb.freeDeviceList(b, true);
}
}
-
+
/**
* Tests the {@link DeviceList#hashCode()} method.
*/
@@ -95,7 +95,7 @@ public void testHashCode()
LibUsb.freeDeviceList(list, true);
}
}
-
+
/**
* Tests the {@link DeviceList#toString()} method
*/
@@ -115,7 +115,7 @@ public void testToString()
LibUsb.freeDeviceList(list, true);
}
}
-
+
/**
* Tests the {@link DeviceList#getPointer()} method
*/
diff --git a/src/test/java/org/usb4java/LibUsbDeviceTest.java b/src/test/java/org/usb4java/LibUsbDeviceTest.java
index 0bdb523..abd7d29 100644
--- a/src/test/java/org/usb4java/LibUsbDeviceTest.java
+++ b/src/test/java/org/usb4java/LibUsbDeviceTest.java
@@ -38,7 +38,7 @@
*/
public class LibUsbDeviceTest
{
- /** The libusb contxet. */
+ /** The libusb context. */
private Context context;
/** The device to run the tests on. */
@@ -785,7 +785,7 @@ private void validateInterfaceDescriptor(final InterfaceDescriptor desc)
}
/**
- * Validates the specified endpoint desriptor.
+ * Validates the specified endpoint descriptor.
*
* @param desc
* The endpoint descriptor to validate.
diff --git a/src/test/java/org/usb4java/LibUsbGlobalTest.java b/src/test/java/org/usb4java/LibUsbGlobalTest.java
index 84c8ecd..10c74fd 100644
--- a/src/test/java/org/usb4java/LibUsbGlobalTest.java
+++ b/src/test/java/org/usb4java/LibUsbGlobalTest.java
@@ -27,7 +27,7 @@
*/
public class LibUsbGlobalTest
{
- /** The libusb contxet. */
+ /** The libusb context. */
private Context context;
/**
@@ -63,6 +63,7 @@ public void tearDown()
* Tests the {@link LibUsb#setDebug(Context, int)} method.
*/
@Test
+ @Deprecated
public void testSetDebug()
{
assumeUsbTestsEnabled();
diff --git a/src/test/java/org/usb4java/LibUsbHotplugTest.java b/src/test/java/org/usb4java/LibUsbHotplugTest.java
index 1eaadfc..dafa218 100644
--- a/src/test/java/org/usb4java/LibUsbHotplugTest.java
+++ b/src/test/java/org/usb4java/LibUsbHotplugTest.java
@@ -18,12 +18,12 @@
/**
* Tests the hotplug part of the {@link LibUsb} class.
- *
+ *
* @author Klaus Reimer (k@ailis.de)
*/
public class LibUsbHotplugTest
{
- /** The libusb contxet. */
+ /** The libusb context. */
private Context context;
/**
@@ -95,7 +95,7 @@ public int processEvent(Context context, Device device,
}
/**
- * Ensures that no hotplug event is fired when enumeration is deactived.
+ * Ensures that no hotplug event is fired when enumeration is deactivated.
* When no devices are connected then this test is pretty much useless but
* won't fail because of that.
*/
diff --git a/src/test/java/org/usb4java/TransferTest.java b/src/test/java/org/usb4java/TransferTest.java
index facb0e8..c2d852e 100644
--- a/src/test/java/org/usb4java/TransferTest.java
+++ b/src/test/java/org/usb4java/TransferTest.java
@@ -30,7 +30,7 @@
*/
public class TransferTest
{
- /** The libusb contxet. */
+ /** The libusb context. */
private Context context;
/**
diff --git a/src/test/java/org/usb4java/test/UsbAssume.java b/src/test/java/org/usb4java/test/UsbAssume.java
index 1b9f22f..7445ce8 100644
--- a/src/test/java/org/usb4java/test/UsbAssume.java
+++ b/src/test/java/org/usb4java/test/UsbAssume.java
@@ -15,7 +15,7 @@
/**
* USB-related assumptions.
- *
+ *
* @author Klaus Reimer (k@ailis.de)
*/
public class UsbAssume
@@ -25,16 +25,16 @@ public class UsbAssume
/** If TCK tests are to be executed. */
private static Boolean tckTests;
-
+
/**
* Check if USB tests are enabled.
- *
+ *
* USB tests can be controlled with the system property USB_TESTS. When
* set to true then USB tests are always run, if set to false then they
* are never run. If this property is not set then the command-line tool
* lsusb is called. If this tool returned at least two lines of text then
* USB tests are enabled. In all other cases they are disabled.
- *
+ *
* @return True if USB tests are enabled, false if not.
*/
public static boolean isUsbTestsEnabled()
@@ -86,7 +86,7 @@ public static boolean isUsbTestsEnabled()
* Assume that USB tests are enabled. Call this in the first line of
* tests method or preparation methods when you want to ignore the
* tests when the system is not able to run the tests anyway.
- *
+ *
* USB tests can be controlled with the system property USB_TESTS. When
* set to true then USB tests are always run, if set to false then they
* are never run. If this property is not set then the command-line tool
@@ -117,7 +117,7 @@ public static void assumeHotplugAvailable()
* Assume that TCK tests are enabled. Call this in the first line of
* tests method or preparation methods when you want to ignore the
* tests when the system is not able to run the TCK tests anyway.
- *
+ *
* TCK tests can be controlled with the system property TCK_TESTS. When
* set to true then TCK tests are always run, if set to false then they
* are never run. If this property is not set then the command-line tool
From 054abf6503b2867383fd97c44544fde705b310d7 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 21:05:18 +0200
Subject: [PATCH 10/37] Add missing SPEED_SUPER_PLUS constant
---
src/changes/changes.xml | 5 ++++-
src/main/java/org/usb4java/LibUsb.java | 4 ++++
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index e24d8e1..559be47 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -9,7 +9,10 @@
-
+
+ Add missing SPEED_SUPER_PLUS constant.
+
+
Wrap new libusb functions: setOption.
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index cf236b8..b231695 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -163,6 +163,10 @@ public final class LibUsb
/** The device is operating at super speed (5000MBit/s). */
public static final int SPEED_SUPER = 4;
+ /** The device is operating at super speed plus (10000MBit/s). */
+ public static final int SPEED_SUPER_PLUS = 5;
+
+
// Supported speeds (wSpeedSupported) bitfield. Indicates what speeds the
// device supports.
From f0d2b91b1e2f10dd8ef34b39ecf62f02309f3365 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 21:35:34 +0200
Subject: [PATCH 11/37] NOT FOUND error is also ok in unit test
---
src/test/java/org/usb4java/LibUsbTest.java | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/test/java/org/usb4java/LibUsbTest.java b/src/test/java/org/usb4java/LibUsbTest.java
index 90fd453..12e0103 100644
--- a/src/test/java/org/usb4java/LibUsbTest.java
+++ b/src/test/java/org/usb4java/LibUsbTest.java
@@ -201,13 +201,16 @@ public void testSetOption()
assumeUsbTestsEnabled();
final Context context = new Context();
assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
- assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_NONE));
- assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_DEBUG));
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
- assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK));
+ // On Windows this is either a success when USBDK is found or ERROR_NOT_FOUND when not
+ final int result = LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK);
+ assertTrue(result == LibUsb.SUCCESS || result == LibUsb.ERROR_NOT_FOUND);
} else {
+ // On other operating systems it is always ERROR_NOT_SUPPORTED
assertEquals(LibUsb.ERROR_NOT_SUPPORTED, LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK));
}
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_NONE));
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_DEBUG));
}
/**
From bddf0cde58d348b5853b1046375229c304026f47 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 22:31:15 +0200
Subject: [PATCH 12/37] Fix typo
---
src/test/java/org/usb4java/LibUsbDeviceTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/test/java/org/usb4java/LibUsbDeviceTest.java b/src/test/java/org/usb4java/LibUsbDeviceTest.java
index abd7d29..08611fa 100644
--- a/src/test/java/org/usb4java/LibUsbDeviceTest.java
+++ b/src/test/java/org/usb4java/LibUsbDeviceTest.java
@@ -436,7 +436,7 @@ public void testUnrefDeviceWithoutDevice()
* Tests the {@link LibUsb#open(Device, DeviceHandle)} method. This can't be
* really tested in a simple unit test like this. Most likely the user has
* no access to the device. So this test succeeds on SUCCESS and on
- * ERROR_ACCESS. At least we have to make sure then open() method doesn't
+ * ERROR_ACCESS. At least we have to make sure that the open() method doesn't
* crash.
*/
@Test
From 3c37af552fcc59251fdc33aa4e23a2c2997d5a29 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 22:31:54 +0200
Subject: [PATCH 13/37] Wrap new libusb functions: devMemAlloc and devMemFree
---
src/changes/changes.xml | 2 +-
src/main/java/org/usb4java/LibUsb.java | 41 +++++++++++++++++++++++++-
2 files changed, 41 insertions(+), 2 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 559be47..fa19243 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -13,7 +13,7 @@
Add missing SPEED_SUPER_PLUS constant.
- Wrap new libusb functions: setOption.
+ Wrap new libusb functions: setOption, devMemAlloc, devMemFree.
Updated to libusb 1.0.22.
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index b231695..762a99d 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -1082,7 +1082,7 @@ public static native DeviceHandle openDeviceWithVidPid(
*/
public static native void close(final DeviceHandle handle);
-/**
+ /**
* Get the underlying device for a handle.
*
* Please note that the reference count of the returned device is not
@@ -1319,6 +1319,45 @@ public static native int allocStreams(final DeviceHandle handle,
public static native int freeStreams(final DeviceHandle handle,
final byte[] endpoints);
+
+ /**
+ * Attempts to allocate a block of persistent DMA memory suitable for transfers against the given device.
+ *
+ * If successful, will return a block of memory that is suitable for use as "buffer" in {@link Transfer}
+ * against this device. Using this memory instead of regular memory means that the host controller can use DMA
+ * directly into the buffer to increase performance, and also that transfers can no longer fail due to kernel
+ * memory fragmentation.
+ *
+ * Note that this means you should not modify this memory (or even data on the same cache lines) when a transfer
+ * is in progress, although it is legal to have several transfers going on within the same memory block.
+ *
+ * Will return NULL on failure. Many systems do not support such zerocopy and will always return NULL. Memory
+ * allocated with this function must be freed with {@link #devMemFree()}. Specifically, this means that the flag
+ * {@link #TRANSFER_FREE_BUFFER} cannot be used to free memory allocated with this function.
+ *
+ * Since version 1.0.21, LIBUSB_API_VERSION >= 0x01000105
+ *
+ * @param handle
+ * A device handle.
+ * @param length
+ * Size of desired data buffer.
+ * @return The newly allocated memory, or NULL on failure.
+ */
+ public static native ByteBuffer devMemAlloc(final DeviceHandle handle, final int length);
+
+ /**
+ * Free device memory allocated with {@link #devMemAlloc()}.
+ *
+ * @param handle
+ * A device handle.
+ * @param buffer
+ * The previously allocated memory.
+ * @param size
+ * The size of the previously allocated memory.
+ * @return {@link #SUCCESS}, or a LIBUSB_ERROR code on failure.
+ */
+ public static native int devMemFree(final DeviceHandle handle, final ByteBuffer buffer, final int length);
+
/**
* Determine if a kernel driver is active on an interface.
*
From 7ab6e6d3ed0d621d26490507b5bc18b52ae330bb Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 22:44:01 +0200
Subject: [PATCH 14/37] Document ERROR_BUSY return value
---
src/main/java/org/usb4java/LibUsb.java | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index 8757f85..2df3077 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -1940,11 +1940,12 @@ public static int getStringDescriptor(final DeviceHandle handle,
* timeout, use value 0.
* @return on success the number of bytes actually transferred,
* {@link #ERROR_TIMEOUT} if the transfer timed out,
- * {@link #ERROR_PIPE} if the control request was not supported by
- * the device, {@link #ERROR_NO_DEVICE} if the device has been
- * disconnected, {@link LIBUSB_ERROR_INVALID_PARAM} if the transfer
- * size is larger than the operating system and/or hardware can
- * support. Another ERROR code on other failures
+ * {@link #ERROR_PIPE} if the control request was not supported by the device,
+ * {@link #ERROR_NO_DEVICE} if the device has been disconnected,
+ * {@link #ERROR_BUSY} if called from event handling context,
+ * {@link #ERROR_INVALID_PARAM} if the transfer size is larger than the operating system and/or
+ * hardware can support.
+ * Another ERROR code on other failures
*/
public static native int controlTransfer(final DeviceHandle handle,
final byte bmRequestType, final byte bRequest, final short wValue,
From b24618df0f0e0ab88ed855604d4c11c7d6ecd91a Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Mon, 8 Oct 2018 22:56:06 +0200
Subject: [PATCH 15/37] Implement interruptEventHandler
---
src/changes/changes.xml | 2 +-
src/main/java/org/usb4java/LibUsb.java | 13 ++++++++++++
src/test/java/org/usb4java/LibUsbTest.java | 23 ++++++++++++++++++++++
3 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index fa19243..493623d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -13,7 +13,7 @@
Add missing SPEED_SUPER_PLUS constant.
- Wrap new libusb functions: setOption, devMemAlloc, devMemFree.
+ Wrap new libusb functions: setOption, devMemAlloc, devMemFree, interruptEventHandler.
Updated to libusb 1.0.22.
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index 2df3077..c232569 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -2134,6 +2134,19 @@ public static native int interruptTransfer(final DeviceHandle handle,
*/
public static native int eventHandlerActive(final Context context);
+ /**
+ * Interrupt any active thread that is handling events.
+ *
+ * This is mainly useful for interrupting a dedicated event handling thread when an application wishes to call
+ * {@link #exit()}.
+ *
+ * Since version 1.0.21, LIBUSB_API_VERSION >= 0x01000105
+ *
+ * @param ctx
+ * The context to operate on, or NULL for the default context.
+ */
+ public static native void interruptEventHandler(final Context context);
+
/**
* Acquire the event waiters lock.
*
diff --git a/src/test/java/org/usb4java/LibUsbTest.java b/src/test/java/org/usb4java/LibUsbTest.java
index 12e0103..9dba00c 100644
--- a/src/test/java/org/usb4java/LibUsbTest.java
+++ b/src/test/java/org/usb4java/LibUsbTest.java
@@ -1098,6 +1098,17 @@ public void testEventHandlerActiveWithUninitializedContext()
LibUsb.eventHandlerActive(context);
}
+ /**
+ * Tests {@link LibUsb#interruptEventHandler(Context)} with uninitialized USB context.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testInterruptEventHandlerWithUninitializedContext()
+ {
+ assumeUsbTestsEnabled();
+ final Context context = new Context();
+ LibUsb.interruptEventHandler(context);
+ }
+
/**
* Tests {@link LibUsb#lockEventWaiters(Context)} with uninitialized USB
* context.
@@ -1297,4 +1308,16 @@ public void testPollFdNotifiers()
assertNull(listener.removedFd);
assertNull(listener.removedUserData);
}
+
+ /**
+ * Tests the {@link LibUsb#interruptEventHandler(Context)} method. Must not crash.
+ */
+ @Test
+ public void testInterruptEventHandler()
+ {
+ assumeUsbTestsEnabled();
+ final Context context = new Context();
+ assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
+ LibUsb.interruptEventHandler(context);
+ }
}
From b762fb3f016eec3801113fef5caf2bac5e220ae6 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Tue, 9 Oct 2018 00:14:26 +0200
Subject: [PATCH 16/37] Add more unit tests for GetDeviceList
---
src/test/java/org/usb4java/LibUsbTest.java | 51 ++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/src/test/java/org/usb4java/LibUsbTest.java b/src/test/java/org/usb4java/LibUsbTest.java
index 9dba00c..27fa5fc 100644
--- a/src/test/java/org/usb4java/LibUsbTest.java
+++ b/src/test/java/org/usb4java/LibUsbTest.java
@@ -308,6 +308,47 @@ public void testSetOptionWithUninitializedContext()
LibUsb.setOption(context, 0);
}
+ /**
+ * Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method.
+ */
+ @Test
+ public void testGetDeviceList()
+ {
+ assumeUsbTestsEnabled();
+ final Context context = new Context();
+ final DeviceList deviceList = new DeviceList();
+ LibUsb.init(context);
+ try
+ {
+ assertTrue(LibUsb.getDeviceList(context, deviceList) >= 0);
+ LibUsb.freeDeviceList(deviceList, true);
+ }
+ finally
+ {
+ LibUsb.exit(context);
+ }
+ }
+
+ /**
+ * Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method with the default context.
+ */
+ @Test
+ public void testGetDeviceListFromDefaultContext()
+ {
+ assumeUsbTestsEnabled();
+ final DeviceList deviceList = new DeviceList();
+ LibUsb.init(null);
+ try
+ {
+ assertTrue(LibUsb.getDeviceList(null, deviceList) >= 0);
+ LibUsb.freeDeviceList(deviceList, true);
+ }
+ finally
+ {
+ LibUsb.exit(null);
+ }
+ }
+
/**
* Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method with uninitialized USB context.
*/
@@ -319,6 +360,16 @@ public void testGetDeviceListWithUninitializedContext()
LibUsb.getDeviceList(context, new DeviceList());
}
+ /**
+ * Tests {@link LibUsb#getDeviceList(Context, DeviceList)} method with uninitialized default USB context.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testGetDeviceListWithUninitializedDefaultContext()
+ {
+ assumeUsbTestsEnabled();
+ LibUsb.getDeviceList(null, new DeviceList());
+ }
+
/**
* Tests {@link LibUsb#freeDeviceList(DeviceList, boolean)} method with
* uninitialized list.
From 0f092ba635dc4b836391127c14d8ea8b1232e4f5 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Tue, 9 Oct 2018 00:23:55 +0200
Subject: [PATCH 17/37] Remove broken build status
---
README.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/README.md b/README.md
index c76524f..5636524 100644
--- a/README.md
+++ b/README.md
@@ -21,5 +21,3 @@ and loaded so you don't need to care about them.
For more detailed information please visit the [usb4java website](http://usb4java.org/).
-[](https://ci.ailis.de/job/usb4java/)
-
From 2bd1cb8d9ef141314d75283140730345a3877789 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Wed, 10 Oct 2018 23:11:21 +0200
Subject: [PATCH 18/37] Use new os and arch names
---
pom.xml | 94 +++++++++++++-------------
src/main/java/org/usb4java/Loader.java | 87 +++++-------------------
2 files changed, 65 insertions(+), 116 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0453028..ecb357d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,7 @@
4.0.0
-
+
org.usb4javausb4javajar
@@ -16,7 +16,7 @@
usb4java Teamhttp://usb4java.org/
-
+
MIT
@@ -24,7 +24,7 @@
repo
-
+
Discussions
@@ -32,9 +32,9 @@
usb4java+unsubscribe@googlegroups.comusb4java@googlegroups.comhttp://groups.google.com/group/usb4java
-
-
-
+
+
+
kayahr
@@ -45,7 +45,7 @@
+1http://www.ailis.de/~k/
-
+
llongiLuca Longinotti
@@ -55,7 +55,7 @@
+1http://l.longi.li/
-
+
@@ -67,28 +67,28 @@
1.3.0-SNAPSHOT1.3.0-SNAPSHOT
-
+
scm:git:git://github.com/usb4java/${project.artifactId}.gitscm:git:ssh://git@github.com/usb4java/${project.artifactId}.githttp://github.com/usb4java/${project.artifactId}HEAD
-
+
GitHubhttps://github.com/usb4java/${project.artifactId}/issues
-
+
Jenkinshttps://ci.ailis.de/job/${project.artifactId}/
-
+
3.0.5
-
+
@@ -111,11 +111,11 @@
dependenciespluginsplugin-management
-
-
-
+
+
+
-
+ org.apache.maven.pluginsmaven-changes-plugin2.12.1
@@ -142,12 +142,12 @@
-
-
-
+
+
+
-
+
org.apache.maven.plugins
@@ -159,11 +159,11 @@
${project.build.sourceEncoding}
-
+
org.apache.maven.plugins
- maven-site-plugin
+ maven-site-plugin3.7.1false
@@ -172,10 +172,10 @@
${project.build.sourceEncoding}
-
+
-
+ maven-assembly-plugin3.1.0
@@ -194,7 +194,7 @@
single
-
+
@@ -224,12 +224,12 @@
org.apache.maven.plugins
- maven-jar-plugin
+ maven-jar-plugin3.1.0
-
-
+
+
-
+
ailis
@@ -284,7 +284,7 @@
sonatype-snapshotsSonatype Snapshot Repositoryhttps://oss.sonatype.org/content/repositories/snapshots
-
+
-->
ailis-releases
@@ -295,10 +295,10 @@
ailis-snapshotsAilis Maven Snapshotshttp://nexus.ailis.de/content/repositories/snapshots
-
+
-
+
junit
@@ -311,48 +311,48 @@
libusb4java${libusb4java.version}linux-x86
-
+
org.usb4javalibusb4java${libusb4java.version}
- linux-x86_64
-
+ linux-x86-64
+
org.usb4javalibusb4java${libusb4java.version}
- windows-x86
-
+ win32-x86
+
org.usb4javalibusb4java${libusb4java.version}
- windows-x86_64
-
+ win32-x86-64
+
org.usb4javalibusb4java${libusb4java.version}
- macos-x86_64
-
+ darwin-x86-64
+
org.usb4javalibusb4java${libusb4java.version}
- linux-armhf
-
+ linux-arm
+
org.usb4javalibusb4java${libusb4java.version}
- linux-arm64
-
+ linux-aarch64
+
org.apache.commonscommons-lang33.8.1
-
+
diff --git a/src/main/java/org/usb4java/Loader.java b/src/main/java/org/usb4java/Loader.java
index 7cf85d5..e6917d0 100644
--- a/src/main/java/org/usb4java/Loader.java
+++ b/src/main/java/org/usb4java/Loader.java
@@ -22,57 +22,6 @@ public final class Loader
/** Buffer size used for copying data. */
private static final int BUFFER_SIZE = 8192;
- /** Constant for OS X operating system. */
- private static final String OS_MACOS = "macos";
-
- /** Constant for OS X operating system. */
- private static final String OS_MACOSX = "macosx";
-
- /** Constant for Linux operating system. */
- private static final String OS_LINUX = "linux";
-
- /** Constant for Windows operating system. */
- private static final String OS_WINDOWS = "windows";
-
- /** Constant for FreeBSD operating system. */
- private static final String OS_FREEBSD = "freebsd";
-
- /** Constant for SunOS operating system. */
- private static final String OS_SUNOS = "sunos";
-
- /** Constant for i386 architecture. */
- private static final String ARCH_I386 = "i386";
-
- /** Constant for x86 architecture. */
- private static final String ARCH_X86 = "x86";
-
- /** Constant for x86_64 architecture. */
- private static final String ARCH_X86_64 = "x86_64";
-
- /** Constant for amd64 architecture. */
- private static final String ARCH_AMD64 = "amd64";
-
- /** Constant for armhf architecture. */
- private static final String ARCH_ARMHF = "armhf";
-
- /** Constant for aarch64 architecture. */
- private static final String ARCH_AARCH64 = "aarch64";
-
- /** Constant for arm architecture. */
- private static final String ARCH_ARM = "arm";
-
- /** Constant for arm64 architecture. */
- private static final String ARCH_ARM64 = "arm64";
-
- /** Constant for so file extension. */
- private static final String EXT_SO = "so";
-
- /** Constant for dll file extension. */
- private static final String EXT_DLL = "dll";
-
- /** Constant for dylib file extension. */
- private static final String EXT_DYLIB = "dylib";
-
/** The temporary directory for native libraries. */
private static File tmp;
@@ -99,13 +48,13 @@ private static String getOS()
{
final String os = System.getProperty("os.name").toLowerCase()
.replace(" ", "");
- if (os.contains(OS_WINDOWS))
+ if (os.contains("windows"))
{
- return OS_WINDOWS;
+ return "win32";
}
- if (os.equals(OS_MACOSX))
+ if (os.equals("macosx") || os.equals("macos"))
{
- return OS_MACOS;
+ return "darwin";
}
return os;
}
@@ -122,21 +71,21 @@ private static String getArch()
{
final String arch = System.getProperty("os.arch").toLowerCase()
.replace(" ", "");
- if (arch.equals(ARCH_I386))
+ if (arch.equals("i386"))
{
- return ARCH_X86;
+ return "x86";
}
- if (arch.equals(ARCH_AMD64))
+ if (arch.equals("amd64") || arch.equals("x86_64"))
{
- return ARCH_X86_64;
+ return "x86-64";
}
- if (arch.equals(ARCH_AARCH64))
+ if (arch.equals("arm64"))
{
- return ARCH_ARM64;
+ return "aarch64";
}
- if (arch.equals(ARCH_ARM))
+ if (arch.equals("armhf") || arch.equals("aarch32"))
{
- return ARCH_ARMHF;
+ return "arm";
}
return arch;
}
@@ -155,17 +104,17 @@ private static String getExt()
{
return ext;
}
- if (os.equals(OS_LINUX) || os.equals(OS_FREEBSD) || os.equals(OS_SUNOS))
+ if (os.equals("linux") || os.equals("freebsd") || os.equals("sunos"))
{
- return EXT_SO;
+ return "so";
}
- if (os.equals(OS_WINDOWS))
+ if (os.equals("win32"))
{
- return EXT_DLL;
+ return "dll";
}
- if (os.equals(OS_MACOS))
+ if (os.equals("darwin"))
{
- return EXT_DYLIB;
+ return "dylib";
}
throw new LoaderException("Unable to determine the shared library "
+ "file extension for operating system '" + os
From dfffd0521e7de6f2cc15c98ef5cdf7c6a0ff6854 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Wed, 10 Oct 2018 23:33:43 +0200
Subject: [PATCH 19/37] Map armv7l arch to arm binary
---
src/main/java/org/usb4java/Loader.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/main/java/org/usb4java/Loader.java b/src/main/java/org/usb4java/Loader.java
index e6917d0..3706e44 100644
--- a/src/main/java/org/usb4java/Loader.java
+++ b/src/main/java/org/usb4java/Loader.java
@@ -83,7 +83,7 @@ private static String getArch()
{
return "aarch64";
}
- if (arch.equals("armhf") || arch.equals("aarch32"))
+ if (arch.equals("armhf") || arch.equals("aarch32") || arch.equals("armv7l"))
{
return "arm";
}
From 7d65b24fd7aee6bd9516ff0e96d9c5906b0c6e62 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Thu, 11 Oct 2018 07:34:42 +0200
Subject: [PATCH 20/37] Add changelog entry
---
src/changes/changes.xml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 493623d..8ba74dd 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -9,6 +9,12 @@
+
+ Renamed os and architecture identifiers to the naming conventions of
+ the JNA project. So the platforms are now named: linux-x86,
+ linux-x86-64, linux-arm, linux-aarch64, darwin-x86-64, win32-x86 and
+ win32-x86-64.
+
Add missing SPEED_SUPER_PLUS constant.
From bbd9390f47bfbd76ede242b529a3aecd55794e44 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Fri, 12 Oct 2018 08:43:29 +0200
Subject: [PATCH 21/37] Implement getPollfds and freePollfds
---
src/changes/changes.xml | 2 +-
src/main/java/org/usb4java/LibUsb.java | 33 ++++--
src/main/java/org/usb4java/Pollfd.java | 111 ++++++++++++++++++
src/main/java/org/usb4java/Pollfds.java | 102 ++++++++++++++++
.../java/org/usb4java/PollfdsIterator.java | 53 +++++++++
.../java/org/usb4java/LibUsbDeviceTest.java | 99 ++++++++++++++++
6 files changed, 391 insertions(+), 9 deletions(-)
create mode 100644 src/main/java/org/usb4java/Pollfd.java
create mode 100644 src/main/java/org/usb4java/Pollfds.java
create mode 100644 src/main/java/org/usb4java/PollfdsIterator.java
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 8ba74dd..de229a9 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -19,7 +19,7 @@
Add missing SPEED_SUPER_PLUS constant.
- Wrap new libusb functions: setOption, devMemAlloc, devMemFree, interruptEventHandler.
+ Wrap new libusb functions: setOption, devMemAlloc, devMemFree, interruptEventHandler, getPollfds, freePollfds.
Updated to libusb 1.0.22.
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index c232569..b1ba7a3 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -775,8 +775,6 @@ private LibUsb()
* Some options require one or more arguments to be provided. Consult each option's documentation for specific
* requirements.
*
- * Since libusb version 1.0.22, LIBUSB_API_VERSION >= 0x01000106
- *
* @param context
* The {@link Context} on which to operate.
* @param option
@@ -796,8 +794,6 @@ public static int setOption(final Context context, final int option) {
* Some options require one or more arguments to be provided. Consult each option's documentation for specific
* requirements.
*
- * Since libusb version 1.0.22, LIBUSB_API_VERSION >= 0x01000106
- *
* @param context
* The {@link Context} on which to operate.
* @param option
@@ -1335,8 +1331,6 @@ public static native int freeStreams(final DeviceHandle handle,
* allocated with this function must be freed with {@link #devMemFree()}. Specifically, this means that the flag
* {@link #TRANSFER_FREE_BUFFER} cannot be used to free memory allocated with this function.
*
- * Since version 1.0.21, LIBUSB_API_VERSION >= 0x01000105
- *
* @param handle
* A device handle.
* @param length
@@ -2140,8 +2134,6 @@ public static native int interruptTransfer(final DeviceHandle handle,
* This is mainly useful for interrupting a dedicated event handling thread when an application wishes to call
* {@link #exit()}.
*
- * Since version 1.0.21, LIBUSB_API_VERSION >= 0x01000105
- *
* @param ctx
* The context to operate on, or NULL for the default context.
*/
@@ -2516,6 +2508,31 @@ static native void setPollfdNotifiersNative(final Context context,
*/
static native void unsetPollfdNotifiersNative(final Context context);
+ /**
+ * Retrieve a list of file descriptors that should be polled by your main loop as libusb event sources.
+ *
+ * The returned list should be freed with {@link #freePollfds()} when done. The actual list contents must not be
+ * touched.
+ *
+ * As file descriptors are a Unix-specific concept, this function is not available on Windows and will always
+ * return NULL.
+ *
+ * @param context
+ * The context to operate on, or NULL for the default context.
+ * @return A list of libusb_pollfd structures, NULL on error, NULL on platforms where the functionality is not
+ * available.
+ */
+ public static native Pollfds getPollfds(final Context context);
+
+ /**
+ * Free a list of {@link Pollfd} structures.
+ *
+ * This should be called for all pollfd lists allocated with {@link #getPollfds()}.
+ *
+ * It is legal to call this function with a NULL pollfd list. In this case, the function will simply return safely.
+ */
+ public static native void freePollfds(final Pollfds pollfds);
+
/**
* Allocate a libusb transfer without support for isochronous transfers.
*
diff --git a/src/main/java/org/usb4java/Pollfd.java b/src/main/java/org/usb4java/Pollfd.java
new file mode 100644
index 0000000..38dd6e1
--- /dev/null
+++ b/src/main/java/org/usb4java/Pollfd.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2018 Klaus Reimer
+ * See LICENSE.md for licensing information.
+ *
+ * Based on libusb :
+ *
+ * Copyright 2001 Johannes Erdfelt
+ * Copyright 2007-2009 Daniel Drake
+ * Copyright 2010-2012 Peter Stuge
+ * Copyright 2008-2013 Nathan Hjelm
+ * Copyright 2009-2013 Pete Batard
+ * Copyright 2009-2013 Ludovic Rousseau
+ * Copyright 2010-2012 Michael Plante
+ * Copyright 2011-2013 Hans de Goede
+ * Copyright 2012-2013 Martin Pieuchot
+ * Copyright 2012-2013 Toby Gray
+ */
+
+package org.usb4java;
+
+/**
+ * File descriptor for polling.
+ *
+ * @author Klaus Reimer (k@ailis.de)
+ */
+public final class Pollfd
+{
+ /** There is data to read */
+ public static final int POLLIN = 1;
+
+ /** Writing now will not block. */
+ public static final int POLLOUT = 4;
+
+ /** The native pointer to the pollfd structure. */
+ private long pollfdPointer;
+
+ /**
+ * Package-private constructor to prevent manual instantiation. Structures are
+ * always created by JNI.
+ */
+ Pollfd()
+ {
+ // Empty
+ }
+
+ /**
+ * Returns the native pointer to the pollfd structure.
+ *
+ * @return The native pointer to the pollfd structure.
+ */
+ public long getPointer()
+ {
+ return this.pollfdPointer;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = (prime * result)
+ + (int) (this.pollfdPointer ^ (this.pollfdPointer >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (this.getClass() != obj.getClass())
+ {
+ return false;
+ }
+ final Pollfd other = (Pollfd) obj;
+ if (this.pollfdPointer != other.pollfdPointer)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.format("libusb pollfd 0x%x", this.pollfdPointer);
+ }
+
+ /**
+ * Returns the numeric file descriptor.
+ *
+ * @return The numeric file descriptor.
+ */
+ public native byte fd();
+
+ /**
+ * Returns the event flags to poll.
+ *
+ * {@link #POLLIN} indicates that you should monitor this file descriptor for becoming ready to read from, and
+ * {@link #POLLOUT} indicates that you should monitor this file descriptor for non-blocking write readiness.
+ *
+ * @return The event flags to poll.
+ */
+ public native short events();
+}
diff --git a/src/main/java/org/usb4java/Pollfds.java b/src/main/java/org/usb4java/Pollfds.java
new file mode 100644
index 0000000..bb1906d
--- /dev/null
+++ b/src/main/java/org/usb4java/Pollfds.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2018 Klaus Reimer
+ * See LICENSE.md for licensing information.
+ */
+
+package org.usb4java;
+
+import java.util.Iterator;
+
+/**
+ * List of poll file descriptors as returned by {@link LibUsb#getPollfds(Context)}.
+ *
+ * @author Klaus Reimer (k@ailis.de)
+ */
+public final class Pollfds implements Iterable
+{
+ /** The native pointer to the pollfd array. */
+ private long pollfdsPointer;
+
+ /** The number of file descriptors in the list. */
+ private int size;
+
+ /**
+ * Package-private constructor to prevent manual instantiation. Structures are
+ * always created by JNI.
+ */
+ Pollfds()
+ {
+ // Empty
+ }
+
+ /**
+ * Returns the native pointer.
+ *
+ * @return The native pointer.
+ */
+ public long getPointer()
+ {
+ return this.pollfdsPointer;
+ }
+
+ /**
+ * Returns the number of poll file descriptors in the list.
+ *
+ * @return The number of poll file descriptors in the list.
+ */
+ public int getSize()
+ {
+ return this.size;
+ }
+
+ /**
+ * Returns the poll file descriptor with the specified index.
+ *
+ * @param index
+ * The index.
+ * @return The poll file descriptor or null when index is out of bounds.
+ */
+ public native Pollfd get(final int index);
+
+ @Override
+ public Iterator iterator()
+ {
+ return new PollfdsIterator(this);
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = (prime * result)
+ + (int) (this.pollfdsPointer ^ (this.pollfdsPointer >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (this.getClass() != obj.getClass())
+ {
+ return false;
+ }
+ final Pollfds other = (Pollfds) obj;
+ return this.pollfdsPointer == other.pollfdsPointer;
+ }
+
+ @Override
+ public String toString()
+ {
+ return String.format("libusb pollfd list 0x%x with size %d",
+ this.pollfdsPointer, this.size);
+ }
+}
diff --git a/src/main/java/org/usb4java/PollfdsIterator.java b/src/main/java/org/usb4java/PollfdsIterator.java
new file mode 100644
index 0000000..41a7755
--- /dev/null
+++ b/src/main/java/org/usb4java/PollfdsIterator.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 Klaus Reimer
+ * See LICENSE.md for licensing information.
+ */
+
+package org.usb4java;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * Iterator for {@link Pollfds}.
+ *
+ * @author Klaus Reimer (k@ailis.de)
+ */
+final class PollfdsIterator implements Iterator
+{
+ /** The file descriptor list. */
+ private final Pollfds pollfds;
+
+ /** The current index. */
+ private int nextIndex;
+
+ /**
+ * Constructor.
+ *
+ * @param pollfds
+ * The file descriptor list list.
+ */
+ PollfdsIterator(final Pollfds pollfds)
+ {
+ this.pollfds = pollfds;
+ }
+
+ @Override
+ public boolean hasNext()
+ {
+ return this.nextIndex < this.pollfds.getSize();
+ }
+
+ @Override
+ public Pollfd next()
+ {
+ if (!hasNext()) throw new NoSuchElementException();
+ return this.pollfds.get(this.nextIndex++);
+ }
+
+ @Override
+ public void remove()
+ {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/src/test/java/org/usb4java/LibUsbDeviceTest.java b/src/test/java/org/usb4java/LibUsbDeviceTest.java
index 08611fa..43366f1 100644
--- a/src/test/java/org/usb4java/LibUsbDeviceTest.java
+++ b/src/test/java/org/usb4java/LibUsbDeviceTest.java
@@ -9,8 +9,11 @@
import static org.usb4java.test.UsbAssume.isUsbTestsEnabled;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeNotNull;
import java.nio.ByteBuffer;
@@ -1212,4 +1215,100 @@ public void testGetAndFreeDeviceListWithDefaultContext()
LibUsb.exit(null);
}
}
+
+ /**
+ * Tests the {@link LibUsb#getPollfds()} and {@link LibUsb#freePollfds()} methods.
+ */
+ @Test
+ public void testGetAndFreePollfds()
+ {
+ assumeUsbTestsEnabled();
+
+ final Pollfds pollfds = LibUsb.getPollfds(this.context);
+ try {
+ if (System.getProperty("os.name").toLowerCase().contains("windows")) {
+ assertNull(pollfds);
+ } else {
+ assertNotNull(pollfds);
+ assertTrue("Size must be >= 0", pollfds.getSize() >= 0);
+ int i = 0;
+ for (Pollfd pollfd : pollfds) {
+ assertEquals(pollfds.get(i), pollfd);
+ assertTrue("File descriptor must be > 0", pollfd.fd() > 0);
+ assertTrue("Events must be > 0", pollfd.events() > 0);
+ i++;
+ }
+ }
+ } finally {
+ LibUsb.freePollfds(pollfds);
+ }
+ }
+
+ /**
+ * Tests the {@link LibUsb#getPollfds()} and {@link LibUsb#freePollfds()} methods with the default context.
+ */
+ @Test
+ public void testGetAndFreePollfdsWithDefaultContext()
+ {
+ assumeUsbTestsEnabled();
+
+ assertEquals(0, LibUsb.init(null));
+ final Pollfds pollfds = LibUsb.getPollfds(null);
+ try {
+ if (System.getProperty("os.name").toLowerCase().contains("windows")) {
+ assertNull(pollfds);
+ } else {
+ assertNotNull(pollfds);
+ assertTrue("Size must be >= 0", pollfds.getSize() >= 0);
+ int i = 0;
+ for (Pollfd pollfd : pollfds) {
+ assertEquals(pollfds.get(i), pollfd);
+ assertTrue("File descriptor must be > 0", pollfd.fd() > 0);
+ assertTrue("Events must be > 0", pollfd.events() > 0);
+ i++;
+ }
+ }
+ } finally {
+ LibUsb.freePollfds(pollfds);
+ }
+ }
+
+ /**
+ * Ensures that {@link LibUsb#freePollfds()} doesn't throw an error when called with null argument.
+ */
+ @Test
+ public void testFreePollfdsWithNullArgument()
+ {
+ LibUsb.freePollfds(null);
+ }
+
+ /**
+ * Ensures that {@link LibUsb#freePollfds()} doesn't crash when called twice and throws an IllegalStateException
+ * instead.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testDoubleFreePollfds()
+ {
+ assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows"));
+ assumeUsbTestsEnabled();
+ final Pollfds pollfds = LibUsb.getPollfds(this.context);
+ LibUsb.freePollfds(pollfds);
+ LibUsb.freePollfds(pollfds);
+ }
+
+ /**
+ * Ensures that accessing Pollfds properties after calling {@link LibUsb#freePollfds()} doesn't crash and
+ * throws an IllegalStateException instead.
+ */
+ @Test(expected = IllegalStateException.class)
+ public void testPollfdsAccessAfterFree()
+ {
+ assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows"));
+ assumeUsbTestsEnabled();
+ assertEquals(0, LibUsb.init(null));
+ final Pollfds pollfds = LibUsb.getPollfds(null);
+ assertNotNull(pollfds);
+ LibUsb.freePollfds(pollfds);
+ assertNotNull(pollfds.get(0));
+ }
}
From 2ece25826fe7c8561ef01a5103ccb1736933ae42 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Fri, 12 Oct 2018 08:48:55 +0200
Subject: [PATCH 22/37] Free USB contexts in tests
---
.../java/org/usb4java/LibUsbDeviceTest.java | 52 ++++---
src/test/java/org/usb4java/LibUsbTest.java | 132 +++++++++++-------
2 files changed, 113 insertions(+), 71 deletions(-)
diff --git a/src/test/java/org/usb4java/LibUsbDeviceTest.java b/src/test/java/org/usb4java/LibUsbDeviceTest.java
index 43366f1..6253ee5 100644
--- a/src/test/java/org/usb4java/LibUsbDeviceTest.java
+++ b/src/test/java/org/usb4java/LibUsbDeviceTest.java
@@ -1253,23 +1253,30 @@ public void testGetAndFreePollfdsWithDefaultContext()
assumeUsbTestsEnabled();
assertEquals(0, LibUsb.init(null));
- final Pollfds pollfds = LibUsb.getPollfds(null);
- try {
- if (System.getProperty("os.name").toLowerCase().contains("windows")) {
- assertNull(pollfds);
- } else {
- assertNotNull(pollfds);
- assertTrue("Size must be >= 0", pollfds.getSize() >= 0);
- int i = 0;
- for (Pollfd pollfd : pollfds) {
- assertEquals(pollfds.get(i), pollfd);
- assertTrue("File descriptor must be > 0", pollfd.fd() > 0);
- assertTrue("Events must be > 0", pollfd.events() > 0);
- i++;
+ try
+ {
+ final Pollfds pollfds = LibUsb.getPollfds(null);
+ try {
+ if (System.getProperty("os.name").toLowerCase().contains("windows")) {
+ assertNull(pollfds);
+ } else {
+ assertNotNull(pollfds);
+ assertTrue("Size must be >= 0", pollfds.getSize() >= 0);
+ int i = 0;
+ for (Pollfd pollfd : pollfds) {
+ assertEquals(pollfds.get(i), pollfd);
+ assertTrue("File descriptor must be > 0", pollfd.fd() > 0);
+ assertTrue("Events must be > 0", pollfd.events() > 0);
+ i++;
+ }
}
+ } finally {
+ LibUsb.freePollfds(pollfds);
}
- } finally {
- LibUsb.freePollfds(pollfds);
+ }
+ finally
+ {
+ LibUsb.exit(null);
}
}
@@ -1306,9 +1313,16 @@ public void testPollfdsAccessAfterFree()
assumeFalse(System.getProperty("os.name").toLowerCase().contains("windows"));
assumeUsbTestsEnabled();
assertEquals(0, LibUsb.init(null));
- final Pollfds pollfds = LibUsb.getPollfds(null);
- assertNotNull(pollfds);
- LibUsb.freePollfds(pollfds);
- assertNotNull(pollfds.get(0));
+ try
+ {
+ final Pollfds pollfds = LibUsb.getPollfds(null);
+ assertNotNull(pollfds);
+ LibUsb.freePollfds(pollfds);
+ assertNotNull(pollfds.get(0));
+ }
+ finally
+ {
+ LibUsb.exit(null);
+ }
}
}
diff --git a/src/test/java/org/usb4java/LibUsbTest.java b/src/test/java/org/usb4java/LibUsbTest.java
index 27fa5fc..a798a33 100644
--- a/src/test/java/org/usb4java/LibUsbTest.java
+++ b/src/test/java/org/usb4java/LibUsbTest.java
@@ -201,16 +201,23 @@ public void testSetOption()
assumeUsbTestsEnabled();
final Context context = new Context();
assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
- if (System.getProperty("os.name").toLowerCase().contains("windows")) {
- // On Windows this is either a success when USBDK is found or ERROR_NOT_FOUND when not
- final int result = LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK);
- assertTrue(result == LibUsb.SUCCESS || result == LibUsb.ERROR_NOT_FOUND);
- } else {
- // On other operating systems it is always ERROR_NOT_SUPPORTED
- assertEquals(LibUsb.ERROR_NOT_SUPPORTED, LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK));
+ try
+ {
+ if (System.getProperty("os.name").toLowerCase().contains("windows")) {
+ // On Windows this is either a success when USBDK is found or ERROR_NOT_FOUND when not
+ final int result = LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK);
+ assertTrue(result == LibUsb.SUCCESS || result == LibUsb.ERROR_NOT_FOUND);
+ } else {
+ // On other operating systems it is always ERROR_NOT_SUPPORTED
+ assertEquals(LibUsb.ERROR_NOT_SUPPORTED, LibUsb.setOption(context, LibUsb.OPTION_USE_USBDK));
+ }
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_NONE));
+ assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_DEBUG));
+ }
+ finally
+ {
+ LibUsb.exit(context);
}
- assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_NONE));
- assertEquals(LibUsb.SUCCESS, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, LibUsb.LOG_LEVEL_DEBUG));
}
/**
@@ -222,8 +229,15 @@ public void testSetOptionWithInvalidParameters()
assumeUsbTestsEnabled();
final Context context = new Context();
assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
- assertEquals(LibUsb.ERROR_INVALID_PARAM, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, 234));
- assertEquals(LibUsb.ERROR_INVALID_PARAM, LibUsb.setOption(context, 123));
+ try
+ {
+ assertEquals(LibUsb.ERROR_INVALID_PARAM, LibUsb.setOption(context, LibUsb.OPTION_LOG_LEVEL, 234));
+ assertEquals(LibUsb.ERROR_INVALID_PARAM, LibUsb.setOption(context, 123));
+ }
+ finally
+ {
+ LibUsb.exit(context);
+ }
}
/**
@@ -1318,46 +1332,53 @@ public void testPollFdNotifiers()
final PollfdListenerMock listener = new PollfdListenerMock();
final Context context = new Context();
LibUsb.init(context);
- LibUsb.setPollfdNotifiers(context, listener, "test");
-
- FileDescriptor fd = new FileDescriptor();
- LibUsb.triggerPollfdAdded(fd, 53, context.getPointer());
- assertEquals(53, listener.addedEvents);
- assertSame(fd, listener.addedFd);
- assertSame("test", listener.addedUserData);
- assertNull(listener.removedFd);
- assertNull(listener.removedUserData);
-
- listener.reset();
-
- fd = new FileDescriptor();
- LibUsb.triggerPollfdRemoved(fd, context.getPointer());
- assertEquals(0, listener.addedEvents);
- assertNull(listener.addedFd);
- assertNull(listener.addedUserData);
- assertSame(fd, listener.removedFd);
- assertSame("test", listener.removedUserData);
-
- LibUsb.setPollfdNotifiers(context, null, null);
- listener.reset();
-
- fd = new FileDescriptor();
- LibUsb.triggerPollfdAdded(fd, 53, context.getPointer());
- assertEquals(0, listener.addedEvents);
- assertNull(listener.addedFd);
- assertNull(listener.addedUserData);
- assertNull(listener.removedFd);
- assertNull(listener.removedUserData);
-
- listener.reset();
-
- fd = new FileDescriptor();
- LibUsb.triggerPollfdRemoved(fd, context.getPointer());
- assertEquals(0, listener.addedEvents);
- assertNull(listener.addedFd);
- assertNull(listener.addedUserData);
- assertNull(listener.removedFd);
- assertNull(listener.removedUserData);
+ try
+ {
+ LibUsb.setPollfdNotifiers(context, listener, "test");
+
+ FileDescriptor fd = new FileDescriptor();
+ LibUsb.triggerPollfdAdded(fd, 53, context.getPointer());
+ assertEquals(53, listener.addedEvents);
+ assertSame(fd, listener.addedFd);
+ assertSame("test", listener.addedUserData);
+ assertNull(listener.removedFd);
+ assertNull(listener.removedUserData);
+
+ listener.reset();
+
+ fd = new FileDescriptor();
+ LibUsb.triggerPollfdRemoved(fd, context.getPointer());
+ assertEquals(0, listener.addedEvents);
+ assertNull(listener.addedFd);
+ assertNull(listener.addedUserData);
+ assertSame(fd, listener.removedFd);
+ assertSame("test", listener.removedUserData);
+
+ LibUsb.setPollfdNotifiers(context, null, null);
+ listener.reset();
+
+ fd = new FileDescriptor();
+ LibUsb.triggerPollfdAdded(fd, 53, context.getPointer());
+ assertEquals(0, listener.addedEvents);
+ assertNull(listener.addedFd);
+ assertNull(listener.addedUserData);
+ assertNull(listener.removedFd);
+ assertNull(listener.removedUserData);
+
+ listener.reset();
+
+ fd = new FileDescriptor();
+ LibUsb.triggerPollfdRemoved(fd, context.getPointer());
+ assertEquals(0, listener.addedEvents);
+ assertNull(listener.addedFd);
+ assertNull(listener.addedUserData);
+ assertNull(listener.removedFd);
+ assertNull(listener.removedUserData);
+ }
+ finally
+ {
+ LibUsb.exit(context);
+ }
}
/**
@@ -1369,6 +1390,13 @@ public void testInterruptEventHandler()
assumeUsbTestsEnabled();
final Context context = new Context();
assertEquals(LibUsb.SUCCESS, LibUsb.init(context));
- LibUsb.interruptEventHandler(context);
+ try
+ {
+ LibUsb.interruptEventHandler(context);
+ }
+ finally
+ {
+ LibUsb.exit(context);
+ }
}
}
From 5f3cad266a625cecd40d85427aea3f3952a40e9d Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 21 Oct 2018 12:21:25 +0200
Subject: [PATCH 23/37] Switch from BZ2 to XZ compression
---
src/main/assembly/tarball.xml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/main/assembly/tarball.xml b/src/main/assembly/tarball.xml
index 9b1d4b9..35bb930 100644
--- a/src/main/assembly/tarball.xml
+++ b/src/main/assembly/tarball.xml
@@ -4,7 +4,7 @@
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
tarball
- tar.bz2
+ tar.xz
@@ -30,9 +30,9 @@
- lib
+ libfalseruntime
-
+
From 5249c172f98b7307169116523c42ec43ccc4b32a Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 21 Oct 2018 12:21:37 +0200
Subject: [PATCH 24/37] Fix javadoc links
---
src/main/java/org/usb4java/LibUsb.java | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/src/main/java/org/usb4java/LibUsb.java b/src/main/java/org/usb4java/LibUsb.java
index b1ba7a3..6cebb61 100644
--- a/src/main/java/org/usb4java/LibUsb.java
+++ b/src/main/java/org/usb4java/LibUsb.java
@@ -89,7 +89,7 @@ public final class LibUsb
/**
* Use the UsbDk backend for a specific context, if available.
*
- * This option should be set immediately after calling {@link #init()}, otherwise
+ * This option should be set immediately after calling {@link #init(Context)}, otherwise
* unspecified behavior may occur.
*
* Only valid on Windows.
@@ -763,7 +763,7 @@ private LibUsb()
* @param level
* The log level to set.
*
- * @deprecated Use {@link #setOption()} instead using the {@link #OPTION_LOG_LEVEL} option.
+ * @deprecated Use {@link #setOption(Context, int, int)} instead using the {@link #OPTION_LOG_LEVEL} option.
*/
public static native void setDebug(final Context context, final int level);
@@ -1328,8 +1328,9 @@ public static native int freeStreams(final DeviceHandle handle,
* is in progress, although it is legal to have several transfers going on within the same memory block.
*
* Will return NULL on failure. Many systems do not support such zerocopy and will always return NULL. Memory
- * allocated with this function must be freed with {@link #devMemFree()}. Specifically, this means that the flag
- * {@link #TRANSFER_FREE_BUFFER} cannot be used to free memory allocated with this function.
+ * allocated with this function must be freed with {@link #devMemFree(DeviceHandle, ByteBuffer, int)}.
+ * Specifically, this means that the flag {@link #TRANSFER_FREE_BUFFER} cannot be used to free memory
+ * allocated with this function.
*
* @param handle
* A device handle.
@@ -1340,7 +1341,7 @@ public static native int freeStreams(final DeviceHandle handle,
public static native ByteBuffer devMemAlloc(final DeviceHandle handle, final int length);
/**
- * Free device memory allocated with {@link #devMemAlloc()}.
+ * Free device memory allocated with {@link #devMemAlloc(DeviceHandle, int)}.
*
* @param handle
* A device handle.
@@ -1350,7 +1351,7 @@ public static native int freeStreams(final DeviceHandle handle,
* The size of the previously allocated memory.
* @return {@link #SUCCESS}, or a LIBUSB_ERROR code on failure.
*/
- public static native int devMemFree(final DeviceHandle handle, final ByteBuffer buffer, final int length);
+ public static native int devMemFree(final DeviceHandle handle, final ByteBuffer buffer, final int size);
/**
* Determine if a kernel driver is active on an interface.
@@ -2132,9 +2133,9 @@ public static native int interruptTransfer(final DeviceHandle handle,
* Interrupt any active thread that is handling events.
*
* This is mainly useful for interrupting a dedicated event handling thread when an application wishes to call
- * {@link #exit()}.
+ * {@link #exit(Context)}.
*
- * @param ctx
+ * @param context
* The context to operate on, or NULL for the default context.
*/
public static native void interruptEventHandler(final Context context);
@@ -2511,7 +2512,7 @@ static native void setPollfdNotifiersNative(final Context context,
/**
* Retrieve a list of file descriptors that should be polled by your main loop as libusb event sources.
*
- * The returned list should be freed with {@link #freePollfds()} when done. The actual list contents must not be
+ * The returned list should be freed with {@link #freePollfds(Pollfds)} when done. The actual list contents must not be
* touched.
*
* As file descriptors are a Unix-specific concept, this function is not available on Windows and will always
@@ -2527,7 +2528,7 @@ static native void setPollfdNotifiersNative(final Context context,
/**
* Free a list of {@link Pollfd} structures.
*
- * This should be called for all pollfd lists allocated with {@link #getPollfds()}.
+ * This should be called for all pollfd lists allocated with {@link #getPollfds(Context)}.
*
* It is legal to call this function with a NULL pollfd list. In this case, the function will simply return safely.
*/
From df699d2612c0215a764f07bedc62372794b450a2 Mon Sep 17 00:00:00 2001
From: Klaus Reimer
Date: Sun, 21 Oct 2018 12:22:03 +0200
Subject: [PATCH 25/37] Improve documentation
---
src/site/apt/configuration.apt.vm | 25 ++++++++----
src/site/apt/faq.apt.vm | 39 +++++++++---------
src/site/apt/nativelibs.apt.vm | 67 +++++++++++++++++--------------
src/site/apt/quickstart/index.apt | 23 +++++------
src/site/xdoc/index.xml.vm | 40 +++++++++---------
5 files changed, 103 insertions(+), 91 deletions(-)
diff --git a/src/site/apt/configuration.apt.vm b/src/site/apt/configuration.apt.vm
index ea46ed9..7d6ef54 100644
--- a/src/site/apt/configuration.apt.vm
+++ b/src/site/apt/configuration.apt.vm
@@ -1,7 +1,7 @@
-----------------------------------------------------------------------------
Configuration
-----------------------------------------------------------------------------
-
+
Configuration
The configuration options explained here are only valid for the javax-usb
@@ -15,21 +15,21 @@ Configuration
implementation you have to put the following property into the
file which must be located in the root of
your classpath:
-
+
+----+
javax.usb.services = org.usb4java.javax.Services
-+----+
++----+
can be configured by adding more properties to this file as
described in the following sections.
-
+
* Communication timeout
The default USB communication timeout of is 2500 milliseconds.
To change this to 250 milliseconds for example add this to the properties
- file:
-
+ file:
+
+----+
org.usb4java.javax.timeout = 250
+----+
@@ -52,4 +52,15 @@ org.usb4java.javax.scanInterval = 1000
+----+
((org.usb4java.javax.Services) UsbHostManager.getUsbServices()).scan();
+----+
-
\ No newline at end of file
+
+
+* Use USBDK
+
+ If you want to use {{{https://github.com/daynix/UsbDk}USBDK}} on Windows
+ then you have to enable the feature with the following entry:
+
++----+
+org.usb4java.javax.useUSBDK = true
++----+
+
+ This setting is ignored on other platforms.
diff --git a/src/site/apt/faq.apt.vm b/src/site/apt/faq.apt.vm
index 581bfff..5bd958e 100644
--- a/src/site/apt/faq.apt.vm
+++ b/src/site/apt/faq.apt.vm
@@ -1,15 +1,15 @@
-----------------------------------------------------------------------------
FAQ
-----------------------------------------------------------------------------
-
+
Frequently asked questions
If you have a question which is not answered here please ask the
{{{mailto:usb4java@googlegroups.com}usb4java mailing list}}
({{{http://groups.google.com/group/usb4java}Google group}}).
- You can subscribe to it via email by sending a mail to
+ You can subscribe to it via email by sending a mail to
{{{mailto:usb4java+subscribe@googlegroups.com}usb4java+subscribe@googlegroups.com}}.
-
+
* I can't open my USB device on Linux. Why?
On Linux you need write permissions on the device file of the USB device
@@ -20,49 +20,48 @@ Frequently asked questions
with content like this:
----
- SUBSYSTEM=="usb",ATTR{idVendor}=="89ab",ATTR{idProduct}=="4567",MODE="0660",GROUP="wheel"
+ SUBSYSTEM=="usb",ATTR{idVendor}=="89ab",ATTR{idProduct}=="4567",MODE="0660",GROUP="plugdev"
----
This means that whenever a USB device with vendor id <0x89ab> and product id
<0x4567> is attached then the group is permitted to
write to the device. So make sure your user is in that group (or use a
different group).
-
+
If your device uses a shared vendor/product id then you might want to
filter for the manufacturer and product name. This can be done by checking
the ATTR properties and .
-
+
To activate this new configuration you may need to re-attach the USB device
or run the command <<>>.
* I can't open my USB device on Windows. Why?
On Windows you need to create a driver for your USB device. Read the
- {{{https://github.com/libusb/libusb/wiki/Windows#wiki-How_to_use_libusb_on_Windows}How to use libusb on Windows}}
+ {{{https://github.com/libusb/libusb/wiki/Windows#wiki-How_to_use_libusb_on_Windows}How to use libusb on Windows}}
article from the {{{http://libusb.info}libusb project}} for more information.
* My program crashes. What can I do?
- If the program crashes with a Java stack trace then it is most likely a
- problem in your own program. If you can't find it you may find some help on
- the {{{./mail-lists.html}mailinglist}}.
-
+ If the program crashes with a Java stack trace then it is most likely a
+ problem in your own program. If you can't find it you may find some help on
+ the {{{./mail-lists.html}mailinglist}}.
+
If the JVM crashes the hard way because of a segfault in the native code then
- it is more likely a problem of usb4java or libusb and you should file a
+ it is more likely a problem of usb4java or libusb and you should file a
{{{./issue-tracking.html}bugreport}} with as much information as possible
(Full stack trace, full crash log, example code how to reproduce the crash).
-
+
If usb4java crashes on Windows then please first of all make sure you have
created a proper device driver as explained in the previous FAQ entry. Also
consider creating a new up-to-date device driver with the latest Zadig tool.
-
+
If you have experience in C programming then it would be very helpful when
you could try to reproduce the problem in C by directly using libusb. If
- this works but the same USB communication doesn't work with usb4java then it
- would be nice if you could give us your C source and Java source so we can
+ this works but the same USB communication doesn't work with usb4java then it
+ would be nice if you could give us your C source and Java source so we can
track down the difference which causes the crash. If the C program also
crashes then your problem is located in libusb and not in usb4java and you
- should consult the libusb mailinglist or bug tracker instead. Never report a
- problem in the libusb bug tracker or the libusb mailing list if you
- can't reproduce the problem with a native C program!
-
\ No newline at end of file
+ should consult the libusb mailinglist or bug tracker instead. Never report a
+ problem in the libusb bug tracker or the libusb mailing list if you
+ can't reproduce the problem with a native C program!
diff --git a/src/site/apt/nativelibs.apt.vm b/src/site/apt/nativelibs.apt.vm
index d8399b3..862aa7c 100644
--- a/src/site/apt/nativelibs.apt.vm
+++ b/src/site/apt/nativelibs.apt.vm
@@ -1,41 +1,41 @@
-----------------------------------------------------------------------------
Native libraries
-----------------------------------------------------------------------------
-
+
Library loading
The native libraries for all supported platforms are provided as JAR files
which you can simply reference in your classpath. usb4java automatically
determines on startup which libraries are needed for the current platform
- and extracts them to a temporary directory and loads them from there.
- This makes it easy to use usb4java because you just need to put the JARs
+ and extracts them to a temporary directory and loads them from there.
+ This makes it easy to use usb4java because you just need to put the JARs
into your classpath. No need to fiddle around with or
environment variables like or .
-
+
usb4java only extracts the files into a temporary directory when they
are inside a JAR file. So if you prefer direct loading without extracting
to a temporary directory then you may want to distribute the files in
extracted form. Just make sure your classpath includes the directory where
you have extracted the JARs. Here is an example application layout for this
scenario:
-
+
+-----------------------------------------------------------------------------+
natives/
org/usb4java/
- linux-x86/libusb4java.so
- windows-x86/libusb4java.dll
- osx-x86/libusb4java.dylib
+ linux-x86-64/libusb4java.so
+ win32-x86-64/libusb4java.dll
+ darwin-x86-64/libusb4java.dylib
lib/
usb4java.jar
commons-lang3.jar
myapp.jar
myapp.sh
-+-----------------------------------------------------------------------------+
++-----------------------------------------------------------------------------+
To make this work just make sure to put the folder into your
- classpath.
+ classpath.
+
-
Unsupported platforms
When you use usb4java on a platform which is not directly supported by
@@ -46,7 +46,7 @@ Native library not found in classpath: /org/usb4java/freebsd-x86/libusb4java.so
+----+
+----+
-Unable to determine the shared library file extension for operating system
+Unable to determine the shared library file extension for operating system
'strangeos'. Please specify Java parameter -Dusb4java.libext.strangeos=
+----+
@@ -54,12 +54,12 @@ Unable to determine the shared library file extension for operating system
is completely unknown to the usb4java authors and usb4java does not know the
file extension of shared libraries on this platform. You can fix this by
specifying a Java parameter like this (As explained in the exception):
-
+
+----+
-Dusb4java.libext.strangeos=so
+----+
- After this you will most likely get the other exception, which means that
+ After this you will most likely get the other exception, which means that
there is no native JNI wrapper present for this platform. Your only chance
here is to compile this wrapper yourself. I can't predict how this works
on really strange platforms but chances are high that your platform is
@@ -68,48 +68,53 @@ Unable to determine the shared library file extension for operating system
1. Install a Java JDK ({{{http://openjdk.java.net/}OpenJDK}} for example).
Make sure the environment variable is pointing to the
directory where you have installed the JDK.
-
+
2. Install the {{{http://libusb.info/}libusb}} development files.
-
+
3. Install {{{http://git-scm.com/}Git}}.
-
+
4. Clone the {{{https://github.com/usb4java/libusb4java/}libusb4java source code repository}} with Git:
-
+
+----
$ git clone git://github.com/usb4java/libusb4java.git
+----
5. Enter the cloned libusb4java directory:
-
+
+----
$ cd libusb4java
+----
- 6. Compile the native library:
-
+ 6. Create a build output directory and enter it:
+
++---
+$ mkdir build
+$ cd build
++---
+
+ 7. Compile the native library:
+
++----
+$ cmake .. -DCMAKE_INSTALL_PREFIX=""
+$ make install/strip DESTDIR=/tmp
+----
-$ ./autogen.sh
-$ ./configure --prefix=/
-$ make install-strip DESTDIR=/tmp
-+----
- 8. When compilation was successful then the native library can be found in
+ 8. When compilation was successful then the native library can be found in
the directory . The file name depends on your operating system.
Make sure you rename it to (Or whatever file extension
- your platform uses) and copy this file into the directory
+ your platform uses) and copy this file into the directory
in your classpath where is the name
of your operating system and is your CPU architecture (Both
must match the names mentioned in the exception thrown by usb4java.)
-
- If you can't use the GNU compiler or the autotools then you are on your own.
+
+ If you can't use the GNU compiler or cmake then you are on your own.
If you have some experience with compiling JNI libraries then I guess this
won't be hard for you. There are only a couple of source files in the
sub folder. You could write a new simple Makefile or whatever is needed on
your platform.
- If you have problems then please consult the
+ If you have problems then please consult the
{{{mailto:usb4java@googlegroups.com}usb4java mailing list}}
({{{http://groups.google.com/group/usb4java}Google group}}).
You can subscribe to it via email by sending a mail to
{{{mailto:usb4java+subscribe@googlegroups.com}usb4java+subscribe@googlegroups.com}}.
-
\ No newline at end of file
diff --git a/src/site/apt/quickstart/index.apt b/src/site/apt/quickstart/index.apt
index f6a36cc..302293a 100644
--- a/src/site/apt/quickstart/index.apt
+++ b/src/site/apt/quickstart/index.apt
@@ -7,14 +7,14 @@ Quick start
* Choose an API
usb4java provides two different APIs you can choose from:
-
+
* {{{./libusb.html}The low-level (libusb) API}}
-
+
* {{{./javax-usb.html}The high-level (javax-usb) API}}
-
+
[]
-
- The low-level API closely follows the C API of the
+
+ The low-level API closely follows the C API of the
{{{http://libusb.info/}libusb}} project. This API has the advantage that it
provides the same functionality as libusb does. And if you know the C API of
libusb then you will most likely feel right at home when using this API
@@ -22,16 +22,13 @@ Quick start
Java. The disadvantage is that you will have a hard time changing
your code when you later switch to a different Java USB library. And as a
pure Java developer you may dislike the API because it is too low-level (For
- example most methods return error codes instead of throwing exceptions).
+ example most methods return error codes instead of throwing exceptions).
- The high-level API simply implements the
+ The high-level API simply implements the
{{{http://javax-usb.sourceforge.net/}javax-usb (JSR80) API}}. One advantage
of this API is that it is implementation-independent. So it is easy to
switch to a different javax-usb implementation later without changing your
code. Another advantage is that this API is object oriented and is much
- easier to use for Java developers. The disadvantage is that the javax-usb
- specification is pretty old and may lack support for some newer USB
- techniques provided by the low-level API.
-
-
-
\ No newline at end of file
+ easier to use for Java developers. The disadvantage is that the javax-usb
+ specification is very old (maybe even abandoned) and may lack support for
+ some newer USB techniques provided by the low-level API.
diff --git a/src/site/xdoc/index.xml.vm b/src/site/xdoc/index.xml.vm
index 090da5c..d266755 100644
--- a/src/site/xdoc/index.xml.vm
+++ b/src/site/xdoc/index.xml.vm
@@ -14,34 +14,34 @@
through the usb4java-javax extension.
- Supported platforms are Linux (x86 32/64 bit, ARM 32 bit),
- OS X (x86 32/64 bit) and
+ Supported platforms are Linux (x86 32/64 bit, ARM 32/64 bit),
+ OS X (x86 64 bit) and
Windows (x86 32/64 bit). But other platforms may work
- as well (as long as they have at least Java 6 and are supported by
+ as well (as long as they have at least Java 6 and are supported by
libusb) by compiling the JNI library manually.
- When you are using Maven then you can add the necessary dependencies
+ When you are using Maven then you can add the necessary dependencies
like this:
<-- For using just usb4java without javax-usb -->
@@ -62,13 +62,13 @@
</dependency>
</dependencies>
-
+
- Copyright (C) 2011 Klaus Reimer, k@ailis.de
+ Copyright (C) 2011 Klaus Reimer, k@ailis.de
Copyright (C) 2013 Luca Longinotti, l@longi.li
-
+
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -91,30 +91,30 @@
THE SOFTWARE.