📄 basicprovidermanagerrouter.cpp
字号:
//%2006//////////////////////////////////////////////////////////////////////////// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation, The Open Group.// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; VERITAS Software Corporation; The Open Group.// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;// EMC Corporation; Symantec Corporation; The Open Group.//// Permission is hereby granted, free of charge, to any person obtaining a copy// of this software and associated documentation files (the "Software"), to// deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or// sell copies of the Software, and to permit persons to whom the Software is// furnished to do so, subject to the following conditions:// // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED// "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT// LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.////==============================================================================////%/////////////////////////////////////////////////////////////////////////////#include "BasicProviderManagerRouter.h"#include <Pegasus/Common/Config.h>#include <Pegasus/Common/OperationContextInternal.h>#include <Pegasus/Common/CIMMessage.h>#include <Pegasus/Common/Tracer.h>#include <Pegasus/Common/Logger.h>#include <Pegasus/Common/FileSystem.h>#include <Pegasus/Config/ConfigManager.h>#include <Pegasus/ProviderManagerService/ProviderManagerModule.h>#include <Pegasus/ProviderManager2/ProviderManager.h>// ProviderManager library names. Should these be defined elsewhere?#if defined(PEGASUS_OS_OS400)# define LIBRARY_NAME_DEFAULTPM "QSYS/QYCMPMDE00"# define LIBRARY_NAME_CMPIPM "QSYS/QYCMCMPIPM"# define LIBRARY_NAME_JMPIPM "QSYS/QYCMJMPIPM"#else# define LIBRARY_NAME_CMPIPM "CMPIProviderManager"# define LIBRARY_NAME_JMPIPM "JMPIProviderManager"#endifPEGASUS_NAMESPACE_BEGINclass ProviderManagerContainer{public: ProviderManagerContainer( const String& physicalName, const String& logicalName, const String& interfaceName, PEGASUS_INDICATION_CALLBACK_T indicationCallback, PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, Boolean subscriptionInitComplete) : _manager(0) {#if defined (PEGASUS_OS_VMS) _physicalName = ConfigManager::getInstance()->getCurrentValue("providerDir") + String("/") + FileSystem::buildLibraryFileName(physicalName) + String(".exe");#elif defined (PEGASUS_OS_OS400) _physicalName = physicalName;#else _physicalName = ConfigManager::getHomedPath(PEGASUS_DEST_LIB_DIR) + String("/") + FileSystem::buildLibraryFileName(physicalName);#endif _logicalName = logicalName; _interfaceName = interfaceName; _module.reset(new ProviderManagerModule(_physicalName)); Boolean moduleLoaded = _module->load(); if (moduleLoaded) { _manager = _module->getProviderManager(_logicalName); } else { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "ProviderManagerModule load failed."); } if (_manager == 0) { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "Failed to load ProviderManager \"" + _physicalName + "\"."); Logger::put_l( Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE, "ProviderManager.BasicProviderManagerRouter." "PROVIDERMANAGER_LOAD_FAILED", "Failed to load the Provider Manager for interface type \"$0\"" " from library \"$1\".", _interfaceName, _physicalName); throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( "ProviderManager.BasicProviderManagerRouter." "PROVIDERMANAGER_LOAD_FAILED", "Failed to load the Provider Manager for interface type \"$0\"" " from library \"$1\".", _interfaceName, _physicalName)); } _manager->setIndicationCallback(indicationCallback); _manager->setResponseChunkCallback(responseChunkCallback); _manager->setSubscriptionInitComplete (subscriptionInitComplete); } ProviderManagerContainer( const String& interfaceName, PEGASUS_INDICATION_CALLBACK_T indicationCallback, PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, Boolean subscriptionInitComplete, ProviderManager* manager) : _interfaceName(interfaceName), _manager(manager), _module(0) { _manager->setIndicationCallback(indicationCallback); _manager->setResponseChunkCallback(responseChunkCallback); _manager->setSubscriptionInitComplete(subscriptionInitComplete); } ~ProviderManagerContainer() { delete _manager; if (_module.get()) _module->unload(); } ProviderManager* getProviderManager() { return _manager; } const String& getInterfaceName() const { return _interfaceName; }private: ProviderManagerContainer(); ProviderManagerContainer& operator=(const ProviderManagerContainer&); ProviderManagerContainer(const ProviderManagerContainer&); String _physicalName; String _logicalName; String _interfaceName; ProviderManager* _manager; AutoPtr<ProviderManagerModule> _module;};PEGASUS_INDICATION_CALLBACK_T BasicProviderManagerRouter::_indicationCallback = 0;PEGASUS_RESPONSE_CHUNK_CALLBACK_T BasicProviderManagerRouter::_responseChunkCallback = 0;ProviderManager* (*BasicProviderManagerRouter::_createDefaultProviderManagerCallback)() = 0;BasicProviderManagerRouter::BasicProviderManagerRouter( PEGASUS_INDICATION_CALLBACK_T indicationCallback, PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, ProviderManager* (*createDefaultProviderManagerCallback)()){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "BasicProviderManagerRouter::BasicProviderManagerRouter"); _indicationCallback = indicationCallback; _responseChunkCallback = responseChunkCallback; _subscriptionInitComplete = false; _createDefaultProviderManagerCallback = createDefaultProviderManagerCallback; PEG_METHOD_EXIT();}BasicProviderManagerRouter::~BasicProviderManagerRouter(){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "BasicProviderManagerRouter::~BasicProviderManagerRouter"); /* Clean up the provider managers */ for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++) { ProviderManagerContainer* pmc=_providerManagerTable[i]; delete pmc; } PEG_METHOD_EXIT();}Message* BasicProviderManagerRouter::processMessage(Message * message){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "BasicProviderManagerRouter::processMessage"); CIMRequestMessage* request = dynamic_cast<CIMRequestMessage *>(message); PEGASUS_ASSERT(request != 0); Message* response = 0; Boolean remoteNameSpaceRequest=false; // // Retrieve the ProviderManager routing information // CIMInstance providerModule; if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) || (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) || (request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE)) { // Provider information is in OperationContext ProviderIdContainer pidc = (ProviderIdContainer) request->operationContext.get(ProviderIdContainer::NAME); providerModule = pidc.getModule(); remoteNameSpaceRequest=pidc.isRemoteNameSpace(); } else if (dynamic_cast<CIMIndicationRequestMessage*>(request) != 0) { // Provider information is in CIMIndicationRequestMessage CIMIndicationRequestMessage* indReq = dynamic_cast<CIMIndicationRequestMessage*>(request); ProviderIdContainer pidc = indReq->operationContext.get(ProviderIdContainer::NAME); providerModule = pidc.getModule(); } else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE) { // Provider information is in CIMEnableModuleRequestMessage CIMEnableModuleRequestMessage* emReq = dynamic_cast<CIMEnableModuleRequestMessage*>(request); providerModule = emReq->providerModule; } else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE) { // Provider information is in CIMDisableModuleRequestMessage CIMDisableModuleRequestMessage* dmReq = dynamic_cast<CIMDisableModuleRequestMessage*>(request); providerModule = dmReq->providerModule; } else if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) || (request->getType() == CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE) || (request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -