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  }