📄 providermanagerservice.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 "ProviderManagerService.h"#include <Pegasus/Common/Config.h>#include <Pegasus/Common/PegasusVersion.h>#include <Pegasus/Common/Constants.h>#include <Pegasus/Common/CIMMessage.h>#include <Pegasus/Common/Thread.h>#include <Pegasus/Common/Tracer.h>#include <Pegasus/Common/Logger.h>#include <Pegasus/Common/AutoPtr.h>#include <Pegasus/Common/Constants.h>#include <Pegasus/Common/StatisticalData.h>#include <Pegasus/Config/ConfigManager.h>#include <Pegasus/ProviderManagerService/BasicProviderManagerRouter.h>#include <Pegasus/ProviderManagerService/OOPProviderManagerRouter.h>#ifdef PEGASUS_ZOS_SECURITY// This include file will not be provided in the OpenGroup CVS for now.// Do NOT try to include it in your compile#include <Pegasus/ProviderManager2/ProviderManagerzOS_inline.h>#endifPEGASUS_NAMESPACE_BEGINinline Boolean _isSupportedRequestType(const Message * message){ // ATTN: needs implementation // for now, assume all requests are valid return true;}inline Boolean _isSupportedResponseType(const Message * message){ // ATTN: needs implementation // for now, assume all responses are invalid return false;}ProviderManagerService* ProviderManagerService::providerManagerService=NULL;Uint32 ProviderManagerService::_indicationServiceQueueId = PEG_NOT_FOUND;ProviderManagerService::ProviderManagerService( ProviderRegistrationManager * providerRegistrationManager, CIMRepository * repository, ProviderManager* (*createDefaultProviderManagerCallback)()) : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP){ providerManagerService=this; _repository=repository; _providerRegistrationManager = providerRegistrationManager; _unloadIdleProvidersBusy = 0; _basicProviderManagerRouter = 0; _oopProviderManagerRouter = 0; // Determine which ProviderManagerRouter(s) to use _forceProviderProcesses = ConfigManager::parseBooleanValue( ConfigManager::getInstance()->getCurrentValue( "forceProviderProcesses"));#ifdef PEGASUS_DISABLE_PROV_USERCTXT if (_forceProviderProcesses) { _oopProviderManagerRouter = new OOPProviderManagerRouter( indicationCallback, responseChunkCallback, providerModuleFailureCallback); } else { _basicProviderManagerRouter = new BasicProviderManagerRouter( indicationCallback, responseChunkCallback, createDefaultProviderManagerCallback); }#else _oopProviderManagerRouter = new OOPProviderManagerRouter( indicationCallback, responseChunkCallback, providerModuleFailureCallback); if (!_forceProviderProcesses) { _basicProviderManagerRouter = new BasicProviderManagerRouter( indicationCallback, responseChunkCallback, createDefaultProviderManagerCallback); }#endif#ifdef PEGASUS_ENABLE_REMOTE_CMPI if (!_basicProviderManagerRouter) { _basicProviderManagerRouter = new BasicProviderManagerRouter( indicationCallback, responseChunkCallback, createDefaultProviderManagerCallback); }#endif}ProviderManagerService::~ProviderManagerService(void){ delete _basicProviderManagerRouter; delete _oopProviderManagerRouter; providerManagerService=NULL;}Boolean ProviderManagerService::messageOK(const Message * message){ PEGASUS_ASSERT(message != 0); if (_isSupportedRequestType(message)) { return MessageQueueService::messageOK(message); } return false;}void ProviderManagerService::handleEnqueue(void){ Message * message = dequeue(); handleEnqueue(message);}void ProviderManagerService::handleEnqueue(Message * message){ PEGASUS_ASSERT(message != 0); AsyncLegacyOperationStart * asyncRequest; if (message->_async != NULL) { asyncRequest = static_cast<AsyncLegacyOperationStart *>(message->_async); } else { asyncRequest = new AsyncLegacyOperationStart( 0, this->getQueueId(), message, this->getQueueId()); } _handle_async_request(asyncRequest);}void ProviderManagerService::_handle_async_request(AsyncRequest * request){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::_handle_async_request"); PEGASUS_ASSERT((request != 0) && (request->op != 0)); if (request->getType() == async_messages::ASYNC_LEGACY_OP_START) { request->op->processing(); _incomingQueue.insert_back(request->op); ThreadStatus rtn = PEGASUS_THREAD_OK; while ((rtn = _thread_pool->allocate_and_awaken( (void *)this, ProviderManagerService::handleCimOperation)) != PEGASUS_THREAD_OK) { if (rtn == PEGASUS_THREAD_INSUFFICIENT_RESOURCES) Threads::yield(); else { Logger::put( Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, "Not enough threads to service provider manager."); Tracer::trace(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "Could not allocate thread for %s.", getQueueName()); break; } } } else { // pass all other operations to the default handler MessageQueueService::_handle_async_request(request); } PEG_METHOD_EXIT(); return;}// Note: This method should not throw an exception. It is used as a thread// entry point, and any exceptions thrown are ignored.ThreadReturnType PEGASUS_THREAD_CDECLProviderManagerService::handleCimOperation(void* arg){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimOperation"); PEGASUS_ASSERT(arg != 0); // get the service from argument ProviderManagerService* service = reinterpret_cast<ProviderManagerService *>(arg); PEGASUS_ASSERT(service != 0); try { if (service->_incomingQueue.size() == 0) { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, "ProviderManagerService::handleCimOperation() called with no " "op node in queue"); PEG_METHOD_EXIT(); return ThreadReturnType(1); } AsyncOpNode* op = service->_incomingQueue.remove_front(); PEGASUS_ASSERT(op != 0); PEGASUS_ASSERT(op->_request.get() != 0); AsyncRequest* request = static_cast<AsyncRequest*>(op->_request.get()); if ((request == 0) || (request->getType() != async_messages::ASYNC_LEGACY_OP_START)) { // reply with NAK PEG_METHOD_EXIT(); return ThreadReturnType(0); } Message* legacy = static_cast<AsyncLegacyOperationStart *>(request)->get_action(); if (_isSupportedRequestType(legacy)) { AutoPtr<Message> xmessage(legacy); // Set the client's requested language into this service thread. // This will allow functions in this service to return messages // in the correct language. CIMMessage* msg = dynamic_cast<CIMMessage *>(legacy); if (msg != 0) { AcceptLanguageList* langs = new AcceptLanguageList( ((AcceptLanguageListContainer)msg->operationContext.get( AcceptLanguageListContainer::NAME)).getLanguages()); Thread::setLanguages(langs); } else { Thread::clearLanguages(); } service->handleCimRequest(op, legacy); } } catch (const Exception& e) { PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, "Unexpected exception in handleCimOperation: " + e.getMessage()); } catch (...) { PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, "Unexpected exception in handleCimOperation."); } PEG_METHOD_EXIT(); return ThreadReturnType(0);}void ProviderManagerService::handleCimRequest( AsyncOpNode * op, Message * message){ PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimRequest"); CIMRequestMessage * request = dynamic_cast<CIMRequestMessage *>(message); PEGASUS_ASSERT(request != 0); // get request from op node AsyncRequest * async = static_cast<AsyncRequest *>(op->_request.get()); PEGASUS_ASSERT(async != 0); Message * response = 0; Boolean consumerLookupFailed = false; if (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) { // // Get a ProviderIdContainer for ExportIndicationRequestMessage. // Note: This can be removed when the CIMExportRequestDispatcher // is updated to add the ProviderIdContainer to the message. // CIMInstance providerModule; CIMInstance provider; const CIMExportIndicationRequestMessage* expRequest = dynamic_cast<const CIMExportIndicationRequestMessage*>(request); if (_providerRegistrationManager->lookupIndicationConsumer( expRequest->destinationPath, provider, providerModule)) { request->operationContext.insert( ProviderIdContainer(providerModule, provider)); } else { consumerLookupFailed = true; } } if (consumerLookupFailed) { CIMResponseMessage* cimResponse = request->buildResponse(); cimResponse->cimException = PEGASUS_CIM_EXCEPTION( CIM_ERR_NOT_SUPPORTED, String::EMPTY); response = cimResponse; } else if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) || (dynamic_cast<CIMIndicationRequestMessage*>(request) != 0) || (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) || (request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE)) { // Handle CIMOperationRequestMessage, CIMExportIndicationRequestMessage, // CIMIndicationRequestMessage, and CIMInitializeProviderRequestMessage. // (These should be blocked when the provider module is disabled.) // // Get the provider module instance to check for a disabled module // CIMInstance providerModule; // The provider ID container is added to the OperationContext // by the CIMOperationRequestDispatcher for all CIM operation // requests to providers, so it does not need to be added again. // CIMInitializeProviderRequestMessage also has a provider ID // container.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -