safearrayconversion.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Helper for converting SafeArray to array of objects.
  2. package ole
  3. import (
  4. "unsafe"
  5. )
  6. type SafeArrayConversion struct {
  7. Array *SafeArray
  8. }
  9. func (sac *SafeArrayConversion) ToStringArray() (strings []string) {
  10. totalElements, _ := sac.TotalElements(0)
  11. strings = make([]string, totalElements)
  12. for i := int32(0); i < totalElements; i++ {
  13. strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i)
  14. }
  15. return
  16. }
  17. func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) {
  18. totalElements, _ := sac.TotalElements(0)
  19. bytes = make([]byte, totalElements)
  20. for i := int32(0); i < totalElements; i++ {
  21. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)]))
  22. }
  23. return
  24. }
  25. func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) {
  26. totalElements, _ := sac.TotalElements(0)
  27. values = make([]interface{}, totalElements)
  28. vt, _ := safeArrayGetVartype(sac.Array)
  29. for i := int32(0); i < totalElements; i++ {
  30. switch VT(vt) {
  31. case VT_BOOL:
  32. var v bool
  33. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  34. values[i] = v
  35. case VT_I1:
  36. var v int8
  37. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  38. values[i] = v
  39. case VT_I2:
  40. var v int16
  41. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  42. values[i] = v
  43. case VT_I4:
  44. var v int32
  45. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  46. values[i] = v
  47. case VT_I8:
  48. var v int64
  49. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  50. values[i] = v
  51. case VT_UI1:
  52. var v uint8
  53. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  54. values[i] = v
  55. case VT_UI2:
  56. var v uint16
  57. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  58. values[i] = v
  59. case VT_UI4:
  60. var v uint32
  61. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  62. values[i] = v
  63. case VT_UI8:
  64. var v uint64
  65. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  66. values[i] = v
  67. case VT_R4:
  68. var v float32
  69. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  70. values[i] = v
  71. case VT_R8:
  72. var v float64
  73. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  74. values[i] = v
  75. case VT_BSTR:
  76. var v string
  77. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  78. values[i] = v
  79. case VT_VARIANT:
  80. var v VARIANT
  81. safeArrayGetElement(sac.Array, i, unsafe.Pointer(&v))
  82. values[i] = v.Value()
  83. default:
  84. // TODO
  85. }
  86. }
  87. return
  88. }
  89. func (sac *SafeArrayConversion) GetType() (varType uint16, err error) {
  90. return safeArrayGetVartype(sac.Array)
  91. }
  92. func (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) {
  93. return safeArrayGetDim(sac.Array)
  94. }
  95. func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) {
  96. return safeArrayGetElementSize(sac.Array)
  97. }
  98. func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int32, err error) {
  99. if index < 1 {
  100. index = 1
  101. }
  102. // Get array bounds
  103. var LowerBounds int32
  104. var UpperBounds int32
  105. LowerBounds, err = safeArrayGetLBound(sac.Array, index)
  106. if err != nil {
  107. return
  108. }
  109. UpperBounds, err = safeArrayGetUBound(sac.Array, index)
  110. if err != nil {
  111. return
  112. }
  113. totalElements = UpperBounds - LowerBounds + 1
  114. return
  115. }
  116. // Release Safe Array memory
  117. func (sac *SafeArrayConversion) Release() {
  118. safeArrayDestroy(sac.Array)
  119. }