/////////////////////////////////////////////////////////////////////////// // // Copyright(C) 1997-1998 Microsoft Corporation all rights reserved. // // Module: sdocomponentmgr.h // // Project: Everest // // Description: IAS Core Component Manager Definitions // // Log: // // When Who What // ---- --- ---- // 6/08/98 TLP Initial Version // 8/13/98 SEB dsource.h has been merged into iastlb.h // /////////////////////////////////////////////////////////////////////////////// #ifndef __INC_SDO_COMPONENT_MGR_H_ #define __INC_SDO_COMPONENT_MGR_H_ #include "sdobasedefs.h" #include ////////////////////////////////////////////////////////////////////////////// // IAS Component Interface Class ////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////// // Component Class Lifetime Trace (Debugging) // // #define TRACE_ENVELOPE_LETTER_LIFETIME #ifdef TRACE_ENVELOPE_LETTER_LIFETIME #define TRACE_ENVELOPE_CREATE(x) ATLTRACE(L"Created %ls - envelope class - at %p \n", L#x, this); #define TRACE_ENVELOPE_DESTROY(x) ATLTRACE(L"Destroyed %ls - envelope class - at %p \n", L#x, this); #define TRACE_LETTER_CREATE(x) ATLTRACE(L"Created %ls - letter class - at %p \n", L#x, this); #define TRACE_LETTER_DESTROY(x) ATLTRACE(L"Destroyed %ls - letter class - at %p \n", L#x, this); #else #define TRACE_ENVELOPE_CREATE(x) #define TRACE_ENVELOPE_DESTROY(x) #define TRACE_LETTER_CREATE(x) #define TRACE_LETTER_DESTROY(x) #endif ////////////////////// // Types of Components // typedef enum _COMPONENTTYPE { COMPONENT_TYPE_AUDITOR = 0x100, COMPONENT_TYPE_UNUSED, COMPONENT_TYPE_PROTOCOL, COMPONENT_TYPE_REQUEST_HANDLER, COMPONENT_TYPE_MAX } COMPONENTTYPE; /////////////////// // Component States // typedef enum _COMPONENTSTATE { COMPONENT_STATE_SHUTDOWN = 0x100, COMPONENT_STATE_INITIALIZED, COMPONENT_STATE_SUSPENDED } COMPONENTSTATE; ///////////////////////////////////////////////////////////////////////////// // The Base Componet Class (Envelope ) ///////////////////////////////////////////////////////////////////////////// // Forward references // class CComponent; class CComponentAuditor; class CComponentProtocol; class CComponentRequestHandler; // Object management class typedefs // typedef CSdoMasterPtr ComponentMasterPtr; typedef CSdoHandle ComponentPtr; // Component container class typedefs // typedef LONG IAS_COMPONENT_ID; typedef map ComponentMap; typedef map::iterator ComponentMapIterator; /////////////////////////////////////////// // Dummy class used for letter construction // struct LetterConstructor { LetterConstructor(int=0) { } }; ///////////////////////////////////////////////////////////////////////////// class CComponent { public: ////////////////////////////////////////////////////////////////////////// virtual ~CComponent() { // if m_pComponent is not NULL then the envelope is being destroyed. // if m_pComponent is NULL then the letter is being destroyed. // // the enveloper will only be destroyed by the master pointer that // owns it. The envelope will then destroy the letter it created. The // letter, which is derived from the envelope, will eventually cause // this destructor to be invoked again - this time however // m_pComponent is set to NULL. // if ( NULL != m_pComponent ) { TRACE_ENVELOPE_DESTROY(CComponent); delete m_pComponent; } } ////////////////////////////////////////////////////////////////////////// virtual HRESULT Initialize(ISdo* pSdoService) { _ASSERT( COMPONENT_STATE_SHUTDOWN == m_eState ); HRESULT hr = m_pComponent->Initialize(pSdoService); if ( SUCCEEDED(hr) ) m_eState = COMPONENT_STATE_INITIALIZED; return hr; } ////////////////////////////////////////////////////////////////////////// virtual HRESULT Configure(ISdo* pSdoService) { _ASSERT( COMPONENT_STATE_SHUTDOWN != m_eState ); return m_pComponent->Configure(pSdoService); } ////////////////////////////////////////////////////////////////////////// virtual HRESULT Suspend(void) { _ASSERT( COMPONENT_STATE_INITIALIZED == m_eState ); HRESULT hr = m_pComponent->Suspend(); if ( SUCCEEDED(hr) ) m_eState = COMPONENT_STATE_SUSPENDED; return hr; } ////////////////////////////////////////////////////////////////////////// virtual HRESULT Resume(void) { _ASSERT( COMPONENT_STATE_SUSPENDED == m_eState ); HRESULT hr = m_pComponent->Resume(); if ( SUCCEEDED(hr) ) m_eState = COMPONENT_STATE_INITIALIZED; return hr; } ////////////////////////////////////////////////////////////////////////// virtual HRESULT PutObject(IUnknown* pObj, REFIID riid) { // _ASSERT( COMPONENT_STATE_INITIALIZED == m_eState ); return m_pComponent->PutObject(pObj, riid); } ////////////////////////////////////////////////////////////////////////// virtual HRESULT GetObject(IUnknown** ppObj, REFIID riid) { _ASSERT( COMPONENT_STATE_INITIALIZED == m_eState ); return m_pComponent->GetObject(ppObj, riid); } ////////////////////////////////////////////////////////////////////////// virtual void Shutdown(void) { _ASSERT( COMPONENT_STATE_INITIALIZED == m_eState || COMPONENT_STATE_SUSPENDED == m_eState ); m_pComponent->Shutdown(); m_eState = COMPONENT_STATE_SHUTDOWN; } ////////////////////////////////////////////////////////////////////////// inline LONG GetId(void) const { return m_lId; } ////////////////////////////////////////////////////////////////////////// inline COMPONENTSTATE GetState(void) const { return m_eState; } ////////////////////////////////////////////////////////////////////////// inline COMPONENTTYPE GetType(void) const { return m_eType; } protected: typedef CComPtr IASComponentPtr; // Invoked explicitly by derived (letter) classes // CComponent(LONG eComponentType, LONG lComponentId, LetterConstructor TheDummy) : m_lId(lComponentId), m_eState(COMPONENT_STATE_SHUTDOWN), // Not used by derived class m_eType((COMPONENTTYPE)eComponentType), m_pComponent(NULL) { } private: // No default constructor since we would'nt know what // type of component to build by default // CComponent(); // The constructor - Only a ComponentMasterPtr can construct this class // friend ComponentMasterPtr; CComponent(LONG eComponentType, LONG lComponentId); // No copy - No Assignment - No Shirt, No Shoes, No Service // CComponent(const CComponent& theComponent); CComponent& operator = (const CComponent& theComponent); ///////////////////////////////////////////////////////////////////////// LONG m_lId; COMPONENTSTATE m_eState; COMPONENTTYPE m_eType; CComponent* m_pComponent; }; /////////////////////////////////////////////////////////////////// // IAS Component (Letter) Classes /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// class CComponentAuditor : public CComponent { public: CComponentAuditor(LONG lComponentId) : CComponent(COMPONENT_TYPE_AUDITOR, lComponentId, LetterConstructor()) { TRACE_LETTER_CREATE(CComponentAuditor); } virtual ~CComponentAuditor() { TRACE_LETTER_DESTROY(CComponentAuditor); } virtual HRESULT Initialize(ISdo* pSdoService); virtual HRESULT Configure(ISdo* pSdoService); virtual HRESULT Suspend(void); virtual HRESULT Resume(void); virtual HRESULT GetObject(IUnknown** ppObj, REFIID riid); virtual HRESULT PutObject(IUnknown* pObj, REFIID riid); virtual void Shutdown(void); private: CComponentAuditor(const CComponentAuditor& x); CComponentAuditor& operator = (const CComponentAuditor& x); IASComponentPtr m_pAuditor; }; /////////////////////////////////////////////////////////////////// class CComponentProtocol : public CComponent { public: CComponentProtocol(LONG lComponentId) : CComponent(COMPONENT_TYPE_PROTOCOL, lComponentId, LetterConstructor()) { TRACE_LETTER_CREATE(CComponentProtocol); } virtual ~CComponentProtocol() { TRACE_LETTER_DESTROY(CComponentProtocol); } virtual HRESULT Initialize(ISdo* pSdo); virtual HRESULT Configure(ISdo* pSdo); virtual HRESULT Suspend(void); virtual HRESULT Resume(void); virtual HRESULT GetObject(IUnknown** ppObj, REFIID riid); virtual HRESULT PutObject(IUnknown* pObj, REFIID riid); virtual void Shutdown(void); private: CComponentProtocol(const CComponentProtocol& x); CComponentProtocol& operator = (const CComponentProtocol& x); IASComponentPtr m_pProtocol; }; /////////////////////////////////////////////////////////////////// class CComponentRequestHandler : public CComponent { public: CComponentRequestHandler(LONG lComponentId) : CComponent(COMPONENT_TYPE_REQUEST_HANDLER, lComponentId, LetterConstructor()) { TRACE_LETTER_CREATE(CComponentRequestHandler); } ~CComponentRequestHandler() { TRACE_LETTER_DESTROY(CComponentRequestHandler); } virtual HRESULT Initialize(ISdo* pSdo); virtual HRESULT Configure(ISdo* pSdo); virtual HRESULT Suspend(void); virtual HRESULT Resume(void); virtual HRESULT GetObject(IUnknown** ppObj, REFIID riid); virtual HRESULT PutObject(IUnknown* pObj, REFIID riid); virtual void Shutdown(void); private: CComponentRequestHandler(const CComponentRequestHandler& x); CComponentRequestHandler& operator = (const CComponentRequestHandler& x); IASComponentPtr m_pRequestHandler; }; #endif // __INC_SDO_COMPONENT_MGR_H_