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


#pragma once

#include "resource.h"
#include "activdbg.h"
#include <exdispid.h>
#include <shlguid.h>
#include <string>

#include "IECrossfireExtension.h"
#include "Util.h"
#include "Logger.h"

enum {
	STATE_DISCONNECTED,
	STATE_LISTENING,
	STATE_CONNECTED,
};

class ATL_NO_VTABLE IECrossfireBHO :
	public CComObjectRootEx<CComSingleThreadModel>,
	public CComCoClass<IECrossfireBHO, &CLSID_IECrossfireBHO>,
	public IObjectWithSiteImpl<IECrossfireBHO>,
	public IIECrossfireBHO,
	public IBrowserContext,
	public IDispEventImpl<1, IECrossfireBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1> {

public:
	DECLARE_REGISTRY_RESOURCEID(IDR_IECrossfireBHO)
	DECLARE_NOT_AGGREGATABLE(IECrossfireBHO)
	BEGIN_COM_MAP(IECrossfireBHO)
		COM_INTERFACE_ENTRY(IIECrossfireBHO)
		COM_INTERFACE_ENTRY(IBrowserContext)
		COM_INTERFACE_ENTRY(IObjectWithSite)
	END_COM_MAP()
	DECLARE_PROTECT_FINAL_CONSTRUCT()

	HRESULT FinalConstruct() {
		return S_OK;
	}

	void FinalRelease() {
	}

public:
	IECrossfireBHO();
	virtual ~IECrossfireBHO();

	/* DWebBrowserEvents2 */
	BEGIN_SINK_MAP(IECrossfireBHO)
		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete2)
		SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_WINDOWSTATECHANGED, OnWindowStateChanged)
	END_SINK_MAP()
    void STDMETHODCALLTYPE OnBeforeNavigate2(IDispatch* pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, VARIANT_BOOL* Cancel);
	void STDMETHODCALLTYPE OnDocumentComplete(IDispatch* pDisp, VARIANT* URL);
	void STDMETHODCALLTYPE OnNavigateComplete2(IDispatch* pDisp, VARIANT* URL);
	void STDMETHODCALLTYPE OnWindowStateChanged(LONG dwFlags, LONG dwValidFlagMask);

	/* IBrowserContext */
	HRESULT STDMETHODCALLTYPE displayMessage(OLECHAR* url);
	HRESULT STDMETHODCALLTYPE navigate(OLECHAR* url, boolean openNewTab);

	/* IObjectWithSite */
	HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, LPVOID *ppvReturn);
	HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite);

private:
	bool displayHTML(wchar_t* htmlText);
//	int getServerState();
	bool initServer(bool startIfNeeded);
	void onServerStateChanged(WPARAM wParam, LPARAM lParam);
	bool startDebugging(unsigned int port);

	bool m_contextCreated;
	bool m_eventsHooked;
	bool m_firstNavigate;
	wchar_t* m_htmlToDisplay;
	bool m_isCurrentContext;
	wchar_t* m_lastUrl;
	HWND m_messageWindow;
	ICrossfireServer* m_server;
	int m_serverState;
	IWebBrowser2* m_webBrowser;

	static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

	/* constants */
	static const UINT ServerStateChangeMsg;
	static const wchar_t* ServerWindowClass;
	static const wchar_t* WindowClass;

	static const wchar_t* ABOUT_BLANK;
	static const wchar_t* DEBUG_START;
};

OBJECT_ENTRY_AUTO(__uuidof(IECrossfireBHO), IECrossfireBHO)
