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

93 lines
2.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: R U N D O W N . H
//
// Contents: RPC rundown support
//
// Notes:
//
// Author: mbend 12 Nov 2000
//
//----------------------------------------------------------------------------
#pragma once
#include "upsync.h"
#include "ulist.h"
class CRundownHelperBase
{
public:
virtual ~CRundownHelperBase() {}
// Called on RPC disconnect
virtual void OnRundown() = 0;
// Do we match a RPC context handle
virtual BOOL IsMatch(void * pvItem) = 0;
};
template <class Type>
class CRundownHelper : public CRundownHelperBase
{
public:
CRundownHelper(Type * pType) : m_pType(pType) {}
CRundownHelper(const CRundownHelper & ref) : m_pType(ref.m_pType) {}
CRundownHelper & operator=(const CRundownHelper & ref)
{
if(this != &ref)
{
m_pType = ref.m_pType;
}
return *this;
}
void OnRundown()
{
// Type must have a static void Type::OnRundown(Type *) method
Type::OnRundown(m_pType);
}
BOOL IsMatch(void * pvItem)
{
return m_pType == pvItem;
}
private:
Type * m_pType;
};
class CSsdpRundownSupport
{
public:
~CSsdpRundownSupport();
static CSsdpRundownSupport & Instance();
template <class Type> HRESULT HrAddRundownItem(Type * pType)
{
HRESULT hr = S_OK;
CRundownHelperBase * pBase = new CRundownHelper<Type>(pType);
if(!pBase)
{
return E_OUTOFMEMORY;
}
return HrAddItemInternal(pBase);
}
void RemoveRundownItem(void * pvItem);
void DoRundown(void * pvItem);
private:
CSsdpRundownSupport();
CSsdpRundownSupport(const CSsdpRundownSupport &);
CSsdpRundownSupport & operator=(const CSsdpRundownSupport &);
HRESULT HrAddItemInternal(CRundownHelperBase * pBase);
static CSsdpRundownSupport s_instance;
typedef CUList<CRundownHelperBase*> RundownList;
CUCriticalSection m_critSec;
RundownList m_rundownList;
};