/*
 * Copyright 2004 Kevin Koltzau
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef DO_NO_IMPORTS
import "ocidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "servprov.idl";
#endif

cpp_quote("DEFINE_GUID(SID_VariantConversion, 0x1f101481,0xbccd,0x11d0,0x93,0x36,0x00,0xa0,0xc9,0xd,0xca,0xa9);")
cpp_quote("DEFINE_GUID(SID_GetCaller, 0x4717cc40,0xbcb9,0x11d0,0x93,0x36,0x00,0xa0,0xc9,0xd,0xca,0xa9);")

cpp_quote("#define fdexNameCaseSensitive       0x00000001L")
cpp_quote("#define fdexNameEnsure              0x00000002L")
cpp_quote("#define fdexNameImplicit            0x00000004L")
cpp_quote("#define fdexNameCaseInsensitive     0x00000008L")
cpp_quote("#define fdexNameInternal            0x00000010L")
cpp_quote("#define fdexNameNoDynamicProperties 0x00000020L")

cpp_quote("#define fdexPropCanGet              0x00000001L")
cpp_quote("#define fdexPropCannotGet           0x00000002L")
cpp_quote("#define fdexPropCanPut              0x00000004L")
cpp_quote("#define fdexPropCannotPut           0x00000008L")
cpp_quote("#define fdexPropCanPutRef           0x00000010L")
cpp_quote("#define fdexPropCannotPutRef        0x00000020L")
cpp_quote("#define fdexPropNoSideEffects       0x00000040L")
cpp_quote("#define fdexPropDynamicType         0x00000080L")
cpp_quote("#define fdexPropCanCall             0x00000100L")
cpp_quote("#define fdexPropCannotCall          0x00000200L")
cpp_quote("#define fdexPropCanConstruct        0x00000400L")
cpp_quote("#define fdexPropCannotConstruct     0x00000800L")
cpp_quote("#define fdexPropCanSourceEvents     0x00001000L")
cpp_quote("#define fdexPropCannotSourceEvents  0x00002000L")

cpp_quote("#define fdexEnumDefault             0x00000001L")
cpp_quote("#define fdexEnumAll                 0x00000002L")

cpp_quote("#define grfdexPropCanAll \\")
cpp_quote("       (fdexPropCanGet | fdexPropCanPut | fdexPropCanPutRef | \\")
cpp_quote("        fdexPropCanCall | fdexPropCanConstruct | fdexPropCanSourceEvents)")
cpp_quote("#define grfdexPropCannotAll \\")
cpp_quote("       (fdexPropCannotGet | fdexPropCannotPut | fdexPropCannotPutRef | \\")
cpp_quote("        fdexPropCannotCall | fdexPropCannotConstruct | fdexPropCannotSourceEvents)")
cpp_quote("#define grfdexPropExtraAll \\")
cpp_quote("       (fdexPropNoSideEffects | fdexPropDynamicType)")
cpp_quote("#define grfdexPropAll \\")
cpp_quote("       (grfdexPropCanAll | grfdexPropCannotAll | grfdexPropExtraAll)")

cpp_quote("#define DISPATCH_CONSTRUCT 0x4000")

cpp_quote("#define DISPID_THIS (-613)")
cpp_quote("#define DISPID_STARTENUM DISPID_UNKNOWN")

[
object,
uuid(A6EF9860-C720-11d0-9337-00A0C90DCAA9),
pointer_default(unique)
]
interface IDispatchEx : IDispatch
{
    HRESULT GetDispID(
            [in] BSTR bstrName,
            [in] DWORD grfdex,
            [out] DISPID *pid);

    [local]
    HRESULT InvokeEx(
            [in] DISPID id,
            [in] LCID lcid,
            [in] WORD wFlags,
            [in] DISPPARAMS *pdp,
            [out] VARIANT *pvarRes,
            [out] EXCEPINFO *pei,
            [in, unique] IServiceProvider *pspCaller);

    [call_as(InvokeEx)]
    HRESULT RemoteInvokeEx(
            [in] DISPID id,
            [in] LCID lcid,
            [in] DWORD dwFlags,
            [in] DISPPARAMS *pdp,
            [out] VARIANT *pvarRes,
            [out] EXCEPINFO *pei,
            [in, unique] IServiceProvider *pspCaller,
            [in] UINT cvarRefArg,
            [in, size_is(cvarRefArg)] UINT *rgiRefArg,
            [in, out, size_is(cvarRefArg)] VARIANT *rgvarRefArg);

    HRESULT DeleteMemberByName(
            [in] BSTR bstrName,
            [in] DWORD grfdex);

    HRESULT DeleteMemberByDispID(
            [in] DISPID id);

    HRESULT GetMemberProperties(
            [in] DISPID id,
            [in] DWORD grfdexFetch,
            [out] DWORD *pgrfdex);

    HRESULT GetMemberName(
            [in] DISPID id,
            [out] BSTR *pbstrName);

    HRESULT GetNextDispID(
            [in] DWORD grfdex,
            [in] DISPID id,
            [out] DISPID *pid);

    HRESULT GetNameSpaceParent([out] IUnknown **ppunk);
}

[
object,
uuid(A6EF9861-C720-11d0-9337-00A0C90DCAA9),
pointer_default(unique)
]
interface IDispError : IUnknown
{
    HRESULT QueryErrorInfo(
            [in] GUID guidErrorType,
            [out] IDispError **ppde);

    HRESULT GetNext(
            [out] IDispError **ppde);

    HRESULT GetHresult(
            [out] HRESULT *phr);

    HRESULT GetSource(
            [out] BSTR *pbstrSource);

    HRESULT GetHelpInfo(
            [out] BSTR *pbstrFileName,
            [out] DWORD *pdwContext);

    HRESULT GetDescription(
            [out] BSTR *pbstrDescription);
}

[
object,
uuid(A6EF9862-C720-11d0-9337-00A0C90DCAA9),
pointer_default(unique)
]
interface IVariantChangeType : IUnknown
{
    HRESULT ChangeType(
            [in, out, unique] VARIANT *pvarDst,
            [in, unique] VARIANT *pvarSrc,
            [in] LCID lcid,
            [in] VARTYPE vtNew);
}


[
object,
uuid(CA04B7E6-0D21-11d1-8CC5-00C04FC2B085),
pointer_default(unique)
]
interface IObjectIdentity : IUnknown
{
    HRESULT IsEqualObject( 
            [in] IUnknown *punk);
}

[
    object,
    uuid(c5598e60-b307-11d1-b27d-006008c3fbfb),
    pointer_default(unique)
]
interface ICanHandleException : IUnknown
{
    HRESULT CanHandleException(
            [in] EXCEPINFO *pExcepInfo,
            [in] VARIANT *pvar);
}
