Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

161 lines
5.0 KiB

/*****************************************************************************
* (C) COPYRIGHT MICROSOFT CORPORATION, 2002
*
* AUTHOR: ByronC
*
* DATE: 4/1/2002
*
* @doc INTERNAL
*
* @module RegistrationCookie.cpp - Declarations for <c RegistrationCookie> |
*
* This file contains the implementation for the <c RegistrationCookie> class.
*
*****************************************************************************/
#include "cplusinc.h"
#include "coredbg.h"
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc | RegistrationCookie | RegistrationCookie |
*
* We initialize all member variables. In general, this sets the values to 0,
* except:
* <nl><md RegistrationCookie::m_ulSig> is set to be RegistrationCookie_INIT_SIG.
* <nl><md RegistrationCookie::m_cRef> is set to be 1.
*
* We also AddRef <md RegistrationCookie::m_pClientEventRegistration> if it is not NULL.
*
*****************************************************************************/
RegistrationCookie::RegistrationCookie(
WiaEventReceiver *pWiaEventReceiver,
ClientEventRegistrationInfo *pClientEventRegistration) :
m_ulSig(RegistrationCookie_INIT_SIG),
m_cRef(1),
m_pWiaEventReceiver(pWiaEventReceiver),
m_pClientEventRegistration(pClientEventRegistration)
{
DBG_FN(RegistrationCookie constructor);
if (m_pClientEventRegistration)
{
m_pClientEventRegistration->AddRef();
}
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc | RegistrationCookie | ~RegistrationCookie |
*
* Do any cleanup that is not already done. Specifically we:
* <nl>- Request <md RegistrationCookie::m_pWiaEventReceiver> to unregister
* <md RegistrationCookie::m_pClientEventRegistration>.
* <nl>- Release our ref count on <md RegistrationCookie::m_pClientEventRegistration>.
*
* Also:
* <nl><md RegistrationCookie::m_ulSig> is set to be RegistrationCookie_DEL_SIG.
*
*****************************************************************************/
RegistrationCookie::~RegistrationCookie()
{
DBG_FN(~RegistrationCookie);
m_ulSig = RegistrationCookie_DEL_SIG;
m_cRef = 0;
if (m_pClientEventRegistration)
{
if (m_pWiaEventReceiver)
{
//
// Change this registration to an unregistration before sending off the
// request.
//
m_pClientEventRegistration->setToUnregister();
HRESULT hr = m_pWiaEventReceiver->SendRegisterUnregisterInfo(m_pClientEventRegistration);
if (FAILED(hr))
{
DBG_ERR(("Failed to unregister event notification"));
}
}
m_pClientEventRegistration->Release();
m_pClientEventRegistration = NULL;
}
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc HRESULT | RegistrationCookie | QueryInterface |
*
* Typical QueryInterface. We only respond to IID_IUnknown.
*
* @rvalue S_OK |
* The method succeeded. This class has been AddRef'd.
* @rvalue E_NOINTERFACE |
* We do not supoort that interface.
*****************************************************************************/
HRESULT _stdcall RegistrationCookie::QueryInterface(
const IID &iid,
void **ppv)
{
HRESULT hr = S_OK;
*ppv = NULL;
if (iid == IID_IUnknown)
{
*ppv = (IUnknown*) this;
hr = S_OK;
}
else
{
hr = E_NOINTERFACE;
}
if (SUCCEEDED(hr))
{
AddRef();
}
return hr;
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc ULONG | RegistrationCookie | AddRef |
*
* Increments this object's ref count. We should always AddRef when handing
* out a pointer to this object.
*
* @rvalue Count |
* The reference count after the count has been incremented.
*****************************************************************************/
ULONG __stdcall RegistrationCookie::AddRef()
{
InterlockedIncrement((long*) &m_cRef);
return m_cRef;
}
/*****************************************************************************
* @doc INTERNAL
*
* @mfunc ULONG | RegistrationCookie | Release |
*
* Decrement this object's ref count. We should always Release when finished
* with a pointer to this object.
*
* @rvalue Count |
* The reference count after the count has been decremented.
*****************************************************************************/
ULONG __stdcall RegistrationCookie::Release()
{
ULONG ulRefCount = m_cRef - 1;
if (InterlockedDecrement((long*) &m_cRef) == 0)
{
delete this;
return 0;
}
return ulRefCount;
}