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

195 lines
5.6 KiB
C++

/*++
Copyright (C) 1998-2001 Microsoft Corporation
Module Name:
ENUMMRSH.H
Abstract:
Object Enumerator 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 "smartnextpacket.h"
#include "mrshbase.h"
//***************************************************************************
//
// class CEnumFactoryBuffer
//
// DESCRIPTION:
//
// This class provides the proxy stub factory so that we can provide custom
// facelets and stublets for the IWbemObjectSink interface.
//
//***************************************************************************
class CEnumFactoryBuffer : public CUnk
{
// 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 XEnumFactory : public CImpl<IPSFactoryBuffer, CEnumFactoryBuffer>
{
public:
XEnumFactory(CEnumFactoryBuffer* pObj) :
CImpl<IPSFactoryBuffer, CEnumFactoryBuffer>(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_XEnumFactory;
public:
CEnumFactoryBuffer(CLifeControl* pControl, IUnknown* pUnkOuter = NULL)
: CUnk(NULL, pUnkOuter), m_XEnumFactory(this), m_pLifeControl( pControl )
{}
void* GetInterface(REFIID riid);
friend XEnumFactory;
};
//***************************************************************************
//
// class CEnumProxyBuffer
//
// 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 CEnumProxyBuffer : public CBaseProxyBuffer
{
private:
IEnumWbemClassObject* m_pOldProxyEnum;
CWbemClassToIdMap m_ClassToIdMap;
BOOL m_fTriedSmartEnum;
BOOL m_fUseSmartEnum;
HANDLE m_hSmartNextMutex;
GUID m_guidSmartEnum;
IWbemWCOSmartEnum* m_pSmartEnum;
CRITICAL_SECTION m_cs;
protected:
class XEnumFacelet : public IEnumWbemClassObject, IClientSecurity
{
protected:
CEnumProxyBuffer* m_pObject;
CWbemClassCache m_ClassCache;
public:
XEnumFacelet(CEnumProxyBuffer* pObject) : m_pObject(pObject){};
~XEnumFacelet(){};
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);
// IEnumWbemClassObject Methods
STDMETHOD(Reset)();
STDMETHOD(Next)(long lTimeout, ULONG uCount,
IWbemClassObject** apObj, ULONG FAR* puReturned);
STDMETHOD(NextAsync)(ULONG uCount, IWbemObjectSink* pSink);
STDMETHOD(Clone)(IEnumWbemClassObject** pEnum);
STDMETHOD(Skip)(long lTimeout, ULONG nNum);
// IClientSecurity Methods
STDMETHOD(QueryBlanket)( IUnknown* pProxy, DWORD* pAuthnSvc, DWORD* pAuthzSvc,
OLECHAR** pServerPrincName, DWORD* pAuthnLevel, DWORD* pImpLevel,
void** pAuthInfo, DWORD* pCapabilities );
STDMETHOD(SetBlanket)( IUnknown* pProxy, DWORD AuthnSvc, DWORD AuthzSvc,
OLECHAR* pServerPrincName, DWORD AuthnLevel, DWORD ImpLevel,
void* pAuthInfo, DWORD Capabilities );
STDMETHOD(CopyProxy)( IUnknown* pProxy, IUnknown** pCopy );
} m_XEnumFacelet;
friend XEnumFacelet;
protected:
// Pure Virtuals from base class
void* GetInterface( REFIID riid );
void** GetOldProxyInterfacePtr( void );
void ReleaseOldProxyInterface( void );
// Initialize the smart enumerator
HRESULT InitSmartEnum( BOOL fSetBlanket = FALSE, DWORD AuthnSvc = RPC_C_AUTHN_WINNT,
DWORD AuthzSvc = RPC_C_AUTHZ_NONE, OLECHAR* pServerPrincName = NULL,
DWORD AuthnLevel = RPC_C_AUTHN_LEVEL_DEFAULT, DWORD ImpLevel = RPC_C_IMP_LEVEL_IMPERSONATE,
void* pAuthInfo = NULL, DWORD Capabilities = EOAC_NONE );
public:
CEnumProxyBuffer(CLifeControl* pControl, IUnknown* pUnkOuter);
~CEnumProxyBuffer();
};
//***************************************************************************
//
// class CEnumStubBuffer
//
// DESCRIPTION:
//
// This class provides the stublet for the IWbemObjectSink interface.
//
//***************************************************************************
class CEnumStubBuffer : public CBaseStubBuffer
{
protected:
class XEnumStublet : public CBaseStublet
{
IWbemObjectSink* m_pServer;
protected:
virtual IUnknown* GetServerInterface( void );
virtual void** GetServerPtr( void );
virtual void ReleaseServerPointer( void );
public:
XEnumStublet(CEnumStubBuffer* pObj);
~XEnumStublet();
friend CEnumStubBuffer;
} m_XEnumStublet;
friend XEnumStublet;
public:
CEnumStubBuffer(CLifeControl* pControl, IUnknown* pUnkOuter = NULL)
: CBaseStubBuffer(pControl, pUnkOuter), m_XEnumStublet(this)
{}
void* GetInterface(REFIID riid);
};