windows-nt/Source/XPSP1/NT/net/ias/sdo/sdoias/sdocomponentmgr.h
2020-09-26 16:20:57 +08:00

352 lines
9.4 KiB
C++

///////////////////////////////////////////////////////////////////////////
//
// 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 <iastlb.h>
//////////////////////////////////////////////////////////////////////////////
// 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<CComponent> ComponentMasterPtr;
typedef CSdoHandle<CComponent> ComponentPtr;
// Component container class typedefs
//
typedef LONG IAS_COMPONENT_ID;
typedef map<IAS_COMPONENT_ID, ComponentPtr> ComponentMap;
typedef map<IAS_COMPONENT_ID, ComponentPtr>::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<IIasComponent> 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_