/*
 * Defines the COM interfaces and APIs related to OLE automation support.
 *
 * Copyright (C) the Wine project
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE_WINE_OBJ_OLEAUT_H
#define __WINE_WINE_OBJ_OLEAUT_H


DEFINE_OLEGUID(IID_StdOle, 0x00020430,0,0);

/*****************************************************************************
 * Predeclare the interfaces
 */
DEFINE_OLEGUID(IID_IDispatch,       0x00020400,0,0);
typedef struct IDispatch IDispatch,*LPDISPATCH;

DEFINE_OLEGUID(IID_ITypeInfo,       0x00020401,0,0);
typedef struct ITypeInfo ITypeInfo,*LPTYPEINFO;

DEFINE_OLEGUID(IID_ITypeLib,        0x00020402,0,0);
typedef struct ITypeLib ITypeLib,*LPTYPELIB;

DEFINE_OLEGUID(IID_ITypeComp,       0x00020403,0,0);
typedef struct ITypeComp ITypeComp,*LPTYPECOMP;

DEFINE_OLEGUID(IID_IEnumVARIANT,    0x00020404,0,0);
typedef struct IEnumVARIANT IEnumVARIANT,*LPENUMVARIANT;

DEFINE_OLEGUID(IID_ICreateTypeInfo, 0x00020405,0,0);
typedef struct ICreateTypeInfo ICreateTypeInfo,*LPCREATETYPEINFO;

DEFINE_OLEGUID(IID_ICreateTypeLib,  0x00020406,0,0);
typedef struct ICreateTypeLib ICreateTypeLib,*LPCREATETYPELIB;

DEFINE_OLEGUID(IID_ICreateTypeInfo2,0x0002040E,0,0);
typedef struct ICreateTypeInfo2 ICreateTypeInfo2,*LPCREATETYPEINFO2;

DEFINE_OLEGUID(IID_ICreateTypeLib2, 0x0002040F,0,0);
typedef struct ICreateTypeLib2 ICreateTypeLib2,*LPCREATETYPELIB2;

DEFINE_OLEGUID(IID_ITypeChangeEvents,0x00020410,0,0);
typedef struct ITypeChangeEvents ITypeChangeEvents,*LPTYPECHANGEEVENTS;

DEFINE_OLEGUID(IID_ITypeLib2,       0x00020411,0,0);
typedef struct ITypeLib2 ITypeLib2,*LPTYPELIB2;

DEFINE_OLEGUID(IID_ITypeInfo2,      0x00020412,0,0);
typedef struct ITypeInfo2 ITypeInfo2,*LPTYPEINFO2;

/* The OLE Automation ProxyStub Interface Class (aka Typelib Marshaler) */
DEFINE_OLEGUID(CLSID_PSOAInterface, 0x00020424,0,0);

/*****************************************************************************
 * Automation data types
 */

/*****************************************************************
 *  SafeArray defines and structs
 */

#define FADF_AUTO        ( 0x1 )
#define FADF_STATIC      ( 0x2 )
#define FADF_EMBEDDED    ( 0x4 )
#define FADF_FIXEDSIZE   ( 0x10 )
#define FADF_RECORD      ( 0x20 )
#define FADF_HAVEIID     ( 0x40 )
#define FADF_HAVEVARTYPE ( 0x80 )
#define FADF_BSTR        ( 0x100 )
#define FADF_UNKNOWN     ( 0x200 )
#define FADF_DISPATCH    ( 0x400 )
#define FADF_VARIANT     ( 0x800 )
#define FADF_RESERVED    ( 0xf008 )

/* Undocumented flags */
#define FADF_CREATEVECTOR ( 0x2000 ) /* set when the safe array is created using SafeArrayCreateVector */


typedef struct  tagSAFEARRAYBOUND
{
  ULONG cElements;                  /* Number of elements in dimension */
  LONG  lLbound;                    /* Lower bound of dimension */
} SAFEARRAYBOUND;

typedef struct  tagSAFEARRAY
{
  USHORT          cDims;            /* Count of array dimension */
  USHORT          fFeatures;        /* Flags describing the array */
  ULONG           cbElements;       /* Size of each element */
  ULONG           cLocks;           /* Number of lock on array */
  PVOID           pvData;           /* Pointer to data valid when cLocks > 0 */
  SAFEARRAYBOUND  rgsabound[ 1 ];   /* One bound for each dimension */
} SAFEARRAY, *LPSAFEARRAY;

typedef enum tagCALLCONV {
	CC_CDECL    = 1,
	CC_MSCPASCAL  = CC_CDECL + 1,
	CC_PASCAL   = CC_MSCPASCAL,
	CC_MACPASCAL  = CC_PASCAL + 1,
	CC_STDCALL    = CC_MACPASCAL + 1,
	CC_RESERVED   = CC_STDCALL + 1,
	CC_SYSCALL    = CC_RESERVED + 1,
	CC_MPWCDECL   = CC_SYSCALL + 1,
	CC_MPWPASCAL  = CC_MPWCDECL + 1,
	CC_MAX    = CC_MPWPASCAL + 1
} CALLCONV;

typedef CY CURRENCY;

/*
 * Declarations of the VARIANT structure and the VARIANT APIs.
 */
/* S_OK 			   : Success.
 * DISP_E_BADVARTYPE   : The variant type vt in not a valid type of variant.
 * DISP_E_OVERFLOW	   : The data pointed to by pvarSrc does not fit in the destination type.
 * DISP_E_TYPEMISMATCH : The variant type vt is not a valid type of variant.
 * E_INVALIDARG 	   : One argument is invalid.
 * * E_OUTOFMEMORY     : Memory could not be allocated for the conversion.
 * DISP_E_ARRAYISLOCKED : The variant contains an array that is locked.
 */
#if (__STDC__ && !defined(_FORCENAMELESSUNION)) || defined(NONAMELESSUNION)
#define __VARIANT_NAME_1 n1
#define __VARIANT_NAME_2 n2
#define __VARIANT_NAME_3 n3
#else
#define __tagVARIANT
#define __VARIANT_NAME_1
#define __VARIANT_NAME_2
#define __VARIANT_NAME_3
#endif

typedef struct tagVARIANT VARIANT, *LPVARIANT;
typedef struct tagVARIANT VARIANTARG, *LPVARIANTARG;

struct tagVARIANT
{
    union
    {
        struct __tagVARIANT
        {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union /* DUMMYUNIONNAME */
            {
                /* By value. */
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                INT intVal;
                UINT uintVal;
                BYTE bVal;
                short iVal;
                long lVal;
                float fltVal;
                double dblVal;
                VARIANT_BOOL boolVal;
                SCODE scode;
                DATE date;
                BSTR bstrVal;
                CY cyVal;
                IUnknown* punkVal;
                IDispatch* pdispVal;
                SAFEARRAY* parray;

                /* By reference */
                CHAR* pcVal;
                USHORT* puiVal;
                ULONG* pulVal;
                INT* pintVal;
                UINT* puintVal;
                BYTE* pbVal;
                short* piVal;
                long* plVal;
                float* pfltVal;
                double* pdblVal;
                VARIANT_BOOL* pboolVal;
                SCODE* pscode;
                DATE* pdate;
                BSTR* pbstrVal;
                VARIANT* pvarVal;
                PVOID byref;
                CY* pcyVal;
                DECIMAL* pdecVal;
                IUnknown** ppunkVal;
                IDispatch** ppdispVal;
                SAFEARRAY** pparray;
            } __VARIANT_NAME_3;
        } __VARIANT_NAME_2;
        DECIMAL decVal;
    } __VARIANT_NAME_1;
};


typedef LONG DISPID;
typedef DWORD HREFTYPE;
typedef DISPID MEMBERID;

#define DISPATCH_METHOD         0x1
#define DISPATCH_PROPERTYGET    0x2
#define DISPATCH_PROPERTYPUT    0x4
#define DISPATCH_PROPERTYPUTREF 0x8

#define DISPID_UNKNOWN  ( -1 )
#define DISPID_VALUE  ( 0 )
#define DISPID_PROPERTYPUT  ( -3 )
#define DISPID_NEWENUM  ( -4 )
#define DISPID_EVALUATE ( -5 )
#define DISPID_CONSTRUCTOR  ( -6 )
#define DISPID_DESTRUCTOR ( -7 )
#define DISPID_COLLECT  ( -8 )

#define MEMBERID_NIL DISPID_UNKNOWN

#define IMPLTYPEFLAG_FDEFAULT         (0x1)
#define IMPLTYPEFLAG_FSOURCE          (0x2)
#define IMPLTYPEFLAG_FRESTRICTED      (0x4)
#define IMPLTYPEFLAG_FDEFAULTVTABLE   (0x8)

typedef struct  tagDISPPARAMS
{
  VARIANTARG* rgvarg;
  DISPID*     rgdispidNamedArgs;
  UINT      cArgs;
  UINT      cNamedArgs;
} DISPPARAMS;

typedef struct tagEXCEPINFO
{
    WORD  wCode;
    WORD  wReserved;
    BSTR  bstrSource;
    BSTR  bstrDescription;
    BSTR  bstrHelpFile;
    DWORD dwHelpContext;
    PVOID pvReserved;
    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
    SCODE scode;
} EXCEPINFO, * LPEXCEPINFO;

typedef struct tagIDLDESC
{
	ULONG dwReserved;
	USHORT wIDLFlags;
} IDLDESC;

typedef struct tagPARAMDESCEX
{
	ULONG cBytes;
	VARIANTARG varDefaultValue;
} PARAMDESCEX, *LPPARAMDESCEX;

typedef struct tagPARAMDESC
{
	LPPARAMDESCEX pparamdescex;
	USHORT wParamFlags;
} PARAMDESC;

#define PARAMFLAG_NONE      	(0x00)
#define PARAMFLAG_FIN           (0x01)
#define PARAMFLAG_FOUT          (0x02)
#define PARAMFLAG_FLCID     	(0x04)
#define PARAMFLAG_FRETVAL       (0x08)
#define PARAMFLAG_FOPT          (0x10)
#define PARAMFLAG_FHASDEFAULT   (0x20)
#define PARAMFLAG_FHASCUSTDATA  (0x40)

typedef struct tagTYPEDESC
{
	union {
		struct tagTYPEDESC *lptdesc;
		struct tagARRAYDESC *lpadesc;
		HREFTYPE hreftype;
	} DUMMYUNIONNAME;
	VARTYPE vt;
} TYPEDESC;

typedef struct tagELEMDESC
{
	TYPEDESC tdesc;
	union {
		IDLDESC idldesc;
		PARAMDESC paramdesc;
	} DUMMYUNIONNAME;
} ELEMDESC, *LPELEMDESC;

typedef enum tagTYPEKIND
{
	TKIND_ENUM = 0,
	TKIND_RECORD = 1,
	TKIND_MODULE = 2,
	TKIND_INTERFACE = 3,
	TKIND_DISPATCH = 4,
	TKIND_COCLASS = 5,
	TKIND_ALIAS = 6,
	TKIND_UNION = 7,
	TKIND_MAX = 8
} TYPEKIND;

typedef struct tagTYPEATTR
{
	GUID guid;
	LCID lcid;
	DWORD dwReserved;
	MEMBERID memidConstructor;
	MEMBERID memidDestructor;
	LPOLESTR lpstrSchema;
	ULONG cbSizeInstance;
	TYPEKIND typekind;
	WORD cFuncs;
	WORD cVars;
	WORD cImplTypes;
	WORD cbSizeVft;
	WORD cbAlignment;
	WORD wTypeFlags;
	WORD wMajorVerNum;
	WORD wMinorVerNum;
	TYPEDESC tdescAlias;
	IDLDESC idldescType;
} TYPEATTR, *LPTYPEATTR;

typedef enum tagTYPEFLAGS {
	TYPEFLAG_FAPPOBJECT =             0x01,
	TYPEFLAG_FCANCREATE =             0x02,
	TYPEFLAG_FLICENSED =              0x04,
	TYPEFLAG_FPREDECLID =             0x08,
	TYPEFLAG_FHIDDEN =                0x10,
	TYPEFLAG_FCONTROL =               0x20,
	TYPEFLAG_FDUAL =                  0x40,
	TYPEFLAG_FNONEXTENSIBLE =         0x80,
	TYPEFLAG_FOLEAUTOMATION =         0x100,
	TYPEFLAG_FRESTRICTED =            0x200,
	TYPEFLAG_FAGGREGATABLE =          0x400,
	TYPEFLAG_FREPLACEABLE =           0x800,
	TYPEFLAG_FDISPATCHABLE =          0x1000,
	TYPEFLAG_FREVERSEBIND =           0x2000,
	TYPEFLAG_FPROXY =                 0x4000
} TYPEFLAGS;

typedef struct tagARRAYDESC
{
	TYPEDESC tdescElem;
	USHORT cDims;
	SAFEARRAYBOUND rgbounds[1];
} ARRAYDESC;

typedef enum tagFUNCKIND
{
	FUNC_VIRTUAL = 0,
	FUNC_PUREVIRTUAL = 1,
	FUNC_NONVIRTUAL = 2,
	FUNC_STATIC = 3,
	FUNC_DISPATCH = 4
} FUNCKIND;

typedef enum tagFUNCFLAGS
{
	FUNCFLAG_FRESTRICTED = 0x1,
	FUNCFLAG_FSOURCE = 0x2,
	FUNCFLAG_FBINDABLE = 0x4,
	FUNCFLAG_FREQUESTEDIT = 0x8,
	FUNCFLAG_FDISPLAYBIND = 0x10,
	FUNCFLAG_FDEFAULTBIND = 0x20,
	FUNCFLAG_FHIDDEN = 0x40,
	FUNCFLAG_FUSESGETLASTERROR = 0x80,
	FUNCFLAG_FDEFAULTCOLLELEM = 0x100,
	FUNCFLAG_FUIDEFAULT = 0x200,
	FUNCFLAG_FNONBROWSABLE = 0x400,
	FUNCFLAG_FREPLACEABLE = 0x800,
	FUNCFLAG_FIMMEDIATEBIND = 0x1000
} FUNCFLAGS;

typedef enum tagINVOKEKIND
{
	INVOKE_FUNC = 1,
	INVOKE_PROPERTYGET = 2,
	INVOKE_PROPERTYPUT = 4,
	INVOKE_PROPERTYPUTREF = 8
} INVOKEKIND;

typedef struct tagFUNCDESC
{
	MEMBERID memid;
	SCODE *lprgscode;
	ELEMDESC *lprgelemdescParam;
	FUNCKIND funckind;
	INVOKEKIND invkind;
	CALLCONV callconv;
	SHORT cParams;
	SHORT cParamsOpt;
	SHORT oVft;
	SHORT cScodes;
	ELEMDESC elemdescFunc;
	WORD wFuncFlags;
} FUNCDESC, *LPFUNCDESC;

typedef enum tagVARKIND
{
	VAR_PERINSTANCE = 0,
	VAR_STATIC = 1,
	VAR_CONST = 2,
	VAR_DISPATCH = 3
} VARKIND;

typedef struct tagVARDESC
{
	MEMBERID memid;
	LPOLESTR lpstrSchema;
	union {
		ULONG oInst;
		VARIANT *lpvarValue;
	} DUMMYUNIONNAME;
	ELEMDESC elemdescVar;
	WORD wVarFlags;
	VARKIND varkind;
} VARDESC, *LPVARDESC;

typedef enum tagSYSKIND
{
	SYS_WIN16 = 0,
	SYS_WIN32 = 1,
	SYS_MAC = 2
} SYSKIND;

typedef enum tagLIBFLAGS
{
	LIBFLAG_FRESTRICTED = 0x1,
	LIBFLAG_FCONTROL = 0x2,
	LIBFLAG_FHIDDEN = 0x4,
	LIBFLAG_FHASDISKIMAGE = 0x8
} LIBFLAGS;

typedef struct tagTLIBATTR
{
	GUID guid;
	LCID lcid;
	SYSKIND syskind;
	WORD wMajorVerNum;
	WORD wMinorVerNum;
	WORD wLibFlags;
} TLIBATTR, *LPTLIBATTR;

typedef enum tagDESCKIND
{
	DESCKIND_NONE = 0,
	DESCKIND_FUNCDESC = 1,
	DESCKIND_VARDESC = 2,
	DESCKIND_TYPECOMP = 3,
	DESCKIND_IMPLICITAPPOBJ = 4,
	DESCKIND_MAX = 5
} DESCKIND;

typedef union tagBINDPTR
{
	FUNCDESC *lpfuncdesc;
	VARDESC  *lpvardesc;
	ITypeComp *lptcomp;
} BINDPTR, *LPBINDPTR;

typedef enum tagVARFLAGS
{
	VARFLAG_FREADONLY = 0x1,
	VARFLAG_FSOURCE = 0x2,
	VARFLAG_FBINDABLE = 0x4,
	VARFLAG_FREQUESTEDIT  = 0x8,
	VARFLAG_FDISPLAYBIND  = 0x10,
	VARFLAG_FDEFAULTBIND  = 0x20,
	VARFLAG_FHIDDEN = 0x40,
	VARFLAG_FRESTRICTED = 0x80,
	VARFLAG_FDEFAULTCOLLELEM  = 0x100,
	VARFLAG_FUIDEFAULT  = 0x200,
	VARFLAG_FNONBROWSABLE = 0x400,
	VARFLAG_FREPLACEABLE  = 0x800,
	VARFLAG_FIMMEDIATEBIND  = 0x1000
} VARFLAGS;


/*
 * Data types for Variants.
 */

enum VARENUM {
	VT_EMPTY = 0,
	VT_NULL = 1,
	VT_I2 = 2,
	VT_I4 = 3,
	VT_R4 = 4,
	VT_R8 = 5,
	VT_CY = 6,
	VT_DATE = 7,
	VT_BSTR = 8,
	VT_DISPATCH = 9,
	VT_ERROR  = 10,
	VT_BOOL = 11,
	VT_VARIANT	= 12,
	VT_UNKNOWN	= 13,
	VT_DECIMAL	= 14,
	VT_I1 = 16,
	VT_UI1	= 17,
	VT_UI2	= 18,
	VT_UI4	= 19,
	VT_I8 = 20,
	VT_UI8	= 21,
	VT_INT	= 22,
	VT_UINT = 23,
	VT_VOID = 24,
	VT_HRESULT	= 25,
	VT_PTR	= 26,
	VT_SAFEARRAY  = 27,
	VT_CARRAY = 28,
	VT_USERDEFINED	= 29,
	VT_LPSTR  = 30,
	VT_LPWSTR = 31,
	VT_RECORD = 36,
	VT_FILETIME = 64,
	VT_BLOB = 65,
	VT_STREAM = 66,
	VT_STORAGE	= 67,
	VT_STREAMED_OBJECT	= 68,
	VT_STORED_OBJECT  = 69,
	VT_BLOB_OBJECT	= 70,
	VT_CF = 71,
	VT_CLSID  = 72,
	VT_VECTOR = 0x1000,
	VT_ARRAY  = 0x2000,
	VT_BYREF  = 0x4000,
	VT_RESERVED = 0x8000,
	VT_ILLEGAL	= 0xffff,
	VT_ILLEGALMASKED  = 0xfff,
	VT_TYPEMASK = 0xfff
};

/* the largest valide type
 */
#define VT_MAXVALIDTYPE VT_CLSID


/*
 * Declarations of the VARIANT structure and the VARIANT APIs.
 */

/* S_OK 			   : Success.
 * DISP_E_BADVARTYPE   : The variant type vt in not a valid type of variant.
 * DISP_E_OVERFLOW	   : The data pointed to by pvarSrc does not fit in the destination type.
 * DISP_E_TYPEMISMATCH : The variant type vt is not a valid type of variant.
 * E_INVALIDARG 	   : One argument is invalid.
 * E_OUTOFMEMORY	   : Memory could not be allocated for the conversion.
 * DISP_E_ARRAYISLOCKED : The variant contains an array that is locked.
 */


typedef struct  tagCUSTDATAITEM {
    GUID guid;
    VARIANTARG varValue;
} CUSTDATAITEM, *LPCUSTDATAITEM;

typedef struct  tagCUSTDATA {
    INT cCustData;
    LPCUSTDATAITEM prgCustData; /* count cCustdata */
} CUSTDATA, *LPCUSTDATA;



/*****************************************************************************
 * IDispatch interface
 */
#define ICOM_INTERFACE IDispatch
#define IDispatch_METHODS \
  ICOM_METHOD1(HRESULT, GetTypeInfoCount, UINT*, pctinfo) \
  ICOM_METHOD3(HRESULT, GetTypeInfo, UINT, iTInfo, LCID, lcid, ITypeInfo**, ppTInfo) \
  ICOM_METHOD5(HRESULT, GetIDsOfNames, REFIID, riid, LPOLESTR*, rgszNames, UINT, cNames, LCID, lcid, DISPID*, rgDispId) \
  ICOM_METHOD8(HRESULT, Invoke, DISPID, dispIdMember, REFIID, riid, LCID, lcid, WORD, wFlags, DISPPARAMS*, pDispParams, VARIANT*, pVarResult, EXCEPINFO*, pExepInfo, UINT*, puArgErr)
#define IDispatch_IMETHODS \
	IUnknown_IMETHODS \
	IDispatch_METHODS
ICOM_DEFINE(IDispatch,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IDispatch_QueryInterface(p,a,b) ICOM_CALL2(QueryInterface,p,a,b)
#define IDispatch_AddRef(p)             ICOM_CALL (AddRef,p)
#define IDispatch_Release(p)            ICOM_CALL (Release,p)
/*** IDispatch methods ***/
#define IDispatch_GetTypeInfoCount(p,a)      ICOM_CALL1 (GetTypeInfoCount,p,a)
#define IDispatch_GetTypeInfo(p,a,b,c)       ICOM_CALL3 (GetTypeInfo,p,a,b,c)
#define IDispatch_GetIDsOfNames(p,a,b,c,d,e) ICOM_CALL5 (GetIDsOfNames,p,a,b,c,d,e)
#define IDispatch_Invoke(p,a,b,c,d,e,f,g,h)  ICOM_CALL8 (Invoke,p,a,b,c,d,e,f,g,h)


/*****************************************************************************
 * ITypeInfo interface
 */
#define ICOM_INTERFACE ITypeInfo
#define ITypeInfo_METHODS \
	ICOM_METHOD1(HRESULT,GetTypeAttr, TYPEATTR**,ppTypeAttr) \
	ICOM_METHOD1(HRESULT,GetTypeComp, ITypeComp**,ppTComp) \
	ICOM_METHOD2(HRESULT,GetFuncDesc, UINT,index, FUNCDESC**,ppFuncDesc) \
	ICOM_METHOD2(HRESULT,GetVarDesc, UINT,index, VARDESC**,ppVarDesc) \
	ICOM_METHOD4(HRESULT,GetNames, MEMBERID,memid, BSTR*,rgBstrNames, UINT,cMaxNames, UINT*,pcNames) \
	ICOM_METHOD2(HRESULT,GetRefTypeOfImplType, UINT,index, HREFTYPE*, pRefType) \
	ICOM_METHOD2(HRESULT,GetImplTypeFlags, UINT,index, INT*,pImplTypeFlags)\
	ICOM_METHOD3(HRESULT,GetIDsOfNames, LPOLESTR*,rgszNames, UINT,cNames, MEMBERID*,pMemId) \
	ICOM_METHOD7(HRESULT,Invoke, PVOID,pvInstance, MEMBERID,memid, WORD,wFlags, DISPPARAMS*,pDispParams, VARIANT*,pVarResult, EXCEPINFO*,pExcepInfo, UINT*,puArgErr) \
	ICOM_METHOD5(HRESULT,GetDocumentation, MEMBERID,memid, BSTR*,pBstrName, BSTR*,pBstrDocString, DWORD*,pdwHelpContext, BSTR*,pBstrHelpFile) \
	ICOM_METHOD5(HRESULT,GetDllEntry, MEMBERID,memid, INVOKEKIND,invKind, BSTR*,pBstrDllName, BSTR*,pBstrName, WORD*,pwOrdinal) \
	ICOM_METHOD2(HRESULT,GetRefTypeInfo, HREFTYPE,hRefType, ITypeInfo**,ppTInfo) \
	ICOM_METHOD3(HRESULT,AddressOfMember, MEMBERID,memid, INVOKEKIND,invKind, PVOID*,ppv) \
	ICOM_METHOD3(HRESULT,CreateInstance, IUnknown*,pUnkOuter, REFIID,riid, PVOID*,ppvObj) \
	ICOM_METHOD2(HRESULT,GetMops, MEMBERID,memid, BSTR*,pBstrMops) \
	ICOM_METHOD2(HRESULT,GetContainingTypeLib, ITypeLib**,ppTLib, UINT*,pIndex) \
	ICOM_METHOD1(HRESULT,ReleaseTypeAttr, TYPEATTR*,pTypeAttr) \
	ICOM_METHOD1(HRESULT,ReleaseFuncDesc, FUNCDESC*,pFuncDesc) \
	ICOM_METHOD1(HRESULT,ReleaseVarDesc, VARDESC*,pVarDesc)

#define ITypeInfo_IMETHODS \
	IUnknown_IMETHODS \
	ITypeInfo_METHODS
ICOM_DEFINE(ITypeInfo,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define ITypeInfo_QueryInterface(p,a,b)         ICOM_CALL2(QueryInterface,p,a,b)
#define ITypeInfo_AddRef(p)                     ICOM_CALL (AddRef,p)
#define ITypeInfo_Release(p)                    ICOM_CALL (Release,p)
/*** ITypeInfo methods ***/
#define ITypeInfo_GetTypeAttr(p,a)              ICOM_CALL1(GetTypeAttr,p,a)
#define ITypeInfo_GetTypeComp(p,a)              ICOM_CALL1(GetTypeComp,p,a)
#define ITypeInfo_GetFuncDesc(p,a,b)            ICOM_CALL2(GetFuncDesc,p,a,b)
#define ITypeInfo_GetVarDesc(p,a,b)             ICOM_CALL2(GetVarDesc,p,a,b)
#define ITypeInfo_GetNames(p,a,b,c,d)           ICOM_CALL4(GetNames,p,a,b,c,d)
#define ITypeInfo_GetRefTypeOfImplType(p,a,b)   ICOM_CALL2(GetRefTypeOfImplType,p,a,b)
#define ITypeInfo_GetImplTypeFlags(p,a,b)       ICOM_CALL2(GetImplTypeFlags,p,a,b)
#define ITypeInfo_GetIDsOfNames(p,a,b,c)        ICOM_CALL3(GetIDsOfNames,p,a,b,c)
#define ITypeInfo_Invoke(p,a,b,c,d,e,f,g)       ICOM_CALL7(Invoke,p,a,b,c,d,e,f,g)
#define ITypeInfo_GetDocumentation(p,a,b,c,d,e) ICOM_CALL5(GetDocumentation,p,a,b,c,d,e)
#define ITypeInfo_GetDllEntry(p,a,b,c,d,e)      ICOM_CALL5(GetDllEntry,p,a,b,c,d,e)
#define ITypeInfo_GetRefTypeInfo(p,a,b)         ICOM_CALL2(GetRefTypeInfo,p,a,b)
#define ITypeInfo_AddressOfMember(p,a,b,c)      ICOM_CALL3(AddressOfMember,p,a,b,c)
#define ITypeInfo_CreateInstance(p,a,b,c)       ICOM_CALL3(CreateInstance,p,a,b,c)
#define ITypeInfo_GetMops(p,a,b)                ICOM_CALL2(GetMops,p,a,b)
#define ITypeInfo_GetContainingTypeLib(p,a,b)   ICOM_CALL2(GetContainingTypeLib,p,a,b)
#define ITypeInfo_ReleaseTypeAttr(p,a)          ICOM_CALL1(ReleaseTypeAttr,p,a)
#define ITypeInfo_ReleaseFuncDesc(p,a)          ICOM_CALL1(ReleaseFuncDesc,p,a)
#define ITypeInfo_ReleaseVarDesc(p,a)           ICOM_CALL1(ReleaseVarDesc,p,a)


/*****************************************************************************
 * ITypeInfo2 interface
 */
#define ICOM_INTERFACE ITypeInfo2
#define ITypeInfo2_METHODS \
	ICOM_METHOD1(HRESULT, GetTypeKind, TYPEKIND*, pTypeKind) \
	ICOM_METHOD1(HRESULT, GetTypeFlags, UINT*, pTypeFlags) \
	ICOM_METHOD3(HRESULT, GetFuncIndexOfMemId, MEMBERID, memid, INVOKEKIND,\
		invKind, UINT*, pFuncIndex) \
	ICOM_METHOD2(HRESULT, GetVarIndexOfMemId, MEMBERID, memid, UINT*, \
		pVarIndex) \
	ICOM_METHOD2(HRESULT, GetCustData, REFGUID, guid, VARIANT*, pVarVal) \
	ICOM_METHOD3(HRESULT, GetFuncCustData, UINT, index, REFGUID, guid,\
		VARIANT*, pVarVal) \
	ICOM_METHOD4(HRESULT, GetParamCustData, UINT, indexFunc, UINT,\
		indexParam, REFGUID, guid, VARIANT*, pVarVal) \
	ICOM_METHOD3(HRESULT, GetVarCustData, UINT, index, REFGUID, guid,\
		VARIANT*, pVarVal) \
	ICOM_METHOD3(HRESULT, GetImplTypeCustData, UINT, index, REFGUID, guid,\
		VARIANT*, pVarVal) \
	ICOM_METHOD5(HRESULT, GetDocumentation2, MEMBERID, memid, LCID, lcid,\
		BSTR*, pbstrHelpString, DWORD*, pdwHelpStringContext,\
		BSTR*, pbstrHelpStringDll) \
	ICOM_METHOD1(HRESULT, GetAllCustData, CUSTDATA*, pCustData) \
	ICOM_METHOD2(HRESULT, GetAllFuncCustData, UINT, index, CUSTDATA*,\
		pCustData)\
	ICOM_METHOD3(HRESULT, GetAllParamCustData, UINT, indexFunc, UINT,\
		indexParam, CUSTDATA*, pCustData) \
	ICOM_METHOD2(HRESULT, GetAllVarCustData, UINT, index, CUSTDATA*,\
		pCustData) \
	ICOM_METHOD2(HRESULT, GetAllImplTypeCustData, UINT, index, CUSTDATA*,\
		pCustData)

#define ITypeInfo2_IMETHODS \
	IUnknown_IMETHODS \
	ITypeInfo_METHODS \
	ITypeInfo2_METHODS
ICOM_DEFINE(ITypeInfo2,ITypeInfo)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define ITypeInfo2_QueryInterface(p,a,b)         ICOM_CALL2(QueryInterface,p,a,b)
#define ITypeInfo2_AddRef(p)                     ICOM_CALL (AddRef,p)
#define ITypeInfo2_Release(p)                    ICOM_CALL (Release,p)
/*** ITypeInfo methods ***/
#define ITypeInfo2_GetTypeAttr(p,a)              ICOM_CALL1(GetTypeAttr,p,a)
#define ITypeInfo2_GetTypeComp(p,a)              ICOM_CALL1(GetTypeComp,p,a)
#define ITypeInfo2_GetFuncDesc(p,a,b)            ICOM_CALL2(GetFuncDesc,p,a,b)
#define ITypeInfo2_GetVarDesc(p,a,b)             ICOM_CALL2(GetVarDesc,p,a,b)
#define ITypeInfo2_GetNames(p,a,b,c,d)           ICOM_CALL4(GetNames,p,a,b,c,d)
#define ITypeInfo2_GetRefTypeOfImplType(p,a,b)   ICOM_CALL2(GetRefTypeOfImplType,p,a,b)
#define ITypeInfo2_GetImplTypeFlags(p,a,b)       ICOM_CALL2(GetImplTypeFlags,p,a,b)
#define ITypeInfo2_GetIDsOfNames(p,a,b,c)        ICOM_CALL3(GetIDsOfNames,p,a,b,c)
#define ITypeInfo2_Invoke(p,a,b,c,d,e,f,g)       ICOM_CALL7(Invoke,p,a,b,c,d,e,f,g)
#define ITypeInfo2_GetDocumentation(p,a,b,c,d,e) ICOM_CALL5(GetDocumentation,p,a,b,c,d,e)
#define ITypeInfo2_GetDllEntry(p,a,b,c,d,e)      ICOM_CALL5(GetDllEntry,p,a,b,c,d,e)
#define ITypeInfo2_GetRefTypeInfo(p,a,b)         ICOM_CALL2(GetRefTypeInfo,p,a,b)
#define ITypeInfo2_AddressOfMember(p,a,b,c)      ICOM_CALL3(AddressOfMember,p,a,b,c)
#define ITypeInfo2_CreateInstance(p,a,b,c)       ICOM_CALL3(CreateInstance,p,a,b,c)
#define ITypeInfo2_GetMops(p,a,b)                ICOM_CALL2(GetMops,p,a,b)
#define ITypeInfo2_GetContainingTypeLib(p,a,b)   ICOM_CALL2(GetContainingTypeLib,p,a,b)
#define ITypeInfo2_ReleaseTypeAttr(p,a)          ICOM_CALL1(ReleaseTypeAttr,p,a)
#define ITypeInfo2_ReleaseFuncDesc(p,a)          ICOM_CALL1(ReleaseFuncDesc,p,a)
#define ITypeInfo2_ReleaseVarDesc(p,a)           ICOM_CALL1(ReleaseVarDesc,p,a)
/*** ITypeInfo2 methods ***/
#define ITypeInfo2_GetTypeKind(p,a)              ICOM_CALL1(GetTypeKind,p,a)
#define ITypeInfo2_GetTypeFlags(p,a)             ICOM_CALL1(GetTypeFlags,p,a)
#define ITypeInfo2_GetFuncIndexOfMemId(p,a,b,c)  ICOM_CALL3(GetFuncIndexOfMemId,p,a,b,c)
#define ITypeInfo2_GetVarIndexOfMemId(p,a,b)     ICOM_CALL2(GetVarIndexOfMemId,p,a,b)
#define ITypeInfo2_GetCustData(p,a,b)            ICOM_CALL2(GetCustData,p,a,b)
#define ITypeInfo2_GetFuncCustData(p,a,b,c)      ICOM_CALL3(GetFuncCustData,p,a,b,c)
#define ITypeInfo2_GetParamCustData(p,a,b,c,d)   ICOM_CALL4(GetParamCustData,p,a,b,c,d)
#define ITypeInfo2_GetVarCustData(p,a,b,c)       ICOM_CALL3(GetVarCustData,p,a,b,c)
#define ITypeInfo2_GetImplTypeCustData(p,a,b,c)  ICOM_CALL3(GetImplTypeCustData,p,a,b,c)
#define ITypeInfo2_GetDocumentation2(p,a,b,c,d,e) ICOM_CALL5(GetDocumentation2,p,a,b,c,d,e)
#define ITypeInfo2_GetAllCustData(p,a)           ICOM_CALL1(GetAllCustData,p,a)
#define ITypeInfo2_GetAllFuncCustData(p,a,b)     ICOM_CALL2(GetAllFuncCustData,p,a,b)
#define ITypeInfo2_GetAllParamCustData(p,a,b,c)  ICOM_CALL3(GetAllParamCustData,p,a,b,c)
#define ITypeInfo2_GetAllVarCustData(p,a,b)      ICOM_CALL2(GetAllVarCustData,p,a,b)
#define ITypeInfo2_GetAllImplTypeCustData(p,a,b) ICOM_CALL2(GetAllImplTypeCustData,p,a,b)

/*****************************************************************************
 * ITypeLib interface
 */
#define ICOM_INTERFACE ITypeLib
#define ITypeLib_METHODS \
	ICOM_METHOD (UINT,GetTypeInfoCount) \
	ICOM_METHOD2(HRESULT,GetTypeInfo, UINT,index, ITypeInfo**,ppTInfo) \
	ICOM_METHOD2(HRESULT,GetTypeInfoType, UINT,index, TYPEKIND*,pTKind) \
	ICOM_METHOD2(HRESULT,GetTypeInfoOfGuid, REFGUID,guid, ITypeInfo**,ppTinfo) \
	ICOM_METHOD1(HRESULT,GetLibAttr, TLIBATTR**,ppTLibAttr) \
	ICOM_METHOD1(HRESULT,GetTypeComp, ITypeComp**,ppTComp) \
	ICOM_METHOD5(HRESULT,GetDocumentation, INT,index, BSTR*,pBstrName, BSTR*,pBstrDocString, DWORD*,pdwHelpContext, BSTR*,pBstrHelpFile) \
	ICOM_METHOD3(HRESULT,IsName, LPOLESTR,szNameBuf, ULONG,lHashVal, BOOL*,bfName) \
	ICOM_METHOD5(HRESULT,FindName, LPOLESTR,szNameBuf, ULONG,lHashVal, ITypeInfo**,ppTInfo, MEMBERID*,rgMemId, USHORT*,pcFound) \
	ICOM_METHOD1(VOID,ReleaseTLibAttr, TLIBATTR*,pTLibAttr)
#define ITypeLib_IMETHODS \
	IUnknown_IMETHODS \
	ITypeLib_METHODS
ICOM_DEFINE(ITypeLib,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define ITypeLib_QueryInterface(p,a,b)         ICOM_CALL2(QueryInterface,p,a,b)
#define ITypeLib_AddRef(p)                     ICOM_CALL (AddRef,p)
#define ITypeLib_Release(p)                    ICOM_CALL (Release,p)
/*** ITypeLib methods ***/
#define ITypeLib_GetTypeInfoCount(p)           ICOM_CALL (GetTypeInfoCount,p)
#define ITypeLib_GetTypeInfo(p,a,b)            ICOM_CALL2(GetTypeInfo,p,a,b)
#define ITypeLib_GetTypeInfoType(p,a,b)        ICOM_CALL2(GetTypeInfoType,p,a,b)
#define ITypeLib_GetTypeInfoOfGuid(p,a,b)      ICOM_CALL2(GetTypeInfoOfGuid,p,a,b)
#define ITypeLib_GetLibAttr(p,a)               ICOM_CALL1(GetLibAttr,p,a)
#define ITypeLib_GetTypeComp(p,a)              ICOM_CALL1(GetTypeComp,p,a)
#define ITypeLib_GetDocumentation(p,a,b,c,d,e) ICOM_CALL5(GetDocumentation,p,a,b,c,d,e)
#define ITypeLib_IsName(p,a,b,c)               ICOM_CALL3(IsName,p,a,b,c)
#define ITypeLib_FindName(p,a,b,c,d,e)         ICOM_CALL5(FindName,p,a,b,c,d,e)
#define ITypeLib_ReleaseTLibAttr(p,a)          ICOM_CALL1(ReleaseTLibAttr,p,a)


/*****************************************************************************
 * ITypeLib2 interface
 */
#define ICOM_INTERFACE ITypeLib2
#define ITypeLib2_METHODS \
	ICOM_METHOD2(HRESULT, GetCustData, REFGUID, guid, VARIANT*, pVarVal) \
	ICOM_METHOD2(HRESULT, GetLibStatistics, ULONG *, pcUniqueNames, ULONG*,pcchUniqueNames) \
	ICOM_METHOD5(HRESULT, GetDocumentation2, INT, index, LCID, lcid,BSTR*, pbstrHelpString, DWORD*, pdwHelpStringContext, BSTR*, strHelpStringDll) \
    	ICOM_METHOD1(HRESULT, GetAllCustData, CUSTDATA *, pCustData)
#define ITypeLib2_IMETHODS \
	IUnknown_IMETHODS \
	ITypeLib_IMETHODS \
	ITypeLib2_METHODS
ICOM_DEFINE(ITypeLib2,ITypeLib)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define ITypeLib2_QueryInterface(p,a,b)         ICOM_CALL2(QueryInterface,p,a,b)
#define ITypeLib2_AddRef(p)                     ICOM_CALL (AddRef,p)
#define ITypeLib2_Release(p)                    ICOM_CALL (Release,p)
/*** ITypeLib methods ***/
#define ITypeLib2_GetTypeInfoCount(p)           ICOM_CALL (GetTypeInfoCount,p)
#define ITypeLib2_GetTypeInfo(p,a,b)            ICOM_CALL2(GetTypeInfo,p,a,b)
#define ITypeLib2_GetTypeInfoType(p,a,b)        ICOM_CALL2(GetTypeInfoType,p,a,b)
#define ITypeLib2_GetTypeInfoOfGuid(p,a,b)      ICOM_CALL2(GetTypeInfoOfGuid,p,a,b)
#define ITypeLib2_GetLibAttr(p,a)               ICOM_CALL1(GetLibAttr,p,a)
#define ITypeLib2_GetTypeComp(p,a)              ICOM_CALL1(GetTypeComp,p,a)
#define ITypeLib2_GetDocumentation(p,a,b,c,d,e) ICOM_CALL5(GetDocumentation,p,a,b,c,d,e)
#define ITypeLib2_IsName(p,a,b,c)               ICOM_CALL3(IsName,p,a,b,c)
#define ITypeLib2_FindName(p,a,b,c,d,e)         ICOM_CALL5(FindName,p,a,b,c,d,e)
#define ITypeLib2_ReleaseTLibAttr(p,a)          ICOM_CALL1(ReleaseTLibAttr,p,a)
/*** ITypeLib2 methods ***/
#define ITypeLib2_GetCustData(p,a,b)            ICOM_CALL2(GetCustData,p,a,b)
#define ITypeLib2_GetLibStatistics(p,a,b)       ICOM_CALL2(GetLibStatistics,p,a,b)
#define ITypeLib2_GetDocumentation2(p,a,b,c,d,e,f) ICOM_CALL5(GetDocumentation2,p,a,b,c,d,e)
#define ITypeLib2_GetAllCustData(p,a)           ICOM_CALL1(GetAllCustData,p,a)

/*****************************************************************************
 * ITypeComp interface
 */
#define ICOM_INTERFACE ITypeComp
#define ITypeComp_METHODS \
	ICOM_METHOD6(HRESULT,Bind, LPOLESTR,szName, ULONG,lHashVal, WORD,wFlags, ITypeInfo**,ppTInfo, DESCKIND*,pDescKind, BINDPTR*,pBindPtr) \
	ICOM_METHOD4(HRESULT,BindType, LPOLESTR,szName, ULONG,lHashVal, ITypeInfo**,ppTInfo, ITypeComp**,ppTComp)
#define ITypeComp_IMETHODS \
	IUnknown_IMETHODS \
	ITypeComp_METHODS
ICOM_DEFINE(ITypeComp,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define ITypeComp_QueryInterface(p,a,b)         ICOM_CALL2(QueryInterface,p,a,b)
#define ITypeComp_AddRef(p)                     ICOM_CALL (AddRef,p)
#define ITypeComp_Release(p)                    ICOM_CALL (Release,p)
/*** ITypeComp methods ***/
#define ITypeComp_Bind(p,a,b,c,d,e,f)           ICOM_CALL6(Bind,p,a,b,c,d,e,f)
#define ITypeComp_BindType(p,a,b,c,d)           ICOM_CALL4(BindType,p,a,b,c,d)

/*****************************************************************************
 * IEnumVARIANT interface
 */
#define ICOM_INTERFACE IEnumVARIANT
#define IEnumVARIANT_METHODS \
	ICOM_METHOD3(HRESULT,Next, ULONG,celt, VARIANT*,rgVar, ULONG*,pCeltFetched) \
	ICOM_METHOD1(HRESULT,Skip, ULONG,celt) \
	ICOM_METHOD (HRESULT,Reset) \
	ICOM_METHOD1(HRESULT,Clone, IEnumVARIANT**,ppEnum)
#define IEnumVARIANT_IMETHODS \
	IUnknown_IMETHODS \
	IEnumVARIANT_METHODS
ICOM_DEFINE(IEnumVARIANT,IUnknown)
#undef ICOM_INTERFACE

/*** IUnknown methods ***/
#define IEnumVARIANT_QueryInterface(p,a,b)   ICOM_CALL2(QueryInterface,p,a,b)
#define IEnumVARIANT_AddRef(p)               ICOM_CALL (AddRef,p)
#define IEnumVARIANT_Release(p)              ICOM_CALL (Release,p)
/*** IEnumVARIANT methods ***/
#define IEnumVARIANT_Next(p,a,b,c)           ICOM_CALL3(Next,p,a,b,c)
#define IEnumVARIANT_Skip(p,a)               ICOM_CALL1(Skip,p,a)
#define IEnumVARIANT_Reset(p)                ICOM_CALL (Reset,p)
#define IEnumVARIANT_Clone(p,a)              ICOM_CALL1(Clone,p,a)

#endif /* __WINE_WINE_OBJ_OLEAUT_H */

