/*
 * Copyright 2008 Jacek Caban for CodeWeavers
 *
 * 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 "activscp.idl";
/* import "dbgprop.idl"; */

interface IDebugDocumentContext;
interface IRemoteDebugApplication;
interface IEnumDebugCodeContexts;

/* FIXME: */
interface IEnumDebugStackFrames;
interface IDebugStackFrame;
interface IApplicationDebugger;
interface IEnumRemoteDebugApplicationThreads;
interface IDebugApplicationNode;
interface IEnumDebugExpressionContexts;
interface IDebugApplicationThread;
interface IDebugSyncOperation;
interface IDebugAsyncOperation;
interface IDebugStackFrameSniffer;
interface IDebugThreadCall32;
interface IActiveScriptErrorDebug;
interface IProvideExpressionContexts;

typedef enum tagBREAKPOINT_STATE {
    BREAKPOINT_DELETED,
    BREAKPOINT_DISABLED,
    BREAKPOINT_ENABLED
} BREAKPOINT_STATE;

typedef DWORD APPBREAKFLAGS;

typedef enum tagBREAKREASON {
    BREAKREASON_STEP,
    BREAKREASON_BREAKPOINT,
    BREAKREASON_DEBUGGER_BLOCK,
    BREAKREASON_HOST_INITIATED,
    BREAKREASON_LANGUAGE_INITIATED,
    BREAKREASON_DEBUGGER_HALT,
    BREAKREASON_ERROR,
    BREAKREASON_JIT
} BREAKREASON;

typedef enum tagBREAKRESUME_ACTION {
    BREAKRESUMEACTION_ABORT,
    BREAKRESUMEACTION_CONTINUE,
    BREAKRESUMEACTION_STEP_INTO,
    BREAKRESUMEACTION_STEP_OVER,
    BREAKRESUMEACTION_STEP_OUT,
    BREAKRESUMEACTION_IGNORE
} BREAKRESUMEACTION;

typedef enum tagDOCUMENTNAMETYPE {
    DOCUMENTNAMETYPE_APPNODE,
    DOCUMENTNAMETYPE_TITLE,
    DOCUMENTNAMETYPE_FILE_TAIL,
    DOCUMENTNAMETYPE_URL
} DOCUMENTNAMETYPE;

typedef enum tagERRORRESUMEACTION {
    ERRORRESUMEACTION_ReexecuteErrorStatement,
    ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller,
    ERRORRESUMEACTION_SkipErrorStatement,
} ERRORRESUMEACTION;

typedef WORD SOURCE_TEXT_ATTR;

#ifdef INTEROPLIB
enum enum_SOURCE_TEXT_ATTR
{
    SOURCETEXT_ATTR_KEYWORD        = 0x01,
    SOURCETEXT_ATTR_COMMENT        = 0x02,
    SOURCETEXT_ATTR_NONSOURCE      = 0x04,
    SOURCETEXT_ATTR_OPERATOR       = 0x08,
    SOURCETEXT_ATTR_NUMBER         = 0x10,
    SOURCETEXT_ATTR_STRING         = 0x20,
    SOURCETEXT_ATTR_FUNCTION_START = 0x40
};
#endif

const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_KEYWORD         = 0x01;
const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_COMMENT         = 0x02;
const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_NONSOURCE       = 0x04;
const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_OPERATOR        = 0x08;
const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_NUMBER          = 0x10;
const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_STRING          = 0x20;
const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_FUNCTION_START  = 0x40;

/************************************************************
 *      interface IActiveScriptDebug32
 */
[
    object,
    uuid(51973c10-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IActiveScriptDebug32 : IUnknown
{
    HRESULT GetScriptTextAttributes(
            [in, size_is(uNumCodeChars)] LPCOLESTR pstrCode,
            [in] ULONG uNumCodeChars,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwFlags,
            [in, out, size_is(uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);

    HRESULT GetScriptletTextAttributes(
            [in, size_is(uNumCodeChars)] LPCOLESTR pstrCode,
            [in] ULONG uNumCodeChars,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwFlags,
            [in, out, size_is(uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);

    HRESULT EnumCodeContextsOfPosition(
            [in] DWORD dwSourceContext,
            [in] ULONG uCharacterOffset,
            [in] ULONG uNumChars,
            [out] IEnumDebugCodeContexts **ppescc);
}

[
    object,
    uuid(bc437e23-f5b8-47f4-bb79-7d1ce5483b86),
    pointer_default(unique)
]
interface IActiveScriptDebug64 : IUnknown
{
    HRESULT GetScriptTextAttributes(
            [in, size_is(uNumCodeChars)] LPCOLESTR pstrCode,
            [in] ULONG uNumCodeChars,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwFlags,
            [in, out, size_is(uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);

    HRESULT GetScriptletTextAttributes(
            [in, size_is(uNumCodeChars)] LPCOLESTR pstrCode,
            [in] ULONG uNumCodeChars,
            [in] LPCOLESTR pstrDelimiter,
            [in] DWORD dwFlags,
            [in, out, size_is(uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);

    HRESULT EnumCodeContextsOfPosition(
           [in] DWORDLONG dwSourceContext,
           [in] ULONG uCharacterOffset,
           [in] ULONG uNumChars,
           [out] IEnumDebugCodeContexts **ppescc);
}

/************************************************************
 *      interface IDebugDocumentInfo
 */
[
    object,
    uuid(51973c1f-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IDebugDocumentInfo : IUnknown
{
    HRESULT GetName(
            [in]  DOCUMENTNAMETYPE dnt,
            [out] BSTR *pbstrName);

    HRESULT GetDocumentClassId(
            [out] CLSID *pclsidDocument);
}

/************************************************************
 *      interface IDebugDocument
 */
[
    object,
    uuid(51973c21-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IDebugDocument : IDebugDocumentInfo
{
}

/************************************************************
 *      interface IDebugCodeContext
 */
[
    object,
    uuid(51973c13-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IDebugCodeContext : IUnknown
{
    HRESULT GetDocumentContext(
            [out] IDebugDocumentContext **ppsc);

    HRESULT SetBreakPoint(
            [in]  BREAKPOINT_STATE bps);
}

/************************************************************
 *      interface IEnumDebugCodeContexts
 */
[
    object,
    uuid(51973c1d-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IEnumDebugCodeContexts : IUnknown
{
    HRESULT Next(
            [in]  ULONG celt,
            [out] IDebugCodeContext **pscc,
            [out] ULONG *pceltFetched);

    HRESULT Skip(
            [in]  ULONG celt);

    HRESULT Reset();

    HRESULT Clone(
            [out] IEnumDebugCodeContexts **ppescc);
}

/************************************************************
 *      interface IDebugDocumentContext
 */
[
    object,
    uuid(51973c28-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IDebugDocumentContext : IUnknown
{
    HRESULT GetDocument(
            [out] IDebugDocument **ppsd);

    HRESULT EnumCodeContexts(
            [out] IEnumDebugCodeContexts **ppescc);
}

/************************************************************
 *      interface IRemoteDebugApplicationThread
 */
[
    object,
    uuid(51973c37-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique)
]
interface IRemoteDebugApplicationThread : IUnknown
{
    HRESULT GetSystemThreadId(
            [out] DWORD *dwThreadId);

    HRESULT GetApplication(
            [out] IRemoteDebugApplication **pprda);

    HRESULT EnumStackFrames(
            [out] IEnumDebugStackFrames **ppedsf);

    HRESULT GetDescription(
            [out] BSTR *pbstrDescription,
            [out] BSTR *pbstrState);

    HRESULT SetNextStatement(
            [in]  IDebugStackFrame *pStackFrame,
            [in]  IDebugCodeContext *pCodeContext);

    HRESULT GetState(
            [out] DWORD *pState);

    HRESULT Suspend(
            [out] DWORD *pdwCount);

    HRESULT Resume(
            [out] DWORD *pdwCount);

    HRESULT GetSuspendCount(
            [out] DWORD *pdwCount);
}

/************************************************************
 *      interface IRemoteDebugApplication
 */
[
    object,
    uuid(51973c30-cb0c-11d0-b5c9-00a0244Aae7a),
    pointer_default(unique)
]
interface IRemoteDebugApplication : IUnknown
{
    HRESULT ResumeFromBreakPoint(
            [in]  IRemoteDebugApplicationThread *prptFocus,
            [in]  BREAKRESUMEACTION bra,
            [in]  ERRORRESUMEACTION era);

    HRESULT CauseBreak();

    HRESULT ConnectDebugger(
            [in]  IApplicationDebugger *pad);

    HRESULT DisconnectDebugger();

    HRESULT GetDebugger(
            [out] IApplicationDebugger **pad);

    HRESULT CreateInstanceAtApplication(
            [in]  REFCLSID rclsid,
            [in]  IUnknown *pUnkOuter,
            [in]  DWORD dwClsContext,
            [in]  REFIID riid,
            [out, iid_is(riid)] IUnknown **ppvObject);

    HRESULT QueryAlive();

    HRESULT EnumThreads(
            [out] IEnumRemoteDebugApplicationThreads **pperdat);

    HRESULT GetName(
            [out] BSTR *pbstrName);

    HRESULT GetRootNode(
            [out] IDebugApplicationNode **ppdanRoot);

    HRESULT EnumGlobalExpressionContexts(
            [out] IEnumDebugExpressionContexts **ppedec);
}

/************************************************************
 *      interface IDebugApplication32
 */
[
    object,
    uuid(51973c32-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique),
    local
]
interface IDebugApplication32 : IRemoteDebugApplication
{
    HRESULT SetName(
            [in] LPCOLESTR pstrName);

    HRESULT StepOutComplete();

    HRESULT DebugOutput(
            [in] LPCOLESTR pstr);

    HRESULT StartDebugSession();

    HRESULT HandleBreakPoint(
            [in]  BREAKREASON br,
            [out] BREAKRESUMEACTION *pbra);

    HRESULT Close();

    HRESULT GetBreakFlags(
            [out] APPBREAKFLAGS *pabf,
            [out] IRemoteDebugApplicationThread **pprdatSteppingThread);

    HRESULT GetCurrentThread(
            [out] IDebugApplicationThread **pat);

    HRESULT CreateAsyncDebugOperation(
            [in]  IDebugSyncOperation *psdo,
            [out] IDebugAsyncOperation **ppado);

    HRESULT AddStackFrameSniffer(
            [in]  IDebugStackFrameSniffer *pdsfs,
            [out] DWORD *pdwCookie);

    HRESULT RemoveStackFrameSniffer(
            [in]  DWORD dwCookie);

    HRESULT QueryCurrentThreadIsDebuggerThread();

    HRESULT SynchronousCallInDebuggerThread(
            [in]  IDebugThreadCall32 *pptc,
            [in]  DWORD dwParam1,
            [in]  DWORD dwParam2,
            [in]  DWORD dwParam3);

    HRESULT CreateApplicationNode(
            [out] IDebugApplicationNode **ppdanNew);

    HRESULT FireDebuggerEvent(
            [in]  REFGUID riid,
            [in]  IUnknown *punk);

    HRESULT HandleRuntimeError(
            [in]  IActiveScriptErrorDebug *pErrorDebug,
            [in]  IActiveScriptSite *pScriptSite,
            [out] BREAKRESUMEACTION *pbra,
            [out] ERRORRESUMEACTION *perra,
            [out] BOOL *pfCallOnScriptError);

    BOOL FCanJitDebug();

    BOOL FIsAutoJitDebugEnabled();

    HRESULT AddGlobalExpressionContextProvider(
            [in]  IProvideExpressionContexts *pdsfs,
            [out] DWORD *pdwCookie);

    HRESULT RemoveGlobalExpressionContextProvider(
            [in]  DWORD dwCookie);
}

/************************************************************
 *      interface IDebugApplication64
 */
[
    object,
    uuid(4dedc754-04c7-4f10-9e60-16a390fe6e62),
    pointer_default(unique),
    local
]
interface IDebugApplication64 : IRemoteDebugApplication
{
    HRESULT SetName(
            [in] LPCOLESTR pstrName);

    HRESULT StepOutComplete();

    HRESULT DebugOutput(
            [in] LPCOLESTR pstr);

    HRESULT StartDebugSession();

    HRESULT HandleBreakPoint(
            [in]  BREAKREASON br,
            [out] BREAKRESUMEACTION *pbra);

    HRESULT Close();

    HRESULT GetBreakFlags(
            [out] APPBREAKFLAGS *pabf,
            [out] IRemoteDebugApplicationThread **pprdatSteppingThread);

    HRESULT GetCurrentThread(
            [out] IDebugApplicationThread **pat);

    HRESULT CreateAsyncDebugOperation(
            [in]  IDebugSyncOperation *psdo,
            [out] IDebugAsyncOperation **ppado);

    HRESULT AddStackFrameSniffer(
            [in]  IDebugStackFrameSniffer *pdsfs,
            [out] DWORD *pdwCookie);

    HRESULT RemoveStackFrameSniffer(
            [in]  DWORD dwCookie);

    HRESULT QueryCurrentThreadIsDebuggerThread();

    HRESULT SynchronousCallInDebuggerThread(
            [in]  IDebugThreadCall32 *pptc,
            [in]  DWORDLONG dwParam1,
            [in]  DWORDLONG dwParam2,
            [in]  DWORDLONG dwParam3);

    HRESULT CreateApplicationNode(
            [out] IDebugApplicationNode **ppdanNew);

    HRESULT FireDebuggerEvent(
            [in]  REFGUID riid,
            [in]  IUnknown *punk);

    HRESULT HandleRuntimeError(
            [in]  IActiveScriptErrorDebug *pErrorDebug,
            [in]  IActiveScriptSite *pScriptSite,
            [out] BREAKRESUMEACTION *pbra,
            [out] ERRORRESUMEACTION *perra,
            [out] BOOL *pfCallOnScriptError);

    BOOL FCanJitDebug();

    BOOL FIsAutoJitDebugEnabled();

    HRESULT AddGlobalExpressionContextProvider(
            [in]  IProvideExpressionContexts *pdsfs,
            [out] DWORDLONG *pdwCookie);

    HRESULT RemoveGlobalExpressionContextProvider(
            [in]  DWORDLONG dwCookie);
}

/************************************************************
 *      interface IActiveScriptSiteDebug32
 */
[
    object,
    uuid(51973c11-cb0c-11d0-b5c9-00a0244a0e7a),
    pointer_default(unique),
    local
]
interface IActiveScriptSiteDebug32 : IUnknown
{
    HRESULT GetDocumentContextFromPosition(
            [in]  DWORD dwSourceContext,
            [in]  ULONG uCharacterOffset,
            [in]  ULONG uNumChars,
            [out] IDebugDocumentContext **ppsc);

    HRESULT GetApplication(
            [out] IDebugApplication32 **ppda);

    HRESULT GetRootApplicationNode(
            [out] IDebugApplicationNode **ppdanRoot);

    HRESULT OnScriptErrorDebug(
            [in]  IActiveScriptErrorDebug *pErrorDebug,
            [out] BOOL *pfEnterDebugger,
            [out] BOOL *pfCallOnScriptErrorWhenContinuing);
}

/************************************************************
 *      interface IActiveScriptSiteDebug64
 */
[
    object,
    uuid(d6b96b0a-7463-402c-92ac-89984226942f),
    pointer_default(unique),
    local
]
interface IActiveScriptSiteDebug64 : IUnknown
{
    HRESULT GetDocumentContextFromPosition(
            [in]  DWORDLONG dwSourceContext,
            [in]  ULONG uCharacterOffset,
            [in]  ULONG uNumChars,
            [out] IDebugDocumentContext **ppsc);

    HRESULT GetApplication(
            [out] IDebugApplication64 **ppda);

    HRESULT GetRootApplicationNode(
            [out] IDebugApplicationNode **ppdanRoot);

    HRESULT OnScriptErrorDebug(
            [in]  IActiveScriptErrorDebug *pErrorDebug,
            [out] BOOL *pfEnterDebugger,
            [out] BOOL *pfCallOnScriptErrorWhenContinuing);
}

cpp_quote("#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS")
cpp_quote("#ifdef _WIN64")

cpp_quote("#define IActiveScriptDebug IActiveScriptDebug64")
cpp_quote("#define IID_IActiveScriptDebug IID_IActiveScriptDebug64")

cpp_quote("#define IActiveScriptSiteDebug IActiveScriptSiteDebug64")
cpp_quote("#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug64")

cpp_quote("#define IDebugApplication IDebugApplication64")
cpp_quote("#define IID_IDebugApplication IID_IDebugApplication64")

cpp_quote("#else")

cpp_quote("#define IActiveScriptDebug IActiveScriptDebug32")
cpp_quote("#define IID_IActiveScriptDebug IID_IActiveScriptDebug32")

cpp_quote("#define IActiveScriptSiteDebug IActiveScriptSiteDebug32")
cpp_quote("#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug32")

cpp_quote("#define IDebugApplication IDebugApplication32")
cpp_quote("#define IID_IDebugApplication IID_IDebugApplication32")

cpp_quote("#endif")
cpp_quote("#endif")
