hdirect-0.21.0: comlib/AutoPrim.idl
/*
Primitive marshalling and invocation functions
needed by Haskell client Automation library.
*/
stub_include("autoPrim.h");
module AutoPrim {
import "SafeArray.idl";
hs_quote("
import Com (checkHR, marshallIUnknown, IUnknown, mkIID, IID, LCID)
import HDirect (Ptr, allocBytes, marshallBool, readref, readStablePtr,
marshallPtr, readPtr, unmarshallref, trivialFree, doThenFree, free,
sizeofInt32, readInt32, unmarshallString, freeString, sizeofInt16,
readInt16, sizeofDouble, readDouble, sizeofFloat, readFloat, Octet,
readBool, sizeofChar, readChar, unmarshallBool,
freeref, sizeofWord8, readWord8, sizeofWord32, readWord32,
StablePtr, sizeofPtr, readPtr, writePtr, sizeofForeignPtr )
import SafeArray ( SAFEARRAY, marshallSAFEARRAY, unmarshallSAFEARRAY, readSAFEARRAY, sizeofSAFEARRAY )
import Pointer ( allocMemory )
import IOExts (unsafePerformIO)
import Int (Int32, Int16)
import Word (Word8, Word32)
import Foreign.ForeignPtr ( ForeignPtr, withForeignPtr )
import Foreign.Ptr
");
hs_quote("
data VARIANT_ = VARIANT_
type VARIANT = Ptr VARIANT_
sizeofBSTR = sizeofPtr
iidIDispatch :: IID (IDispatch ())
iidIDispatch = mkIID \"{00020400-0000-0000-C000-000000000046}\"
sizeofVARIANT :: Word32
sizeofVARIANT = 16
marshallVARIANT :: VARIANT -> IO VARIANT
marshallVARIANT m = return m
unmarshallVARIANT :: Ptr a -> IO VARIANT
unmarshallVARIANT v = return (castPtr v)
readVARIANT :: Ptr VARIANT -> IO VARIANT
readVARIANT ptr =
readPtr ptr
-- unmarshallVARIANT ptr
writeVARIANT :: Ptr VARIANT -> VARIANT -> IO ()
writeVARIANT ptr v = writePtr ptr v
copyVARIANT :: VARIANT -> VARIANT -> IO ()
copyVARIANT ptr v = do
primCopyVARIANT (castPtr ptr) (castPtr v)
-- ToDo: if the passed in variant has a finaliser
-- attached to it, this is the time to disable those.
-- It doesn't at the moment, though.
allocVARIANT :: IO VARIANT
allocVARIANT = do
x <- allocMemory (fromIntegral sizeofVARIANT)
variantInit x
return x
{- BEGIN_GHC_ONLY
foreign import ccall \"writeVarInt\" writeVarStablePtr
END_GHC_ONLY -}
{- BEGIN_NOT_FOR_GHC -}
primitive writeVarStablePtr \"prim_AutoPrim_writeVarInt\"
{- END_NOT_FOR_GHC -}
:: StablePtr a -> Ptr (StablePtr a) -> IO ()
{- BEGIN_GHC_ONLY
foreign import ccall \"readVarInt\" prim_readVarStablePtr
END_GHC_ONLY -}
{- BEGIN_NOT_FOR_GHC -}
primitive prim_readVarStablePtr \"prim_AutoPrim_readVarInt\"
{- END_NOT_FOR_GHC -}
:: Ptr (StablePtr a) -> Ptr b -> IO Int32
readVarStablePtr :: VARIANT -> IO (StablePtr a)
readVarStablePtr p = do
i <- allocBytes (fromIntegral sizeofInt32)
o_readVarInt <- prim_readVarStablePtr (castPtr p) i
checkHR o_readVarInt
doThenFree (freeref trivialFree) (unmarshallref readStablePtr) i
");
typedef long DISPID;
typedef [ptr]void* PEXCEPINFO;
interface IDispatch : IUnknown {} ;
int //HRESULT
dispatchInvoke ( [in]IDispatch* obj
, [in]DISPID dispid
, [in]LCID lcid
, [in]boolean isfunction
, [in]unsigned int flags
, [in]unsigned int cargs
, [in]unsigned int cargsout
, [in,ptr]VARIANT* args
, [in,ptr]VARIANT* argsout
, [out,ref]PEXCEPINFO* info
);
int //HRESULT
dispatchGetMemberID ( [in,ref]IDispatch* obj
, [in,ptr]BSTR* name
, [in]LCID lcid
, [out,ref]DISPID* dispid
);
void freeExcepInfo([in]PEXCEPINFO einfo);
[ptr]char* getExcepInfoMessage ([in]PEXCEPINFO info);
void freeVariants ([in]unsigned int count, [in,ptr]VARIANT* p);
int readVariantTag([in,ptr]VARIANT* p);
void __stdcall VariantInit ([in,ptr]VARIANT* p);
// Family of functions for reading&writing values to a VARIANT.
void writeVarShort ([in]short i, [in,ptr]VARIANT* p);
HRESULT readVarShort ([in,ptr]VARIANT* p, [out,ref]short* i);
void writeVarInt ([in]int i, [in,ptr]VARIANT* p);
HRESULT readVarInt ([in,ptr]VARIANT* p, [out,ref]int* i);
void writeVarWord ([in]unsigned int i, [in,ptr]VARIANT* p);
HRESULT readVarWord ([in,ptr]VARIANT* p, [out,ref]unsigned int* i);
void writeVarFloat ([in]float i, [in,ptr]VARIANT* p);
HRESULT readVarFloat ([in,ptr]VARIANT* p, [out,ref]float* i);
void writeVarDouble ([in]double i, [in,ptr]VARIANT* p);
HRESULT readVarDouble ([in,ptr]VARIANT* p, [out,ref]double* i);
typedef [ignore,ptr]VARIANT* PVARIANT;
typedef [ignore,ptr]char* PCHAR;
void writeVarString ([in,ptr]char* str, [in,ptr]VARIANT* p);
HRESULT readVarString ([in,ptr]VARIANT* p, [out,ptr]PCHAR* pstr, [out,ptr]PVARIANT* w);
void writeVarDispatch ([in,ref]IDispatch ip, [in,ptr]VARIANT* p);
HRESULT readVarDispatch ([in,ptr]VARIANT* p, [out,ptr]void** ip, [out,ptr]PVARIANT* w);
void writeVarOptional ( [in,ptr]VARIANT* p);
void writeVarError ([in]int err, [in,ptr]VARIANT* p);
HRESULT readVarError ([in,ptr]VARIANT* p, [out,ref]int* perr);
void writeVarBool ([in]boolean b, [in,ptr]VARIANT* p);
HRESULT readVarBool ([in,ptr]VARIANT* p, [out,ref]boolean* pb);
void writeVarUnknown ([in,ref]IUnknown ip, [in,ptr]VARIANT* p);
HRESULT readVarUnknown ([in,ptr]VARIANT* p, [out,ptr]void** ip, [out,ptr]PVARIANT* w);
void writeVarByte ([in]byte b, [in,ptr]VARIANT* p);
HRESULT readVarByte ([in,ptr]VARIANT* p, [out,ref]byte* pb);
void writeVarEmpty ([in,ptr]VARIANT* p);
void writeVarNull ([in,ptr]VARIANT* p);
HRESULT readVarNull ([in,ptr]VARIANT* p);
// Also used for Int64.
void writeVarCurrency ([in]int hi, [in]unsigned int lo, [in,ptr]VARIANT* p);
HRESULT readVarCurrency ([in,ptr]VARIANT* p, [out,ref]int* hi, [out,ref]int* lo);
void writeVarWord64 ([in]unsigned long hi, [in]unsigned long lo, [in,ptr]VARIANT* p);
HRESULT readVarWord64 ([in,ptr]VARIANT* p, [out,ref]unsigned long* hi, [out,ref]unsigned long* lo);
void writeVarVariant ([in,ptr]VARIANT* p1, [in,ptr]VARIANT* p2);
HRESULT readVarVariant ([in,ptr]VARIANT* p1, [out,ptr]PVARIANT* p2);
void writeVarSAFEARRAY ([in,ptr]VARIANT* p1, [in,ptr]SAFEARRAY* p2, [in]int vt);
HRESULT readVarSAFEARRAY ([in,ptr]VARIANT* p1, [out,ptr]void* p2, [in]int vt);
HRESULT primCopyVARIANT ([in,ptr]VARIANT* p1, [in,ptr]VARIANT* p2);
HRESULT primVARIANTClear ([in,ptr]VARIANT* p1 );
HRESULT primClockToDate([in]int ct,[out]double* pT);
};