From 9864bb3235470809da3c4b4cd23cf3845ce1f5cf Mon Sep 17 00:00:00 2001 From: Klaus Reimer Date: Sat, 5 Feb 2011 15:46:51 +0100 Subject: [PATCH] Improved error handling. Changed visibility of all classes except UsbServicesImpl to package private. --- TODO.txt | 23 ++------ .../ailis/usb4java/jsr80/AbstractDevice.java | 52 ++++++++----------- .../usb4java/jsr80/EventListenerList.java | 2 +- .../ailis/usb4java/jsr80/LibUsbException.java | 35 ++++++++++++- .../usb4java/jsr80/PipeQueueProcessor.java | 17 ++++-- .../jsr80/UsbConfigurationDescriptorImpl.java | 2 +- .../usb4java/jsr80/UsbConfigurationImpl.java | 7 +-- .../usb4java/jsr80/UsbDescriptorImpl.java | 2 +- .../jsr80/UsbDeviceDescriptorImpl.java | 2 +- .../ailis/usb4java/jsr80/UsbDeviceImpl.java | 2 +- .../usb4java/jsr80/UsbDeviceListenerList.java | 2 +- .../jsr80/UsbEndpointDescriptorImpl.java | 2 +- .../ailis/usb4java/jsr80/UsbEndpointImpl.java | 2 +- .../de/ailis/usb4java/jsr80/UsbHubImpl.java | 3 +- .../jsr80/UsbInterfaceDescriptorImpl.java | 2 +- .../usb4java/jsr80/UsbInterfaceImpl.java | 2 +- .../de/ailis/usb4java/jsr80/UsbPipeImpl.java | 2 +- .../usb4java/jsr80/UsbPipeListenerList.java | 2 +- .../de/ailis/usb4java/jsr80/UsbPortImpl.java | 2 +- .../jsr80/UsbServicesListenerList.java | 2 +- .../jsr80/UsbStringDescriptorImpl.java | 2 +- 21 files changed, 94 insertions(+), 73 deletions(-) diff --git a/TODO.txt b/TODO.txt index 93eb200..9a72ede 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,20 +1,7 @@ -JSR-80 implementation checklist: +JSR-80: + +* Do extensive tests with USB pipes. interrupt data transfer seems to work + (MouseDriver demo is working) but never used bulk transfer and it's unclear + if the queue implementation is working correctly under stress. - [ ] UsbConfiguration - [x] UsbConfigurationDescriptor - [x] UsbDescriptor - [ ] UsbDevice - [x] UsbDeviceDescriptor - [x] UsbDeviceListener - [ ] UsbEndpoint - [x] UsbEndpointDescriptor - [ ] UsbHub - [ ] UsbInterface - [x] UsbInterfaceDescriptor - [ ] UsbPipe - [X] UsbPipeListener - [ ] UsbPort - [ ] UsbServices - [X] UsbServicesListener - [x] UsbStringDescritor \ No newline at end of file diff --git a/src/main/java/de/ailis/usb4java/jsr80/AbstractDevice.java b/src/main/java/de/ailis/usb4java/jsr80/AbstractDevice.java index 807e916..97fe8ea 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/AbstractDevice.java +++ b/src/main/java/de/ailis/usb4java/jsr80/AbstractDevice.java @@ -16,7 +16,6 @@ import static de.ailis.usb4java.USB.usb_get_string; import static de.ailis.usb4java.USB.usb_open; import static de.ailis.usb4java.USB.usb_release_interface; import static de.ailis.usb4java.USB.usb_set_configuration; -import static de.ailis.usb4java.USB.usb_strerror; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; @@ -132,8 +131,8 @@ abstract class AbstractDevice implements UsbDevice this.handle = usb_open(this.device); if (this.handle == null) { - throw new UsbException("Can't open device " - + this.device + ": " + usb_strerror()); + throw new LibUsbException("Can't open device " + + this.device); } } finally @@ -159,11 +158,10 @@ abstract class AbstractDevice implements UsbDevice USBLock.acquire(); try { - if (usb_close(this.handle) < 0) - { - throw new UsbException("Can't close device " - + this.device + ": " + usb_strerror()); - } + final int result = usb_close(this.handle); + if (result < 0) + throw new LibUsbException("Can't close device " + + this.device, result); } finally { @@ -361,7 +359,9 @@ abstract class AbstractDevice implements UsbDevice try { final int result = usb_set_configuration(open(), number & 0xff); - if (result < 0) throw new UsbException(usb_strerror()); + if (result < 0) + throw new LibUsbException("Unable to set configuration", + result); this.activeConfigurationNumber = number; } finally @@ -403,7 +403,9 @@ abstract class AbstractDevice implements UsbDevice } final int result = usb_claim_interface(open(), number & 0xff); - if (result < 0) throw new UsbException(usb_strerror()); + if (result < 0) + throw new LibUsbException("Unable to claim interface", + result); this.claimedInterfaceNumber = number; } finally @@ -436,7 +438,8 @@ abstract class AbstractDevice implements UsbDevice try { final int result = usb_release_interface(open(), number & 0xff); - if (result < 0) throw new UsbException(usb_strerror()); + if (result < 0) + throw new LibUsbException("Unable to release interface", result); this.claimedInterfaceNumber = null; } finally @@ -510,9 +513,8 @@ abstract class AbstractDevice implements UsbDevice final ByteBuffer buffer = ByteBuffer.allocateDirect(256); final int len = usb_get_string(handle, index, langid, buffer); if (len < 0) - throw new UsbException("Unable to get string descriptor " - + index - + " from device " + this.device + ": " + len); + throw new LibUsbException("Unable to get string descriptor " + + index + " from device " + this.device, len); return new UsbStringDescriptorImpl( new USB_String_Descriptor(buffer)); } @@ -553,12 +555,11 @@ abstract class AbstractDevice implements UsbDevice final int len = usb_get_descriptor(handle, USB_DT_STRING, 0, buffer); if (len < 0) - throw new UsbException( - "Unable to get string descriptor languages: " - + usb_strerror()); + throw new LibUsbException( + "Unable to get string descriptor languages", len); if (len < 2) - throw new UsbException("Illegal descriptor length: " - + usb_strerror()); + throw new UsbException("Received illegal descriptor length: " + + len); final short[] languages = new short[(len - 2) / 2]; if (languages.length == 0) return languages; buffer.position(2); @@ -580,15 +581,6 @@ abstract class AbstractDevice implements UsbDevice @Override public final void syncSubmit(final UsbControlIrp irp) throws UsbException { - if ((irp.bRequest() == UsbConst.REQUEST_SET_CONFIGURATION) - && (irp.bmRequestType() == 0)) - { - final int result2 = usb_set_configuration(open(), irp.wValue()); - if (result2 < 0) throw new UsbException(usb_strerror()); - return; - } - - USBLock.acquire(); try { @@ -600,7 +592,9 @@ abstract class AbstractDevice implements UsbDevice final int len = usb_control_msg(handle, irp.bmRequestType(), irp.bRequest(), irp.wValue(), irp.wIndex(), buffer, 250); - if (len < 0) throw new UsbException(usb_strerror()); + if (len < 0) + throw new LibUsbException("Unable to submit control message", + len); buffer.rewind(); buffer.get(irp.getData(), 0, len); irp.setActualLength(len); diff --git a/src/main/java/de/ailis/usb4java/jsr80/EventListenerList.java b/src/main/java/de/ailis/usb4java/jsr80/EventListenerList.java index b47bd16..6dd5403 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/EventListenerList.java +++ b/src/main/java/de/ailis/usb4java/jsr80/EventListenerList.java @@ -19,7 +19,7 @@ import java.util.List; * The event listener type. */ -public abstract class EventListenerList +abstract class EventListenerList { /** The list with registered listeners. */ protected final List listeners = Collections diff --git a/src/main/java/de/ailis/usb4java/jsr80/LibUsbException.java b/src/main/java/de/ailis/usb4java/jsr80/LibUsbException.java index edf7208..31bf06c 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/LibUsbException.java +++ b/src/main/java/de/ailis/usb4java/jsr80/LibUsbException.java @@ -16,7 +16,7 @@ import javax.usb.UsbException; * @author Klaus Reimer (k@ailis.de) */ -public class LibUsbException extends UsbException +class LibUsbException extends UsbException { /** Serial version UID. */ private static final long serialVersionUID = 1L; @@ -25,6 +25,37 @@ public class LibUsbException extends UsbException private final int errorCode; + /** + * Constructor. + * + * @param message + * The error message. + * @param errorCode + * The error code. + */ + + public LibUsbException(final String message, final int errorCode) + { + super(String.format("USB error %d: %s: %s", -errorCode, message, + usb_strerror())); + this.errorCode = errorCode; + } + + + /** + * Constructor. + * + * @param message + * The error message. + */ + + public LibUsbException(final String message) + { + super(String.format("USB error: %s: %s", message, usb_strerror())); + this.errorCode = 0; + } + + /** * Constructor. * @@ -34,7 +65,7 @@ public class LibUsbException extends UsbException public LibUsbException(final int errorCode) { - super(String.format("USB error %d: %s", errorCode, usb_strerror())); + super(String.format("USB error %d: %s", -errorCode, usb_strerror())); this.errorCode = errorCode; } diff --git a/src/main/java/de/ailis/usb4java/jsr80/PipeQueueProcessor.java b/src/main/java/de/ailis/usb4java/jsr80/PipeQueueProcessor.java index 89d6d32..413dddd 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/PipeQueueProcessor.java +++ b/src/main/java/de/ailis/usb4java/jsr80/PipeQueueProcessor.java @@ -193,12 +193,15 @@ final class PipeQueueProcessor extends Thread final int ep = descriptor.bEndpointAddress(); final ByteBuffer buffer = ByteBuffer.allocateDirect(size); final int result = usb_bulk_read(getDevice().open(), ep, buffer, 5000); - if (result < 0) throw new LibUsbException(result); + if (result < 0) + throw new LibUsbException("Unable to read from interrupt endpoint", + result); buffer.rewind(); buffer.get(data, 0, result); return result; } + /** * Writes the specified bytes to a bulk endpoint. * @@ -223,7 +226,9 @@ final class PipeQueueProcessor extends Thread buffer.put(data, written, Math.min(total - written, size)); buffer.rewind(); final int result = usb_bulk_write(handle, ep, buffer, 5000); - if (result < 0) throw new LibUsbException(result); + if (result < 0) + throw new LibUsbException( + "Unable to write to interrupt endpoint", result); written += result; buffer.rewind(); } @@ -250,7 +255,9 @@ final class PipeQueueProcessor extends Thread final ByteBuffer buffer = ByteBuffer.allocateDirect(size); final int result = usb_interrupt_read(getDevice().open(), ep, buffer, 5000); - if (result < 0) throw new LibUsbException(result); + if (result < 0) + throw new LibUsbException("Unable to read from interrupt endpoint", + result); buffer.rewind(); buffer.get(data, 0, result); return result; @@ -281,7 +288,9 @@ final class PipeQueueProcessor extends Thread buffer.put(data, written, Math.min(total - written, size)); buffer.rewind(); final int result = usb_interrupt_write(handle, ep, buffer, 5000); - if (result < 0) throw new LibUsbException(result); + if (result < 0) + throw new LibUsbException( + "Unable to write to interrupt endpoint", result); written += result; buffer.rewind(); } diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationDescriptorImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationDescriptorImpl.java index 5a11378..ad283f3 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationDescriptorImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationDescriptorImpl.java @@ -16,7 +16,7 @@ import de.ailis.usb4java.USB_Config_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbConfigurationDescriptorImpl extends +final class UsbConfigurationDescriptorImpl extends UsbDescriptorImpl implements UsbConfigurationDescriptor { diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationImpl.java index 96b386e..3cb9458 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbConfigurationImpl.java @@ -6,7 +6,6 @@ package de.ailis.usb4java.jsr80; import static de.ailis.usb4java.USB.usb_set_altinterface; -import static de.ailis.usb4java.USB.usb_strerror; import java.io.UnsupportedEncodingException; import java.util.ArrayList; @@ -33,7 +32,7 @@ import de.ailis.usb4java.USB_Interface_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbConfigurationImpl implements UsbConfiguration +final class UsbConfigurationImpl implements UsbConfiguration { /** The JSR 80 USB configuration descriptor. */ private final UsbConfigurationDescriptor descriptor; @@ -187,7 +186,9 @@ public final class UsbConfigurationImpl implements UsbConfiguration { final int result = usb_set_altinterface(this.device.open(), iface.getUsbInterfaceDescriptor().bAlternateSetting()); - if (result < 0) throw new UsbException(usb_strerror()); + if (result < 0) + throw new LibUsbException( + "Unable to set alternate interface", result); this.activeSettings.put(number & 0xff, iface); } finally diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbDescriptorImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbDescriptorImpl.java index 745447f..3976a89 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbDescriptorImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbDescriptorImpl.java @@ -18,7 +18,7 @@ import de.ailis.usb4java.USB_Descriptor_Header; * The descriptor type. */ -public abstract class UsbDescriptorImpl +abstract class UsbDescriptorImpl implements UsbDescriptor { /** The low level USB descriptor header. */ diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceDescriptorImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceDescriptorImpl.java index e30d6ca..faaa5b8 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceDescriptorImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceDescriptorImpl.java @@ -16,7 +16,7 @@ import de.ailis.usb4java.USB_Device_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbDeviceDescriptorImpl extends +final class UsbDeviceDescriptorImpl extends UsbDescriptorImpl implements UsbDeviceDescriptor { /** diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceImpl.java index 9161e07..b5dfa09 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceImpl.java @@ -14,7 +14,7 @@ import de.ailis.usb4java.USB_Device; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbDeviceImpl extends AbstractDevice +final class UsbDeviceImpl extends AbstractDevice { /** * Constructor. diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceListenerList.java b/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceListenerList.java index aa931f7..a381dd0 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceListenerList.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbDeviceListenerList.java @@ -17,7 +17,7 @@ import javax.usb.event.UsbDeviceListener; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbDeviceListenerList extends +final class UsbDeviceListenerList extends EventListenerList implements UsbDeviceListener { /** diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointDescriptorImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointDescriptorImpl.java index a8ee79d..50fa565 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointDescriptorImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointDescriptorImpl.java @@ -16,7 +16,7 @@ import de.ailis.usb4java.USB_Endpoint_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbEndpointDescriptorImpl extends +final class UsbEndpointDescriptorImpl extends UsbDescriptorImpl implements UsbEndpointDescriptor { diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointImpl.java index 75d56c8..37acc3e 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbEndpointImpl.java @@ -18,7 +18,7 @@ import javax.usb.UsbPipe; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbEndpointImpl implements UsbEndpoint +final class UsbEndpointImpl implements UsbEndpoint { /** The USB interface this endpoint belongs to. */ private final UsbInterfaceImpl iface; diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbHubImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbHubImpl.java index 1e563b8..06d3a0e 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbHubImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbHubImpl.java @@ -20,8 +20,7 @@ import de.ailis.usb4java.USB_Device; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbHubImpl extends AbstractDevice implements UsbHub, - UsbPorts +final class UsbHubImpl extends AbstractDevice implements UsbHub, UsbPorts { /** The hub ports. */ private final UsbPortsImpl ports = new UsbPortsImpl(this); diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceDescriptorImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceDescriptorImpl.java index 877ce2f..da60a2f 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceDescriptorImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceDescriptorImpl.java @@ -16,7 +16,7 @@ import de.ailis.usb4java.USB_Interface_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbInterfaceDescriptorImpl extends +final class UsbInterfaceDescriptorImpl extends UsbDescriptorImpl implements UsbInterfaceDescriptor { diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceImpl.java index e0207e5..b4d85ed 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbInterfaceImpl.java @@ -33,7 +33,7 @@ import de.ailis.usb4java.USB_Interface_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbInterfaceImpl implements UsbInterface +final class UsbInterfaceImpl implements UsbInterface { /** The USB configuration. */ private final UsbConfigurationImpl configuration; diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbPipeImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbPipeImpl.java index 541e610..bfc809c 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbPipeImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbPipeImpl.java @@ -28,7 +28,7 @@ import javax.usb.util.DefaultUsbIrp; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbPipeImpl implements UsbPipe +final class UsbPipeImpl implements UsbPipe { /** The endpoint this pipe belongs to. */ private final UsbEndpointImpl endpoint; diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbPipeListenerList.java b/src/main/java/de/ailis/usb4java/jsr80/UsbPipeListenerList.java index c8754ca..ad86923 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbPipeListenerList.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbPipeListenerList.java @@ -16,7 +16,7 @@ import javax.usb.event.UsbPipeListener; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbPipeListenerList extends +final class UsbPipeListenerList extends EventListenerList implements UsbPipeListener { /** diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbPortImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbPortImpl.java index 6949839..9de445b 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbPortImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbPortImpl.java @@ -16,7 +16,7 @@ import javax.usb.UsbPort; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbPortImpl implements UsbPort +final class UsbPortImpl implements UsbPort { /** The USB hub this port belongs to. */ private final UsbHub hub; diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbServicesListenerList.java b/src/main/java/de/ailis/usb4java/jsr80/UsbServicesListenerList.java index 6becb23..a8e9059 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbServicesListenerList.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbServicesListenerList.java @@ -15,7 +15,7 @@ import javax.usb.event.UsbServicesListener; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbServicesListenerList extends +final class UsbServicesListenerList extends EventListenerList implements UsbServicesListener { /** diff --git a/src/main/java/de/ailis/usb4java/jsr80/UsbStringDescriptorImpl.java b/src/main/java/de/ailis/usb4java/jsr80/UsbStringDescriptorImpl.java index 6edde6d..b8d62fa 100644 --- a/src/main/java/de/ailis/usb4java/jsr80/UsbStringDescriptorImpl.java +++ b/src/main/java/de/ailis/usb4java/jsr80/UsbStringDescriptorImpl.java @@ -16,7 +16,7 @@ import de.ailis.usb4java.USB_String_Descriptor; * @author Klaus Reimer (k@ailis.de) */ -public final class UsbStringDescriptorImpl extends +final class UsbStringDescriptorImpl extends UsbDescriptorImpl implements UsbStringDescriptor { /**