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

    cpp_quote("#undef GetCurrentThread")
    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")
