// Path: src/main/java/org/usb4java/javax/descriptors/SimpleUsbStringDescriptor.java
// public final class SimpleUsbStringDescriptor extends SimpleUsbDescriptor
//     implements UsbStringDescriptor
// {
//     /** The serial version UID. */
//     private static final long serialVersionUID = 1L;
// 
//     /** The string data in UTF-16LE encoding. */
//     private final byte[] bString;
// 
//     /**
//      * Constructs a new string descriptor by reading the descriptor data
//      * from the specified byte buffer.
//      * 
//      * @param data
//      *            The descriptor data as a byte buffer.
//      */
//     public SimpleUsbStringDescriptor(final ByteBuffer data)
//     {
//         super(data.get(0), data.get(1));
// 
//         data.position(2);
//         this.bString = new byte[bLength() - 2];
//         data.get(this.bString);
//     }
// 
//     /**
//      * Constructs a new string descriptor with the specified data.
//      * 
//      * @param bLength
//      *            The descriptor length.
//      * @param bDescriptorType
//      *            The descriptor type.
//      * @param string
//      *            The string.
//      * @throws UnsupportedEncodingException
//      *             When system does not support UTF-16LE encoding.
//      */
//     public SimpleUsbStringDescriptor(final byte bLength,
//         final byte bDescriptorType, final String string)
//         throws UnsupportedEncodingException
//     {
//         super(bLength, bDescriptorType);
//         this.bString = string.getBytes("UTF-16LE");
//     }
// 
//     /**
//      * Copy constructor.
//      * 
//      * @param descriptor
//      *            The descriptor from which to copy the data.
//      */
//     public SimpleUsbStringDescriptor(final UsbStringDescriptor descriptor)
//     {
//         super(descriptor.bLength(), descriptor.bDescriptorType());
//         this.bString = descriptor.bString().clone();
//     }
// 
//     @Override
//     public byte[] bString()
//     {
//         return this.bString.clone();
//     }
// 
//     @Override
//     public String getString() throws UnsupportedEncodingException
//     {
//         return new String(this.bString, "UTF-16LE");
//     }
// 
//     @Override
//     public boolean equals(final Object obj)
//     {
//         if (this == obj) return true;
//         if (obj == null || getClass() != obj.getClass()) return false;
//         final SimpleUsbStringDescriptor other = (SimpleUsbStringDescriptor) obj;
//         return new EqualsBuilder()
//             .append(bLength(), other.bLength())
//             .append(bDescriptorType(), other.bDescriptorType())
//             .append(this.bString, other.bString)
//             .isEquals();
//     }
// 
//     @Override
//     public int hashCode()
//     {
//         return new HashCodeBuilder()
//             .append(bDescriptorType())
//             .append(bLength())
//             .append(this.bString)
//             .toHashCode();
//     }
// 
//     @Override
//     public String toString()
//     {
//         return new String(this.bString, Charset.forName("UTF-16LE"));
//     }
// }


import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.usb.UsbClaimException;
import javax.usb.UsbConst;
import javax.usb.UsbControlIrp;
import javax.usb.UsbDevice;
import javax.usb.UsbDeviceDescriptor;
import javax.usb.UsbDisconnectedException;
import javax.usb.UsbException;
import javax.usb.UsbPlatformException;
import javax.usb.UsbPort;
import javax.usb.UsbStringDescriptor;
import javax.usb.event.UsbDeviceEvent;
import javax.usb.event.UsbDeviceListener;
import javax.usb.util.DefaultUsbControlIrp;
import org.usb4java.ConfigDescriptor;
import org.usb4java.Device;
import org.usb4java.DeviceHandle;
import org.usb4java.LibUsb;
import org.usb4java.javax.descriptors.SimpleUsbStringDescriptor;

    @Override
    public final boolean isConfigured()
    {
        return getActiveUsbConfigurationNumber() != 0;
    }

    @Override
    public final UsbDeviceDescriptor getUsbDeviceDescriptor()
    {
        return this.id.getDeviceDescriptor();
    }

    @Override
    public final UsbStringDescriptor getUsbStringDescriptor(final byte index)
        throws UsbException
    {
        checkConnected();
        final short[] languages = getLanguages();
        final DeviceHandle handle = open();
        final short langId = languages.length == 0 ? 0 : languages[0];
        final ByteBuffer data = ByteBuffer.allocateDirect(256);
        final int result =
            LibUsb.getStringDescriptor(handle, index, langId, data);
        if (result < 0)
        {
            throw ExceptionUtils.createPlatformException(
                "Unable to get string descriptor " + index + " from device "
                    + this, result);
        }
// Path: src/main/java/org/usb4java/javax/descriptors/SimpleUsbStringDescriptor.java
// public final class SimpleUsbStringDescriptor extends SimpleUsbDescriptor
//     implements UsbStringDescriptor
// {
//     /** The serial version UID. */
//     private static final long serialVersionUID = 1L;
// 
//     /** The string data in UTF-16LE encoding. */
//     private final byte[] bString;
// 
//     /**
//      * Constructs a new string descriptor by reading the descriptor data
//      * from the specified byte buffer.
//      * 
//      * @param data
//      *            The descriptor data as a byte buffer.
//      */
//     public SimpleUsbStringDescriptor(final ByteBuffer data)
//     {
//         super(data.get(0), data.get(1));
// 
//         data.position(2);
//         this.bString = new byte[bLength() - 2];
//         data.get(this.bString);
//     }
// 
//     /**
//      * Constructs a new string descriptor with the specified data.
//      * 
//      * @param bLength
//      *            The descriptor length.
//      * @param bDescriptorType
//      *            The descriptor type.
//      * @param string
//      *            The string.
//      * @throws UnsupportedEncodingException
//      *             When system does not support UTF-16LE encoding.
//      */
//     public SimpleUsbStringDescriptor(final byte bLength,
//         final byte bDescriptorType, final String string)
//         throws UnsupportedEncodingException
//     {
//         super(bLength, bDescriptorType);
//         this.bString = string.getBytes("UTF-16LE");
//     }
// 
//     /**
//      * Copy constructor.
//      * 
//      * @param descriptor
//      *            The descriptor from which to copy the data.
//      */
//     public SimpleUsbStringDescriptor(final UsbStringDescriptor descriptor)
//     {
//         super(descriptor.bLength(), descriptor.bDescriptorType());
//         this.bString = descriptor.bString().clone();
//     }
// 
//     @Override
//     public byte[] bString()
//     {
//         return this.bString.clone();
//     }
// 
//     @Override
//     public String getString() throws UnsupportedEncodingException
//     {
//         return new String(this.bString, "UTF-16LE");
//     }
// 
//     @Override
//     public boolean equals(final Object obj)
//     {
//         if (this == obj) return true;
//         if (obj == null || getClass() != obj.getClass()) return false;
//         final SimpleUsbStringDescriptor other = (SimpleUsbStringDescriptor) obj;
//         return new EqualsBuilder()
//             .append(bLength(), other.bLength())
//             .append(bDescriptorType(), other.bDescriptorType())
//             .append(this.bString, other.bString)
//             .isEquals();
//     }
// 
//     @Override
//     public int hashCode()
//     {
//         return new HashCodeBuilder()
//             .append(bDescriptorType())
//             .append(bLength())
//             .append(this.bString)
//             .toHashCode();
//     }
// 
//     @Override
//     public String toString()
//     {
//         return new String(this.bString, Charset.forName("UTF-16LE"));
//     }
// }


// Path: src/main/java/org/usb4java/javax/AbstractDevice.java
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.usb.UsbClaimException;
import javax.usb.UsbConst;
import javax.usb.UsbControlIrp;
import javax.usb.UsbDevice;
import javax.usb.UsbDeviceDescriptor;
import javax.usb.UsbDisconnectedException;
import javax.usb.UsbException;
import javax.usb.UsbPlatformException;
import javax.usb.UsbPort;
import javax.usb.UsbStringDescriptor;
import javax.usb.event.UsbDeviceEvent;
import javax.usb.event.UsbDeviceListener;
import javax.usb.util.DefaultUsbControlIrp;
import org.usb4java.ConfigDescriptor;
import org.usb4java.Device;
import org.usb4java.DeviceHandle;
import org.usb4java.LibUsb;
import org.usb4java.javax.descriptors.SimpleUsbStringDescriptor;


    @Override
    public final boolean isConfigured()
    {
        return getActiveUsbConfigurationNumber() != 0;
    }

    @Override
    public final UsbDeviceDescriptor getUsbDeviceDescriptor()
    {
        return this.id.getDeviceDescriptor();
    }

    @Override
    public final UsbStringDescriptor getUsbStringDescriptor(final byte index)
        throws UsbException
    {
        checkConnected();
        final short[] languages = getLanguages();
        final DeviceHandle handle = open();
        final short langId = languages.length == 0 ? 0 : languages[0];
        final ByteBuffer data = ByteBuffer.allocateDirect(256);
        final int result =
            LibUsb.getStringDescriptor(handle, index, langId, data);
        if (result < 0)
        {
            throw ExceptionUtils.createPlatformException(
                "Unable to get string descriptor " + index + " from device "
                    + this, result);
        }
        return new SimpleUsbStringDescriptor(data);