/*
 * 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
 
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(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);
}
