hdirect-0.21.0: comlib/ComPrim.idl
/*
IDL spec. for the primitives needed to implement
a Haskell COM support library.
Note: this spec. is processed as a 'normal' FFI spec,
not a COM one.
*/
stub_include("comPrim.h");
[pointer_default(ptr)]
module ComPrim {
hs_quote("
import Pointer ( makeFO, finalNoFree )
import HDirect
import Foreign.ForeignPtr
import Foreign.Ptr
{- BEGIN_GHC_ONLY
import Dynamic
import GHC.IOBase
--import ForeignObj
END_GHC_ONLY -}
import Int
import Word ( Word32
)
import IOExts ( unsafePerformIO )
import WideString ( WideString, marshallWideString, freeWideString,
readWideString, writeWideString )
import IO ( hPutStrLn, stderr )
data IUnknown_ a = Unknown (ForeignPtr ())
type IUnknown a = IUnknown_ a
type HRESULT = Int32
failed :: HRESULT -> Bool
failed hr = hr < 0
ifaceToAddr :: IUnknown a -> Ptr b
ifaceToAddr (Unknown x) = castPtr (foreignPtrToPtr x)
addrToIPointer :: Bool -> Ptr b -> IO (IUnknown a)
addrToIPointer finaliseMe x = do
i <- makeFO x (castPtrToFunPtr $ if finaliseMe then addrOfReleaseIUnknown else finalNoFree)
return (Unknown i)
marshallIUnknown :: IUnknown a -> IO (ForeignPtr b)
marshallIUnknown (Unknown x) = return (castForeignPtr x)
checkHR :: HRESULT -> IO ()
checkHR hr
| failed hr = coFailHR hr
| otherwise = return ()
coFailHR :: HRESULT -> IO a
coFailHR hr = do
str <- stringFromHR hr
coFailWithHR hr str
{- BEGIN_GHC_ONLY
-- ghc-specific
newtype ComError = ComError Int32
comErrorTc = mkTyCon \"ComError\"
instance Typeable ComError where
typeOf _ = mkAppTy comErrorTc []
coFailWithHR :: HRESULT -> String -> IO a
coFailWithHR hr msg =
ioException (IOError Nothing (DynIOError (toDyn (ComError hr))) \"\" msg Nothing)
END_GHC_ONLY -}
{- BEGIN_NOT_FOR_GHC -}
coPrefix = \"Com error: \"
coFailWithHR :: HRESULT -> String -> IO a
coFailWithHR hr msg = ioError (userError (coPrefix ++ msg ++ showParen True (shows hr) \"\"))
{- END_NOT_FOR_GHC -}
stringFromHR :: HRESULT -> IO String
stringFromHR hr = do
pstr <- hresultString hr -- static memory
unmarshallString (castPtr pstr)
");
HRESULT comInitialize(void);
void comUnInitialize(void);
void _cdecl messageBox([in,ptr]char* str,[in,ptr]char* title,[in]unsigned long flg);
typedef [ptr]void* PIID;
typedef [ptr]void* PCLSID;
typedef [ptr]void* PGUID;
HRESULT primCLSIDFromProgID( [in,ptr]char* str
, [in,ptr]PCLSID rptr
);
HRESULT _cdecl
primProgIDFromCLSID( [in,foreign]PCLSID pclsid
, [out,ref]void** pwide
);
HRESULT _cdecl
primStringToGUID ( [in,ptr]wchar_t* str, [in,ptr]void* pguid);
HRESULT _cdecl
primGUIDToString ( [in,foreign,ptr]PGUID guid, [out,ref]void** str);
HRESULT _cdecl
primCopyGUID ( [in,foreign,ptr]PGUID pguid1, [in,ptr]PGUID pguid2);
HRESULT _cdecl
primNewGUID ([in,foreign,ptr]PGUID pguid);
HRESULT _cdecl
bindObject ( [in,ptr]wchar_t* name
, [in,foreign,ptr]PIID iid
, [out,ptr] void** ppv
);
boolean _cdecl
primComEqual( [in]IUnknown* unk1, [in]IUnknown* unk2 );
[pure]boolean IsEqualGUID ([in,foreign,ptr]PGUID guid1, [in,foreign,ptr]PGUID guid2);
[pure]unsigned long _cdecl lOCALE_USER_DEFAULT();
// Get at the default ICreateTypeLib2 implementation.
HRESULT _cdecl
primCreateTypeLib
( [in] long skind
, [in,string]wchar_t* lpkind
, [out,ptr]void** ppv
);
unsigned int _stdcall GetLastError ();
void* cdecl hresultString([in]int i);
HRESULT _stdcall CoCreateInstance
( [in,foreign]PCLSID clsid
, [in,foreign]void* inner
, [in]int ctxt
, [in,foreign,ptr]PGUID riid
, [in,ptr]void* ppv
);
typedef unsigned long ULONG;
typedef unsigned int DWORD;
typedef struct _COAUTHIDENTITY {
[string,size_is(UserLength)]USHORT* User;
ULONG UserLength;
[string,size_is(DomainLength)]USHORT* Domain;
ULONG DomainLength;
[string,size_is(PasswordLength)]USHORT* Password;
ULONG PasswordLength;
ULONG Flags;
} COAUTHIDENTITY;
typedef struct _COAUTHINFO {
DWORD dwAuthnSvc;
DWORD dwAuthzSvc;
[string]wchar_t* pwszServerPrincName;
DWORD dwAuthnLevel;
DWORD dwImpersonationLevel;
[unique]COAUTHIDENTITY* pAuthIdentityData;
DWORD dwCapabilities;
} COAUTHINFO;
typedef struct _COSERVERINFO {
DWORD dwReserved1;
[string]wchar_t* pwszName;
[unique]COAUTHINFO* pAuthInfo;
DWORD dwReserved2;
} COSERVERINFO;
typedef struct _MULTI_QI {
[ptr]PGUID pIID;
[ptr]void* pItf;
HRESULT hr;
} MULTI_QI_PRIM;
HRESULT _stdcall CoCreateInstanceEx
( [in,foreign]PCLSID clsid
, [in,foreign]void* pUnkOuter
, [in]DWORD dwClsCtx
, [in,unique]COSERVERINFO* pServerInfo
, [in]ULONG cmq
, [in,out,size_is(cmq),length_is(cmq)]MULTI_QI_PRIM* pResults
);
HRESULT _stdcall GetActiveObject
( [in,foreign]PCLSID clsid
, [in,ptr]void* inner // should be a foreign
, [in,ptr]void* ppv
);
HRESULT _cdecl
primQI ( [in,ptr]void* methPtr
, [in,ptr]void* iptr
, [in,foreign]PCLSID riid
, [in,ptr]void** ppv
);
unsigned int _cdecl
primAddRef
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
);
unsigned int _cdecl
primRelease
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
);
HRESULT _cdecl
primEnumNext
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
, [in]unsigned int celt
, [in,ptr]void* ptr
, [in,ptr]void* po
);
HRESULT _cdecl
primEnumSkip
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
, [in]unsigned int celt
);
HRESULT _cdecl
primEnumReset
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
);
HRESULT _cdecl
primEnumClone
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
, [in,ptr]void* ppv
);
HRESULT _stdcall
primPersistLoad
( [in,ptr]void* methPtr
, [in,ptr]void* iptr
, [in,ptr]wchar_t* pszFileName
, [in]unsigned int dwMode
);
void* _cdecl primNullIID();
HRESULT _stdcall LoadTypeLib
( [in,ptr]wchar_t* pfname
, [in,ptr]void* ptr
);
HRESULT _stdcall LoadTypeLibEx
( [in,ptr]wchar_t* pfname
, [in]int rkind
, [in,ptr]void* ptr
);
HRESULT _stdcall LoadRegTypeLib
( [in,foreign,ptr]PGUID pguid
, [in]int maj
, [in]int min
, [in]int lcid
, [in,ptr]void* ptr
);
[ptr]wchar_t*
_cdecl primQueryPathOfRegTypeLib
( [in,foreign,ptr]PGUID pgd
, [in]unsigned short maj
, [in]unsigned short min
);
[pure]void* addrOfReleaseIUnknown();
//
// BSTR operations
//
HRESULT _cdecl bstrToStringLen ([in,ptr]BSTR* bstr,[in]int len, [in,ptr]char* str);
// length of bstrs (in 8-bit byte units).
[pure]int _cdecl bstrLen ([in,ptr]BSTR* bstr);
HRESULT _cdecl stringToBSTR ([in,ptr]BSTR* bstr, [out,ptr]BSTR* res);
[string]char* _cdecl getModuleFileName ( [in,ptr]void* hModule);
// Used by stand-alone clients to
void _cdecl messagePump();
void _cdecl postQuitMsg();
// a little bit of useful Win32 functionality seeping through.
[call_as("OutputDebugString")]
void primOutputDebugString( [in,string]char* msg );
void primGetVersionInfo
( [out,ref]unsigned long* maj
, [out,ref]unsigned long* min
, [out,ref]unsigned long* pid
);
HRESULT _stdcall
CoRegisterClassObject
( [in,foreign]PCLSID rclsid
, [in,foreign]void* pUnk
, [in] long dwClsContext
, [in] long flags
, [out,ref] unsigned long* lpwRegister
);
}