//****************************************************************************** // // Copyright (c) 1999-2000, Microsoft Corporation, All rights reserved // //***************************************************************************** #include "precomp.h" #include #include "delivrec.h" #include "qsink.h" #include "nsrep.h" /************************************************************************* CDeliveryRecord **************************************************************************/ CDeliveryRecord::~CDeliveryRecord() { if ( m_pNamespace ) { m_pNamespace->RemoveFromCache( m_dwSize ); } Clear(); } void CDeliveryRecord::AddToCache( CEssNamespace * pNamespace, DWORD dwTotalSize, DWORD * pdwSleep ) { _DBG_ASSERT( pNamespace ); if ( NULL == m_pNamespace ) { m_pNamespace = pNamespace; } m_pNamespace->AddToCache( m_dwSize, dwTotalSize, pdwSleep ); } HRESULT CDeliveryRecord::Initialize( IWbemClassObject** apEvents, ULONG cEvents, IWbemCallSecurity* pCallSec ) { HRESULT hr; Clear(); m_pCallSec = pCallSec; for( ULONG i=0; i < cEvents; i++ ) { // // TODO : should clone the object here later. // if ( m_Events.Add( apEvents[i] ) < 0 ) { return WBEM_E_OUT_OF_MEMORY; } hr = AdjustTotalSize( apEvents[i] ); if ( FAILED(hr) ) { return WBEM_E_CRITICAL_ERROR; } } return WBEM_S_NO_ERROR; } HRESULT CDeliveryRecord::AdjustTotalSize( IWbemClassObject* pObj ) { HRESULT hr; CWbemPtr<_IWmiObject> pEventInt; hr = pObj->QueryInterface( IID__IWmiObject, (void**)&pEventInt ); if ( FAILED(hr) ) { return hr; } DWORD dwSize; hr = pEventInt->GetObjectMemory( NULL, 0, &dwSize ); if ( FAILED(hr) && hr != WBEM_E_BUFFER_TOO_SMALL ) { return hr; } m_dwSize += dwSize; return WBEM_S_NO_ERROR; } HRESULT CDeliveryRecord::Persist( IStream* pStrm ) { HRESULT hr; DWORD dwNumObjects = m_Events.GetSize(); hr = pStrm->Write( &dwNumObjects, sizeof(DWORD), NULL ); if ( FAILED(hr) ) { return hr; } for( DWORD i=0; i < dwNumObjects; i++ ) { hr = CoMarshalInterface( pStrm, IID_IWbemClassObject, m_Events[i], MSHCTX_DIFFERENTMACHINE, NULL, MSHLFLAGS_NORMAL ); if ( FAILED(hr) ) { return hr; } } return WBEM_S_NO_ERROR; } HRESULT CDeliveryRecord::Unpersist( IStream* pStrm ) { HRESULT hr; Clear(); DWORD dwNumObjects; hr = pStrm->Read( &dwNumObjects, sizeof(DWORD), NULL ); if ( FAILED(hr) ) { return hr; } for( DWORD i=0; i < dwNumObjects; i++ ) { CWbemPtr pEvent; hr = CoUnmarshalInterface( pStrm, IID_IWbemClassObject, (void**)&pEvent ); if ( FAILED(hr) ) { return hr; } if ( m_Events.Add( pEvent ) < 0 ) { return WBEM_E_OUT_OF_MEMORY; } hr = AdjustTotalSize( pEvent ); if ( FAILED(hr) ) { return WBEM_E_CRITICAL_ERROR; } } return WBEM_S_NO_ERROR; } /************************************************************************* CGuaranteedDeliveryRecord **************************************************************************/ HRESULT CGuaranteedDeliveryRecord::PreDeliverAction( ITransaction* pTxn ) { return WBEM_S_NO_ERROR; } HRESULT CGuaranteedDeliveryRecord::PostDeliverAction( ITransaction* pTxn, HRESULT hres ) { #ifdef __WHISTLER_UNCUT return m_pSink->GuaranteedPostDeliverAction( m_pRcvr ); #else return WBEM_E_NOT_SUPPORTED; #endif } /************************************************************************* CExpressDeliveryRecord **************************************************************************/ HRESULT CExpressDeliveryRecord::PreDeliverAction( ITransaction* pTxn ) { return WBEM_S_NO_ERROR; } HRESULT CExpressDeliveryRecord::PostDeliverAction( ITransaction* pTxn, HRESULT hres ) { return WBEM_S_NO_ERROR; } CReuseMemoryManager CExpressDeliveryRecord::mstatic_Manager(sizeof CExpressDeliveryRecord); void *CExpressDeliveryRecord::operator new(size_t nBlock) { return mstatic_Manager.Allocate(); } void CExpressDeliveryRecord::operator delete(void* p) { mstatic_Manager.Free(p); }