support string descriptor
This commit is contained in:
parent
e6926d7d6a
commit
682df2c04a
|
@ -73,6 +73,20 @@ std::wstring ansi2unicode(const char* ansi, UINT cp = CP_ACP)
|
|||
|
||||
return unic;
|
||||
}
|
||||
std::string unicode2ansi(const wchar_t* unic, UINT cp = CP_ACP)
|
||||
{
|
||||
int len = WideCharToMultiByte(cp, 0, unic, lstrlenW(unic), NULL, 0, NULL, NULL);
|
||||
char *buf = new char[len + 4];
|
||||
|
||||
memset(buf, 0, len + 4);
|
||||
len = WideCharToMultiByte(cp, 0, unic, lstrlenW(unic), buf, len, NULL, NULL);
|
||||
buf[len--] = 0;
|
||||
|
||||
std::string ansi(buf);
|
||||
delete[] buf;
|
||||
|
||||
return ansi;
|
||||
}
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// OVERLAPPED ...
|
||||
ovl_cls::ovl_cls(uint32_t type) : ref_(1), io_bytes_(0), type_(type)
|
||||
|
@ -387,6 +401,16 @@ bool usb_device::init(void)
|
|||
COPY_MEMBER(dev_desc_, &info->ConnectionInfo->DeviceDescriptor, iSerialNumber);
|
||||
COPY_MEMBER(dev_desc_, &info->ConnectionInfo->DeviceDescriptor, bNumConfigurations);
|
||||
}
|
||||
PSTRING_DESCRIPTOR_NODE strdesc = info->StringDescs;
|
||||
while (strdesc)
|
||||
{
|
||||
STRCFG sc;
|
||||
sc.id = strdesc->DescriptorIndex;
|
||||
sc.val = strdesc->StringDescriptor ? unicode2ansi(strdesc->StringDescriptor->bString) : "";
|
||||
str_cfg_.push_back(sc);
|
||||
|
||||
strdesc = strdesc->Next;
|
||||
}
|
||||
if (info->ConfigDesc)
|
||||
{
|
||||
libusb_config_descriptor* desc = NULL;
|
||||
|
@ -469,6 +493,7 @@ void usb_device::clear(void)
|
|||
{
|
||||
close();
|
||||
|
||||
str_cfg_.clear();
|
||||
if (dev_desc_)
|
||||
delete dev_desc_;
|
||||
dev_desc_ = NULL;
|
||||
|
@ -534,6 +559,23 @@ int usb_device::get_config_descriptor(int index, libusb_config_descriptor** desc
|
|||
|
||||
return LIBUSB_SUCCESS;
|
||||
}
|
||||
int usb_device::get_config_string(uint8_t desc_index, unsigned char* data, int length)
|
||||
{
|
||||
for (auto& v : str_cfg_)
|
||||
{
|
||||
if (v.id == desc_index)
|
||||
{
|
||||
if (length < v.val.length())
|
||||
memcpy(data, v.val.c_str(), length);
|
||||
else
|
||||
strcpy((char*)data, v.val.c_str());
|
||||
|
||||
return LIBUSB_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
return LIBUSB_ERROR_NOT_FOUND;
|
||||
}
|
||||
int usb_device::open(libusb_device_handle** dev_handle)
|
||||
{
|
||||
if (handle_)
|
||||
|
@ -1249,6 +1291,7 @@ void usb_monitor::quit(void)
|
|||
std::lock_guard<std::mutex> lock(lock_);
|
||||
for (auto& v : devices_)
|
||||
v->release();
|
||||
devices_.clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1503,3 +1546,8 @@ int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer* transfer/*in wind
|
|||
{
|
||||
return ((usb_device*)transfer)->cancel_io();
|
||||
}
|
||||
int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle* dev_handle,
|
||||
uint8_t desc_index, unsigned char* data, int length)
|
||||
{
|
||||
return ((usb_device*)dev_handle)->get_config_string(desc_index, data, length);
|
||||
}
|
||||
|
|
|
@ -104,6 +104,13 @@ class usb_device // consider as libusb_device
|
|||
libusb_device_descriptor *dev_desc_;
|
||||
std::vector<libusb_config_descriptor*> cfg_desc_;
|
||||
|
||||
typedef struct _str_cfg
|
||||
{
|
||||
int id;
|
||||
std::string val;
|
||||
}STRCFG;
|
||||
std::vector<STRCFG> str_cfg_;
|
||||
|
||||
typedef struct _usb_pipe
|
||||
{
|
||||
UCHAR address;
|
||||
|
@ -149,6 +156,7 @@ public:
|
|||
void clear(void);
|
||||
int get_descriptor(libusb_device_descriptor* desc);
|
||||
int get_config_descriptor(int index, libusb_config_descriptor** desc);
|
||||
int get_config_string(uint8_t desc_index, unsigned char* data, int length);
|
||||
int open(libusb_device_handle** dev_handle);
|
||||
int close(void);
|
||||
int set_timeout(unsigned milliseconds);
|
||||
|
|
Loading…
Reference in New Issue