windows-nt/Source/XPSP1/NT/net/upnp/ssdp/common/ssdpsrv/rundown.cpp
2020-09-26 16:20:57 +08:00

123 lines
2.8 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: R U N D O W N . C P P
//
// Contents: RPC rundown support
//
// Notes:
//
// Author: mbend 12 Nov 2000
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "rundown.h"
CSsdpRundownSupport CSsdpRundownSupport::s_instance;
CSsdpRundownSupport::CSsdpRundownSupport()
{
}
CSsdpRundownSupport::~CSsdpRundownSupport()
{
CLock lock(m_critSec);
RundownList::Iterator iter;
if(S_OK == m_rundownList.GetIterator(iter))
{
CRundownHelperBase ** ppBase = NULL;
while(S_OK == iter.HrGetItem(&ppBase))
{
delete *ppBase;
if(S_OK != iter.HrNext())
{
break;
}
}
}
m_rundownList.Clear();
}
CSsdpRundownSupport & CSsdpRundownSupport::Instance()
{
return s_instance;
}
void CSsdpRundownSupport::RemoveRundownItem(void * pvItem)
{
CRundownHelperBase * pBase = NULL;
{
CLock lock(m_critSec);
RundownList::Iterator iter;
if(S_OK == m_rundownList.GetIterator(iter))
{
CRundownHelperBase ** ppBase = NULL;
while(S_OK == iter.HrGetItem(&ppBase))
{
if((*ppBase)->IsMatch(pvItem))
{
pBase = *ppBase;
iter.HrErase();
break;
}
if(S_OK != iter.HrNext())
{
break;
}
}
}
}
if(pBase)
{
delete pBase;
}
}
void CSsdpRundownSupport::DoRundown(void * pvItem)
{
CRundownHelperBase * pBase = NULL;
{
CLock lock(m_critSec);
RundownList::Iterator iter;
if(S_OK == m_rundownList.GetIterator(iter))
{
CRundownHelperBase ** ppBaseIter = NULL;
while(S_OK == iter.HrGetItem(&ppBaseIter))
{
if((*ppBaseIter)->IsMatch(pvItem))
{
pBase = *ppBaseIter;
iter.HrErase();
break;
}
if(S_OK != iter.HrNext())
{
break;
}
}
}
}
if(pBase)
{
pBase->OnRundown();
delete pBase;
TraceTag(ttidSsdpRpcIf, "Rundown called for %p", pvItem);
}
}
HRESULT CSsdpRundownSupport::HrAddItemInternal(CRundownHelperBase * pBase)
{
HRESULT hr = S_OK;
CLock lock(m_critSec);
hr = m_rundownList.HrPushFrontTransfer(pBase);
TraceHr(ttidError, FAL, hr, FALSE, "CSsdpRundownSupport::HrAddItemInternal");
return hr;
}