📄 basicprovidermanagerrouter.cpp
字号:
{ // 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 + -