⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 providermanagerservice.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//%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 + -