#ifndef __MSGUTILS_H__
#define __MSGUTILS_H__

HRESULT CreateDummyISMTPServer(
			DWORD		dwInstance,
			LPSTR		szLogFileName,
			ISMTPServer	**ppServer
			);

HRESULT CreateStoreDriver(
			DWORD				dwInstance,
			ISMTPServer			*pServer,
			IMailMsgStoreDriver	**ppStore
			);

HRESULT CreateUnboundMailMsg(
			IMailMsgProperties	**ppMsg
			);

HRESULT BindMailMsg(
			IMailMsgProperties		*ppMsg,
			IMailMsgStoreDriver		*pStore,
			IMailMsgPropertyStream	*pStream,
			HANDLE					hFile
			);

HRESULT CreateBoundMailMsg(
			IMailMsgStoreDriver	*pStore,
			IMailMsgProperties	**ppMsg
			);

HRESULT GenerateRandomProperties(
			IMailMsgProperties	*pMsg,
			DWORD				dwNumGlobalProperties,
			DWORD				dwAvgGlobalPropertyLength,
			DWORD				dwNumRecipients,
			DWORD				dwAvgUserNameLength,
			DWORD				dwAvgDomainNameLength,
			DWORD				dwNumRecipientProperties,
			DWORD				dwAvgRecipientPropertyLength
			);


class CDummySMTPServer : public ISMTPServer
{
public:
	CDummySMTPServer(
				DWORD	dwInstance,
				LPSTR	szLogFileName
				)
	{
		m_dwInstance = dwInstance;
		if (szLogFileName)
			lstrcpy(m_szLogFileName, szLogFileName);
		else
			*m_szLogFileName = '\0';
		m_hLogFile = INVALID_HANDLE_VALUE;
		m_ulRefCount = 1;
	}
	~CDummySMTPServer()
	{
		if (m_hLogFile != INVALID_HANDLE_VALUE)
			CloseHandle(m_hLogFile);
	}

	HRESULT Init();

	STDMETHOD(QueryInterface)(REFIID iid, void  **ppvObject);
	STDMETHOD_(ULONG, AddRef)(void) {return(InterlockedIncrement(&m_ulRefCount));};
	STDMETHOD_(ULONG, Release) (void) 
	{
		LONG    lRefCount = InterlockedDecrement(&m_ulRefCount);
		if (lRefCount == 0)
		{
            delete this;
		}

		return(lRefCount);
	};

	STDMETHOD (AllocMessage)(
				IMailMsgProperties **ppMsg
				);

	STDMETHOD (SubmitMessage)(
				IMailMsgProperties *pMsg
				);

	STDMETHOD (TriggerLocalDelivery)(IMailMsgProperties *pMsg, DWORD dwRecipientCount, DWORD * pdwRecipIndexes);

	STDMETHOD (ReadMetabaseString)(DWORD MetabaseId, LPBYTE Buffer, DWORD * BufferSize, BOOL fSecure);

	STDMETHOD (ReadMetabaseDword)(DWORD MetabaseId, DWORD * dwValue);
	STDMETHOD (ServerStartHintFunction)();
	STDMETHOD (ServerStopHintFunction)();

private:
	LONG	m_ulRefCount;
	DWORD	m_dwInstance;
	char	m_szLogFileName[MAX_PATH * 2];
	HANDLE	m_hLogFile;
};

#endif