version 1.38, 2004/05/17 23:42:58
|
version 1.39, 2004/05/18 23:58:41
|
|
|
// Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com) | // Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com) |
// Adrian Schuur, IBM (schuur@de.ibm.com) | // Adrian Schuur, IBM (schuur@de.ibm.com) |
// Amit K Arora (amita@in.ibm.com) for PEP-101 | // Amit K Arora (amita@in.ibm.com) for PEP-101 |
|
// Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
#include <Pegasus/Common/Config.h> | #include <Pegasus/Common/Config.h> |
#include <Pegasus/Common/Constants.h> | #include <Pegasus/Common/Constants.h> |
#include <Pegasus/Common/CIMMessage.h> | #include <Pegasus/Common/CIMMessage.h> |
|
#include <Pegasus/Common/Thread.h> |
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
#include <Pegasus/Common/AutoPtr.h> | #include <Pegasus/Common/AutoPtr.h> |
#include <Pegasus/ProviderManager2/OperationResponseHandler.h> |
|
| |
#include <Pegasus/Config/ConfigManager.h> | #include <Pegasus/Config/ConfigManager.h> |
| |
#include <Pegasus/ProviderManager2/ProviderManagerModule.h> |
#include <Pegasus/ProviderManager2/BasicProviderManagerRouter.h> |
#include <Pegasus/ProviderManager2/ProviderManager.h> |
|
#include <Pegasus/ProviderManager2/ProviderType.h> |
|
#include <Pegasus/ProviderManager2/ProviderName.h> |
|
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
|
|
static const Uint16 _MODULE_STOPPING = 9; | static const Uint16 _MODULE_STOPPING = 9; |
static const Uint16 _MODULE_STOPPED = 10; | static const Uint16 _MODULE_STOPPED = 10; |
| |
// BEGIN TEMP SECTION |
|
class ProviderManagerContainer |
|
{ |
|
public: |
|
ProviderManagerContainer(void) : _manager(0) |
|
{ |
|
} |
|
|
|
ProviderManagerContainer(const ProviderManagerContainer & container) : _manager(0) |
|
{ |
|
*this = container; |
|
} |
|
|
|
ProviderManagerContainer(const String & physicalName, const String & logicalName, const String & interfaceName) : _manager(0) |
|
{ |
|
_physicalName=ProviderManager::_resolvePhysicalName(physicalName); |
|
|
|
_logicalName = logicalName; |
|
|
|
_interfaceName = interfaceName; |
|
|
|
_module = ProviderManagerModule(_physicalName); |
|
|
|
_module.load(); |
|
|
|
_manager = _module.getProviderManager(_logicalName); |
|
|
|
PEGASUS_ASSERT(_manager != 0); |
|
} |
|
|
|
~ProviderManagerContainer(void) |
|
{ |
|
_module.unload(); |
|
} |
|
|
|
ProviderManagerContainer & operator=(const ProviderManagerContainer & container) |
|
{ |
|
if(this == &container) |
|
{ |
|
return(*this); |
|
} |
|
|
|
_logicalName = container._logicalName; |
|
_physicalName = container._physicalName; |
|
_interfaceName = container._interfaceName; |
|
|
|
_module = container._module; |
|
_manager = container._manager; |
|
|
|
return(*this); |
|
} |
|
|
|
ProviderManager *getProviderManager(void) |
|
{ |
|
return _manager; |
|
} |
|
|
|
const String & getPhysicalName(void) const |
|
{ |
|
return(_physicalName); |
|
} |
|
|
|
const String & getLogicalName(void) const |
|
{ |
|
return(_logicalName); |
|
} |
|
|
|
const String & getInterfaceName(void) const |
|
{ |
|
return(_interfaceName); |
|
} |
|
|
|
private: |
|
String _physicalName; |
|
String _logicalName; |
|
String _interfaceName; |
|
|
|
ProviderManagerModule _module; |
|
ProviderManager * _manager; |
|
|
|
}; |
|
|
|
static Array<ProviderManagerContainer*> _providerManagers; |
|
// END TEMP SECTION |
|
|
|
inline Boolean _isSupportedRequestType(const Message * message) | inline Boolean _isSupportedRequestType(const Message * message) |
{ | { |
// ATTN: needs implementation | // ATTN: needs implementation |
|
|
| |
ProviderManagerService* ProviderManagerService::providerManagerService=NULL; | ProviderManagerService* ProviderManagerService::providerManagerService=NULL; |
CIMRepository* ProviderManagerService::_repository=NULL; | CIMRepository* ProviderManagerService::_repository=NULL; |
|
Uint32 ProviderManagerService::_indicationServiceQueueId = PEG_NOT_FOUND; |
| |
ProviderManagerService::ProviderManagerService(void) | ProviderManagerService::ProviderManagerService(void) |
: MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP) | : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP) |
|
|
_repository=repository; | _repository=repository; |
| |
_providerRegistrationManager = providerRegistrationManager; | _providerRegistrationManager = providerRegistrationManager; |
|
_providerManagerRouter = |
// ATTN: this section is a temporary solution to populate the list of enabled |
new BasicProviderManagerRouter(indicationCallback); |
// provider managers for a given distribution. it includes another temporary |
|
// solution for converting a generic file name into a file name useable by |
|
// each platform. |
|
|
|
// BEGIN TEMP SECTION |
|
//#if defined(PEGASUS_OS_OS400) |
|
//_providerManagers.append(ProviderManagerContainer("QSYS/??????????", "INTERNAL", "INTERNAL")); |
|
//#else |
|
//_providerManager.append(ProviderManagerContainer("InternalProviderManager", "DEFAULT", "INTERNAL")); |
|
//#endif |
|
|
|
#if defined(ENABLE_DEFAULT_PROVIDER_MANAGER) |
|
#if defined(PEGASUS_OS_OS400) |
|
_providerManagers.append( |
|
new ProviderManagerContainer("QSYS/QYCMDFTPVM", "DEFAULT", "C++Default")); |
|
#else |
|
_providerManagers.append( |
|
new ProviderManagerContainer("DefaultProviderManager", "DEFAULT", "C++Default")); |
|
#endif |
|
#endif |
|
|
|
#if defined(ENABLE_CMPI_PROVIDER_MANAGER) |
|
#if defined(PEGASUS_OS_OS400) |
|
_providerManagers.append( |
|
new ProviderManagerContainer("QSYS/QYCMCMPIPM", "CMPI", "CMPI")); |
|
#else |
|
_providerManagers.append( |
|
new ProviderManagerContainer("CMPIProviderManager", "CMPI", "CMPI")); |
|
#endif |
|
#endif |
|
|
|
#if defined(ENABLE_JMPI_PROVIDER_MANAGER) |
|
#if defined(PEGASUS_OS_OS400) |
|
_providerManagers.append( |
|
new ProviderManagerContainer("QSYS/QYCMJMPIPM", "JMPI", "JMPI")); |
|
#else |
|
_providerManagers.append( |
|
new ProviderManagerContainer("JMPIProviderManager", "JMPI", "JMPI")); |
|
#endif |
|
#endif |
|
|
|
// END TEMP SECTION |
|
} | } |
| |
ProviderManagerService::~ProviderManagerService(void) | ProviderManagerService::~ProviderManagerService(void) |
{ | { |
|
delete _providerManagerRouter; |
providerManagerService=NULL; | providerManagerService=NULL; |
} | } |
| |
|
|
return; | return; |
} | } |
| |
|
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL |
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL ProviderManagerService::handleCimOperation(void * arg) throw() |
ProviderManagerService::handleCimOperation(void * arg) throw() |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimOperation"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"ProviderManagerService::handleCimOperation"); |
| |
if(arg == 0) | if(arg == 0) |
{ | { |
|
|
} | } |
| |
// get the service from argument | // get the service from argument |
ProviderManagerService * service = reinterpret_cast<ProviderManagerService *>(arg); |
ProviderManagerService * service = |
|
reinterpret_cast<ProviderManagerService *>(arg); |
| |
if(service->_incomingQueue.size() == 0) | if(service->_incomingQueue.size() == 0) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"ProviderManagerService::handleCimOperation() called with no op node in queue" ); |
"ProviderManagerService::handleCimOperation() called with no " |
|
"op node in queue"); |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
| |
|
|
| |
if((op == 0) || (op->_request.count() == 0)) | if((op == 0) || (op->_request.count() == 0)) |
{ | { |
|
// ATTN: This may dereference a null pointer! |
MessageQueue * queue = MessageQueue::lookup(op->_source_queue); | MessageQueue * queue = MessageQueue::lookup(op->_source_queue); |
| |
PEGASUS_ASSERT(queue != 0); | PEGASUS_ASSERT(queue != 0); |
|
|
| |
AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0)); | AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0)); |
| |
if((request == 0) || (request->getType() != async_messages::ASYNC_LEGACY_OP_START)) |
if ((request == 0) || |
|
(request->getType() != async_messages::ASYNC_LEGACY_OP_START)) |
{ | { |
// reply with NAK | // reply with NAK |
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
return(PEGASUS_THREAD_RETURN(0)); | return(PEGASUS_THREAD_RETURN(0)); |
} | } |
| |
try | try |
{ | { |
Message * legacy = static_cast<AsyncLegacyOperationStart *>(request)->get_action(); |
Message* legacy = |
|
static_cast<AsyncLegacyOperationStart *>(request)->get_action(); |
| |
if(_isSupportedRequestType(legacy)) | if(_isSupportedRequestType(legacy)) |
{ | { |
|
|
| |
if(msg != 0) | if(msg != 0) |
{ | { |
AcceptLanguages * langs = new AcceptLanguages(msg->acceptLanguages); |
AcceptLanguages* langs = |
|
new AcceptLanguages(msg->acceptLanguages); |
Thread::setLanguages(langs); | Thread::setLanguages(langs); |
} | } |
else | else |
|
|
return(PEGASUS_THREAD_RETURN(0)); | return(PEGASUS_THREAD_RETURN(0)); |
} | } |
| |
void ProviderManagerService::handleCimRequest(AsyncOpNode * op, Message * message) |
void ProviderManagerService::handleCimRequest( |
|
AsyncOpNode * op, |
|
Message * message) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"ProviderManagerService::handleCimRequest"); |
| |
CIMRequestMessage * request = dynamic_cast<CIMRequestMessage *>(message); | CIMRequestMessage * request = dynamic_cast<CIMRequestMessage *>(message); |
PEGASUS_ASSERT(request != 0); | PEGASUS_ASSERT(request != 0); |
|
|
ProviderIdContainer pidc = _getProviderIdContainer(request); | ProviderIdContainer pidc = _getProviderIdContainer(request); |
request->operationContext.insert(pidc); | request->operationContext.insert(pidc); |
| |
// Retrieve the provider interface type |
response = _providerManagerRouter->processMessage(request); |
String interfaceType; |
|
CIMValue itValue = pidc.getModule().getProperty( |
|
pidc.getModule().findProperty("InterfaceType")).getValue(); |
|
itValue.get(interfaceType); |
|
|
|
// Forward the request to the appropriate ProviderManager |
|
ProviderManager* pm = _lookupProviderManager(interfaceType); |
|
response = pm->processMessage(request); |
|
} |
|
else if (dynamic_cast<CIMIndicationRequestMessage*>(request) != 0) |
|
{ |
|
// Handle CIMIndicationRequestMessage |
|
CIMIndicationRequestMessage* indReq = |
|
dynamic_cast<CIMIndicationRequestMessage*>(request); |
|
|
|
// Get the InterfaceType property from the provider module instance |
|
String interfaceType; |
|
CIMValue itValue = indReq->providerModule.getProperty( |
|
indReq->providerModule.findProperty("InterfaceType")).getValue(); |
|
itValue.get(interfaceType); |
|
|
|
// Forward the request to the appropriate ProviderManager |
|
ProviderManager* pm = _lookupProviderManager(interfaceType); |
|
response = pm->processMessage(request); |
|
} | } |
else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE) | else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE) |
{ | { |
|
|
| |
try | try |
{ | { |
// Get the InterfaceType property from the provider module instance |
// Forward the request to the ProviderManager |
String interfaceType; |
response = _providerManagerRouter->processMessage(request); |
CIMValue itValue = emReq->providerModule.getProperty( |
|
emReq->providerModule.findProperty("InterfaceType")).getValue(); |
|
itValue.get(interfaceType); |
|
|
|
// Forward the request to the appropriate ProviderManager |
|
// ATTN: Why is this sent to a provider manager at all? |
|
ProviderManager* pm = _lookupProviderManager(interfaceType); |
|
response = pm->processMessage(request); |
|
| |
// If successful, update provider module status to OK | // If successful, update provider module status to OK |
// ATTN: Use CIMEnableModuleResponseMessage operationalStatus? | // ATTN: Use CIMEnableModuleResponseMessage operationalStatus? |
|
|
| |
try | try |
{ | { |
// Get the InterfaceType property from the provider module instance |
|
String interfaceType; |
|
CIMValue itValue = dmReq->providerModule.getProperty( |
|
dmReq->providerModule.findProperty("InterfaceType")).getValue(); |
|
itValue.get(interfaceType); |
|
|
|
// Change module status from OK to STOPPING | // Change module status from OK to STOPPING |
if (updateModuleStatus) | if (updateModuleStatus) |
{ | { |
|
|
providerModule, _MODULE_OK, _MODULE_STOPPING); | providerModule, _MODULE_OK, _MODULE_STOPPING); |
} | } |
| |
// Forward the request to the appropriate ProviderManager |
// Forward the request to the ProviderManager |
// ATTN: Why is this sent to a provider manager at all? |
response = _providerManagerRouter->processMessage(request); |
ProviderManager* pm = _lookupProviderManager(interfaceType); |
|
response = pm->processMessage(request); |
|
| |
// Update provider module status based on success or failure | // Update provider module status based on success or failure |
if (updateModuleStatus) | if (updateModuleStatus) |
|
|
operationalStatus); | operationalStatus); |
} | } |
} | } |
else if (request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) |
|
{ |
|
// Handle CIMStopAllProvidersRequestMessage |
|
// Send CIMStopAllProvidersRequestMessage to all ProviderManagers |
|
for (Uint32 i = 0, n = _providerManagers.size(); i < n; i++) |
|
{ |
|
ProviderManagerContainer* pmc=_providerManagers[i]; |
|
Message* resp = pmc->getProviderManager()->processMessage(request); |
|
if (resp) |
|
{ |
|
response = resp; |
|
} |
|
} |
|
} |
|
else | else |
{ | { |
// ERROR: Unrecognized message type. |
response = _providerManagerRouter->processMessage(request); |
PEGASUS_ASSERT(0); |
|
CIMResponseMessage* resp = new CIMResponseMessage( |
|
0, request->messageId, CIMException(), |
|
request->queueIds.copyAndPop()); |
|
resp->synch_response(request); |
|
OperationResponseHandler handler(request, resp); |
|
handler.setStatus(CIM_ERR_FAILED, "Unknown message type."); |
|
response = resp; |
|
} | } |
| |
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
AsyncLegacyOperationResult * async_result = | AsyncLegacyOperationResult * async_result = |
new AsyncLegacyOperationResult( | new AsyncLegacyOperationResult( |
async->getKey(), | async->getKey(), |
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |
// ATTN: May need to add interfaceVersion parameter to further constrain lookup |
|
ProviderManager* ProviderManagerService::_lookupProviderManager( |
|
const String& interfaceType) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"ProviderManagerService::_lookupProviderManager"); |
|
|
|
// find provider manager for specified provider interface type |
|
for(Uint32 i = 0, n = _providerManagers.size(); i < n; i++) |
|
{ |
|
if (interfaceType == _providerManagers[i]->getInterfaceName()) |
|
{ |
|
ProviderManagerContainer* pmc=_providerManagers[i]; |
|
PEG_METHOD_EXIT(); |
|
return pmc->getProviderManager(); |
|
} |
|
} |
|
|
|
// ProviderManager not found for the specified interface type |
|
PEGASUS_ASSERT(0); |
|
PEG_METHOD_EXIT(); |
|
return 0; |
|
//ProviderManagerContainer *pmc=_providerManagers[0]; |
|
//return pmc->getProviderManager(); |
|
} |
|
|
|
void ProviderManagerService::unload_idle_providers(void) | void ProviderManagerService::unload_idle_providers(void) |
{ | { |
for(Uint32 i = 0, n = _providerManagers.size(); i < n; i++) |
_providerManagerRouter->unload_idle_providers(); |
{ |
|
ProviderManagerContainer *pmc=_providerManagers[i]; |
|
pmc->getProviderManager()->unload_idle_providers(); |
|
} |
|
} | } |
| |
ProviderIdContainer ProviderManagerService::_getProviderIdContainer( | ProviderIdContainer ProviderManagerService::_getProviderIdContainer( |
|
|
Array<CIMInstance> providerModules; | Array<CIMInstance> providerModules; |
Array<CIMInstance> providers; | Array<CIMInstance> providers; |
_providerRegistrationManager->lookupAssociationProvider( | _providerRegistrationManager->lookupAssociationProvider( |
request->nameSpace, request->assocClass, providers, providerModules); |
request->nameSpace, request->assocClass, |
|
providers, providerModules); |
providerModule = providerModules[0]; | providerModule = providerModules[0]; |
provider = providers[0]; | provider = providers[0]; |
break; | break; |
|
|
Array<CIMInstance> providerModules; | Array<CIMInstance> providerModules; |
Array<CIMInstance> providers; | Array<CIMInstance> providers; |
_providerRegistrationManager->lookupAssociationProvider( | _providerRegistrationManager->lookupAssociationProvider( |
request->nameSpace, request->assocClass, providers, providerModules); |
request->nameSpace, request->assocClass, |
|
providers, providerModules); |
providerModule = providerModules[0]; | providerModule = providerModules[0]; |
provider = providers[0]; | provider = providers[0]; |
break; | break; |
|
|
Array<CIMInstance> providerModules; | Array<CIMInstance> providerModules; |
Array<CIMInstance> providers; | Array<CIMInstance> providers; |
_providerRegistrationManager->lookupAssociationProvider( | _providerRegistrationManager->lookupAssociationProvider( |
request->nameSpace, request->resultClass, providers, providerModules); |
request->nameSpace, request->resultClass, |
|
providers, providerModules); |
providerModule = providerModules[0]; | providerModule = providerModules[0]; |
provider = providers[0]; | provider = providers[0]; |
break; | break; |
|
|
Array<CIMInstance> providerModules; | Array<CIMInstance> providerModules; |
Array<CIMInstance> providers; | Array<CIMInstance> providers; |
_providerRegistrationManager->lookupAssociationProvider( | _providerRegistrationManager->lookupAssociationProvider( |
request->nameSpace, request->resultClass, providers, providerModules); |
request->nameSpace, request->resultClass, |
|
providers, providerModules); |
providerModule = providerModules[0]; | providerModule = providerModules[0]; |
provider = providers[0]; | provider = providers[0]; |
break; | break; |
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |
|
void ProviderManagerService::indicationCallback( |
|
CIMProcessIndicationRequestMessage* request) |
|
{ |
|
if (_indicationServiceQueueId == PEG_NOT_FOUND) |
|
{ |
|
Array<Uint32> serviceIds; |
|
|
|
providerManagerService->find_services( |
|
PEGASUS_QUEUENAME_INDICATIONSERVICE, 0, 0, &serviceIds); |
|
PEGASUS_ASSERT(serviceIds.size() != 0); |
|
|
|
_indicationServiceQueueId = serviceIds[0]; |
|
} |
|
|
|
request->queueIds = QueueIdStack( |
|
_indicationServiceQueueId, providerManagerService->getQueueId()); |
|
|
|
AsyncLegacyOperationStart * asyncRequest = |
|
new AsyncLegacyOperationStart( |
|
providerManagerService->get_next_xid(), |
|
0, |
|
_indicationServiceQueueId, |
|
request, |
|
_indicationServiceQueueId); |
|
|
|
providerManagerService->SendForget(asyncRequest); |
|
} |
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |