404 lines
10 KiB
C++
404 lines
10 KiB
C++
|
///////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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 <iascomp.h>
|
||
|
#include <iastlb.h>
|
||
|
|
||
|
/////////////////////////////////////////
|
||
|
// 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<ISdo> 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<ISdo> 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();
|
||
|
}
|