Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

144 lines
3.8 KiB

/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
FILTSINK.H
Abstract:
History:
--*/
#include <providl.h>
#include <unk.h>
#include <parmdefs.h>
#include "arrtempl.h"
#include <metadata.h>
class CAnySink
{
public:
virtual RELEASE_ME IHmmFilter* GetFilter() = 0;
virtual HRESULT Send(IHmmClassObject* pObject) = 0;
virtual HRESULT Send(IHmmPropertySource* pSource,
IHmmPropertyList* pList) = 0;
};
class CAnySinkContainer
{
public:
virtual long AddMember(CAnySink* pSink) = 0;
virtual BOOL RemoveMember(long lIndex) = 0;
virtual BOOL RemoveMember(CAnySink* pSink) = 0;
virtual INTERNAL GetMember(long lIndex) = 0;
};
class CAnySinkLocation
{
public:
virtual BOOL RemoveSink(CAnySink* pSink) = 0;
};
class CAnySinkLocations
{
public:
virtual void AddLocation(CAnySinkLocation* pLocation) = 0;
};
class CFilteringSink : public CUnk, public CAnySink, public CAnySinkContainer,
public CAnySinkLocation
{
protected:
class XEventSink : public CImpl<IHmmEventSink, CFilteringSink>
{
public:
XEventSink(CFilteringSink* pObj)
: CImpl<IHmmEventSink, CFilteringSink>(pObj)
{}
STDMETHOD(Indicate)(
long lNumObjects,
IHmmClassObject **apObjects);
STDMETHOD(IndicateRaw)(
long lNumObjects,
IHmmPropertySource **apObjects);
STDMETHOD(IndicateWithHint)(
long lNumObjects,
IHmmClassObject *pObject,
IUnknown *pHint);
STDMETHOD(CheckObject)(
IHmmPropertySource *pSource,
IHmmPropertyList **ppList,
IUnknown **ppHint);
STDMETHOD(GetRequirements)(
IHmmFilter **ppRequirements);
STDMETHOD(SetRequirementChangeSink)(
IHmmRequirementChangeSink *pNewSink,
IHmmRequirementChangeSink **ppOldSink);
STDMETHOD(GetOptimizedSink)(
IHmmFilter *pGuaranteedCondition,
long lFlags,
IHmmEventSink **ppOptimizedSink);
STDMETHOD(GetUsefulSubsink)(
long lIndex,
long lFlags,
IHmmEventSink **ppSubsink);
} m_XEventSink;
friend XEventSink;
protected:
CUniquePointerArray<CAnySink> m_apMembers;
IHmmFilter* m_pFrontFilter;
IHmmFilter* m_pGuaranteedFilter;
IHmmRequirementChangeSink* m_pChangeSink;
CMetaData* m_pMeta;
protected:
inline void NotifyChanged(IHmmEventSink* pOld, IHmmEventSink* pNew){}
inline void NotifyChanged(IHmmFilter* pOld, IHmmFilter* pNew){}
HRESULT CheckAndSend(IHmmPropertySource* pSource, BOOL bSend,
IHmmPropertyList** ppList, IUnknown** ppHint);
public:
CFilteringSink(CMetaData* pMeta, CLifeControl* pControl = NULL,
IUnknown* pOuter = NULL)
: CUnk(pControl, pOuter), m_XEventSink(this), m_pFrontFilter(NULL),
m_pChangeSink(NULL), m_pMeta(pMeta)
{}
~CFilteringSink();
void* GetInterface(REFIID riid);
// AnySinkContainer methods
BOOL AddMember(CAnySink* pSink, CAnySinkLocations* pLocations);
BOOL RemoveMember(long lIndex);
BOOL RemoveMember(CAnySink* pSink);
CAnySink* GetMember(long lIndex);
void SetFrontFilter(IHmmFilter* pFilter);
void SetGuaranteedFilter(IHmmFilter* pFilter);
// AnySink methods
RELEASE_ME IHmmFilter* GetFilter()
{return NULL;} // TBD
HRESULT Send(IHmmClassObject* pObject)
{return m_XEventSink.Indicate(1, &pObject);}
HRESULT Send(IHmmPropertySource* pSource, IHmmPropertyList* pList)
{return m_XEventSink.IndicateRaw(1, &pSource);}
// AnySinkLocation methods
BOOL RemoveSink(CAnySink* pSink) {return RemoveMember(pSink);}
};