def getStringDescriptor(self, descriptor, lang_id): """ Fetch description string for given descriptor and in given language. Use getSupportedLanguageList to know which languages are available. Return value is an unicode string. Return None if there is no such descriptor on device. """ descriptor_string = create_unicode_buffer( STRING_LENGTH / sizeof(c_wchar)) result = libusb1.libusb_get_string_descriptor(self.__handle, descriptor, lang_id, descriptor_string, sizeof(descriptor_string)) if result == libusb1.LIBUSB_ERROR_NOT_FOUND: return None if result < 0: raise libusb1.USBError(result) return descriptor_string.value
def getSupportedLanguageList(self): """ Return a list of USB language identifiers (as integers) supported by current device for its string descriptors. """ descriptor_string = create_binary_buffer(STRING_LENGTH) result = libusb1.libusb_get_string_descriptor(self.__handle, 0, 0, descriptor_string, sizeof(descriptor_string)) if result < 0: if result == libusb1.LIBUSB_ERROR_PIPE: # From libusb_control_transfer doc: # control request not supported by the device return [] raise libusb1.USBError(result) length = cast(descriptor_string, POINTER(c_ubyte))[0] langid_list = cast(descriptor_string, POINTER(c_uint16)) result = [] append = result.append for offset in xrange(1, length / 2): append(libusb1.libusb_le16_to_cpu(langid_list[offset])) return result