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

📄 basicprovidermanagerrouter.cpp

📁 Pegasus is an open-source implementationof the DMTF CIM and WBEM standards. It is designed to be por
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    {        // This operation is not provider-specific    }    else    {        // Error: Unrecognized message type.        PEGASUS_ASSERT(0);        CIMResponseMessage* resp = request->buildResponse();        resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,            "Unknown message type.");        response = resp;    }    //    // Forward the request to the appropriate ProviderManager(s)    //    if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||        (request->getType() ==         CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE))    {        _subscriptionInitComplete = true;        // Send CIMStopAllProvidersRequestMessage or        // CIMSubscriptionInitCompleteRequestMessage to all ProviderManagers        ReadLock tableLock(_providerManagerTableLock);        for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)        {            ProviderManagerContainer* pmc=_providerManagerTable[i];            Message* resp = pmc->getProviderManager()->processMessage(request);            delete resp;        }        response = request->buildResponse();    }    else if (request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE)    {        // Do not need to forward this request to in-process provider        // managers        response = request->buildResponse();    }    else    {        // Retrieve the provider interface type        String interfaceType;        CIMValue itValue = providerModule.getProperty(            providerModule.findProperty("InterfaceType")).getValue();        itValue.get(interfaceType);        ProviderManager* pm = 0;        Boolean gotError = false;        try        {            // Look up the appropriate ProviderManager by InterfaceType            pm = _getProviderManager(interfaceType);        }        catch (const CIMException& e)        {            CIMResponseMessage* cimResponse = request->buildResponse();            cimResponse->cimException = e;            response = cimResponse;            gotError = true;        }        if (remoteNameSpaceRequest && !pm->supportsRemoteNameSpaces())        {            CIMResponseMessage* resp = request->buildResponse();            resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,                "Remote Namespace operations not supported for interface type "                    + interfaceType);            response = resp;            gotError = true;        }        if (!gotError)        {            response = pm->processMessage(request);        }    }    // preserve message key    // set HTTP method in response from request    // set closeConnect   ((CIMResponseMessage *)response)->syncAttributes(request);    PEG_METHOD_EXIT();    return response;}// ATTN: May need to add interfaceVersion parameter to further constrain lookupProviderManager* BasicProviderManagerRouter::_getProviderManager(    const String& interfaceType){    PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,        "BasicProviderManagerRouter::_getProviderManager");    //    // Search for this InterfaceType in the table of loaded ProviderManagers    //    {        ReadLock tableLock(_providerManagerTableLock);        ProviderManager* pm = _lookupProviderManager(interfaceType);        if (pm)        {            PEG_METHOD_EXIT();            return pm;        }    }    //    // Load the ProviderManager for this InterfaceType and add it to the table    //    {        WriteLock tableLock(_providerManagerTableLock);        ProviderManager* pm = _lookupProviderManager(interfaceType);        if (pm)        {            PEG_METHOD_EXIT();            return pm;        }        // ATTN: this section is a temporary solution to populate the list of        // enabled 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.        // The DefaultProviderManager is now statically linked rather than        // dynamically loaded. This code is no longer used but remains for        // reference purposes.#if defined(PEGASUS_ENABLE_DEFAULT_PROVIDER_MANAGER)        if (interfaceType == "C++Default" &&            _createDefaultProviderManagerCallback)        {            pm = (*_createDefaultProviderManagerCallback)();            ProviderManagerContainer* pmc = new ProviderManagerContainer(                "C++Default",                _indicationCallback,                _responseChunkCallback,                _subscriptionInitComplete,                pm);            _providerManagerTable.append(pmc);            return pmc->getProviderManager();        }#endif#if defined(PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER)        if (interfaceType == "CMPI")        {            ProviderManagerContainer* pmc = new ProviderManagerContainer(                LIBRARY_NAME_CMPIPM,                "CMPI",                "CMPI",                _indicationCallback,                _responseChunkCallback,                _subscriptionInitComplete);            _providerManagerTable.append(pmc);            return pmc->getProviderManager();        }#endif#if defined(PEGASUS_ENABLE_JMPI_PROVIDER_MANAGER)        if (  interfaceType == "JMPI"           || interfaceType == "JMPIExperimental"           )        {            ProviderManagerContainer* pmc = new ProviderManagerContainer(                LIBRARY_NAME_JMPIPM,                interfaceType,                interfaceType,                _indicationCallback,                _responseChunkCallback,                _subscriptionInitComplete);            _providerManagerTable.append(pmc);            return pmc->getProviderManager();        }#endif        // END TEMP SECTION    }    // Error: ProviderManager not found for the specified interface type    PEGASUS_ASSERT(0);    PEG_METHOD_EXIT();    return 0;}// NOTE: The caller must lock _providerManagerTableLock before calling this// method.ProviderManager* BasicProviderManagerRouter::_lookupProviderManager(    const String& interfaceType){    PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,        "BasicProviderManagerRouter::_lookupProviderManager");    //    // Search for this InterfaceType in the table of loaded ProviderManagers    //    for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)    {        if (interfaceType == _providerManagerTable[i]->getInterfaceName())        {            ProviderManagerContainer* pmc = _providerManagerTable[i];            PEG_METHOD_EXIT();            return pmc->getProviderManager();        }    }    // Not found    PEG_METHOD_EXIT();    return 0;}Boolean BasicProviderManagerRouter::hasActiveProviders(){    PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,        "BasicProviderManagerRouter::hasActiveProviders");    ReadLock tableLock(_providerManagerTableLock);    for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)    {        ProviderManagerContainer* pmc = _providerManagerTable[i];        if (pmc->getProviderManager()->hasActiveProviders())        {            PEG_METHOD_EXIT();            return true;        }    }    PEG_METHOD_EXIT();    return false;}void BasicProviderManagerRouter::unloadIdleProviders(){    PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,        "BasicProviderManagerRouter::unloadIdleProviders");    //    // Save pointers to the ProviderManagerContainers so we don't hold the    // _providerManagerTableLock while unloading idle providers    //    Array<ProviderManagerContainer*> pmcs;    {        ReadLock tableLock(_providerManagerTableLock);        for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)        {            pmcs.append(_providerManagerTable[i]);        }    }    //    // Unload idle providers in each of the active ProviderManagers    // _providerManagerTableLock while unloading idle providers    //    for (Uint32 i = 0; i < pmcs.size(); i++)    {        pmcs[i]->getProviderManager()->unloadIdleProviders();    }    PEG_METHOD_EXIT();}PEGASUS_NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -