#include ".\ieinstance.h"
#include <exdisp.h>
#include <assert.h>

#define CHECK_INIT assert((m_pIOleOject) && ("Init first please!"));

CIEInstance::CIEInstance(HWND hWnd) : m_ulRef(0), m_hWnd(hWnd), m_pIOleOject(NULL)
{
	assert(m_hWnd);
	Init();
}

CIEInstance::~CIEInstance(void)
{
}

BOOL CIEInstance::Init()
{
	HRESULT hr = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC_SERVER, IID_IOleObject, (LPVOID *)&m_pIOleOject);
	if(FAILED(hr))
	{
		return FALSE;
	}
	hr = m_pIOleOject->SetClientSite(this);    // Informs an embedded object of its display location, called a "client site," within its container.
	if(FAILED(hr))
	{
		m_pIOleOject->Release();
		m_pIOleOject = NULL;
		return FALSE;
	}
	m_pIOleOject->SetHostNames(L"Name of container application", NULL);    // Provides an object with the name of its container application and the compound document in which it is embedded.
	OleSetContainedObject(m_pIOleOject, TRUE);
	RECT rc;
	GetClientRect(m_hWnd, &rc);
	m_pIOleOject->DoVerb(OLEIVERB_SHOW, NULL, this, 0, m_hWnd, &rc);    // Requests an object to perform an action in response to an end-user's action.
	IWebBrowser2 *pIWebBrowser2 = NULL;
	m_pIOleOject->QueryInterface(IID_IWebBrowser2, (LPVOID *)&pIWebBrowser2);
	pIWebBrowser2->put_Left(0);
	pIWebBrowser2->put_Top(0);
	pIWebBrowser2->put_Width(rc.right);
	pIWebBrowser2->put_Height(rc.bottom);
	pIWebBrowser2->Release();
	return TRUE;
}

void CIEInstance::ResizeBrowser(WORD wWidth, WORD wHeight)
{
	IWebBrowser2 *pIWebBrowser2 = NULL;
	m_pIOleOject->QueryInterface(IID_IWebBrowser2, (LPVOID *)&pIWebBrowser2);
	if(pIWebBrowser2)
	{
		pIWebBrowser2->put_Width(wWidth);
		pIWebBrowser2->put_Height(wHeight);
	}
}

void CIEInstance::DisplayHTMLPage(WCHAR *pwszUrl)
{
	IWebBrowser2 *pIWebBrowser2 = NULL;
	m_pIOleOject->QueryInterface(IID_IWebBrowser2, (LPVOID *)&pIWebBrowser2);
	if(pIWebBrowser2)
	{
		VARIANT vURL;
		VariantInit(&vURL);
		vURL.vt = VT_BSTR;
		vURL.bstrVal = SysAllocString(pwszUrl);
		pIWebBrowser2->Navigate2(&vURL, NULL, NULL, NULL, NULL);
		pIWebBrowser2->Release();
		VariantClear(&vURL);
	}
}

HRESULT CIEInstance::QueryInterface(REFIID riid, void **ppvObject)
{
	CHECK_INIT
	if(IID_IUnknown == riid)
	{
		AddRef();
		*ppvObject = (IUnknown *)(IOleClientSite *)this;
		return S_OK;
	}
	else if(IID_IOleClientSite == riid)
	{
		AddRef();
		*ppvObject = (IOleClientSite *)this;
		return S_OK;
	}
	else if(IID_IOleInPlaceFrame == riid)
	{
		AddRef();
		*ppvObject = (IOleInPlaceFrame *)this;
		return S_OK;
	}
	else if(IID_IOleInPlaceSite == riid)
	{
		AddRef();
		*ppvObject = (IOleInPlaceSite *)this;
		return S_OK;
	}
	else
	{
		return E_NOINTERFACE;
	}
}

ULONG CIEInstance::AddRef()
{
	//return ++m_ulRef;
	return 1;
}

ULONG CIEInstance::Release()
{
	//--m_ulRef;
	//if(0 == m_ulRef)
	//{
	//	delete this;
	//	return 0;
	//}
	//return m_ulRef;
	return 1;
}
