352 lines
9.4 KiB
C
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_
|