2025-04-27 07:49:33 -04:00

176 lines
4.8 KiB
C++

/*++
Copyright (C) 1998-2001 Microsoft Corporation
Module Name:
SINKMRSH.H
Abstract:
IWbemObjectSink marshaling
History:
--*/
#include <unk.h>
#include <wbemidl.h>
#include <wbemint.h>
#include <wbemcomn.h>
#include <sync.h>
#include <fastall.h>
#include <wbemclasscache.h>
#include <wbemclasstoidmap.h>
#include <objindpacket.h>
#include "mrshbase.h"
//***************************************************************************
//
// class CSinkFactoryBuffer
//
// DESCRIPTION:
//
// This class provides the proxy stub factory so that we can provide custom
// facelets and stublets for the IWbemObjectSink interface.
//
//***************************************************************************
class CSinkFactoryBuffer : public CUnk
{
IRpcProxyBuffer* m_pOldProxy;
IRpcStubBuffer* m_pOldStub;
// We don't want to AddRef the life control, but
// we need to let objects we create AddRef it, so the
// base class won't keep this pointer, but we will.
CLifeControl* m_pLifeControl;
protected:
class XSinkFactory : public CImpl<IPSFactoryBuffer, CSinkFactoryBuffer>
{
public:
XSinkFactory(CSinkFactoryBuffer* pObj) :
CImpl<IPSFactoryBuffer, CSinkFactoryBuffer>(pObj)
{}
STDMETHOD(CreateProxy)(IN IUnknown* pUnkOuter, IN REFIID riid,
OUT IRpcProxyBuffer** ppProxy, void** ppv);
STDMETHOD(CreateStub)(IN REFIID riid, IN IUnknown* pUnkServer,
OUT IRpcStubBuffer** ppStub);
} m_XSinkFactory;
public:
CSinkFactoryBuffer(CLifeControl* pControl, IUnknown* pUnkOuter = NULL)
: CUnk(NULL, pUnkOuter), m_pLifeControl( pControl ), m_XSinkFactory(this)
{}
void* GetInterface(REFIID riid);
friend XSinkFactory;
};
//***************************************************************************
//
// class CSinkProxyBuffer
//
// DESCRIPTION:
//
// This class provides the facelet for the IWbemObjectSink interface.
//
// Trick #1: This object is derived from IRpcProxyBuffer since IRpcProxyBuffer
// is its "internal" interface --- the interface that does not delegate to the
// aggregator. (Unlike in normal objects, where that interface is IUnknown)
//
//***************************************************************************
class CSinkProxyBuffer : public CBaseProxyBuffer
{
private:
enum {OLD, NEW, UNKNOWN} m_StubType;
CWbemClassToIdMap m_ClassToIdMap;
protected:
IWbemObjectSink* m_pOldProxySink;
protected:
class XSinkFacelet : public IWbemObjectSink
{
protected:
CSinkProxyBuffer* m_pObject;
CRITICAL_SECTION m_cs;
public:
XSinkFacelet(CSinkProxyBuffer* pObject) : m_pObject(pObject){InitializeCriticalSection(&m_cs);};
~XSinkFacelet(){DeleteCriticalSection(&m_cs);};
ULONG STDMETHODCALLTYPE AddRef()
{return m_pObject->m_pUnkOuter->AddRef();}
ULONG STDMETHODCALLTYPE Release()
{return m_pObject->m_pUnkOuter->Release();}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv);
HRESULT STDMETHODCALLTYPE Indicate( LONG lObjectCount, IWbemClassObject** ppObjArray );
HRESULT STDMETHODCALLTYPE SetStatus( LONG lFlags, HRESULT hResult, BSTR strParam, IWbemClassObject* pObjParam );
} m_XSinkFacelet;
friend XSinkFacelet;
protected:
// Pure Virtuals from base class
void* GetInterface( REFIID riid );
void** GetOldProxyInterfacePtr( void );
void ReleaseOldProxyInterface( void );
public:
CSinkProxyBuffer(CLifeControl* pControl, IUnknown* pUnkOuter);
~CSinkProxyBuffer();
};
//***************************************************************************
//
// class CSinkStubBuffer
//
// DESCRIPTION:
//
// This class provides the stublet for the IWbemObjectSink interface.
//
//***************************************************************************
class CSinkStubBuffer : public CBaseStubBuffer
{
protected:
class XSinkStublet : public CBaseStublet
{
IWbemObjectSink* m_pServer;
CWbemClassCache m_ClassCache;
bool m_bFirstIndicate;
protected:
virtual IUnknown* GetServerInterface( void );
virtual void** GetServerPtr( void );
virtual void ReleaseServerPointer( void );
public:
XSinkStublet(CSinkStubBuffer* pObj);
~XSinkStublet();
STDMETHOD(Invoke)(RPCOLEMESSAGE* pMessage, IRpcChannelBuffer* pBuffer);
private:
HRESULT Indicate_Stub( RPCOLEMESSAGE* pMessage, IRpcChannelBuffer* pBuffer );
friend CSinkStubBuffer;
} m_XSinkStublet;
friend XSinkStublet;
public:
CSinkStubBuffer(CLifeControl* pControl, IUnknown* pUnkOuter = NULL)
: CBaseStubBuffer( pControl, pUnkOuter ), m_XSinkStublet(this)
{}
void* GetInterface(REFIID riid);
};