diff --git a/java/src/ch/ntb/inf/libusbJava/LibusbJava1.java b/java/src/ch/ntb/inf/libusbJava/LibusbJava1.java
index 9e6b179..f0e5554 100644
--- a/java/src/ch/ntb/inf/libusbJava/LibusbJava1.java
+++ b/java/src/ch/ntb/inf/libusbJava/LibusbJava1.java
@@ -74,7 +74,8 @@ public class LibusbJava1 {
*
*
* @return a context to operate on
- * @throws LibusbError if an error occured
+ * @throws LibusbError
+ * if an error occured
*/
public static native long libusb_init() throws LibusbError;
@@ -191,15 +192,15 @@ public class LibusbJava1 {
* @param dev
* the device to open
*
- * @return a device handler
+ * @return a device handle >= 0
*
* @throws LibusbError
* in case of an error
* Possible causes are:
- * - ERROR_NO_MEM on memory allocation failure - ERROR_ACCESS if
- * the user has insufficient permissions - ERROR_NO_DEVICE if
- * the device has been disconnected - another ERROR code on
- * other failure
+ * - ERROR_NO_MEM on memory allocation failure
+ * - ERROR_ACCESS if the user has insufficient permissions
+ * - ERROR_NO_DEVICE if the device has been disconnected
+ * - another ERROR code on other failure
*
* @see #libusb_get_device(long)
*/
@@ -1383,33 +1384,44 @@ public class LibusbJava1 {
} else {
System.loadLibrary("usbJava-1.0");
}
+
+ /*
+ * After loading the library, we register a "shutdown hook" to be called
+ * for cleaning up stuff in the library when exiting.
+ */
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ try {
+ LibusbJava1.teardown();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+
+ /*
+ * After setting up the cleanup callback, it's now safe to call the code
+ * that initializes stuff in the native library
+ */
+ int setup_result = setup();
+
+ if (setup_result < 0) {
+ throw new UnsatisfiedLinkError("Could not setup the library. ("
+ + setup_result + ")");
+ }
}
/**
- * This method is only used for testing the DLL-code that throws exceptions
- * in the java environment.
+ * This method is used to setup stuff in the native library. After calling
+ * this function, {@link #teardown()} has to be called if the native library
+ * is not used anymore.
*
- * @param code
- * Code of the error to be simulated and hence the code of the
- * exception that shall be thrown.
- *
- * @throws LibusbError
- * @deprecated This function is only for testing purpose and should not be
- * called in production code
+ * @return - 0 if successful - <0 if an error occured
*/
- @Deprecated
- public static native void libusb_exceptionTest(int code) throws LibusbError;
-
+ private static native int setup();
+
/**
- * This method is only used for testing the DLL helpercode. It creates a
- * byte Array of the given size from the given string.
- *
- * @param str String to be copied into the array
- * @param size Size of the array to be created
- *
- * @deprecated This function is only for testing purpose and should not be
- * called in production code
+ * This method cleans up stuff initialized using {@link #setup()}.
*/
- @Deprecated
- public static native byte[] to_byteArrayTest(String str, int size);
+ private static native void teardown();
}
diff --git a/java/src/ch/ntb/inf/libusbJava/usbView/UsbTreeModel.java b/java/src/ch/ntb/inf/libusbJava/usbView/UsbTreeModel.java
index 90e5e29..e1bf70f 100644
--- a/java/src/ch/ntb/inf/libusbJava/usbView/UsbTreeModel.java
+++ b/java/src/ch/ntb/inf/libusbJava/usbView/UsbTreeModel.java
@@ -18,7 +18,7 @@ import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
-import ch.ntb.inf.libusbJava.LibusbJava;
+import ch.ntb.inf.libusbJava.LibusbJava1;
import ch.ntb.inf.libusbJava.Usb_Bus;
import ch.ntb.inf.libusbJava.Usb_Config_Descriptor;
import ch.ntb.inf.libusbJava.Usb_Device;
@@ -26,6 +26,7 @@ import ch.ntb.inf.libusbJava.Usb_Device_Descriptor;
import ch.ntb.inf.libusbJava.Usb_Endpoint_Descriptor;
import ch.ntb.inf.libusbJava.Usb_Interface;
import ch.ntb.inf.libusbJava.Usb_Interface_Descriptor;
+import ch.ntb.inf.libusbJava.exceptions.LibusbError;
public class UsbTreeModel implements TreeModel, TreeSelectionListener {
@@ -61,18 +62,17 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
* Returns the child of parent at index index in the parent's child array.
*/
public Object getChild(Object parent, int index) {
-
- if (parent instanceof String && ((String) parent).compareTo(USB_ROOT) == 0)
- {
+
+ if (parent instanceof String
+ && ((String) parent).compareTo(USB_ROOT) == 0) {
Usb_Bus curBus = rootBus;
-
- for (int i = 0; curBus != null; curBus = curBus.getNext(), i++)
- {
+
+ for (int i = 0; curBus != null; curBus = curBus.getNext(), i++) {
if (i == index)
return curBus;
}
}
-
+
else if (parent instanceof Usb_Bus) {
Usb_Device device = ((Usb_Bus) parent).getDevices();
int count = 0;
@@ -118,23 +118,20 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
/**
* Returns the number of children of parent.
*/
- public int getChildCount(Object parent)
- {
- if (parent instanceof String && ((String) parent).compareTo(USB_ROOT) == 0)
- {
+ public int getChildCount(Object parent) {
+ if (parent instanceof String
+ && ((String) parent).compareTo(USB_ROOT) == 0) {
int count = 0;
-
+
Usb_Bus curBus = rootBus;
-
- for (; curBus != null; curBus = curBus.getNext())
- {
+
+ for (; curBus != null; curBus = curBus.getNext()) {
count++;
}
-
+
return count;
-
- }
- else if (parent instanceof Usb_Bus) {
+
+ } else if (parent instanceof Usb_Bus) {
Usb_Device device = ((Usb_Bus) parent).getDevices();
int count = 0;
while (device != null) {
@@ -244,11 +241,8 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
sb.append("\tidProduct: 0x"
+ Integer.toHexString(devDesc.getIdProduct() & 0xFFFF)
+ "\n");
- sb
- .append("\tbcdDevice: 0x"
- + Integer
- .toHexString(devDesc.getBcdDevice() & 0xFF)
- + "\n");
+ sb.append("\tbcdDevice: 0x"
+ + Integer.toHexString(devDesc.getBcdDevice() & 0xFF) + "\n");
sb.append("\tiManufacturer: 0x"
+ Integer.toHexString(devDesc.getIManufacturer() & 0xFF)
+ "\n");
@@ -257,10 +251,9 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
sb.append("\tiSerialNumber: 0x"
+ Integer.toHexString(devDesc.getISerialNumber() & 0xFF)
+ "\n");
- sb
- .append("\tbNumConfigurations: 0x"
- + Integer.toHexString(devDesc
- .getBNumConfigurations() & 0xFF) + "\n");
+ sb.append("\tbNumConfigurations: 0x"
+ + Integer.toHexString(devDesc.getBNumConfigurations() & 0xFF)
+ + "\n");
// get device handle to retrieve string descriptors
Usb_Bus bus = rootBus;
while (bus != null) {
@@ -272,37 +265,54 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
|| (dev.getDescriptor().getIProduct() > 0) || (dev
.getDescriptor().getISerialNumber() > 0))) {
if (tmpDevDesc.equals(devDesc)) {
- long handle = LibusbJava.usb_open(dev);
- sb.append("\nString descriptors\n");
- if (handle == 0) {
- sb.append("\terror opening the device\n");
- break;
+ try {
+ sb.append("\nString descriptors\n");
+ long handle = LibusbJava1.libusb_open(dev);
+
+ try {
+ if (dev.getDescriptor().getIManufacturer() > 0) {
+ String manufacturer = LibusbJava1
+ .libusb_get_string_descriptor_ascii(
+ handle,
+ devDesc.getIManufacturer(),
+ 255);
+ if (manufacturer == null)
+ manufacturer = "unable to fetch manufacturer string";
+ sb.append("\tiManufacturer: "
+ + manufacturer + "\n");
+ }
+ if (dev.getDescriptor().getIProduct() > 0) {
+ String product = LibusbJava1
+ .libusb_get_string_descriptor_ascii(
+ handle,
+ devDesc.getIProduct(),
+ 255);
+ if (product == null)
+ product = "unable to fetch product string";
+ sb.append("\tiProduct: " + product
+ + "\n");
+ }
+ if (dev.getDescriptor().getISerialNumber() > 0) {
+ String serialNumber = LibusbJava1
+ .libusb_get_string_descriptor_ascii(
+ handle,
+ devDesc.getISerialNumber(),
+ 255);
+ if (serialNumber == null)
+ serialNumber = "unable to fetch serial number string";
+ sb.append("\tiSerialNumber: "
+ + serialNumber + "\n");
+ }
+ } catch (LibusbError ex) {
+ sb.append("\terror getting descriptors: "
+ + ex.getErrorString() + "\n");
+ } finally {
+ LibusbJava1.libusb_close(handle);
+ }
+ } catch (LibusbError ex) {
+ sb.append("\terror opening the device"
+ + ex.getErrorString() + "\n");
}
- if (dev.getDescriptor().getIManufacturer() > 0) {
- String manufacturer = LibusbJava.usb_get_string_simple(handle, devDesc.getIManufacturer());
- if (manufacturer == null)
- manufacturer = "unable to fetch manufacturer string";
- sb.append("\tiManufacturer: " + manufacturer
- + "\n");
- }
- if (dev.getDescriptor().getIProduct() > 0) {
- String product = LibusbJava
- .usb_get_string_simple(handle, devDesc
- .getIProduct());
- if (product == null)
- product = "unable to fetch product string";
- sb.append("\tiProduct: " + product + "\n");
- }
- if (dev.getDescriptor().getISerialNumber() > 0) {
- String serialNumber = LibusbJava
- .usb_get_string_simple(handle, devDesc
- .getISerialNumber());
- if (serialNumber == null)
- serialNumber = "unable to fetch serial number string";
- sb.append("\tiSerialNumber: " + serialNumber
- + "\n");
- }
- LibusbJava.usb_close(handle);
}
}
dev = dev.getNext();
@@ -321,10 +331,9 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
sb.append("\tbNumInterfaces: 0x"
+ Integer.toHexString(confDesc.getBNumInterfaces() & 0xFF)
+ "\n");
- sb
- .append("\tbConfigurationValue: 0x"
- + Integer.toHexString(confDesc
- .getBConfigurationValue() & 0xFF) + "\n");
+ sb.append("\tbConfigurationValue: 0x"
+ + Integer.toHexString(confDesc.getBConfigurationValue() & 0xFF)
+ + "\n");
sb.append("\tiConfiguration: 0x"
+ Integer.toHexString(confDesc.getIConfiguration() & 0xFF)
+ "\n");
@@ -336,7 +345,8 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
+ confDesc.getMaxPower() + ")\n");
sb.append("\textralen: 0x"
+ Integer.toHexString(confDesc.getExtralen()) + "\n");
- sb.append("\textra: " + extraDescriptorToString(confDesc.getExtra()) + "\n");
+ sb.append("\textra: "
+ + extraDescriptorToString(confDesc.getExtra()) + "\n");
// get device handle to retrieve string descriptors
Usb_Bus bus = rootBus;
while (bus != null) {
@@ -346,22 +356,31 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
for (int i = 0; i < tmpConfDesc.length; i++) {
if ((tmpConfDesc.equals(confDesc))
&& (confDesc.getIConfiguration() > 0)) {
- long handle = LibusbJava.usb_open(dev);
- sb.append("\nString descriptors\n");
- if (handle == 0) {
- sb.append("\terror opening the device\n");
- break;
+ try {
+ sb.append("\nString descriptors\n");
+ long handle = LibusbJava1.libusb_open(dev);
+
+ try {
+ String configuration = LibusbJava1
+ .libusb_get_string_descriptor_ascii(
+ handle,
+ confDesc.getIConfiguration(),
+ 255);
+ if (configuration == null)
+ configuration = "unable to fetch configuration string";
+ sb.append("\tiConfiguration: "
+ + configuration + "\n");
+ } catch (LibusbError e1) {
+ sb.append("\terror getting config descriptor: "
+ + e1.getErrorString() + "\n");
+ } finally {
+ LibusbJava1.libusb_close(handle);
+ }
+ } catch (LibusbError e1) {
+ sb.append("\terror opening the device: "
+ + e1.getErrorString() + "\n");
+ } finally {
}
- String configuration = LibusbJava
- .usb_get_string_simple(handle, confDesc
- .getIConfiguration());
- if (configuration == null)
- configuration = "unable to fetch configuration string";
- sb.append("\tiConfiguration: " + configuration
- + "\n");
-
- LibusbJava.usb_close(handle);
-
}
}
dev = dev.getNext();
@@ -388,8 +407,7 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
+ Integer.toHexString(intDesc.getBInterfaceNumber() & 0xFF)
+ "\n");
sb.append("\tbAlternateSetting: 0x"
- + Integer
- .toHexString(intDesc.getBAlternateSetting() & 0xFF)
+ + Integer.toHexString(intDesc.getBAlternateSetting() & 0xFF)
+ "\n");
sb.append("\tbNumEndpoints: 0x"
+ Integer.toHexString(intDesc.getBNumEndpoints() & 0xFF)
@@ -397,52 +415,65 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
sb.append("\tbInterfaceClass: 0x"
+ Integer.toHexString(intDesc.getBInterfaceClass() & 0xFF)
+ "\n");
- sb
- .append("\tbInterfaceSubClass: 0x"
- + Integer.toHexString(intDesc
- .getBInterfaceSubClass() & 0xFF) + "\n");
- sb
- .append("\tbInterfaceProtocol: 0x"
- + Integer.toHexString(intDesc
- .getBInterfaceProtocol() & 0xFF) + "\n");
+ sb.append("\tbInterfaceSubClass: 0x"
+ + Integer.toHexString(intDesc.getBInterfaceSubClass() & 0xFF)
+ + "\n");
+ sb.append("\tbInterfaceProtocol: 0x"
+ + Integer.toHexString(intDesc.getBInterfaceProtocol() & 0xFF)
+ + "\n");
sb.append("\tiInterface: 0x"
+ Integer.toHexString(intDesc.getIInterface()) + "\n");
sb.append("\textralen: 0x"
+ Integer.toHexString(intDesc.getExtralen()) + "\n");
- sb.append("\textra: " + extraDescriptorToString(intDesc.getExtra()) + "\n");
+ sb.append("\textra: " + extraDescriptorToString(intDesc.getExtra())
+ + "\n");
// get device handle to retrieve string descriptors
Usb_Bus bus = rootBus;
while (bus != null) {
Usb_Device dev = bus.getDevices();
while (dev != null) {
- Usb_Config_Descriptor[] confDescs = dev.getConfig();
- for (int i = 0; i < confDescs.length; i++) {
- Usb_Interface[] ints = confDescs[i].getInterface();
- for (int j = 0; j < ints.length; j++) {
- Usb_Interface_Descriptor[] tmpIntDescs = ints[j]
- .getAltsetting();
- for (int k = 0; k < ints.length; k++) {
- if (i < tmpIntDescs.length && tmpIntDescs[i].equals(intDesc)
- && (intDesc.getIInterface() > 0)) {
- long handle = LibusbJava.usb_open(dev);
- sb.append("\nString descriptors\n");
- if (handle == 0) {
- sb
- .append("\terror opening the device\n");
- break;
+ try {
+ long handle = LibusbJava1.libusb_open(dev);
+
+ Usb_Config_Descriptor[] confDescs = dev.getConfig();
+ for (int i = 0; i < confDescs.length; i++) {
+ Usb_Interface[] ints = confDescs[i].getInterface();
+
+ for (int j = 0; j < ints.length; j++) {
+ Usb_Interface_Descriptor[] tmpIntDescs = ints[j]
+ .getAltsetting();
+
+ for (int k = 0; k < ints.length; k++) {
+ if (i < tmpIntDescs.length
+ && tmpIntDescs[i].equals(intDesc)
+ && (intDesc.getIInterface() > 0)) {
+ sb.append("\nString descriptors\n");
+ try {
+ String interface_ = LibusbJava1
+ .libusb_get_string_descriptor_ascii(
+ handle,
+ intDesc.getIInterface(),
+ 255);
+ if (interface_ == null)
+ interface_ = "unable to fetch interface string";
+ sb.append("\tiInterface: "
+ + interface_ + "\n");
+ } catch (LibusbError e1) {
+ sb.append("\terror while reading descriptors: "
+ + e1.getErrorString()
+ + "\n");
+ }
}
- String interface_ = LibusbJava
- .usb_get_string_simple(handle,
- intDesc.getIInterface());
- if (interface_ == null)
- interface_ = "unable to fetch interface string";
- sb.append("\tiInterface: " + interface_
- + "\n");
- LibusbJava.usb_close(handle);
}
}
}
+
+ LibusbJava1.libusb_close(handle);
+ } catch (LibusbError e1) {
+ sb.append("\terror opening the device: "
+ + e1.getErrorString() + "\n");
}
+
dev = dev.getNext();
}
bus = bus.getNext();
@@ -473,7 +504,8 @@ public class UsbTreeModel implements TreeModel, TreeSelectionListener {
+ Integer.toHexString(epDesc.getBSynchAddress()) + "\n");
sb.append("\textralen: 0x"
+ Integer.toHexString(epDesc.getExtralen()) + "\n");
- sb.append("\textra: " + extraDescriptorToString(epDesc.getExtra()) + "\n");
+ sb.append("\textra: " + extraDescriptorToString(epDesc.getExtra())
+ + "\n");
textArea.setText(sb.toString());
}
}