-- Automatically generated by HaskellDirect (ihc.exe), snapshot 171208
-- Created: 23:37 Pacific Standard Time, Wednesday 17 December, 2008
-- Command line: -fno-qualified-names -fhs-to-c -fcomlib -fno-export-lists --gen-headers -fout-pointers-are-not-refs --gen-headers -c System/Win32/Com/Automation/SafeArray.idl -o System/Win32/Com/Automation/SafeArray.hs

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)

{- BEGIN_C_CODE
#if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(mingw32_BUILD_OS)
END_C_CODE-}
{- BEGIN_C_CODE
#include <w32api.h>
END_C_CODE-}
{- BEGIN_C_CODE
#endif
END_C_CODE-}
{- BEGIN_C_CODE
#if !defined(_MSC_VER) && __W32API_MAJOR_VERSION >= 1
END_C_CODE-}
-- --------------------------------------------------
-- 
-- interface SAFEARRAY
-- 
-- --------------------------------------------------
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
{- BEGIN_C_CODE
#endif
END_C_CODE-}