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