module System.Win32.Com.Automation.SafeArray where
import Prelude
import Data.Int (Int32)
import Data.Word (Word32, Word16)
import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
import Foreign.Ptr (Ptr, FunPtr, castPtr)
import System.IO.Unsafe (unsafePerformIO)
import System.Win32.Com (checkHR)
import System.Win32.Com.Automation.StdTypes (VARTYPE)
import System.Win32.Com.HDirect.HDirect (nullFinaliser, writefptr,
readPtr, sizeofPtr, writeWord32, writeInt32, addNCastPtr,
readWord32, readInt32, allocBytes, free, doThenFree,
sizeofForeignPtr, marshalllist, trivialFree, freeref,
sizeofInt32, marshallref)
import System.Win32.Com.HDirect.Pointer (makeFO)
newtype SAFEARRAY
= SAFEARRAY (ForeignPtr SAFEARRAY)
foreign import ccall "&primSafeArrayDestroy" addrOf_SAFEARRAY_primSafeArrayDestroy :: FunPtr (Ptr SAFEARRAY -> IO ())
marshallSAFEARRAY :: SAFEARRAY
-> IO (ForeignPtr SAFEARRAY)
marshallSAFEARRAY (SAFEARRAY v) = return (v)
unmarshallSAFEARRAY :: Bool
-> Ptr SAFEARRAY
-> IO SAFEARRAY
unmarshallSAFEARRAY finaliseMe__ v =
do
v <- makeFO v (case finaliseMe__ of
False -> nullFinaliser
True -> addrOf_SAFEARRAY_primSafeArrayDestroy)
return (SAFEARRAY v)
writeSAFEARRAY :: Ptr (Ptr SAFEARRAY)
-> SAFEARRAY
-> IO ()
writeSAFEARRAY ptr (SAFEARRAY v) =
writefptr ptr
v
readSAFEARRAY :: Bool
-> Ptr SAFEARRAY
-> IO SAFEARRAY
readSAFEARRAY finaliseMe__ ptr =
do
v <- readPtr ptr
v <- makeFO v (case finaliseMe__ of
False -> nullFinaliser
True -> addrOf_SAFEARRAY_primSafeArrayDestroy)
return (SAFEARRAY v)
sizeofSAFEARRAY :: Word32
sizeofSAFEARRAY = sizeofPtr
addrToSAFEARRAY :: Ptr a
-> SAFEARRAY
addrToSAFEARRAY v =
unsafePerformIO (makeFO (castPtr v) addrOf_SAFEARRAY_primSafeArrayDestroy >>= \ v ->
return (SAFEARRAY v))
data SAFEARRAYBOUND = TagSAFEARRAYBOUND {cElements :: Word32,
lLbound :: Int32}
writeSAFEARRAYBOUND :: Ptr SAFEARRAYBOUND
-> SAFEARRAYBOUND
-> IO ()
writeSAFEARRAYBOUND ptr (TagSAFEARRAYBOUND cElements lLbound) =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
writeWord32 pf1 cElements
let pf2 = addNCastPtr pf1 4
writeInt32 pf2 lLbound
readSAFEARRAYBOUND :: Ptr SAFEARRAYBOUND
-> IO SAFEARRAYBOUND
readSAFEARRAYBOUND ptr =
let
pf0 = ptr
pf1 = addNCastPtr pf0 0
in
do
cElements <- readWord32 pf1
let pf2 = addNCastPtr pf1 4
lLbound <- readInt32 pf2
return (TagSAFEARRAYBOUND cElements lLbound)
sizeofSAFEARRAYBOUND :: Word32
sizeofSAFEARRAYBOUND = 8
safeArrayAccessData :: SAFEARRAY
-> IO (Ptr ())
safeArrayAccessData psa =
do
ppvData <- allocBytes (fromIntegral sizeofPtr)
psa <- marshallSAFEARRAY psa
o_safeArrayAccessData <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayAccessData psa ppvData)
checkHR o_safeArrayAccessData
doThenFree free readPtr ppvData
foreign import stdcall "SafeArrayAccessData" prim_System_Win32_Com_Automation_SafeArray_safeArrayAccessData :: Ptr SAFEARRAY -> Ptr (Ptr ()) -> IO Int32
safeArrayAllocData :: SAFEARRAY
-> IO ()
safeArrayAllocData psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayAllocData <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayAllocData psa)
checkHR o_safeArrayAllocData
foreign import stdcall "SafeArrayAllocData" prim_System_Win32_Com_Automation_SafeArray_safeArrayAllocData :: Ptr SAFEARRAY -> IO Int32
safeArrayAllocDescriptor :: Word32
-> IO SAFEARRAY
safeArrayAllocDescriptor cDims =
do
ppsaOut <- allocBytes (fromIntegral sizeofForeignPtr)
o_safeArrayAllocDescriptor <- prim_System_Win32_Com_Automation_SafeArray_safeArrayAllocDescriptor cDims ppsaOut
checkHR o_safeArrayAllocDescriptor
doThenFree free (readSAFEARRAY True) ppsaOut
foreign import stdcall "SafeArrayAllocDescriptor" prim_System_Win32_Com_Automation_SafeArray_safeArrayAllocDescriptor :: Word32 -> Ptr (Ptr SAFEARRAY) -> IO Int32
safeArrayCopy :: SAFEARRAY
-> IO SAFEARRAY
safeArrayCopy psa =
do
ppsaOut <- allocBytes (fromIntegral sizeofForeignPtr)
psa <- marshallSAFEARRAY psa
o_safeArrayCopy <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayCopy psa ppsaOut)
checkHR o_safeArrayCopy
doThenFree free (readSAFEARRAY True) ppsaOut
foreign import stdcall "SafeArrayCopy" prim_System_Win32_Com_Automation_SafeArray_safeArrayCopy :: Ptr SAFEARRAY -> Ptr (Ptr SAFEARRAY) -> IO Int32
safeArrayCreate :: VARTYPE
-> [SAFEARRAYBOUND]
-> IO SAFEARRAY
safeArrayCreate vt rgsabound =
let
cDims = (fromIntegral (length rgsabound) :: Word32)
in
do
rgsabound <- marshalllist sizeofSAFEARRAYBOUND writeSAFEARRAYBOUND rgsabound
o_safeArrayCreate <- prim_System_Win32_Com_Automation_SafeArray_safeArrayCreate vt cDims rgsabound
freeref trivialFree rgsabound
unmarshallSAFEARRAY True o_safeArrayCreate
foreign import stdcall "SafeArrayCreate" prim_System_Win32_Com_Automation_SafeArray_safeArrayCreate :: Word16 -> Word32 -> Ptr SAFEARRAYBOUND -> IO (Ptr SAFEARRAY)
safeArrayDestroy :: SAFEARRAY
-> IO ()
safeArrayDestroy psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayDestroy <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayDestroy psa)
checkHR o_safeArrayDestroy
foreign import stdcall "SafeArrayDestroy" prim_System_Win32_Com_Automation_SafeArray_safeArrayDestroy :: Ptr SAFEARRAY -> IO Int32
safeArrayDestroyData :: SAFEARRAY
-> IO ()
safeArrayDestroyData psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayDestroyData <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayDestroyData psa)
checkHR o_safeArrayDestroyData
foreign import stdcall "SafeArrayDestroyData" prim_System_Win32_Com_Automation_SafeArray_safeArrayDestroyData :: Ptr SAFEARRAY -> IO Int32
safeArrayDestroyDescriptor :: SAFEARRAY
-> IO ()
safeArrayDestroyDescriptor psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayDestroyDescriptor <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayDestroyDescriptor psa)
checkHR o_safeArrayDestroyDescriptor
foreign import stdcall "SafeArrayDestroyDescriptor" prim_System_Win32_Com_Automation_SafeArray_safeArrayDestroyDescriptor :: Ptr SAFEARRAY -> IO Int32
safeArrayGetDim :: SAFEARRAY
-> IO Word32
safeArrayGetDim psa =
do
psa <- marshallSAFEARRAY psa
withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayGetDim psa)
foreign import stdcall "SafeArrayGetDim" prim_System_Win32_Com_Automation_SafeArray_safeArrayGetDim :: Ptr SAFEARRAY -> IO Word32
safeArrayGetElement :: SAFEARRAY
-> Ptr Int32
-> Ptr ()
-> IO ()
safeArrayGetElement psa rgIndices pv =
do
psa <- marshallSAFEARRAY psa
o_safeArrayGetElement <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayGetElement psa rgIndices pv)
checkHR o_safeArrayGetElement
foreign import stdcall "SafeArrayGetElement" prim_System_Win32_Com_Automation_SafeArray_safeArrayGetElement :: Ptr SAFEARRAY -> Ptr Int32 -> Ptr () -> IO Int32
safeArrayGetElemsize :: SAFEARRAY
-> IO Word32
safeArrayGetElemsize psa =
do
psa <- marshallSAFEARRAY psa
withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayGetElemsize psa)
foreign import stdcall "SafeArrayGetElemsize" prim_System_Win32_Com_Automation_SafeArray_safeArrayGetElemsize :: Ptr SAFEARRAY -> IO Word32
safeArrayGetLBound :: SAFEARRAY
-> Word32
-> IO Int32
safeArrayGetLBound psa nDim =
do
plLbound <- allocBytes (fromIntegral sizeofInt32)
psa <- marshallSAFEARRAY psa
o_safeArrayGetLBound <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayGetLBound psa nDim plLbound)
checkHR o_safeArrayGetLBound
doThenFree free readInt32 plLbound
foreign import stdcall "SafeArrayGetLBound" prim_System_Win32_Com_Automation_SafeArray_safeArrayGetLBound :: Ptr SAFEARRAY -> Word32 -> Ptr Int32 -> IO Int32
safeArrayGetUBound :: SAFEARRAY
-> Word32
-> IO Int32
safeArrayGetUBound psa nDim =
do
plLbound <- allocBytes (fromIntegral sizeofInt32)
psa <- marshallSAFEARRAY psa
o_safeArrayGetUBound <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayGetUBound psa nDim plLbound)
checkHR o_safeArrayGetUBound
doThenFree free readInt32 plLbound
foreign import stdcall "SafeArrayGetUBound" prim_System_Win32_Com_Automation_SafeArray_safeArrayGetUBound :: Ptr SAFEARRAY -> Word32 -> Ptr Int32 -> IO Int32
safeArrayLock :: SAFEARRAY
-> IO ()
safeArrayLock psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayLock <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayLock psa)
checkHR o_safeArrayLock
foreign import stdcall "SafeArrayLock" prim_System_Win32_Com_Automation_SafeArray_safeArrayLock :: Ptr SAFEARRAY -> IO Int32
safeArrayPtrOfIndex :: SAFEARRAY
-> Ptr Int32
-> IO (Ptr ())
safeArrayPtrOfIndex psa rgIndices =
do
ppvData <- allocBytes (fromIntegral sizeofPtr)
psa <- marshallSAFEARRAY psa
o_safeArrayPtrOfIndex <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayPtrOfIndex psa rgIndices ppvData)
checkHR o_safeArrayPtrOfIndex
doThenFree free readPtr ppvData
foreign import stdcall "SafeArrayPtrOfIndex" prim_System_Win32_Com_Automation_SafeArray_safeArrayPtrOfIndex :: Ptr SAFEARRAY -> Ptr Int32 -> Ptr (Ptr ()) -> IO Int32
safeArrayPutElement :: SAFEARRAY
-> Ptr Int32
-> Ptr ()
-> IO ()
safeArrayPutElement psa rgIndices pv =
do
psa <- marshallSAFEARRAY psa
o_safeArrayPutElement <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayPutElement psa rgIndices pv)
checkHR o_safeArrayPutElement
foreign import stdcall "SafeArrayPutElement" prim_System_Win32_Com_Automation_SafeArray_safeArrayPutElement :: Ptr SAFEARRAY -> Ptr Int32 -> Ptr () -> IO Int32
safeArrayRedim :: SAFEARRAY
-> SAFEARRAYBOUND
-> IO ()
safeArrayRedim psa psaboundNew =
do
psa <- marshallSAFEARRAY psa
psaboundNew <- marshallref (allocBytes (fromIntegral sizeofSAFEARRAYBOUND)) writeSAFEARRAYBOUND psaboundNew
o_safeArrayRedim <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayRedim psa psaboundNew)
free psaboundNew
checkHR o_safeArrayRedim
foreign import stdcall "SafeArrayRedim" prim_System_Win32_Com_Automation_SafeArray_safeArrayRedim :: Ptr SAFEARRAY -> Ptr SAFEARRAYBOUND -> IO Int32
safeArrayUnaccessData :: SAFEARRAY
-> IO ()
safeArrayUnaccessData psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayUnaccessData <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayUnaccessData psa)
checkHR o_safeArrayUnaccessData
foreign import stdcall "SafeArrayUnaccessData" prim_System_Win32_Com_Automation_SafeArray_safeArrayUnaccessData :: Ptr SAFEARRAY -> IO Int32
safeArrayUnlock :: SAFEARRAY
-> IO ()
safeArrayUnlock psa =
do
psa <- marshallSAFEARRAY psa
o_safeArrayUnlock <- withForeignPtr psa (\ psa -> prim_System_Win32_Com_Automation_SafeArray_safeArrayUnlock psa)
checkHR o_safeArrayUnlock
foreign import stdcall "SafeArrayUnlock" prim_System_Win32_Com_Automation_SafeArray_safeArrayUnlock :: Ptr SAFEARRAY -> IO Int32