|
|
/***************************************************************************
* * Copyright (C) 2001-2002 Microsoft Corporation. All Rights Reserved. * * File: controlobj.cpp * * Content: DP8SIM control interface wrapper object class. * * History: * Date By Reason * ======== ======== ========= * 04/24/01 VanceO Created. * ***************************************************************************/
#include "dp8simi.h"
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::CDP8SimControl"
//=============================================================================
// CDP8SimControl constructor
//-----------------------------------------------------------------------------
//
// Description: Initializes the new CDP8SimControl object.
//
// Arguments: None.
//
// Returns: None (the object).
//=============================================================================
CDP8SimControl::CDP8SimControl(void) { this->m_blList.Initialize();
this->m_Sig[0] = 'D'; this->m_Sig[1] = 'P'; this->m_Sig[2] = '8'; this->m_Sig[3] = 'S';
this->m_lRefCount = 1; // someone must have a pointer to this object
this->m_dwFlags = 0; } // CDP8SimControl::CDP8SimControl
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::~CDP8SimControl"
//=============================================================================
// CDP8SimControl destructor
//-----------------------------------------------------------------------------
//
// Description: Frees the CDP8SimControl object.
//
// Arguments: None.
//
// Returns: None.
//=============================================================================
CDP8SimControl::~CDP8SimControl(void) { DNASSERT(this->m_blList.IsEmpty());
DNASSERT(this->m_lRefCount == 0); DNASSERT(this->m_dwFlags == 0);
//
// For grins, change the signature before deleting the object.
//
this->m_Sig[3] = 's'; } // CDP8SimControl::~CDP8SimControl
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::QueryInterface"
//=============================================================================
// CDP8SimControl::QueryInterface
//-----------------------------------------------------------------------------
//
// Description: Retrieves a new reference for an interfaces supported by this
// CDP8SimControl object.
//
// Arguments:
// REFIID riid - Reference to interface ID GUID.
// LPVOID * ppvObj - Place to store pointer to object.
//
// Returns: HRESULT
// S_OK - Returning a valid interface pointer.
// DPNHERR_INVALIDOBJECT - The interface object is invalid.
// DPNHERR_INVALIDPOINTER - The destination pointer is invalid.
// E_NOINTERFACE - Invalid interface was specified.
//=============================================================================
STDMETHODIMP CDP8SimControl::QueryInterface(REFIID riid, LPVOID * ppvObj) { HRESULT hr = DPN_OK;
DPFX(DPFPREP, 3, "(0x%p) Parameters: (REFIID, 0x%p)", this, ppvObj);
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8SimControl object!"); hr = DPNERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if ((! IsEqualIID(riid, IID_IUnknown)) && (! IsEqualIID(riid, IID_IDP8SimControl))) { DPFX(DPFPREP, 0, "Unsupported interface!"); hr = E_NOINTERFACE; goto Failure; }
if ((ppvObj == NULL) || (IsBadWritePtr(ppvObj, sizeof(void*)))) { DPFX(DPFPREP, 0, "Invalid interface pointer specified!"); hr = DPNERR_INVALIDPOINTER; goto Failure; }
//
// Add a reference, and return the interface pointer (which is actually
// just the object pointer, they line up because CDP8SimControl inherits
// from the interface declaration).
//
this->AddRef(); (*ppvObj) = this;
Exit:
DPFX(DPFPREP, 3, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
goto Exit; } // CDP8SimControl::QueryInterface
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::AddRef"
//=============================================================================
// CDP8SimControl::AddRef
//-----------------------------------------------------------------------------
//
// Description: Adds a reference to this CDP8SimControl object.
//
// Arguments: None.
//
// Returns: New refcount.
//=============================================================================
STDMETHODIMP_(ULONG) CDP8SimControl::AddRef(void) { LONG lRefCount;
DNASSERT(this->IsValidObject());
//
// There must be at least 1 reference to this object, since someone is
// calling AddRef.
//
DNASSERT(this->m_lRefCount > 0);
lRefCount = InterlockedIncrement(&this->m_lRefCount);
DPFX(DPFPREP, 3, "[0x%p] RefCount [0x%lx]", this, lRefCount);
return lRefCount; } // CDP8SimControl::AddRef
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::Release"
//=============================================================================
// CDP8SimControl::Release
//-----------------------------------------------------------------------------
//
// Description: Removes a reference to this CDP8SimControl object. When the
// refcount reaches 0, this object is destroyed.
// You must NULL out your pointer to this object after calling
// this function.
//
// Arguments: None.
//
// Returns: New refcount.
//=============================================================================
STDMETHODIMP_(ULONG) CDP8SimControl::Release(void) { LONG lRefCount;
DNASSERT(this->IsValidObject());
//
// There must be at least 1 reference to this object, since someone is
// calling Release.
//
DNASSERT(this->m_lRefCount > 0);
lRefCount = InterlockedDecrement(&this->m_lRefCount);
//
// Was that the last reference? If so, we're going to destroy this object.
//
if (lRefCount == 0) { DPFX(DPFPREP, 3, "[0x%p] RefCount hit 0, destroying object.", this);
//
// First pull it off the global list.
//
DNEnterCriticalSection(&g_csGlobalsLock);
this->m_blList.RemoveFromList();
DNASSERT(g_lOutstandingInterfaceCount > 0); g_lOutstandingInterfaceCount--; // update count so DLL can unload now works correctly
DNLeaveCriticalSection(&g_csGlobalsLock);
//
// Make sure it's closed.
//
if (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED) { //
// Assert so that the user can fix his/her broken code!
//
DNASSERT(! "DP8SimControl object being released without calling Close first!");
//
// Then go ahead and do the right thing. Ignore error, we can't do
// much about it.
//
this->Close(0); }
//
// Then uninitialize the object.
//
this->UninitializeObject();
//
// Finally delete this (!) object.
//
delete this; } else { DPFX(DPFPREP, 3, "[0x%p] RefCount [0x%lx]", this, lRefCount); }
return lRefCount; } // CDP8SimControl::Release
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::Initialize"
//=============================================================================
// CDP8SimControl::Initialize
//-----------------------------------------------------------------------------
//
// Description: Initializes this DP8Sim Control interface.
//
// Arguments:
// DWORD dwFlags - Unused, must be zero.
//
// Returns: HRESULT
// DP8SIM_OK - The DP8Sim control object was
// successfully initialized.
// DP8SIMERR_ALREADYINITIALIZED - The DP8Sim control object has already
// been initialized.
// DP8SIMERR_INVALIDFLAGS - Invalid flags were specified.
// DP8SIMERR_INVALIDOBJECT - The DP8Sim control object is invalid.
// DP8SIMERR_MISMATCHEDVERSION - A different version of DP8Sim is already
// in use on this system.
//=============================================================================
STDMETHODIMP CDP8SimControl::Initialize(const DWORD dwFlags) { HRESULT hr = DP8SIM_OK; BOOL fHaveLock = FALSE; BOOL fInitializedIPCObject = FALSE;
DPFX(DPFPREP, 2, "(0x%p) Parameters: (0x%x)", this, dwFlags);
#ifndef DPNBUILD_NOPARAMVAL
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8Sim control object!"); hr = DP8SIMERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags specified!"); hr = DP8SIMERR_INVALIDFLAGS; goto Failure; } #endif // ! DPNBUILD_NOPARAMVAL
DNEnterCriticalSection(&this->m_csLock); fHaveLock = TRUE;
//
// Validate the object state.
//
if (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED) { DPFX(DPFPREP, 0, "Control object already initialized!"); hr = DP8SIMERR_ALREADYINITIALIZED; goto Failure; }
//
// Connect the shared memory.
//
hr = this->m_DP8SimIPC.Initialize(); if (hr != DPN_OK) { DPFX(DPFPREP, 0, "Couldn't initialize IPC object!"); goto Failure; }
fInitializedIPCObject = TRUE;
//
// We're now initialized.
//
this->m_dwFlags |= DP8SIMCONTROLOBJ_INITIALIZED;
Exit:
if (fHaveLock) { DNLeaveCriticalSection(&this->m_csLock); }
DPFX(DPFPREP, 2, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
if (fInitializedIPCObject) { this->m_DP8SimIPC.Close(); fInitializedIPCObject = FALSE; }
goto Exit; } // CDP8SimControl::Initialize
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::Close"
//=============================================================================
// CDP8SimControl::Close
//-----------------------------------------------------------------------------
//
// Description: Closes this DP8Sim Control interface.
//
// Arguments:
// DWORD dwFlags - Unused, must be zero.
//
// Returns: HRESULT
// DP8SIM_OK - The DP8Sim control object was successfully
// closed.
// DP8SIMERR_INVALIDFLAGS - Invalid flags were specified.
// DP8SIMERR_INVALIDOBJECT - The DP8Sim control object is invalid.
// DP8SIMERR_NOTINITIALIZED - The DP8Sim control object has not been
// initialized.
//=============================================================================
STDMETHODIMP CDP8SimControl::Close(const DWORD dwFlags) { HRESULT hr = DP8SIM_OK; BOOL fHaveLock = FALSE;
DPFX(DPFPREP, 2, "(0x%p) Parameters: (0x%x)", this, dwFlags);
#ifndef DPNBUILD_NOPARAMVAL
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8Sim control object!"); hr = DP8SIMERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags specified!"); hr = DP8SIMERR_INVALIDFLAGS; goto Failure; } #endif // ! DPNBUILD_NOPARAMVAL
DNEnterCriticalSection(&this->m_csLock); fHaveLock = TRUE;
//
// Validate the object state.
//
if (! (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED)) { DPFX(DPFPREP, 0, "Control object not initialized!"); hr = DP8SIMERR_NOTINITIALIZED; goto Failure; }
//
// Disconnect the shared memory.
//
this->m_DP8SimIPC.Close();
//
// Turn off the initialized flags.
//
this->m_dwFlags &= ~DP8SIMCONTROLOBJ_INITIALIZED; DNASSERT(this->m_dwFlags == 0);
//
// Drop the lock, nobody should be touching this object now.
//
DNLeaveCriticalSection(&this->m_csLock); fHaveLock = FALSE;
Exit:
DPFX(DPFPREP, 2, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
if (fHaveLock) { DNLeaveCriticalSection(&this->m_csLock); }
goto Exit; } // CDP8SimControl::Close
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::GetAllParameters"
//=============================================================================
// CDP8SimControl::GetAllParameters
//-----------------------------------------------------------------------------
//
// Description: Retrieves all of the current DP8Sim settings.
//
// Arguments:
// DP8SIM_PARAMETERS * pdp8spSend - Place to store current send
// parameters.
// DP8SIM_PARAMETERS * pdp8spReceive - Place to store current receive
// parameters.
// DWORD dwFlags - Unused, must be zero.
//
// Returns: HRESULT
// DP8SIM_OK - The parameters were successfully retrieved.
// DP8SIMERR_INVALIDFLAGS - Invalid flags were specified.
// DP8SIMERR_INVALIDOBJECT - The DP8Sim control object is invalid.
// DP8SIMERR_INVALIDPARAM - An invalid structure was specified.
// DP8SIMERR_INVALIDPOINTER - An invalid structure pointer was specified.
// DP8SIMERR_NOTINITIALIZED - The DP8Sim control object has not been
// initialized.
//=============================================================================
STDMETHODIMP CDP8SimControl::GetAllParameters(DP8SIM_PARAMETERS * const pdp8spSend, DP8SIM_PARAMETERS * const pdp8spReceive, const DWORD dwFlags) { HRESULT hr = DP8SIM_OK; BOOL fHaveLock = FALSE;
DPFX(DPFPREP, 2, "(0x%p) Parameters: (0x%p, 0x%p, 0x%x)", this, pdp8spSend, pdp8spReceive, dwFlags);
#ifndef DPNBUILD_NOPARAMVAL
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8Sim control object!"); hr = DP8SIMERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if ((pdp8spSend == NULL) || (IsBadWritePtr(pdp8spSend, sizeof(DP8SIM_PARAMETERS)))) { DPFX(DPFPREP, 0, "Invalid send parameters pointer!"); hr = DP8SIMERR_INVALIDPOINTER; goto Failure; }
if (pdp8spSend->dwSize != sizeof(DP8SIM_PARAMETERS)) { DPFX(DPFPREP, 0, "Send parameters structure size is invalid!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if ((pdp8spReceive == NULL) || (IsBadWritePtr(pdp8spReceive, sizeof(DP8SIM_PARAMETERS)))) { DPFX(DPFPREP, 0, "Invalid receive parameters pointer!"); hr = DP8SIMERR_INVALIDPOINTER; goto Failure; }
if (pdp8spReceive->dwSize != sizeof(DP8SIM_PARAMETERS)) { DPFX(DPFPREP, 0, "Receive parameters structure size is invalid!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags specified!"); hr = DP8SIMERR_INVALIDFLAGS; goto Failure; } #endif // ! DPNBUILD_NOPARAMVAL
DNEnterCriticalSection(&this->m_csLock); fHaveLock = TRUE;
//
// Validate the object state.
//
if (! (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED)) { DPFX(DPFPREP, 0, "Control object not initialized!"); hr = DP8SIMERR_NOTINITIALIZED; goto Failure; }
//
// Retrieve the settings from the IPC object.
//
this->m_DP8SimIPC.GetAllParameters(pdp8spSend, pdp8spReceive);
//
// Drop the lock.
//
DNLeaveCriticalSection(&this->m_csLock); fHaveLock = FALSE;
Exit:
DPFX(DPFPREP, 2, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
if (fHaveLock) { DNLeaveCriticalSection(&this->m_csLock); }
goto Exit; } // CDP8SimControl::GetAllParameters
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::SetAllParameters"
//=============================================================================
// CDP8SimControl::SetAllParameters
//-----------------------------------------------------------------------------
//
// Description: Modifies the current DP8Sim settings.
//
// Arguments:
// DP8SIM_PARAMETERS * pdp8spSend - Structure containing desired send
// parameters.
// DP8SIM_PARAMETERS * pdp8spReceive - Structure containing desired
// receive parameters.
// DWORD dwFlags - Unused, must be zero.
//
// Returns: HRESULT
// DP8SIM_OK - The parameters were successfully changed.
// DP8SIMERR_INVALIDFLAGS - Invalid flags were specified.
// DP8SIMERR_INVALIDOBJECT - The DP8Sim control object is invalid.
// DP8SIMERR_INVALIDPARAM - An invalid structure was specified.
// DP8SIMERR_INVALIDPOINTER - An invalid structure pointer was specified.
// DP8SIMERR_NOTINITIALIZED - The DP8Sim control object has not been
// initialized.
//=============================================================================
STDMETHODIMP CDP8SimControl::SetAllParameters(const DP8SIM_PARAMETERS * const pdp8spSend, const DP8SIM_PARAMETERS * const pdp8spReceive, const DWORD dwFlags) { HRESULT hr = DP8SIM_OK; BOOL fHaveLock = FALSE;
DPFX(DPFPREP, 2, "(0x%p) Parameters: (0x%p, 0x%p, 0x%x)", this, pdp8spSend, pdp8spReceive, dwFlags);
#ifndef DPNBUILD_NOPARAMVAL
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8Sim control object!"); hr = DP8SIMERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if ((pdp8spSend == NULL) || (IsBadReadPtr(pdp8spSend, sizeof(DP8SIM_PARAMETERS)))) { DPFX(DPFPREP, 0, "Invalid send parameters pointer!"); hr = DP8SIMERR_INVALIDPOINTER; goto Failure; }
if (pdp8spSend->dwSize != sizeof(DP8SIM_PARAMETERS)) { DPFX(DPFPREP, 0, "Send parameters structure size is invalid!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (pdp8spSend->dwFlags != 0) { DPFX(DPFPREP, 0, "Send parameters structure flags must be 0!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if ((pdp8spSend->fPacketLossPercent < 0.0) || (pdp8spSend->fPacketLossPercent > 100.0)) { DPFX(DPFPREP, 0, "Send packet loss must be between 0.0 and 100.0!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (pdp8spSend->dwMinLatencyMS > pdp8spSend->dwMaxLatencyMS) { DPFX(DPFPREP, 0, "Minimum send latency must be less than or equal to the maximum send latency!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if ((pdp8spReceive == NULL) || (IsBadReadPtr(pdp8spReceive, sizeof(DP8SIM_PARAMETERS)))) { DPFX(DPFPREP, 0, "Invalid receive parameters pointer!"); hr = DP8SIMERR_INVALIDPOINTER; goto Failure; }
if (pdp8spReceive->dwSize != sizeof(DP8SIM_PARAMETERS)) { DPFX(DPFPREP, 0, "Receive parameters structure size is invalid!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (pdp8spReceive->dwFlags != 0) { DPFX(DPFPREP, 0, "Receive parameters structure flags must be 0!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if ((pdp8spReceive->fPacketLossPercent < 0.0) || (pdp8spReceive->fPacketLossPercent > 100.0)) { DPFX(DPFPREP, 0, "Receive packet loss must be between 0.0 and 100.0!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (pdp8spReceive->dwMinLatencyMS > pdp8spReceive->dwMaxLatencyMS) { DPFX(DPFPREP, 0, "Minimum receive latency must be less than or equal to the receive send latency!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags specified!"); hr = DP8SIMERR_INVALIDFLAGS; goto Failure; } #endif // ! DPNBUILD_NOPARAMVAL
DNEnterCriticalSection(&this->m_csLock); fHaveLock = TRUE;
//
// Validate the object state.
//
if (! (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED)) { DPFX(DPFPREP, 0, "Control object not initialized!"); hr = DP8SIMERR_NOTINITIALIZED; goto Failure; }
//
// Store the settings with the IPC object.
//
this->m_DP8SimIPC.SetAllParameters(pdp8spSend, pdp8spReceive);
//
// Drop the lock.
//
DNLeaveCriticalSection(&this->m_csLock); fHaveLock = FALSE;
Exit:
DPFX(DPFPREP, 2, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
if (fHaveLock) { DNLeaveCriticalSection(&this->m_csLock); }
goto Exit; } // CDP8SimControl::SetAllParameters
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::GetAllStatistics"
//=============================================================================
// CDP8SimControl::GetAllStatistics
//-----------------------------------------------------------------------------
//
// Description: Retrieves all of the current DP8Sim statistics.
//
// Arguments:
// DP8SIM_STATISTICS * pdp8ssSend - Place to store current send
// statistics.
// DP8SIM_STATISTICS * pdp8ssReceive - Place to store current receive
// statistics.
// DWORD dwFlags - Unused, must be zero.
//
// Returns: HRESULT
// DP8SIM_OK - The statistics were successfully retrieved.
// DP8SIMERR_INVALIDFLAGS - Invalid flags were specified.
// DP8SIMERR_INVALIDOBJECT - The DP8Sim control object is invalid.
// DP8SIMERR_INVALIDPARAM - An invalid structure was specified.
// DP8SIMERR_INVALIDPOINTER - An invalid structure pointer was specified.
// DP8SIMERR_NOTINITIALIZED - The DP8Sim control object has not been
// initialized.
//=============================================================================
STDMETHODIMP CDP8SimControl::GetAllStatistics(DP8SIM_STATISTICS * const pdp8ssSend, DP8SIM_STATISTICS * const pdp8ssReceive, const DWORD dwFlags) { HRESULT hr = DP8SIM_OK; BOOL fHaveLock = FALSE;
DPFX(DPFPREP, 2, "(0x%p) Parameters: (0x%p, 0x%p, 0x%x)", this, pdp8ssSend, pdp8ssReceive, dwFlags);
#ifndef DPNBUILD_NOPARAMVAL
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8Sim control object!"); hr = DP8SIMERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if ((pdp8ssSend == NULL) || (IsBadWritePtr(pdp8ssSend, sizeof(DP8SIM_STATISTICS)))) { DPFX(DPFPREP, 0, "Invalid send statistics pointer!"); hr = DP8SIMERR_INVALIDPOINTER; goto Failure; }
if (pdp8ssSend->dwSize != sizeof(DP8SIM_STATISTICS)) { DPFX(DPFPREP, 0, "Send statistics structure size is invalid!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if ((pdp8ssReceive == NULL) || (IsBadWritePtr(pdp8ssReceive, sizeof(DP8SIM_STATISTICS)))) { DPFX(DPFPREP, 0, "Invalid receive statistics pointer!"); hr = DP8SIMERR_INVALIDPOINTER; goto Failure; }
if (pdp8ssReceive->dwSize != sizeof(DP8SIM_STATISTICS)) { DPFX(DPFPREP, 0, "Receive statistics structure size is invalid!"); hr = DP8SIMERR_INVALIDPARAM; goto Failure; }
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags specified!"); hr = DP8SIMERR_INVALIDFLAGS; goto Failure; } #endif // ! DPNBUILD_NOPARAMVAL
DNEnterCriticalSection(&this->m_csLock); fHaveLock = TRUE;
//
// Validate the object state.
//
if (! (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED)) { DPFX(DPFPREP, 0, "Control object not initialized!"); hr = DP8SIMERR_NOTINITIALIZED; goto Failure; }
//
// Retrieve the stats from the IPC object.
//
this->m_DP8SimIPC.GetAllStatistics(pdp8ssSend, pdp8ssReceive);
//
// Drop the lock.
//
DNLeaveCriticalSection(&this->m_csLock); fHaveLock = FALSE;
Exit:
DPFX(DPFPREP, 2, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
if (fHaveLock) { DNLeaveCriticalSection(&this->m_csLock); }
goto Exit; } // CDP8SimControl::GetAllStatistics
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::ClearAllStatistics"
//=============================================================================
// CDP8SimControl::ClearAllStatistics
//-----------------------------------------------------------------------------
//
// Description: Clears all of the current DP8Sim statistics.
//
// Arguments:
// DWORD dwFlags - Unused, must be zero.
//
// Returns: HRESULT
// DP8SIM_OK - The statistics were successfully cleared.
// DP8SIMERR_INVALIDFLAGS - Invalid flags were specified.
// DP8SIMERR_INVALIDOBJECT - The DP8Sim control object is invalid.
// DP8SIMERR_NOTINITIALIZED - The DP8Sim control object has not been
// initialized.
//=============================================================================
STDMETHODIMP CDP8SimControl::ClearAllStatistics(const DWORD dwFlags) { HRESULT hr = DP8SIM_OK; BOOL fHaveLock = FALSE;
DPFX(DPFPREP, 2, "(0x%p) Parameters: (0x%x)", this, dwFlags);
#ifndef DPNBUILD_NOPARAMVAL
//
// Validate the object.
//
if (! this->IsValidObject()) { DPFX(DPFPREP, 0, "Invalid DP8Sim control object!"); hr = DP8SIMERR_INVALIDOBJECT; goto Failure; }
//
// Validate the parameters.
//
if (dwFlags != 0) { DPFX(DPFPREP, 0, "Invalid flags specified!"); hr = DP8SIMERR_INVALIDFLAGS; goto Failure; } #endif // ! DPNBUILD_NOPARAMVAL
DNEnterCriticalSection(&this->m_csLock); fHaveLock = TRUE;
//
// Validate the object state.
//
if (! (this->m_dwFlags & DP8SIMCONTROLOBJ_INITIALIZED)) { DPFX(DPFPREP, 0, "Control object not initialized!"); hr = DP8SIMERR_NOTINITIALIZED; goto Failure; }
//
// Have the IPC object clear the stats.
//
this->m_DP8SimIPC.ClearAllStatistics();
//
// Drop the lock.
//
DNLeaveCriticalSection(&this->m_csLock); fHaveLock = FALSE;
Exit:
DPFX(DPFPREP, 2, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
if (fHaveLock) { DNLeaveCriticalSection(&this->m_csLock); }
goto Exit; } // CDP8SimControl::ClearAllStatistics
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::InitializeObject"
//=============================================================================
// CDP8SimControl::InitializeObject
//-----------------------------------------------------------------------------
//
// Description: Sets up the object for use like the constructor, but may
// fail with OUTOFMEMORY. Should only be called by class factory
// creation routine.
//
// Arguments: None.
//
// Returns: HRESULT
// S_OK - Initialization was successful.
// E_OUTOFMEMORY - There is not enough memory to initialize.
//=============================================================================
HRESULT CDP8SimControl::InitializeObject(void) { HRESULT hr;
DPFX(DPFPREP, 5, "(0x%p) Enter", this);
DNASSERT(this->IsValidObject());
//
// Create the lock.
//
if (! DNInitializeCriticalSection(&this->m_csLock)) { hr = E_OUTOFMEMORY; goto Failure; }
//
// Don't allow critical section reentry.
//
DebugSetCriticalSectionRecursionCount(&this->m_csLock, 0);
hr = S_OK;
Exit:
DPFX(DPFPREP, 5, "(0x%p) Returning: [0x%lx]", this, hr);
return hr;
Failure:
goto Exit; } // CDP8SimControl::InitializeObject
#undef DPF_MODNAME
#define DPF_MODNAME "CDP8SimControl::UninitializeObject"
//=============================================================================
// CDP8SimControl::UninitializeObject
//-----------------------------------------------------------------------------
//
// Description: Cleans up the object like the destructor, mostly to balance
// InitializeObject.
//
// Arguments: None.
//
// Returns: None.
//=============================================================================
void CDP8SimControl::UninitializeObject(void) { DPFX(DPFPREP, 5, "(0x%p) Enter", this);
DNASSERT(this->IsValidObject());
DNDeleteCriticalSection(&this->m_csLock);
DPFX(DPFPREP, 5, "(0x%p) Returning", this); } // CDP8SimControl::UninitializeObject
|