hwinfo-streamdeck/internal/hwinfo/util/util.go

62 lines
1.3 KiB
Go
Raw Normal View History

2023-10-31 20:16:41 -04:00
package util
import "C"
import (
"errors"
"fmt"
"log"
"strings"
"unsafe"
"golang.org/x/text/encoding/charmap"
)
// ErrFileNotFound Windows error
var ErrFileNotFound = errors.New("file not found")
// ErrInvalidHandle Windows error
var ErrInvalidHandle = errors.New("invalid handle")
// UnknownError unhandled Windows error
type UnknownError struct {
Code uint64
}
func (e UnknownError) Error() string {
return fmt.Sprintf("unknown error code: %d", e.Code)
}
// HandleLastError converts C.GetLastError() to golang error
func HandleLastError(code uint64) error {
switch code {
case 2: // ERROR_FILE_NOT_FOUND
return ErrFileNotFound
case 6: // ERROR_INVALID_HANDLE
return ErrInvalidHandle
default:
return UnknownError{Code: code}
}
}
func goStringFromPtr(ptr unsafe.Pointer, len int) string {
s := C.GoStringN((*C.char)(ptr), C.int(len))
return s[:strings.IndexByte(s, 0)]
}
// DecodeCharPtr decodes ISO8859_1 string to UTF-8
func DecodeCharPtr(ptr unsafe.Pointer, len int) string {
s := goStringFromPtr(ptr, len)
ds, err := decodeISO8859_1(s)
if err != nil {
log.Fatalf("TODO: failed to decode: %v", err)
}
return ds
}
var isodecoder = charmap.ISO8859_1.NewDecoder()
func decodeISO8859_1(in string) (string, error) {
return isodecoder.String(in)
}