aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/go-ole/go-ole/utility.go
blob: 99ee82dc345154650d9c1377c6075bab91055f10 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package ole

import (
    "unicode/utf16"
    "unsafe"
)

// ClassIDFrom retrieves class ID whether given is program ID or application string.
//
// Helper that provides check against both Class ID from Program ID and Class ID from string. It is
// faster, if you know which you are using, to use the individual functions, but this will check
// against available functions for you.
func ClassIDFrom(programID string) (classID *GUID, err error) {
    classID, err = CLSIDFromProgID(programID)
    if err != nil {
        classID, err = CLSIDFromString(programID)
        if err != nil {
            return
        }
    }
    return
}

// BytePtrToString converts byte pointer to a Go string.
func BytePtrToString(p *byte) string {
    a := (*[10000]uint8)(unsafe.Pointer(p))
    i := 0
    for a[i] != 0 {
        i++
    }
    return string(a[:i])
}

// UTF16PtrToString is alias for LpOleStrToString.
//
// Kept for compatibility reasons.
func UTF16PtrToString(p *uint16) string {
    return LpOleStrToString(p)
}

// LpOleStrToString converts COM Unicode to Go string.
func LpOleStrToString(p *uint16) string {
    if p == nil {
        return ""
    }

    length := lpOleStrLen(p)
    a := make([]uint16, length)

    ptr := unsafe.Pointer(p)

    for i := 0; i < int(length); i++ {
        a[i] = *(*uint16)(ptr)
        ptr = unsafe.Pointer(uintptr(ptr) + 2)
    }

    return string(utf16.Decode(a))
}

// BstrToString converts COM binary string to Go string.
func BstrToString(p *uint16) string {
    if p == nil {
        return ""
    }
    length := SysStringLen((*int16)(unsafe.Pointer(p)))
    a := make([]uint16, length)

    ptr := unsafe.Pointer(p)

    for i := 0; i < int(length); i++ {
        a[i] = *(*uint16)(ptr)
        ptr = unsafe.Pointer(uintptr(ptr) + 2)
    }
    return string(utf16.Decode(a))
}

// lpOleStrLen returns the length of Unicode string.
func lpOleStrLen(p *uint16) (length int64) {
    if p == nil {
        return 0
    }

    ptr := unsafe.Pointer(p)

    for i := 0; ; i++ {
        if 0 == *(*uint16)(ptr) {
            length = int64(i)
            break
        }
        ptr = unsafe.Pointer(uintptr(ptr) + 2)
    }
    return
}

// convertHresultToError converts syscall to error, if call is unsuccessful.
func convertHresultToError(hr uintptr, r2 uintptr, ignore error) (err error) {
    if hr != 0 {
        err = NewError(hr)
    }
    return
}