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

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

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

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

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 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")
