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.
 
 
 
 
 
 

107 lines
2.2 KiB

/*==========================================================================
*
* Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
*
* File: GroupCon.cpp
* Content: Group Connection object routines
*@@BEGIN_MSINTERNAL
* History:
* Date By Reason
* ==== == ======
* 03/02/00 mjn Created
* 04/18/00 mjn CConnection tracks connection status better
* 05/05/00 mjn Added GetConnectionRef()
* 08/15/00 mjn Added SetGroup()
* mjn Fixed Release() to take locks and cleanup m_pGroup
*@@END_MSINTERNAL
*
***************************************************************************/
#include "dncorei.h"
void CGroupConnection::ReturnSelfToPool( void )
{
g_GroupConnectionPool.Release( this );
}
#undef DPF_MODNAME
#define DPF_MODNAME "CGroupConnection::Release"
void CGroupConnection::Release(void)
{
LONG lRefCount;
DNASSERT(m_lRefCount > 0);
lRefCount = DNInterlockedDecrement(const_cast<LONG*>(&m_lRefCount));
if (lRefCount == 0)
{
if (m_pGroup)
{
m_pGroup->Lock();
RemoveFromConnectionList();
m_pGroup->Unlock();
m_pGroup->Release();
m_pGroup = NULL;
}
if (m_pConnection)
{
m_pConnection->Release();
m_pConnection = NULL;
}
m_dwFlags = 0;
m_lRefCount = 0;
ReturnSelfToPool();
}
}
void CGroupConnection::SetConnection( CConnection *const pConnection )
{
if (pConnection)
{
pConnection->Lock();
if (pConnection->IsConnected())
{
pConnection->AddRef();
m_pConnection = pConnection;
}
pConnection->Unlock();
}
}
#undef DPF_MODNAME
#define DPF_MODNAME "CGroupConnection::GetConnectionRef"
HRESULT CGroupConnection::GetConnectionRef( CConnection **const ppConnection )
{
HRESULT hResultCode;
DNASSERT( ppConnection != NULL);
Lock();
if ( m_pConnection && !m_pConnection->IsInvalid())
{
m_pConnection->AddRef();
*ppConnection = m_pConnection;
hResultCode = DPN_OK;
}
else
{
hResultCode = DPNERR_NOCONNECTION;
}
Unlock();
return( hResultCode );
}
void CGroupConnection::SetGroup( CNameTableEntry *const pGroup )
{
if (pGroup)
{
pGroup->AddRef();
}
m_pGroup = pGroup;
}