#pragma once

#include "stdafx.h"

extern CComModule _Module;

class CEventSink :	
	public CComObjectRootEx<CComSingleThreadModel>,	
	public IDispEventImpl<0, CEventSink, &DIID__ICaoControllerEvents, &LIBID_CAOLib, 1, 0>
{
private:
	HWND m_mainWindow;

public:
	CEventSink()
	{
	}

	BEGIN_COM_MAP(CEventSink)
		COM_INTERFACE_ENTRY_IID(DIID__ICaoControllerEvents, CEventSink)
	END_COM_MAP()

	BEGIN_SINK_MAP(CEventSink)
		SINK_ENTRY_EX(0, DIID__ICaoControllerEvents, 1, OnMessage)
	END_SINK_MAP()

	STDMETHODIMP OnMessage(IUnknown* pIMessage)
	{
		USES_CONVERSION;
		CComVariant vntVal;
		CComPtr<ICaoMessage> pIMsg;
		HWND hlist;

		HRESULT hr = pIMessage->QueryInterface(IID_ICaoMessage, (void**)&pIMsg);
		hr = pIMsg->get_Value(&vntVal);
		if (SUCCEEDED(hr) && vntVal.vt == VT_BSTR) {
			// Add the receieved data to list box
			hlist = GetDlgItem(m_mainWindow, IDC_LIST_RESULT);
			SendMessage(hlist, LB_ADDSTRING, 0, (LPARAM)vntVal.bstrVal);
		}

		return hr;
	}

	void SetMainWindow(HWND hwnd)
	{
		m_mainWindow = hwnd;
	}
};
