/*
 * 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";
#endif

cpp_quote("#ifndef _NO_SCRIPT_GUIDS")

cpp_quote("DEFINE_GUID(CATID_ActiveScript,       0xf0b7a1a1,0x9847,0x11cf,0x8f,0x20,0x00,0x80,0x5f,0x2c,0xd0,0x64);")
cpp_quote("DEFINE_GUID(CATID_ActiveScriptParse,  0xf0b7a1a2,0x9847,0x11cf,0x8f,0x20,0x00,0x80,0x5f,0x2c,0xd0,0x64);")
cpp_quote("DEFINE_GUID(CATID_ActiveScriptEncode, 0xf0b7a1a3,0x9847,0x11cf,0x8f,0x20,0x00,0x80,0x5f,0x2c,0xd0,0x64);")

cpp_quote("#endif")

cpp_quote("#define SCRIPTPROP_NAME                   0x00000000")
cpp_quote("#define SCRIPTPROP_MAJORVERSION           0x00000001")
cpp_quote("#define SCRIPTPROP_MINORVERSION           0x00000002")
cpp_quote("#define SCRIPTPROP_BUILDNUMBER            0x00000003")
cpp_quote("#define SCRIPTPROP_DELAYEDEVENTSINKING    0x00001000")
cpp_quote("#define SCRIPTPROP_CATCHEXCEPTION         0x00001001")
cpp_quote("#define SCRIPTPROP_CONVERSIONLCID         0x00001002")
cpp_quote("#define SCRIPTPROP_HOSTSTACKREQUIRED      0x00001003")
cpp_quote("#define SCRIPTPROP_DEBUGGER               0x00001100")
cpp_quote("#define SCRIPTPROP_JITDEBUG               0x00001101")
cpp_quote("#define SCRIPTPROP_INVOKEVERSIONING       0x00004000")

cpp_quote("#define SCRIPTPROP_HACK_FIBERSUPPORT                0x70000000")
cpp_quote("#define SCRIPTPROP_HACK_TRIDENTEVENTSINK            0x70000001")
cpp_quote("#define SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION 0x70000002")
 
typedef enum tagSCRIPTSTATE {
    SCRIPTSTATE_UNINITIALIZED = 0,
    SCRIPTSTATE_STARTED       = 1,
    SCRIPTSTATE_CONNECTED     = 2,
    SCRIPTSTATE_DISCONNECTED  = 3,
    SCRIPTSTATE_CLOSED        = 4,
    SCRIPTSTATE_INITIALIZED   = 5
} SCRIPTSTATE;

typedef enum tagSCRIPTTHREADSTATE {
    SCRIPTTHREADSTATE_NOTINSCRIPT = 0,
    SCRIPTTHREADSTATE_RUNNING     = 1
} SCRIPTTHREADSTATE;

typedef DWORD SCRIPTTHREADID;
cpp_quote("#define SCRIPTTHREADID_CURRENT ((SCRIPTTHREADID)-1)")
cpp_quote("#define SCRIPTTHREADID_BASE ((SCRIPTTHREADID)-2)")
cpp_quote("#define SCRIPTTHREADID_ALL ((SCRIPTTHREADID)-3)")

cpp_quote("#define SCRIPTITEM_ISVISIBLE           0x00000002")
cpp_quote("#define SCRIPTITEM_ISSOURCE            0x00000004")
cpp_quote("#define SCRIPTITEM_GLOBALMEMBERS       0x00000008")
cpp_quote("#define SCRIPTITEM_ISPERSISTENT        0x00000040")
cpp_quote("#define SCRIPTITEM_CODEONLY            0x00000200")
cpp_quote("#define SCRIPTITEM_NOCODE              0x00000400")
cpp_quote("#define SCRIPTITEM_ALL_FLAGS           (SCRIPTITEM_ISSOURCE | \\")
cpp_quote("                                        SCRIPTITEM_ISVISIBLE | \\")
cpp_quote("                                        SCRIPTITEM_ISPERSISTENT | \\")
cpp_quote("                                        SCRIPTITEM_GLOBALMEMBERS | \\")
cpp_quote("                                        SCRIPTITEM_NOCODE | \\")
cpp_quote("                                        SCRIPTITEM_CODEONLY)")
cpp_quote("#define SCRIPTTYPELIB_ISCONTROL        0x00000010")
cpp_quote("#define SCRIPTTYPELIB_ISPERSISTENT     0x00000040")
cpp_quote("#define SCRIPTTYPELIB_ALL_FLAGS        (SCRIPTTEXT_ISCONTROL | SCRIPTTYPELIB_ISPERSISTENT)")
cpp_quote("#define SCRIPTTEXT_DELAYEXECUTION      0x00000001")
cpp_quote("#define SCRIPTTEXT_ISVISIBLE           0x00000002")
cpp_quote("#define SCRIPTTEXT_ISEXPRESSION        0x00000020")
cpp_quote("#define SCRIPTTEXT_ISPERSISTENT        0x00000040")
cpp_quote("#define SCRIPTTEXT_HOSTMANAGESSOURCE   0x00000080")
cpp_quote("#define SCRIPTTEXT_ALL_FLAGS           (SCRIPTTEXT_DELAYEXECUTION | \\")
cpp_quote("                                        SCRIPTTEXT_ISVISIBLE | \\")
cpp_quote("                                        SCRIPTTEXT_ISEXPRESSION | \\")
cpp_quote("                                        SCRIPTTEXT_ISPERSISTENT | \\")
cpp_quote("                                        SCRIPTTEXT_HOSTMANAGESSOURCE)")
cpp_quote("#define SCRIPTPROC_HOSTMANAGESSOURCE   0x00000080")
cpp_quote("#define SCRIPTPROC_IMPLICIT_THIS       0x00000100")
cpp_quote("#define SCRIPTPROC_IMPLICIT_PARENTS    0x00000200")
cpp_quote("#define SCRIPTPROC_ALL_FLAGS           (SCRIPTPROC_HOSTMANAGESSOURCE | \\")
cpp_quote("                                        SCRIPTPROC_IMPLICIT_THIS | \\")
cpp_quote("                                        SCRIPTPROC_IMPLICIT_PARENTS)")
cpp_quote("#define SCRIPTINFO_IUNKNOWN            0x00000001")
cpp_quote("#define SCRIPTINFO_ITYPEINFO           0x00000002")
cpp_quote("#define SCRIPTINFO_ALL_FLAGS           (SCRIPTINFO_IUNKNOWN | SCRIPTINFO_ITYPEINFO)")
cpp_quote("#define SCRIPTINTERRUPT_DEBUG          0x00000001")
cpp_quote("#define SCRIPTINTERRUPT_RAISEEXCEPTION 0x00000002")
cpp_quote("#define SCRIPTINTERRUPT_ALL_FLAGS      (SCRIPTINTERRUPT_DEBUG | SCRIPTINTERRUPT_RAISEEXCEPTION)")
cpp_quote("#define SCRIPTSTAT_STATEMENT_COUNT      1")
cpp_quote("#define SCRIPTSTAT_INSTRUCTION_COUNT    2")
cpp_quote("#define SCRIPTSTAT_INTSTRUCTION_TIME    3")
cpp_quote("#define SCRIPTSTAT_TOTAL_TIME           4")

[
object,
uuid(EAE1BA61-A4ED-11cf-8F20-00805F2CD064),
pointer_default(unique)
]
interface IActiveScriptError : IUnknown
{
    HRESULT GetExceptionInfo(
            [out] EXCEPINFO *pexcepinfo
    );
    
    HRESULT GetSourcePosition(
            [out] DWORD *pdwSourceContext,
            [out] ULONG *pulLineNumber,
            [out] LONG *plCharacterPosition
    );
    
    HRESULT GetSourceLineText(
            [out] BSTR *pbstrSourceLine
    );
}

[
object,
uuid(DB01A1E3-A42B-11cf-8F20-00805F2CD064),
pointer_default(unique)
]
interface IActiveScriptSite : IUnknown
{
    HRESULT GetLCID(
            [out] LCID *plcid);
    
    HRESULT GetItemInfo(
            [in] LPCOLESTR pstrName,
            [in] DWORD dwReturnMask,
            [out] IUnknown **ppiunkItem,
            [out] ITypeInfo **ppti
    );
    
    HRESULT GetDocVersionString(
            [out] BSTR *pbstrVersion
    );
    
    HRESULT OnScriptTerminate(
            [in] const VARIANT *pvarResult,
            [in] const EXCEPINFO *pexcepinfo
    );
    
    HRESULT OnStateChange(
            [in] SCRIPTSTATE ssScriptState
    );
    
    HRESULT OnScriptError(
            [in] IActiveScriptError *pscripterror
    );
    
    HRESULT OnEnterScript(void);
    
    HRESULT OnLeaveScript(void);
}

cpp_quote("typedef IActiveScriptSite *PIActiveScriptSite;")

[
object,
uuid(D10F6761-83E9-11cf-8F20-00805F2CD064),
pointer_default(unique)
]
interface IActiveScriptSiteWindow : IUnknown
{
    HRESULT GetWindow(
            [out] HWND *phwnd
    );

    HRESULT EnableModeless(
            [in] BOOL fEnable
    );
}

[
object,
uuid(539698A0-CDCA-11CF-A5EB-00AA0047A063),
pointer_default(unique)
]
interface IActiveScriptSiteInterruptPoll : IUnknown
{
    HRESULT QueryContinue();
}

[
object,
uuid(BB1A2AE1-A4F9-11cf-8F20-00805F2CD064),
pointer_default(unique)
]
interface IActiveScript : IUnknown
{
    HRESULT SetScriptSite(
            [in] IActiveScriptSite *pass
    );

    HRESULT GetScriptSite(
            [in] REFIID riid,
            [out, iid_is(riid)] void **ppvObject
    );

    HRESULT SetScriptState(
            [in] SCRIPTSTATE ss
    );

    HRESULT GetScriptState(
            [out] SCRIPTSTATE *pssState
    );

    HRESULT Close(void);

    HRESULT AddNamedItem(
            [in] LPCOLESTR pstrName,
            [in] DWORD dwFlags
    );

    HRESULT AddTypeLib(
            [in] REFGUID rguidTypeLib,
            [in] DWORD dwMajor,
            [in] DWORD dwMinor,
            [in] DWORD dwFlags
    );

    HRESULT GetScriptDispatch(
            [in] LPCOLESTR pstrItemName,
            [out] IDispatch **ppdisp
    );

    HRESULT GetCurrentScriptThreadID(
            [out] SCRIPTTHREADID *pstidThread
    );

    HRESULT GetScriptThreadID(
            [in] DWORD dwWin32ThreadId,
            [out] SCRIPTTHREADID *pstidThread
    );

    HRESULT GetScriptThreadState(
            [in] SCRIPTTHREADID stidThread,
            [out] SCRIPTTHREADSTATE *pstsState
    );

    HRESULT InterruptScriptThread(
            [in] SCRIPTTHREADID stidThread,
            [in] const EXCEPINFO *pexcepinfo,
            [in] DWORD dwFlags
    );

    HRESULT Clone(
            [out] IActiveScript **ppscript
    );
}

cpp_quote("typedef IActiveScript *PIActiveScript;")

[
object,
uuid(BB1A2AE2-A4F9-11cf-8F20-00805F2CD064),
pointer_default(unique)
]
interface IActiveScriptParse32 : IUnknown
{
    HRESULT InitNew(void);

    HRESULT AddScriptlet(
            [in] LPCOLESTR pstrDefaultName,
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrItemName,
            [in] LPCOLESTR pstrSubItemName,
            [in] LPCOLESTR pstrEventName,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] BSTR *pbstrName,
            [out] EXCEPINFO *pexcepinfo
    );

    HRESULT ParseScriptText(
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrItemName,
            [in] IUnknown *punkContext,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] VARIANT *pvarResult,
            [out] EXCEPINFO *pexcepinfo
    );
}

[
   object,
   uuid(c7ef7658-e1ee-480e-97ea-d52cb4d76d17),
   pointer_default(unique)
]
interface IActiveScriptParse64 : IUnknown
{
    HRESULT InitNew(void);

    HRESULT AddScriptlet(
            [in] LPCOLESTR pstrDefaultName,
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrItemName,
            [in] LPCOLESTR pstrSubItemName,
            [in] LPCOLESTR pstrEventName,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORDLONG dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] BSTR *pbstrName,
            [out] EXCEPINFO *pexcepinfo
    );

    HRESULT ParseScriptText(
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrItemName,
            [in] IUnknown *punkContext,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORDLONG dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] VARIANT *pvarResult,
            [out] EXCEPINFO *pexcepinfo
    );
}

cpp_quote("#ifdef _WIN64")
cpp_quote("#define IActiveScriptParse IActiveScriptParse64")
cpp_quote("#define IID_IActiveScriptParse IID_IActiveScriptParse64")
cpp_quote("#else")
cpp_quote("#define IActiveScriptParse IActiveScriptParse32")
cpp_quote("#define IID_IActiveScriptParse IID_IActiveScriptParse32")
cpp_quote("#endif")

cpp_quote("typedef IActiveScriptParse *PIActiveScriptParse;")

[
object,
uuid(1CFF0050-6FDD-11d0-9328-00A0C90DCAA9),
pointer_default(unique)
]
interface IActiveScriptParseProcedureOld32 : IUnknown
{
    HRESULT ParseProcedureText(
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrFormalParams,
            [in] LPCOLESTR pstrItemName,
            [in] IUnknown *punkContext,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] IDispatch **ppdisp
    );
}

[
    object,
    uuid(21f57128-08c9-4638-ba12-22d15d88dc5c),
    pointer_default(unique)
]
interface IActiveScriptParseProcedureOld64 : IUnknown
{
    HRESULT ParseProcedureText(
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrFormalParams,
            [in] LPCOLESTR pstrItemName,
            [in] IUnknown *punkContext,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORDLONG dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] IDispatch **ppdisp
    );
}

cpp_quote("#ifdef _WIN64")
cpp_quote("#define IActiveScriptParseProcedureOld IActiveScriptParseProcedureOld64")
cpp_quote("#define IID_IActiveScriptParseProcedureOld IID_IActiveScriptParseProcedureOld64")
cpp_quote("#else")
cpp_quote("#define IActiveScriptParseProcedureOld IActiveScriptParseProcedureOld32")
cpp_quote("#define IID_IActiveScriptParseProcedureOld IID_IActiveScriptParseProcedureOld32")
cpp_quote("#endif")

[
object,
uuid(AA5B6A80-B834-11d0-932F-00A0C90DCAA9),
pointer_default(unique)
]
interface IActiveScriptParseProcedure32 : IUnknown
{
    HRESULT ParseProcedureText(
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrFormalParams,
            [in] LPCOLESTR pstrProcedureName,
            [in] LPCOLESTR pstrItemName,
            [in] IUnknown *punkContext,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] IDispatch **ppdisp
    );
}

[
    object,
    uuid(c64713b6-e029-4cc5-9200-438b72890b6a),
    pointer_default(unique)
]
interface IActiveScriptParseProcedure64 : IUnknown
{
    HRESULT ParseProcedureText(
            [in] LPCOLESTR pstrCode,
            [in] LPCOLESTR pstrFormalParams,
            [in] LPCOLESTR pstrProcedureName,
            [in] LPCOLESTR pstrItemName,
            [in] IUnknown *punkContext,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORDLONG dwSourceContextCookie,
            [in] ULONG ulStartingLineNumber,
            [in] DWORD dwFlags,
            [out] IDispatch **ppdisp
    );
}

cpp_quote("#ifdef _WIN64")
cpp_quote("#define IActiveScriptParseProcedure IActiveScriptParseProcedure64")
cpp_quote("#define IID_IActiveScriptParseProcedure IID_IActiveScriptParseProcedure64")
cpp_quote("#else")
cpp_quote("#define IActiveScriptParseProcedure IActiveScriptParseProcedure32")
cpp_quote("#define IID_IActiveScriptParseProcedure IID_IActiveScriptParseProcedure32")
cpp_quote("#endif")

[
    object,
    uuid(71ee5b20-fb04-11d1-b3a8-00a0c911e8b2),
    pointer_default(unique)
]
interface IActiveScriptParseProcedure2_32 : IActiveScriptParseProcedure32
{
}

[
    object,
    uuid(fe7c4271-210c-448d-9f54-76dab7047b28),
    pointer_default(unique)
]
interface IActiveScriptParseProcedure2_64 : IActiveScriptParseProcedure64
{
}

cpp_quote("#ifdef _WIN64")
cpp_quote("#define IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_64")
cpp_quote("#define IID_IActiveScriptParseProcedure2 IID_IActiveScriptParseProcedure2_64")
cpp_quote("#else")
cpp_quote("#define IActiveScriptParseProcedure2 IActiveScriptParseProcedure2_32")
cpp_quote("#define IID_IActiveScriptParseProcedure2 IID_IActiveScriptParseProcedure2_32")
cpp_quote("#endif")

[
object,
uuid(63CDBCB0-C1B1-11d0-9336-00A0C90DCAA9),
pointer_default(unique)
]
interface IBindEventHandler : IUnknown
{
    HRESULT BindHandler(
            [in] LPCOLESTR pstrEvent,
            [in] IDispatch *pdisp
    );
}

[
object,
uuid(B8DA6310-E19B-11d0-933C-00A0C90DCAA9),
pointer_default(unique)
]
interface IActiveScriptStats : IUnknown
{
    HRESULT GetStat(
            [in] DWORD stid,
            [out] ULONG *pluHi,
            [out] ULONG *pluLo
    );

    HRESULT GetStatEx(
            [in] REFGUID guid,
            [out] ULONG *pluHi,
            [out] ULONG *pluLo
    );

    HRESULT ResetStats(void);
}

[
    object,
    uuid(4954e0d0-fbc7-11d1-8410-006008c3fbfc),
    pointer_default(unique)
]
interface IActiveScriptProperty : IUnknown
{
    HRESULT GetProperty(
            [in] DWORD dwProperty,
            [in] VARIANT *pvarIndex,
            [out] VARIANT *pvarValue);

    HRESULT SetProperty(
            [in] DWORD dwProperty,
            [in] VARIANT *pvarIndex,
            [in] VARIANT *pvarValue);
}
