/***************************************************************************
 *
 *  Copyright (C) 2001-2002 Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       dp8simipc.h
 *
 *  Content:	Header for interprocess communication object class.
 *
 *  History:
 *   Date      By        Reason
 *  ========  ========  =========
 *  04/25/01  VanceO    Created.
 *
 ***************************************************************************/




//=============================================================================
// Defines
//=============================================================================
#define DP8SIM_IPC_VERSION				2

#define DP8SIM_IPC_MUTEXNAME			_T("DP8Sim IPC Mutex")
#define DP8SIM_IPC_FILEMAPPINGNAME		_T("DP8Sim IPC File Mapping")




//=============================================================================
// Structures
//=============================================================================
typedef struct _DP8SIM_SHAREDMEMORY
{
	DWORD				dwVersion;		// shared memory version
	DP8SIM_PARAMETERS	dp8spSend;		// current send settings
	DP8SIM_PARAMETERS	dp8spReceive;	// current receive settings
	DP8SIM_STATISTICS	dp8ssSend;		// current send statistics
	DP8SIM_STATISTICS	dp8ssReceive;	// current receive statistics
} DP8SIM_SHAREDMEMORY, * PDP8SIM_SHAREDMEMORY;







//=============================================================================
// Send object class
//=============================================================================
class CDP8SimIPC
{
	public:
		CDP8SimIPC(void);	// constructor
		~CDP8SimIPC(void);	// destructor


		inline BOOL IsValidObject(void)
		{
			if ((this == NULL) || (IsBadWritePtr(this, sizeof(CDP8SimIPC))))
			{
				return FALSE;
			}

			if (*((DWORD*) (&this->m_Sig)) != 0x494d4953)	// 0x49 0x4d 0x49 0x53 = 'IMIS' = 'SIMI' in Intel order
			{
				return FALSE;
			}

			return TRUE;
		};


		HRESULT Initialize(void);

		void Close(void);

		void GetAllParameters(DP8SIM_PARAMETERS * const pdp8spSend,
							DP8SIM_PARAMETERS * const pdp8spReceive);

		void GetAllSendParameters(DP8SIM_PARAMETERS * const pdp8sp);

		void GetAllReceiveParameters(DP8SIM_PARAMETERS * const pdp8sp);

		void SetAllParameters(const DP8SIM_PARAMETERS * const pdp8spSend,
							const DP8SIM_PARAMETERS * const pdp8spReceive);

		void GetAllStatistics(DP8SIM_STATISTICS * const pdp8ssSend,
							DP8SIM_STATISTICS * const pdp8ssReceive);

		void ClearAllStatistics(void);

		void IncrementStatsSendTransmitted(DWORD dwBytes, DWORD dwDelay);

		void IncrementStatsSendDropped(DWORD dwBytes);

		void IncrementStatsReceiveTransmitted(DWORD dwBytes, DWORD dwDelay);

		void IncrementStatsReceiveDropped(DWORD dwBytes);



	
	private:
		BYTE					m_Sig[4];		// debugging signature ('SIMI')
		HANDLE					m_hMutex;		// handle to mutex protecting shared memory
		HANDLE					m_hFileMapping;	// handle to shared memory
		DP8SIM_SHAREDMEMORY *	m_pdp8ssm;		// pointer to mapped view of shared memory


#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimIPC::LockSharedMemory"
		inline void LockSharedMemory(void)
		{
			DNASSERT(this->m_hMutex != NULL);
			WaitForSingleObject(this->m_hMutex, INFINITE);
		}

#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimIPC::UnlockSharedMemory"
		inline void UnlockSharedMemory(void)
		{
			DNASSERT(this->m_hMutex != NULL);
			ReleaseMutex(this->m_hMutex);
		}

		void LoadDefaultParameters(DP8SIM_PARAMETERS * const pdp8spSend,
									DP8SIM_PARAMETERS * const pdp8spReceive);

		void SaveDefaultParameters(const DP8SIM_PARAMETERS * const pdp8spSend,
									const DP8SIM_PARAMETERS * const pdp8spReceive);
};