/*
 * 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
 */

import "ocidl.idl";
import "oleidl.idl";
import "oaidl.idl";
import "servprov.idl";

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);
}
