/*
 * 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_HACK_FIBERSUPPORT      0x70000000")
cpp_quote("#define SCRIPTPROP_HACK_TRIDENTEVENTSINK  0x70000001")
 
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 IActiveScriptParse : 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
    );
}

cpp_quote("typedef IActiveScriptParse *PIActiveScriptParse;")

[
object,
uuid(1CFF0050-6FDD-11d0-9328-00A0C90DCAA9),
pointer_default(unique)
]
interface IActiveScriptParseProcedureOld : 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(AA5B6A80-B834-11d0-932F-00A0C90DCAA9),
pointer_default(unique)
]
interface IActiveScriptParseProcedure : 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(71ee5b20-fb04-11d1-b3a8-00a0c911e8b2),
    pointer_default(unique)
]
interface IActiveScriptParseProcedure2 : IActiveScriptParseProcedure
{
}

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