/*******************************************************************************
 * Copyright (c) 2011 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/


#pragma once

#include "activdbg.h"
#include "CrossfireContext.h"
#include "Logger.h"

class ATL_NO_VTABLE IEDebugger :
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<IEDebugger, &CLSID_IEDebugger>,
	public IApplicationDebugger,
    public IApplicationDebuggerUI,
    public IDebugApplicationNodeEvents,
	public IDebugSessionProvider,
	public IIEDebugger {

public:
	DECLARE_REGISTRY_RESOURCEID(IDR_IEDEBUGGER)
	BEGIN_COM_MAP(IEDebugger)
		COM_INTERFACE_ENTRY2(IUnknown, IApplicationDebugger)
		COM_INTERFACE_ENTRY(IIEDebugger)
		COM_INTERFACE_ENTRY(IApplicationDebugger)
		COM_INTERFACE_ENTRY(IApplicationDebuggerUI)
		COM_INTERFACE_ENTRY(IDebugApplicationNodeEvents)
		COM_INTERFACE_ENTRY(IDebugSessionProvider)
		COM_INTERFACE_ENTRY(IIEDebugger)
	END_COM_MAP()
	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct() {
		return S_OK;
	}

	void FinalRelease() {
	}

public:
	IEDebugger();
	~IEDebugger();

	/* interface definitions from activdbg.h */

    /* IApplicationDebugger */
    virtual HRESULT STDMETHODCALLTYPE QueryAlive();
    virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger( 
        /* [in] */ REFCLSID rclsid,
        /* [in] */ IUnknown *pUnkOuter,
        /* [in] */ DWORD dwClsContext,
        /* [in] */ REFIID riid,
        /* [iid_is][out] */ IUnknown **ppvObject);
    virtual HRESULT STDMETHODCALLTYPE onDebugOutput( 
        /* [in] */ LPCOLESTR pstr);
    virtual HRESULT STDMETHODCALLTYPE onHandleBreakPoint( 
        /* [in] */ IRemoteDebugApplicationThread *prpt,
        /* [in] */ BREAKREASON br,
        /* [in] */ IActiveScriptErrorDebug *pError);
    virtual HRESULT STDMETHODCALLTYPE onClose();
    virtual HRESULT STDMETHODCALLTYPE onDebuggerEvent( 
        /* [in] */ REFIID riid,
        /* [in] */ IUnknown *punk);

    /* IApplicationDebuggerUI */
    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop( 
        /* [in] */ IDebugDocumentText *pddt);
    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop( 
        /* [in] */ IDebugDocumentContext *pddc);

    /* IDebugApplicationNodeEvents */
    virtual HRESULT STDMETHODCALLTYPE onAddChild( 
        /* [in] */ IDebugApplicationNode *prddpChild);
    virtual HRESULT STDMETHODCALLTYPE onRemoveChild( 
        /* [in] */ IDebugApplicationNode *prddpChild);
    virtual HRESULT STDMETHODCALLTYPE onDetach();
    virtual HRESULT STDMETHODCALLTYPE onAttach( 
        /* [in] */ IDebugApplicationNode *prddpParent);

	/* IDebugSessionProvider */
    virtual HRESULT STDMETHODCALLTYPE StartDebugSession( 
        /* [in] */ IRemoteDebugApplication *pda);

	/* IEDebugger */
	virtual void setContext(CrossfireContext* value);

private:
	CrossfireContext* m_context;
	std::multimap<std::wstring, DWORD>* m_adviseCookies;
	
	/* event: onBreak */
	static const wchar_t* EVENT_ONBREAK;
	static const wchar_t* KEY_LINE;
	static const wchar_t* KEY_URL;
	virtual HRESULT handleError(IActiveScriptErrorDebug *pScriptErrorDebug);

	/* event: onConsoleError */
	static const wchar_t* EVENT_ONCONSOLEERROR;
	static const wchar_t* KEY_FILENAME;
	static const wchar_t* KEY_LINENUMBER;
	static const wchar_t* KEY_MESSAGE;
	static const wchar_t* KEY_NAME;
	static const wchar_t* KEY_SOURCE;
	static const wchar_t* KEY_STACK;

	/* event: onConsoleLog */
	static const wchar_t* EVENT_ONCONSOLELOG;

	/* event: onResume */
	static const wchar_t* EVENT_ONRESUME;

	/* event: onScript */
	static const wchar_t* EVENT_ONSCRIPT;
	static const wchar_t* KEY_CONTEXTHREF;
	static const wchar_t* KEY_HREF;
};

OBJECT_ENTRY_AUTO(__uuidof(IEDebugger), IEDebugger)
