Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions handle.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ package libusb
// #include <libusb.h>
import "C"
import (
"encoding/binary"
"runtime"
"unicode/utf16"
"unsafe"
)

Expand Down Expand Up @@ -65,12 +67,21 @@ func (dh *DeviceHandle) StringDescriptor(
return "", ErrorCode(usberr)
}

// Convert to Go string
if len(cData) > 0 {
data := (*C.char)(unsafe.Pointer(&cData[0]))
return C.GoString(data), nil
data := C.GoBytes(unsafe.Pointer(dataPtr), C.int(usberr))
if len(data) <= 2 {
return "", nil
}

utf16Data := data[2:]
if len(utf16Data)%2 != 0 {
utf16Data = utf16Data[:len(utf16Data)-1]
}
return "", nil

codeUnits := make([]uint16, len(utf16Data)/2)
for i := range codeUnits {
codeUnits[i] = binary.LittleEndian.Uint16(utf16Data[i*2:])
}
return string(utf16.Decode(codeUnits)), nil
}

// StringDescriptorASCII retrieve(s) a string descriptor in C style ASCII.
Expand All @@ -90,18 +101,14 @@ func (dh *DeviceHandle) StringDescriptorASCII(
if len(data) > 0 {
dataPtr = (*C.uchar)(unsafe.Pointer(&data[0]))
}
bytesRead, err := C.libusb_get_string_descriptor_ascii(
bytesRead := C.libusb_get_string_descriptor_ascii(
dh.libusbDeviceHandle,
C.uint8_t(descIndex),
// Unsafe pointer -> https://stackoverflow.com/a/16376039/95592
dataPtr,
C.int(length),
)

// Check both bytesRead and err
if err != nil {
return "", err
}
if bytesRead < 0 {
return "", ErrorCode(bytesRead)
}
Expand Down