/////////////////////////////////////////////////////////////////////////// // // Copyright(C) 1997-1998 Microsoft Corporation all rights reserved. // // Module: sdocomponentmgr.cpp // // Project: Everest // // Description: IAS - Server Core Manager Implementation // // Author: TLP // // Log: // // When Who What // ---- --- ---- // 6/08/98 TLP Initial Version // /////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "sdocomponentmgr.h" #include "sdocomponentfactory.h" #include "sdohelperfuncs.h" #include "sdocomponent.h" #include #include ///////////////////////////////////////// // Component Master Pointer Intance Count ///////////////////////////////////////// DWORD ComponentMasterPtr::m_dwInstances = 0; ////////////////////////////////////////////////////////////////////////////// // The Component (Envelope) Constructor // // Only a ComponentMasterPtr object can construct a component object // ////////////////////////////////////////////////////////////////////////////// CComponent::CComponent(LONG eComponentType, LONG lComponentId) : m_lId(lComponentId), m_eState(COMPONENT_STATE_SHUTDOWN), m_eType((COMPONENTTYPE)eComponentType), m_pComponent(NULL) { TRACE_ENVELOPE_CREATE(CComponent); _ASSERT( COMPONENT_TYPE_MAX > eComponentType ); // create letter object // switch( eComponentType ) { case COMPONENT_TYPE_AUDITOR: m_pComponent = new CComponentAuditor(lComponentId); break; case COMPONENT_TYPE_PROTOCOL: m_pComponent = new CComponentProtocol(lComponentId); break; case COMPONENT_TYPE_REQUEST_HANDLER: m_pComponent = new CComponentRequestHandler(lComponentId); break; default: _ASSERT( FALSE ); }; } ////////////////////////////////////////////////////////////////////////////// // IAS COMPONENT MANAGER CLASSES // // These classes are responsible for configuring, kick-starting and finally // shutting down IAS core components. A component class basically is a wrapper // around the IIasComponent interface. Its value add is that it knows how // to configure / initialize / shutdown the component using mechanisms // unknown to the underlying component. // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Auditor ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentAuditor::Initialize(ISdo* pSdoAuditor) { HRESULT hr; IASComponentPtr pAuditor; do { hr = SDOCreateComponentFromObject( pSdoAuditor, &pAuditor ); if ( FAILED(hr) ) break; hr = pAuditor->InitNew(); if ( FAILED(hr) ) break; hr = SDOConfigureComponentFromObject( pSdoAuditor, pAuditor.p ); if ( FAILED(hr) ) { pAuditor->Shutdown(); break; } hr = pAuditor->Initialize(); if ( FAILED(hr) ) { IASTracePrintf("Error in Auditor Component - Initialize() for Auditor %d failed...",GetId()); pAuditor->Shutdown(); break; } m_pAuditor = pAuditor; } while (FALSE); return hr; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentAuditor::Configure(ISdo* pSdoAuditor) { return SDOConfigureComponentFromObject( pSdoAuditor, m_pAuditor ); }; /////////////////////////////////////////////////////////////////// HRESULT CComponentAuditor::GetObject(IUnknown** ppObj, REFIID riid) { _ASSERT( FALSE ); return E_FAIL; } /////////////////////////////////////////////////////////////////// HRESULT CComponentAuditor::PutObject(IUnknown* pObj, REFIID riid) { _ASSERT( FALSE ); return E_FAIL; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentAuditor::Suspend() { return m_pAuditor->Suspend(); } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentAuditor::Resume() { return m_pAuditor->Resume(); } ////////////////////////////////////////////////////////////////////////////// void CComponentAuditor::Shutdown() { m_pAuditor->Shutdown(); m_pAuditor.Release(); } ////////////////////////////////////////////////////////////////////////////// // Protocol ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentProtocol::Initialize(ISdo* pSdoProtocol) { HRESULT hr; IASComponentPtr pProtocol; do { hr = SDOCreateComponentFromObject(pSdoProtocol, &pProtocol); if ( FAILED(hr) ) break; // We don't really initialize the protocol (entirely anyway). What // we really want to do at this point is configure the protocol since // the protocol SDO is available. We can't finish initialization until // the protocol receives an IRequestHandler interface (for the // component that will process protocol generated requests). // hr = pProtocol->InitNew(); if ( FAILED(hr) ) { IASTracePrintf("Error in Protocol Component - Initialize() - Could not InitNew() protocol %d failed...",GetId()); break; } hr = SDOConfigureComponentFromObject( pSdoProtocol, pProtocol ); if ( FAILED(hr) ) { IASTracePrintf("Error in Protocol Component - Initialize() - Could not configure protocol %d failed...",GetId()); pProtocol->Shutdown(); break; } hr = pProtocol->Initialize(); if ( FAILED(hr) ) { IASTracePrintf("Error in Protocol Component - Initialize() - Could not initialize protocol %d failed...",GetId()); pProtocol->Shutdown(); break; } m_pProtocol = pProtocol; } while (FALSE); return hr; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentProtocol::Configure(ISdo* pSdoProtocol) { return SDOConfigureComponentFromObject( pSdoProtocol, m_pProtocol ); } /////////////////////////////////////////////////////////////////// HRESULT CComponentProtocol::GetObject(IUnknown** ppObj, REFIID riid) { _ASSERT( FALSE ); return E_FAIL; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentProtocol::PutObject(IUnknown* pObject, REFIID riid) { HRESULT hr; _variant_t vtRequestHandler; _ASSERT( riid == IID_IRequestHandler); _ASSERT( NULL != pObject ); vtRequestHandler = (IDispatch*)pObject; hr = m_pProtocol->PutProperty(PROPERTY_PROTOCOL_REQUEST_HANDLER, &vtRequestHandler); return hr; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentProtocol::Suspend() { return m_pProtocol->Suspend(); } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentProtocol::Resume() { return m_pProtocol->Resume(); } ////////////////////////////////////////////////////////////////////////////// void CComponentProtocol::Shutdown() { // a Protocol can get shutdown while suspended or initialized! // m_pProtocol->Shutdown(); m_pProtocol.Release(); } ////////////////////////////////////////////////////////////////////////////// // Request Handler ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentRequestHandler::Initialize(ISdo* pSdoService) { HRESULT hr; CComPtr pSdoRequestHandler; _ASSERT( NULL != m_pRequestHandler.p ); // request handler may or may not have an SDO associated // with it. Those request handlers that do not expose // configuration data will not have an associated SDO. hr = SDOGetComponentFromCollection( pSdoService, PROPERTY_IAS_REQUESTHANDLERS_COLLECTION, GetId(), &pSdoRequestHandler ); if ( SUCCEEDED(hr) ) { hr = SDOConfigureComponentFromObject( pSdoRequestHandler, m_pRequestHandler.p ); } else { hr = S_OK; } if ( SUCCEEDED(hr) ) { hr = m_pRequestHandler->Initialize(); if ( FAILED(hr) ) IASTracePrintf("Error in Request Handler Component - Initialize() - failed for request handler %d...", GetId()); } return hr; } /////////////////////////////////////////////////////////////////// HRESULT CComponentRequestHandler::GetObject(IUnknown** ppObj, REFIID riid) { _ASSERT( FALSE ); return E_FAIL; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentRequestHandler::PutObject(IUnknown* pObject, REFIID riid) { HRESULT hr; _ASSERT( riid == IID_IIasComponent ); _ASSERT( NULL != pObject ); _ASSERT( NULL == m_pRequestHandler.p ); hr = pObject->QueryInterface(riid, (void**)&m_pRequestHandler.p); if ( SUCCEEDED(hr) ) hr = m_pRequestHandler->InitNew(); return hr; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentRequestHandler::Configure(ISdo* pSdoService) { HRESULT hr; CComPtr pSdoRequestHandler; _ASSERT( NULL != m_pRequestHandler.p ); // request handler may or may not have an SDO associated // with it. Those request handlers that do not expose // configuration data will not have an associated SDO. hr = SDOGetComponentFromCollection( pSdoService, PROPERTY_IAS_REQUESTHANDLERS_COLLECTION, GetId(), &pSdoRequestHandler ); if ( SUCCEEDED(hr) ) { hr = SDOConfigureComponentFromObject( pSdoRequestHandler, m_pRequestHandler.p ); } else { hr = S_OK; } return hr; } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentRequestHandler::Suspend() { return m_pRequestHandler->Suspend(); } ////////////////////////////////////////////////////////////////////////////// HRESULT CComponentRequestHandler::Resume() { return m_pRequestHandler->Resume(); } ////////////////////////////////////////////////////////////////////////////// void CComponentRequestHandler::Shutdown() { m_pRequestHandler->Shutdown(); m_pRequestHandler.Release(); }