github.com/ContinuumLLC/godep-go-ole-go-ole@v1.2.0/safearrayconversion.go (about) 1 // Helper for converting SafeArray to array of objects. 2 3 package ole 4 5 import "unsafe" 6 7 type SafeArrayConversion struct { 8 Array *SafeArray 9 } 10 11 func (sac *SafeArrayConversion) ToStringArray() (strings []string) { 12 totalElements, _ := sac.TotalElements(0) 13 strings = make([]string, totalElements) 14 15 for i := int64(0); i < totalElements; i++ { 16 strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i) 17 } 18 19 return 20 } 21 22 func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) { 23 totalElements, _ := sac.TotalElements(0) 24 bytes = make([]byte, totalElements) 25 26 for i := int64(0); i < totalElements; i++ { 27 ptr, _ := safeArrayGetElement(sac.Array, i) 28 bytes[int32(i)] = *(*byte)(unsafe.Pointer(&ptr)) 29 } 30 31 return 32 } 33 34 func (sac *SafeArrayConversion) GetType() (varType uint16, err error) { 35 return safeArrayGetVartype(sac.Array) 36 } 37 38 func (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) { 39 return safeArrayGetDim(sac.Array) 40 } 41 42 func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) { 43 return safeArrayGetElementSize(sac.Array) 44 } 45 46 func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int64, err error) { 47 if index < 1 { 48 index = 1 49 } 50 51 // Get array bounds 52 var LowerBounds int64 53 var UpperBounds int64 54 55 LowerBounds, err = safeArrayGetLBound(sac.Array, index) 56 if err != nil { 57 return 58 } 59 60 UpperBounds, err = safeArrayGetUBound(sac.Array, index) 61 if err != nil { 62 return 63 } 64 65 totalElements = UpperBounds - LowerBounds + 1 66 return 67 } 68 69 // Release Safe Array memory 70 func (sac *SafeArrayConversion) Release() { 71 safeArrayDestroy(sac.Array) 72 }