version 1.11.4.3, 2004/03/10 14:19:29
|
version 1.91, 2008/12/16 18:56:59
|
|
|
//%2003//////////////////////////////////////////////////////////////////////// |
//%LICENSE//////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Development |
// Licensed to The Open Group (TOG) under one or more contributor license |
// Company, L. P., IBM Corp., The Open Group, Tivoli Systems. |
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; |
// this work for additional information regarding copyright ownership. |
// IBM Corp.; EMC Corporation, The Open Group. |
// Each contributor licenses this file to you under the OpenPegasus Open |
|
// Source License; you may not use this file except in compliance with the |
|
// License. |
|
// |
|
// 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. |
// | // |
// 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. |
|
// |
|
//============================================================================== |
|
// |
|
// Author: Chip Vincent (cvincent@us.ibm.com) |
|
// |
|
// Modified By: Carol Ann Krug Graves, Hewlett-Packard Company |
|
// (carolann_graves@hp.com) |
|
// Mike Day, IBM (mdday@us.ibm.com) |
|
// Karl Schopmeyer(k.schopmeyer@opengroup.org) - Fix associators. |
|
// Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com) |
|
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
| |
#include <Pegasus/Common/CIMMessage.h> | #include <Pegasus/Common/CIMMessage.h> |
#include <Pegasus/Common/OperationContext.h> | #include <Pegasus/Common/OperationContext.h> |
#include <Pegasus/Common/Destroyer.h> |
#include <Pegasus/Common/Time.h> |
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/StatisticalData.h> | #include <Pegasus/Common/StatisticalData.h> |
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
#include <Pegasus/Common/MessageLoader.h> //l10n |
#include <Pegasus/Common/MessageLoader.h> |
|
#include <Pegasus/Common/FileSystem.h> |
|
#include <Pegasus/Common/PegasusVersion.h> |
|
#include <Pegasus/Common/Constants.h> |
| |
//#include <Pegasus/Common/QueryExpression.h> |
#include <Pegasus/Query/QueryExpression/QueryExpression.h> |
//#include <Pegasus/ProviderManager2/QueryExpressionFactory.h> |
#include <Pegasus/ProviderManager2/QueryExpressionFactory.h> |
| |
#include <Pegasus/Config/ConfigManager.h> |
|
|
|
#include <Pegasus/ProviderManager2/Default/Provider.h> |
|
#include <Pegasus/ProviderManager2/OperationResponseHandler.h> | #include <Pegasus/ProviderManager2/OperationResponseHandler.h> |
| |
#include <Pegasus/Server/ProviderRegistrationManager/ProviderRegistrationManager.h> |
|
#include <Pegasus/ProviderManager2/ProviderManagerService.h> |
|
|
|
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
// auto variable to protect provider during operations |
// |
class pm_service_op_lock |
// Default Provider Manager |
{ |
// |
private: |
DefaultProviderManager::DefaultProviderManager() |
pm_service_op_lock(void); |
|
|
|
public: |
|
pm_service_op_lock(Provider *provider) : _provider(provider) |
|
{ | { |
_provider->protect(); |
_subscriptionInitComplete = false; |
} | } |
| |
~pm_service_op_lock(void) |
DefaultProviderManager::~DefaultProviderManager() |
{ | { |
_provider->unprotect(); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
} |
"DefaultProviderManager::~DefaultProviderManager"); |
|
|
Provider * _provider; |
|
}; |
|
|
|
// |
|
// Provider module status |
|
// |
|
static const Uint16 _MODULE_OK = 2; |
|
static const Uint16 _MODULE_STOPPING = 9; |
|
static const Uint16 _MODULE_STOPPED = 10; |
|
| |
// provider manager |
_shutdownAllProviders(); |
static LocalProviderManager providerManager; |
|
| |
DefaultProviderManager::DefaultProviderManager(void) |
for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) |
{ | { |
|
ProviderMessageHandler* provider = i.value(); |
|
delete provider; |
} | } |
| |
DefaultProviderManager::~DefaultProviderManager(void) |
for (ModuleTable::Iterator j = _modules.start(); j != 0; j++) |
{ | { |
|
ProviderModule* module = j.value(); |
|
delete module; |
} | } |
| |
Message * DefaultProviderManager::processMessage(Message * request) |
PEG_METHOD_EXIT(); |
|
} |
|
|
|
Message* DefaultProviderManager::processMessage(Message* message) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, | PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"DefaultProviderManager::processMessage()"); | "DefaultProviderManager::processMessage()"); |
| |
Message * response = 0; |
CIMRequestMessage* request = dynamic_cast<CIMRequestMessage*>(message); |
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMResponseMessage* response = 0; |
| |
|
try |
|
{ |
// pass the request message to a handler method based on message type | // pass the request message to a handler method based on message type |
switch(request->getType()) | switch(request->getType()) |
{ | { |
case CIM_GET_INSTANCE_REQUEST_MESSAGE: | case CIM_GET_INSTANCE_REQUEST_MESSAGE: |
response = handleGetInstanceRequest(request); |
|
|
|
break; |
|
case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE: | case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE: |
response = handleEnumerateInstancesRequest(request); |
|
|
|
break; |
|
case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE: | case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE: |
response = handleEnumerateInstanceNamesRequest(request); |
|
|
|
break; |
|
case CIM_CREATE_INSTANCE_REQUEST_MESSAGE: | case CIM_CREATE_INSTANCE_REQUEST_MESSAGE: |
response = handleCreateInstanceRequest(request); |
|
|
|
break; |
|
case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE: | case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE: |
response = handleModifyInstanceRequest(request); |
|
|
|
break; |
|
case CIM_DELETE_INSTANCE_REQUEST_MESSAGE: | case CIM_DELETE_INSTANCE_REQUEST_MESSAGE: |
response = handleDeleteInstanceRequest(request); |
case CIM_EXEC_QUERY_REQUEST_MESSAGE: |
|
|
break; |
|
// case CIM_EXEC_QUERY_REQUEST_MESSAGE: |
|
// response = handleExecQueryRequest(request); |
|
|
|
// break; |
|
case CIM_ASSOCIATORS_REQUEST_MESSAGE: | case CIM_ASSOCIATORS_REQUEST_MESSAGE: |
response = handleAssociatorsRequest(request); |
|
|
|
break; |
|
case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE: | case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE: |
response = handleAssociatorNamesRequest(request); |
|
|
|
break; |
|
case CIM_REFERENCES_REQUEST_MESSAGE: | case CIM_REFERENCES_REQUEST_MESSAGE: |
response = handleReferencesRequest(request); |
|
|
|
break; |
|
case CIM_REFERENCE_NAMES_REQUEST_MESSAGE: | case CIM_REFERENCE_NAMES_REQUEST_MESSAGE: |
response = handleReferenceNamesRequest(request); |
|
|
|
break; |
|
case CIM_GET_PROPERTY_REQUEST_MESSAGE: | case CIM_GET_PROPERTY_REQUEST_MESSAGE: |
response = handleGetPropertyRequest(request); |
|
|
|
break; |
|
case CIM_SET_PROPERTY_REQUEST_MESSAGE: | case CIM_SET_PROPERTY_REQUEST_MESSAGE: |
response = handleSetPropertyRequest(request); |
|
|
|
break; |
|
case CIM_INVOKE_METHOD_REQUEST_MESSAGE: | case CIM_INVOKE_METHOD_REQUEST_MESSAGE: |
response = handleInvokeMethodRequest(request); |
|
|
|
break; |
|
case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE: | case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE: |
response = handleCreateSubscriptionRequest(request); |
|
|
|
break; |
|
case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE: | case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE: |
response = handleModifySubscriptionRequest(request); |
|
|
|
break; |
|
case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE: | case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE: |
response = handleDeleteSubscriptionRequest(request); |
case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: |
|
{ |
break; |
ProviderIdContainer providerId = |
case CIM_ENABLE_INDICATIONS_REQUEST_MESSAGE: |
request->operationContext.get(ProviderIdContainer::NAME); |
response = handleEnableIndicationsRequest(request); |
|
| |
break; |
// resolve provider name |
case CIM_DISABLE_INDICATIONS_REQUEST_MESSAGE: |
ProviderName name = _resolveProviderName(providerId); |
response = handleDisableIndicationsRequest(request); |
|
| |
break; |
// get cached or load new provider module |
case CIM_CONSUME_INDICATION_REQUEST_MESSAGE: |
ProviderOperationCounter poc( |
response = handleConsumeIndicationRequest(request); |
_getProvider( |
break; |
name.getPhysicalName(), |
|
name.getModuleName(), |
|
name.getLogicalName())); |
| |
case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: |
response = poc.GetProvider().processMessage(request); |
response = handleExportIndicationRequest(request); |
|
break; | break; |
|
} |
| |
case CIM_DISABLE_MODULE_REQUEST_MESSAGE: | case CIM_DISABLE_MODULE_REQUEST_MESSAGE: |
response = handleDisableModuleRequest(request); |
response = _handleDisableModuleRequest(request); |
|
|
break; | break; |
case CIM_ENABLE_MODULE_REQUEST_MESSAGE: |
|
response = handleEnableModuleRequest(request); |
|
| |
|
case CIM_ENABLE_MODULE_REQUEST_MESSAGE: |
|
response = _handleEnableModuleRequest(request); |
break; | break; |
|
|
case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE: | case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE: |
response = handleStopAllProvidersRequest(request); |
// tell the provider manager to shutdown all the providers |
|
_shutdownAllProviders(); |
|
response = request->buildResponse(); |
|
break; |
| |
|
case CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE: |
|
response = _handleSubscriptionInitCompleteRequest(request); |
break; | break; |
default: |
|
response = handleUnsupportedRequest(request); |
|
| |
|
default: |
|
PEGASUS_ASSERT(0); |
break; | break; |
} | } |
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} | } |
|
catch (CIMException& e) |
Message * DefaultProviderManager::handleUnsupportedRequest(const Message * message) |
{ |
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1,"CIMException: %s", |
|
(const char*)e.getMessage().getCString())); |
|
response = request->buildResponse(); |
|
response->cimException = PEGASUS_CIM_EXCEPTION_LANG( |
|
e.getContentLanguages(), e.getCode(), e.getMessage()); |
|
} |
|
catch (Exception& e) |
|
{ |
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1,"Exception: %s", |
|
(const char*)e.getMessage().getCString())); |
|
response = request->buildResponse(); |
|
response->cimException = PEGASUS_CIM_EXCEPTION_LANG( |
|
e.getContentLanguages(), CIM_ERR_FAILED, e.getMessage()); |
|
} |
|
catch (...) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleUnsupportedRequest"); |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL1, |
|
"Exception: Unknown"); |
|
response = request->buildResponse(); |
|
response->cimException = PEGASUS_CIM_EXCEPTION( |
|
CIM_ERR_FAILED, "Unknown error."); |
|
} |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
return response; |
// a null response implies unsupported or unknown operation |
|
return(0); |
|
} | } |
| |
Message * DefaultProviderManager::handleGetInstanceRequest(const Message * message) |
CIMResponseMessage* DefaultProviderManager::_handleDisableModuleRequest( |
|
CIMRequestMessage* message) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleGetInstanceRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::_handleDisableModuleRequest"); |
CIMGetInstanceRequestMessage * request = |
|
dynamic_cast<CIMGetInstanceRequestMessage *>(const_cast<Message *>(message)); |
|
| |
|
CIMDisableModuleRequestMessage* request = |
|
dynamic_cast<CIMDisableModuleRequestMessage*>(message); |
PEGASUS_ASSERT(request != 0); | PEGASUS_ASSERT(request != 0); |
| |
CIMGetInstanceResponseMessage * response = |
Array<Uint16> operationalStatus; |
new CIMGetInstanceResponseMessage( |
CIMException cimException; |
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
CIMInstance()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
// create a handler for this request |
|
GetInstanceResponseHandler handler(request, response); |
|
| |
try | try |
{ | { |
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
// get provider module name |
"DefaultProviderManager::handleGetInstanceRequest - Host name: $0 Name space: $1 Class name: $2", |
String moduleName; |
System::getHostName(), |
CIMInstance mInstance = request->providerModule; |
request->nameSpace.getString(), |
Uint32 pos = mInstance.findProperty(PEGASUS_PROPERTYNAME_NAME); |
request->instanceName.getClassName().getString()); |
PEGASUS_ASSERT(pos != PEG_NOT_FOUND); |
|
mInstance.getProperty(pos).getValue().get(moduleName); |
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->instanceName.getClassName(), |
|
request->instanceName.getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::INSTANCE); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMPropertyList propertyList(request->propertyList); |
|
|
|
// forward request |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.getInstance: " + |
|
ph.GetProvider().getName()); |
|
| |
pm_service_op_lock op_lock(&ph.GetProvider()); |
// |
|
// Unload providers |
|
// |
|
Array<CIMInstance> providerInstances = request->providers; |
| |
STAT_GETSTARTTIME; |
for (Uint32 i = 0, n = providerInstances.size(); i < n; i++) |
|
{ |
|
String pName; |
|
providerInstances[i].getProperty( |
|
providerInstances[i].findProperty(PEGASUS_PROPERTYNAME_NAME)). |
|
getValue().get(pName); |
| |
ph.GetProvider().getInstance( |
Sint16 ret_value = _disableProvider(moduleName, pName); |
context, |
|
objectPath, |
|
request->includeQualifiers, |
|
request->includeClassOrigin, |
|
propertyList, |
|
handler); |
|
| |
STAT_PMS_PROVIDEREND; |
if (ret_value == 0) |
|
{ |
|
// disable failed since there are pending requests, |
|
// stop trying to disable other providers in this module. |
|
operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK); |
|
break; |
|
} |
|
else if (ret_value != 1) // Not success |
|
{ |
|
// disable failed for other reason, throw exception |
|
throw PEGASUS_CIM_EXCEPTION_L( |
|
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService." |
|
"DISABLE_PROVIDER_FAILED", |
|
"Failed to disable the provider.")); |
|
} |
|
} |
} | } |
catch(CIMException & e) | catch(CIMException & e) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1,"CIMException: %s", |
"Exception: " + e.getMessage()); |
(const char*)e.getMessage().getCString())); |
|
cimException = e; |
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} | } |
catch(Exception & e) | catch(Exception & e) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1,"Exception: %s", |
"Exception: " + e.getMessage()); |
(const char*)e.getMessage().getCString())); |
|
cimException = CIMException(CIM_ERR_FAILED, e.getMessage()); |
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} | } |
catch(...) | catch(...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL1, |
"Exception: Unknown"); | "Exception: Unknown"); |
|
cimException = PEGASUS_CIM_EXCEPTION_L( |
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService.UNKNOWN_ERROR", |
|
"Unknown Error")); |
} | } |
| |
PEG_METHOD_EXIT(); |
if (cimException.getCode() == CIM_ERR_SUCCESS) |
|
{ |
return(response); |
// Status is set to OK if a provider was busy |
|
if (operationalStatus.size() == 0) |
|
{ |
|
operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_STOPPED); |
} | } |
|
} |
Message * DefaultProviderManager::handleEnumerateInstancesRequest(const Message * message) |
else |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleEnumerateInstanceRequest"); |
// If exception occurs, module is not stopped |
|
operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK); |
CIMEnumerateInstancesRequestMessage * request = |
} |
dynamic_cast<CIMEnumerateInstancesRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMEnumerateInstancesResponseMessage * response = |
|
new CIMEnumerateInstancesResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMInstance>()); |
|
| |
|
CIMDisableModuleResponseMessage* response = |
|
dynamic_cast<CIMDisableModuleResponseMessage*>( |
|
request->buildResponse()); |
PEGASUS_ASSERT(response != 0); | PEGASUS_ASSERT(response != 0); |
| |
// preserve message key |
response->operationalStatus = operationalStatus; |
response->setKey(request->getKey()); |
|
| |
// Set HTTP method in response from request |
PEG_METHOD_EXIT(); |
response->setHttpMethod (request->getHttpMethod ()); |
|
| |
// create a handler for this request |
return response; |
EnumerateInstancesResponseHandler handler(request, response); |
} |
| |
try |
CIMResponseMessage* DefaultProviderManager::_handleEnableModuleRequest( |
|
CIMRequestMessage* message) |
{ | { |
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"DefaultProviderManager::handleEnumerateInstancesRequest - Host name: $0 Name space: $1 Class name: $2", |
"DefaultProviderManager::_handleEnableModuleRequest"); |
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->className.getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->className); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::INSTANCE); |
|
| |
// resolve provider name |
CIMEnableModuleRequestMessage* request = |
name = _resolveProviderName(name); |
dynamic_cast<CIMEnableModuleRequestMessage*>(message); |
|
PEGASUS_ASSERT(request != 0); |
| |
// get cached or load new provider module |
Array<Uint16> operationalStatus; |
OpProviderHolder ph = providerManager.getProvider(name.getPhysicalName(), |
operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK); |
name.getLogicalName(), String::EMPTY); |
|
| |
// convert arguments |
CIMEnableModuleResponseMessage* response = |
OperationContext context; |
dynamic_cast<CIMEnableModuleResponseMessage*>( |
|
request->buildResponse()); |
|
PEGASUS_ASSERT(response != 0); |
| |
context.insert(IdentityContainer(request->userName)); |
response->operationalStatus = operationalStatus; |
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
| |
CIMPropertyList propertyList(request->propertyList); |
PEG_METHOD_EXIT(); |
|
return response; |
|
} |
| |
// forward request |
CIMResponseMessage* |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
DefaultProviderManager::_handleSubscriptionInitCompleteRequest( |
"Calling provider.enumerateInstances: " + |
CIMRequestMessage* message) |
ph.GetProvider().getName()); |
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::_handleSubscriptionInitCompleteRequest"); |
| |
pm_service_op_lock op_lock(&ph.GetProvider()); |
CIMSubscriptionInitCompleteRequestMessage* request = |
|
dynamic_cast<CIMSubscriptionInitCompleteRequestMessage*>(message); |
|
PEGASUS_ASSERT(request != 0); |
| |
STAT_GETSTARTTIME; |
CIMSubscriptionInitCompleteResponseMessage* response = |
|
dynamic_cast<CIMSubscriptionInitCompleteResponseMessage*>( |
|
request->buildResponse()); |
|
PEGASUS_ASSERT(response != 0); |
| |
ph.GetProvider().enumerateInstances( |
_subscriptionInitComplete = true; |
context, |
|
objectPath, |
|
request->includeQualifiers, |
|
request->includeClassOrigin, |
|
propertyList, |
|
handler); |
|
| |
STAT_PMS_PROVIDEREND; |
// Make a copy of the table so it is not locked during the provider calls |
} |
Array<ProviderMessageHandler*> providerList; |
catch(CIMException & e) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
AutoMutex lock(_providerTableMutex); |
"Exception: " + e.getMessage()); |
|
| |
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) |
} |
|
catch(Exception & e) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
providerList.append(i.value()); |
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} | } |
catch(...) |
} |
|
|
|
// |
|
// Notify all providers that subscription initialization is complete |
|
// |
|
for (Uint32 j = 0; j < providerList.size(); j++) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
AutoMutex lock(providerList[j]->status.getStatusMutex()); |
"Exception: Unknown"); |
|
| |
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
if (providerList[j]->status.isInitialized()) |
|
{ |
|
providerList[j]->subscriptionInitComplete(); |
|
} |
} | } |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
return response; |
return(response); |
|
} | } |
| |
Message * DefaultProviderManager::handleEnumerateInstanceNamesRequest(const Message * message) |
ProviderName DefaultProviderManager::_resolveProviderName( |
|
const ProviderIdContainer& providerId) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleEnumerateInstanceNamesRequest"); |
String providerName; |
|
String fileName; |
CIMEnumerateInstanceNamesRequestMessage * request = |
String moduleName; |
dynamic_cast<CIMEnumerateInstanceNamesRequestMessage *>(const_cast<Message *>(message)); |
CIMValue genericValue; |
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMEnumerateInstanceNamesResponseMessage * response = |
|
new CIMEnumerateInstanceNamesResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMObjectPath>()); |
|
| |
PEGASUS_ASSERT(response != 0); |
genericValue = providerId.getModule().getProperty( |
|
providerId.getModule().findProperty( |
|
PEGASUS_PROPERTYNAME_NAME)).getValue(); |
|
genericValue.get(moduleName); |
| |
// preserve message key |
genericValue = providerId.getProvider().getProperty( |
response->setKey(request->getKey()); |
providerId.getProvider().findProperty( |
|
PEGASUS_PROPERTYNAME_NAME)).getValue(); |
|
genericValue.get(providerName); |
| |
//set HTTP method in response from request |
genericValue = providerId.getModule().getProperty( |
response->setHttpMethod(request->getHttpMethod());; |
providerId.getModule().findProperty("Location")).getValue(); |
|
genericValue.get(fileName); |
| |
// create a handler for this request |
String resolvedFileName = _resolvePhysicalName(fileName); |
EnumerateInstanceNamesResponseHandler handler(request, response); |
|
| |
// process the request |
if (resolvedFileName == String::EMPTY) |
try |
|
{ | { |
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
// Provider library not found |
"DefaultProviderManager::handleEnumerateInstanceNamesRequest - Host name: $0 Name space: $1 Class name: $2", |
throw Exception(MessageLoaderParms( |
System::getHostName(), |
"ProviderManager.ProviderManagerService.PROVIDER_FILE_NOT_FOUND", |
request->nameSpace.getString(), |
"File \"$0\" was not found for provider module \"$1\".", |
request->className.getString()); |
FileSystem::buildLibraryFileName(fileName), moduleName)); |
|
} |
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->className); |
|
|
|
// build an internal provider name from the request arguments |
|
ProviderName name( |
|
objectPath, |
|
ProviderType::INSTANCE); |
|
| |
// resolve provider name |
return ProviderName(moduleName, providerName, resolvedFileName); |
name = _resolveProviderName(name); |
} |
| |
// get cached or load new provider module |
ProviderOperationCounter DefaultProviderManager::_getProvider( |
OpProviderHolder ph = |
const String& moduleFileName, |
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName()); |
const String& moduleName, |
|
const String& providerName) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::_getProvider"); |
| |
// convert arguments |
ProviderMessageHandler* pr = _lookupProvider(moduleName, providerName); |
OperationContext context; |
|
| |
context.insert(IdentityContainer(request->userName)); |
if (!pr->status.isInitialized()) |
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
{ |
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
_initProvider(pr, moduleFileName); |
|
} |
| |
// forward request |
AutoMutex lock(pr->status.getStatusMutex()); |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.enumerateInstanceNames: " + |
|
ph.GetProvider().getName()); |
|
| |
pm_service_op_lock op_lock(&ph.GetProvider()); |
if (!pr->status.isInitialized()) |
|
{ |
|
PEG_METHOD_EXIT(); |
|
throw PEGASUS_CIM_EXCEPTION( |
|
CIM_ERR_FAILED, "provider initialization failed"); |
|
} |
| |
STAT_GETSTARTTIME; |
ProviderOperationCounter poc(pr); |
| |
ph.GetProvider().enumerateInstanceNames( |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,"Returning Provider %s", |
context, |
(const char*)providerName.getCString())); |
objectPath, |
|
handler); |
|
| |
STAT_PMS_PROVIDEREND; |
PEG_METHOD_EXIT(); |
|
return poc; |
} | } |
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
| |
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
ProviderMessageHandler* DefaultProviderManager::_lookupProvider( |
} |
const String& moduleName, |
catch(Exception & e) |
const String& providerName) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"Exception: " + e.getMessage()); |
"DefaultProviderManager::_lookupProvider"); |
| |
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
// lock the providerTable mutex |
|
AutoMutex lock(_providerTableMutex); |
|
|
|
// Construct the lookup key. We need a compound key to differentiate |
|
// providers with the same name from different modules. The size field is |
|
// added to handle the unlikely case when moduleName+providerName |
|
// produce identical strings but define different providers. |
|
char buffer[12]; |
|
sprintf(buffer, "%u:", providerName.size()); |
|
const String key = buffer + moduleName + ":" + providerName; |
|
|
|
// look up provider in cache |
|
ProviderMessageHandler* pr = 0; |
|
if (_providers.lookup(key, pr)) |
|
{ |
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Found Provider %s in Provider Manager Cache", |
|
(const char*)providerName.getCString())); |
} | } |
catch(...) |
else |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
// create provider |
"Exception: Unknown"); |
pr = new ProviderMessageHandler( |
|
moduleName, providerName, |
|
0, _indicationCallback, _responseChunkCallback, |
|
_subscriptionInitComplete); |
| |
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
// insert provider in provider table |
|
_providers.insert(key, pr); |
|
|
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,"Created provider %s", |
|
(const char*)pr->getName().getCString())); |
} | } |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
return pr; |
return(response); |
|
} | } |
| |
Message * DefaultProviderManager::handleCreateInstanceRequest(const Message * message) |
ProviderMessageHandler* DefaultProviderManager::_initProvider( |
|
ProviderMessageHandler* provider, |
|
const String& moduleFileName) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleCreateInstanceRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::_initProvider"); |
CIMCreateInstanceRequestMessage * request = |
|
dynamic_cast<CIMCreateInstanceRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
| |
// create response message |
ProviderModule* module = 0; |
CIMCreateInstanceResponseMessage * response = |
CIMProvider* base; |
new CIMCreateInstanceResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
CIMObjectPath()); |
|
| |
PEGASUS_ASSERT(response != 0); |
// lookup provider module |
|
module = _lookupModule(moduleFileName); |
| |
// preserve message key |
// lock the provider status mutex |
response->setKey(request->getKey()); |
AutoMutex lock(provider->status.getStatusMutex()); |
| |
// Set HTTP method in response from request |
if (provider->status.isInitialized()) |
response->setHttpMethod (request->getHttpMethod ()); |
{ |
|
// Initialization is already complete |
|
return provider; |
|
} |
| |
// create a handler for this request |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
CreateInstanceResponseHandler handler(request, response); |
"Loading/Linking Provider Module %s", |
|
(const char*)moduleFileName.getCString())); |
| |
|
// load the provider |
try | try |
{ | { |
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
base = module->load(provider->getName()); |
"DefaultProviderManager::handleCreateInstanceRequest - Host name: $0 Name space: $1 Class name: $2", |
} |
System::getHostName(), |
catch (...) |
request->nameSpace.getString(), |
{ |
request->newInstance.getPath().getClassName().getString()); |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL1, |
|
"Exception caught Loading/Linking Provider Module %s", |
// make target object path |
(const char*)moduleFileName.getCString())); |
CIMObjectPath objectPath( |
PEG_METHOD_EXIT(); |
System::getHostName(), |
throw; |
request->nameSpace, |
} |
request->newInstance.getPath().getClassName(), |
|
request->newInstance.getPath().getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::INSTANCE); |
|
| |
// resolve provider name |
// initialize the provider |
name = _resolveProviderName(name); |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL2, "Initializing Provider %s", |
|
(const char*)provider->getName().getCString())); |
| |
// get cached or load new provider module |
CIMOMHandle* cimomHandle = new CIMOMHandle(); |
OpProviderHolder ph = |
provider->status.setCIMOMHandle(cimomHandle); |
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
provider->status.setModule(module); |
|
provider->setProvider(base); |
| |
// convert arguments |
Boolean initializeError = false; |
OperationContext context; |
|
| |
context.insert(IdentityContainer(request->userName)); |
try |
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
{ |
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
provider->initialize(*cimomHandle); |
|
} |
|
catch (...) |
|
{ |
|
initializeError = true; |
|
} |
| |
// forward request |
// The cleanup code executed when an exception occurs was previously |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
// included in the catch block above. Unloading the provider module |
"Calling provider.createInstance: " + |
// from inside the catch block resulted in a crash when an exception |
ph.GetProvider().getName()); |
// was thrown from a provider's initialize() method. The issue is that |
|
// when an exception is thrown, the program maintains internal |
|
// pointers related to the code that threw the exception. In the case |
|
// of an exception thrown from a provider during the initialize() |
|
// method, those pointers point into the provider library, so when |
|
// the DefaultProviderManager unloads the library, the pointers into |
|
// the library that the program was holding are invalid. |
| |
pm_service_op_lock op_lock(&ph.GetProvider()); |
if (initializeError == true) |
|
{ |
|
// Allow the provider to clean up |
|
provider->terminate(); |
| |
STAT_GETSTARTTIME; |
// delete the cimom handle |
|
delete cimomHandle; |
| |
ph.GetProvider().createInstance( |
provider->setProvider(0); |
context, |
|
objectPath, |
|
request->newInstance, |
|
handler); |
|
| |
STAT_PMS_PROVIDEREND; |
// unload provider module |
|
module->unloadModule(); |
} | } |
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
| |
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
provider->status.setInitialized(!initializeError); |
|
|
|
PEG_METHOD_EXIT(); |
|
return provider; |
} | } |
catch(Exception & e) |
|
|
ProviderModule* DefaultProviderManager::_lookupModule( |
|
const String& moduleFileName) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"Exception: " + e.getMessage()); |
"DefaultProviderManager::_lookupModule"); |
| |
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
// lock the providerTable mutex |
|
AutoMutex lock(_providerTableMutex); |
|
|
|
// look up provider module in cache |
|
ProviderModule* module = 0; |
|
|
|
if (_modules.lookup(moduleFileName, module)) |
|
{ |
|
// found provider module in cache |
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Found Provider Module %s in Provider Manager Cache", |
|
(const char*)moduleFileName.getCString())); |
} | } |
catch(...) |
else |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
// provider module not found in cache, create provider module |
"Exception: Unknown"); |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Creating Provider Module %s", |
|
(const char*)moduleFileName.getCString())); |
| |
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
module = new ProviderModule(moduleFileName); |
|
|
|
// insert provider module in module table |
|
_modules.insert(moduleFileName, module); |
} | } |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
return module; |
return(response); |
|
} | } |
| |
Message * DefaultProviderManager::handleModifyInstanceRequest(const Message * message) |
Boolean DefaultProviderManager::hasActiveProviders() |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleModifyInstanceRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::hasActiveProviders"); |
CIMModifyInstanceRequestMessage * request = |
|
dynamic_cast<CIMModifyInstanceRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
// create response message |
|
CIMModifyInstanceResponseMessage * response = |
|
new CIMModifyInstanceResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
| |
PEGASUS_ASSERT(response != 0); |
try |
|
{ |
|
AutoMutex lock(_providerTableMutex); |
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Number of providers in _providers table = %d", _providers.size())); |
| |
// preserve message key |
// Iterate through the _providers table looking for an active provider |
response->setKey(request->getKey()); |
for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) |
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
// create a handler for this request |
|
ModifyInstanceResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleModifyInstanceRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->modifiedInstance.getPath().getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->modifiedInstance.getPath ().getClassName(), |
|
request->modifiedInstance.getPath ().getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::INSTANCE); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMPropertyList propertyList(request->propertyList); |
|
|
|
// forward request |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.modifyInstance: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
ph.GetProvider().modifyInstance( |
|
context, |
|
objectPath, |
|
request->modifiedInstance, |
|
request->includeQualifiers, |
|
propertyList, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleDeleteInstanceRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDeleteInstanceRequest"); |
|
|
|
CIMDeleteInstanceRequestMessage * request = |
|
dynamic_cast<CIMDeleteInstanceRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
// create response message |
|
CIMDeleteInstanceResponseMessage * response = |
|
new CIMDeleteInstanceResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
// create a handler for this request |
|
DeleteInstanceResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleDeleteInstanceRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->instanceName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->instanceName.getClassName(), |
|
request->instanceName.getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::INSTANCE); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
// forward request |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.deleteInstance: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
ph.GetProvider().deleteInstance( |
|
context, |
|
objectPath, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
/* |
|
Message * DefaultProviderManager::handleExecQueryRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleExecQueryRequest"); |
|
|
|
CIMExecQueryRequestMessage * request = |
|
dynamic_cast<CIMExecQueryRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMExecQueryResponseMessage * response = |
|
new CIMExecQueryResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMObject>()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
// create a handler for this request |
|
ExecQueryResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleExecQueryRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->className.getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->className); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::QUERY); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), |
|
name.getLogicalName(), String::EMPTY); |
|
|
|
if (dynamic_cast<CIMInstanceQueryProvider*>(ph.GetCIMProvider()) == 0) { |
|
String errorString = " instance provider is registered supporting execQuery " |
|
"but is not a CIMQueryInstanceProvider subclass."; |
|
throw CIMException(CIM_ERR_FAILED,"ProviderLoadFailure (" + name.getPhysicalName() + ":" + |
|
name.getLogicalName() + "):" + errorString); |
|
} |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
QueryExpression qx(QueryExpressionFactory::routeBuildQueryExpressionRep |
|
(request->queryLanguage,request->query)); |
|
|
|
// forward request |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.executeQueryRequest: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
ph.GetProvider().execQuery( |
|
context, |
|
objectPath, |
|
qx, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
cout<<"--- exception not a CIMInstanceQueryProvider"<<endl; |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
*/ |
|
Message * DefaultProviderManager::handleAssociatorsRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleAssociatorsRequest"); |
|
|
|
CIMAssociatorsRequestMessage * request = |
|
dynamic_cast<CIMAssociatorsRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMAssociatorsResponseMessage * response = |
|
new CIMAssociatorsResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMObject>()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// create a handler for this request |
|
AssociatorsResponseHandler handler(request, response); |
|
|
|
// process the request |
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleAssociatorsRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->objectName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->objectName.getClassName()); |
|
|
|
objectPath.setKeyBindings(request->objectName.getKeyBindings()); |
|
|
|
CIMObjectPath assocPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->assocClass.getString()); |
|
|
|
ProviderName name( |
|
assocPath, |
|
ProviderType::ASSOCIATION); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
// ATTN KS STAT_GETSTARTTIME; |
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().associators( |
|
context, |
|
objectPath, |
|
request->assocClass, |
|
request->resultClass, |
|
request->role, |
|
request->resultRole, |
|
request->includeQualifiers, |
|
request->includeClassOrigin, |
|
request->propertyList.getPropertyNameArray(), |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleAssociatorNamesRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleAssociatorNamesRequest"); |
|
|
|
CIMAssociatorNamesRequestMessage * request = |
|
dynamic_cast<CIMAssociatorNamesRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMAssociatorNamesResponseMessage * response = |
|
new CIMAssociatorNamesResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMObjectPath>()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
// create a handler for this request |
|
AssociatorNamesResponseHandler handler(request, response); |
|
|
|
// process the request |
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleAssociationNamesRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->objectName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->objectName.getClassName()); |
|
|
|
objectPath.setKeyBindings(request->objectName.getKeyBindings()); |
|
|
|
CIMObjectPath assocPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->assocClass.getString()); |
|
|
|
ProviderName name( |
|
assocPath, |
|
ProviderType::ASSOCIATION); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().associatorNames( |
|
context, |
|
objectPath, |
|
request->assocClass, |
|
request->resultClass, |
|
request->role, |
|
request->resultRole, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleReferencesRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleReferencesRequest"); |
|
|
|
CIMReferencesRequestMessage * request = |
|
dynamic_cast<CIMReferencesRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMReferencesResponseMessage * response = |
|
new CIMReferencesResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMObject>()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
// create a handler for this request |
|
ReferencesResponseHandler handler(request, response); |
|
|
|
// process the request |
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleReferencesRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->objectName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->objectName.getClassName()); |
|
|
|
objectPath.setKeyBindings(request->objectName.getKeyBindings()); |
|
|
|
CIMObjectPath resultPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->resultClass.getString()); |
|
|
|
ProviderName name( |
|
resultPath, |
|
ProviderType::ASSOCIATION); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.references: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().references( |
|
context, |
|
objectPath, |
|
request->resultClass, |
|
request->role, |
|
request->includeQualifiers, |
|
request->includeClassOrigin, |
|
request->propertyList.getPropertyNameArray(), |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleReferenceNamesRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleReferenceNamesRequest"); |
|
|
|
CIMReferenceNamesRequestMessage * request = |
|
dynamic_cast<CIMReferenceNamesRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMReferenceNamesResponseMessage * response = |
|
new CIMReferenceNamesResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
Array<CIMObjectPath>()); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
// create a handler for this request |
|
ReferenceNamesResponseHandler handler(request, response); |
|
|
|
// process the request |
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleReferenceNamesRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->objectName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->objectName.getClassName()); |
|
|
|
objectPath.setKeyBindings(request->objectName.getKeyBindings()); |
|
|
|
CIMObjectPath resultPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->resultClass.getString()); |
|
|
|
ProviderName name( |
|
resultPath, |
|
ProviderType::ASSOCIATION); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.referenceNames: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().referenceNames( |
|
context, |
|
objectPath, |
|
request->resultClass, |
|
request->role, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleGetPropertyRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleGetPropertyRequest"); |
|
|
|
CIMGetPropertyRequestMessage * request = |
|
dynamic_cast<CIMGetPropertyRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
// create response message |
|
CIMGetPropertyResponseMessage * response = |
|
new CIMGetPropertyResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
CIMValue()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
GetPropertyResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleGetPropertyRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->instanceName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->instanceName.getClassName(), |
|
request->instanceName.getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
0); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMName propertyName = request->propertyName; |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.getProperty: " + |
|
ph.GetProvider().getName()); |
|
|
|
// forward request |
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().getProperty( |
|
context, |
|
objectPath, |
|
propertyName, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleSetPropertyRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleSetPropertyRequest"); |
|
|
|
CIMSetPropertyRequestMessage * request = |
|
dynamic_cast<CIMSetPropertyRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
// create response message |
|
//l10n |
|
CIMSetPropertyResponseMessage * response = |
|
new CIMSetPropertyResponseMessage( |
|
request->messageId, |
|
PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
|
"ProviderManager.DefaultProviderManager.NOT_IMPLEMENTED", |
|
"not implemented")), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
SetPropertyResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleSetPropertyRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->instanceName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->instanceName.getClassName(), |
|
request->instanceName.getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
0); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMName propertyName = request->propertyName; |
|
CIMValue propertyValue = request->newValue; |
|
|
|
STAT_GETSTARTTIME; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.setProperty: " + |
|
ph.GetProvider().getName()); |
|
|
|
// forward request |
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().setProperty( |
|
context, |
|
objectPath, |
|
propertyName, |
|
propertyValue, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleInvokeMethodRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleInvokeMethodRequest"); |
|
|
|
CIMInvokeMethodRequestMessage * request = |
|
dynamic_cast<CIMInvokeMethodRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
// create response message |
|
CIMInvokeMethodResponseMessage * response = |
|
new CIMInvokeMethodResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
CIMValue(), |
|
Array<CIMParamValue>(), |
|
request->methodName); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// propagate message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
// create a handler for this request |
|
InvokeMethodResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleInvokeMethodRequest - Host name: $0 Name space: $1 Class name: $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
request->instanceName.getClassName().getString()); |
|
|
|
// make target object path |
|
CIMObjectPath objectPath( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->instanceName.getClassName(), |
|
request->instanceName.getKeyBindings()); |
|
|
|
ProviderName name( |
|
objectPath, |
|
ProviderType::METHOD, |
|
request->methodName); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMObjectPath instanceReference(request->instanceName); |
|
|
|
// ATTN: propagate namespace |
|
instanceReference.setNameSpace(request->nameSpace); |
|
|
|
// forward request |
|
STAT_GETSTARTTIME; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.invokeMethod: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().invokeMethod( |
|
context, |
|
instanceReference, |
|
request->methodName, |
|
request->inParameters, |
|
handler); |
|
|
|
STAT_PMS_PROVIDEREND; |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown error."); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleCreateSubscriptionRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleCreateSubscriptionRequest"); |
|
|
|
CIMCreateSubscriptionRequestMessage * request = |
|
dynamic_cast<CIMCreateSubscriptionRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMCreateSubscriptionResponseMessage * response = |
|
new CIMCreateSubscriptionResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
OperationResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
String temp; |
|
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
|
{ |
|
temp.append(request->classNames[i].getString()); |
|
|
|
if(i == (n - 1)) |
|
{ |
|
temp.append(", "); |
|
} |
|
} |
|
|
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleCreateSubscriptionRequest - Host name: $0 Name space: $1 Class name(s): $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
temp); |
|
|
|
String physicalName=_resolvePhysicalName( |
|
request->providerModule.getProperty( |
|
request->providerModule.findProperty("Location")).getValue().toString()); |
|
|
|
ProviderName name( |
|
request->provider.getProperty(request->provider.findProperty |
|
("Name")).getValue ().toString (), |
|
physicalName, |
|
request->providerModule.getProperty(request->providerModule.findProperty |
|
("InterfaceType")).getValue().toString(), |
|
0); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(SubscriptionInstanceContainer |
|
(request->subscriptionInstance)); |
|
context.insert(SubscriptionFilterConditionContainer |
|
(request->condition, request->queryLanguage)); |
|
context.insert(SubscriptionLanguageListContainer |
|
(request->acceptLanguages)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMObjectPath subscriptionName = request->subscriptionInstance.getPath(); |
|
|
|
Array<CIMObjectPath> classNames; |
|
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
|
{ |
|
CIMObjectPath className( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->classNames[i]); |
|
|
|
classNames.append(className); |
|
} |
|
|
|
CIMPropertyList propertyList = request->propertyList; |
|
|
|
Uint16 repeatNotificationPolicy = request->repeatNotificationPolicy; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.createSubscription: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().createSubscription( |
|
context, |
|
subscriptionName, |
|
classNames, |
|
propertyList, |
|
repeatNotificationPolicy); |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown Error"); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleModifySubscriptionRequest( const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleModifySubscriptionRequest"); |
|
|
|
CIMModifySubscriptionRequestMessage * request = |
|
dynamic_cast<CIMModifySubscriptionRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMModifySubscriptionResponseMessage * response = |
|
new CIMModifySubscriptionResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
OperationResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
String temp; |
|
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
|
{ |
|
temp.append(request->classNames[i].getString()); |
|
|
|
if(i == (n - 1)) |
|
{ |
|
temp.append(", "); |
|
} |
|
} |
|
|
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleCreateSubscriptionRequest - Host name: $0 Name space: $1 Class name(s): $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
temp); |
|
|
|
String physicalName=_resolvePhysicalName( |
|
request->providerModule.getProperty( |
|
request->providerModule.findProperty("Location")).getValue().toString()); |
|
|
|
ProviderName name( |
|
request->provider.getProperty(request->provider.findProperty |
|
("Name")).getValue ().toString (), |
|
physicalName, |
|
request->providerModule.getProperty(request->providerModule.findProperty |
|
("InterfaceType")).getValue().toString(), |
|
0); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(SubscriptionInstanceContainer |
|
(request->subscriptionInstance)); |
|
context.insert(SubscriptionFilterConditionContainer |
|
(request->condition, request->queryLanguage)); |
|
context.insert(SubscriptionLanguageListContainer |
|
(request->acceptLanguages)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMObjectPath subscriptionName = request->subscriptionInstance.getPath(); |
|
|
|
Array<CIMObjectPath> classNames; |
|
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
|
{ |
|
CIMObjectPath className( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->classNames[i]); |
|
|
|
classNames.append(className); |
|
} |
|
|
|
CIMPropertyList propertyList = request->propertyList; |
|
|
|
Uint16 repeatNotificationPolicy = request->repeatNotificationPolicy; |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.modifySubscription: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().modifySubscription( |
|
context, |
|
subscriptionName, |
|
classNames, |
|
propertyList, |
|
repeatNotificationPolicy); |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown Error"); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleDeleteSubscriptionRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDeleteSubscriptionRequest"); |
|
|
|
CIMDeleteSubscriptionRequestMessage * request = |
|
dynamic_cast<CIMDeleteSubscriptionRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMDeleteSubscriptionResponseMessage * response = |
|
new CIMDeleteSubscriptionResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
OperationResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
String temp; |
|
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
|
{ |
|
temp.append(request->classNames[i].getString()); |
|
|
|
if(i == (n - 1)) |
|
{ |
|
temp.append(", "); |
|
} |
|
} |
|
|
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"DefaultProviderManager::handleDeleteSubscriptionRequest - Host name: $0 Name space: $1 Class name(s): $2", |
|
System::getHostName(), |
|
request->nameSpace.getString(), |
|
temp); |
|
|
|
String physicalName=_resolvePhysicalName( |
|
request->providerModule.getProperty( |
|
request->providerModule.findProperty("Location")).getValue().toString()); |
|
|
|
ProviderName name( |
|
request->provider.getProperty(request->provider.findProperty |
|
("Name")).getValue ().toString (), |
|
physicalName, |
|
request->providerModule.getProperty(request->providerModule.findProperty |
|
("InterfaceType")).getValue().toString(), |
|
0); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
// convert arguments |
|
OperationContext context; |
|
|
|
context.insert(IdentityContainer(request->userName)); |
|
context.insert(SubscriptionInstanceContainer |
|
(request->subscriptionInstance)); |
|
context.insert(SubscriptionLanguageListContainer |
|
(request->acceptLanguages)); |
|
context.insert(AcceptLanguageListContainer(request->acceptLanguages)); |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMObjectPath subscriptionName = request->subscriptionInstance.getPath(); |
|
|
|
Array<CIMObjectPath> classNames; |
|
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
|
{ |
|
CIMObjectPath className( |
|
System::getHostName(), |
|
request->nameSpace, |
|
request->classNames[i]); |
|
|
|
classNames.append(className); |
|
} |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.deleteSubscription: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().deleteSubscription( |
|
context, |
|
subscriptionName, |
|
classNames); |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown Error"); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleEnableIndicationsRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager:: handleEnableIndicationsRequest"); |
|
|
|
CIMEnableIndicationsRequestMessage * request = |
|
dynamic_cast<CIMEnableIndicationsRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMEnableIndicationsResponseMessage * response = |
|
new CIMEnableIndicationsResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
CIMEnableIndicationsResponseMessage * responseforhandler = |
|
new CIMEnableIndicationsResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod(request->getHttpMethod()); |
|
|
|
response->dest = request->queueIds.top(); |
|
|
|
// ATTN: need pointer to Provider Manager Server! |
|
EnableIndicationsResponseHandler *handler = |
|
new EnableIndicationsResponseHandler(request, response, |
|
request->provider, ProviderManagerService::providerManagerService); |
|
|
|
try |
|
{ |
|
String physicalName=_resolvePhysicalName( |
|
request->providerModule.getProperty( |
|
request->providerModule.findProperty("Location")).getValue().toString()); |
|
|
|
ProviderName name( |
|
request->provider.getProperty(request->provider.findProperty |
|
("Name")).getValue ().toString (), |
|
physicalName, |
|
request->providerModule.getProperty(request->providerModule.findProperty |
|
("InterfaceType")).getValue().toString(), |
|
0); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.enableIndications: " + |
|
ph.GetProvider().getName()); |
|
|
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().enableIndications(*handler); |
|
|
|
|
|
// if no exception, store the handler so it is persistent for as |
|
// long as the provider has indications enabled. |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Storing indication handler for " + ph.GetProvider().getName()); |
|
|
|
_insertEntry(ph.GetProvider(), handler); |
|
} |
|
catch(CIMException & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
response->cimException = CIMException(e); |
|
} |
|
catch(Exception & e) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
if (i.value()->status.isInitialized()) |
"Exception: " + e.getMessage()); |
|
response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms( |
|
"ProviderManager.DefaultProviderManager.INTERNAL_ERROR", |
|
"Internal Error")); |
|
} |
|
catch(...) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: Unknown"); |
|
response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms( |
|
"ProviderManager.DefaultProviderManager.UNKNOWN_ERROR", |
|
"Unknown Error")); |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} |
|
|
|
Message * DefaultProviderManager::handleDisableIndicationsRequest(const Message * message) |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDisableIndicationsRequest"); |
|
|
|
CIMDisableIndicationsRequestMessage * request = |
|
dynamic_cast<CIMDisableIndicationsRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMDisableIndicationsResponseMessage * response = |
|
new CIMDisableIndicationsResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
OperationResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
String physicalName=_resolvePhysicalName( |
|
request->providerModule.getProperty( |
|
request->providerModule.findProperty("Location")).getValue().toString()); |
|
|
|
ProviderName name( |
|
request->provider.getProperty(request->provider.findProperty |
|
("Name")).getValue ().toString (), |
|
physicalName, |
|
request->providerModule.getProperty(request->providerModule.findProperty |
|
("InterfaceType")).getValue().toString(), |
|
0); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Calling provider.disableIndications: " + |
|
ph.GetProvider().getName()); |
|
|
|
ph.GetProvider().disableIndications(); |
|
|
|
ph.GetProvider().unprotect(); |
|
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Removing and Destroying indication handler for " + |
|
ph.GetProvider().getName()); |
|
|
|
delete _removeEntry(_generateKey(ph.GetProvider())); |
|
} |
|
|
|
catch(CIMException & e) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_METHOD_EXIT(); |
"Exception: " + e.getMessage()); |
return true; |
|
} |
response->cimException = CIMException(e); |
|
} | } |
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms( |
|
"ProviderManager.DefaultProviderManager.INTERNAL_ERROR", |
|
"Internal Error")); |
|
} | } |
catch(...) | catch(...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
// Unexpected exception; do not assume that no providers are loaded |
"Exception: Unknown"); |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL1, |
response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms( |
"Unexpected Exception in hasActiveProviders."); |
"ProviderManager.DefaultProviderManager.UNKNOWN_ERROR", |
PEG_METHOD_EXIT(); |
"Unknown Error")); |
return true; |
} | } |
| |
|
// No active providers were found in the _providers table |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
return false; |
return(response); |
|
} | } |
| |
Message * DefaultProviderManager::handleConsumeIndicationRequest(const Message *message) |
void DefaultProviderManager::unloadIdleProviders() |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handlConsumeIndicationRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::unloadIdleProviders"); |
CIMConsumeIndicationRequestMessage *request = |
|
dynamic_cast<CIMConsumeIndicationRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMResponseMessage * response = |
|
new CIMResponseMessage( |
|
CIM_CONSUME_INDICATION_RESPONSE_MESSAGE, |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
Uint32 type = 3; |
|
| |
try | try |
{ | { |
ProviderName name( |
struct timeval now; |
String::EMPTY, |
Time::gettimeofday(&now); |
String::EMPTY, |
|
String::EMPTY, |
|
0); |
|
|
|
/* |
|
ProviderName name( |
|
String::EMPTY, |
|
String::EMPTY, |
|
objectPath.toString()); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(name); |
|
*/ |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
| |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
// Make a copy of the table so it is not locked during provider calls |
"Calling provider.: " + |
Array<ProviderMessageHandler*> providerList; |
ph.GetProvider().getName()); |
|
|
|
OperationContext context; |
|
|
|
//l10n |
|
// ATTN-CEC 06/04/03 NOTE: I can't find where the consume msg is sent. This |
|
// does not appear to be hooked-up. When it is added, need to |
|
// make sure that Content-Language is set in the consume msg. |
|
// NOTE: A-L is not needed to be set in the consume msg. |
|
// add the langs to the context |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMInstance indication_copy = request->indicationInstance; |
|
|
|
SimpleIndicationResponseHandler handler; |
|
|
|
ph.GetProvider().consumeIndication(context, |
|
"", |
|
indication_copy); |
|
} |
|
catch(CIMException & e) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
AutoMutex lock(_providerTableMutex); |
"Exception: " + e.getMessage()); |
|
| |
response->cimException = CIMException(e); |
for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) |
} |
|
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
//l10n |
|
//response->cimException = CIMException(CIM_ERR_FAILED, "Internal Error"); |
|
response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms( |
|
"ProviderManager.DefaultProviderManager.INTERNAL_ERROR", |
|
"Internal Error")); |
|
} |
|
catch(...) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
providerList.append(i.value()); |
"Exception: Unknown"); |
|
//l10n |
|
//response->cimException = CIMException(CIM_ERR_FAILED, "Unknown Error"); |
|
response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms( |
|
"ProviderManager.DefaultProviderManager.UNKNOWN_ERROR", |
|
"Unknown Error")); |
|
} | } |
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} | } |
| |
|
for (Uint32 i = 0; i < providerList.size(); i++) |
Message *DefaultProviderManager::handleExportIndicationRequest(const Message *message) |
|
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManagerService::handlExportIndicationRequest"); |
ProviderMessageHandler* provider = providerList[i]; |
|
|
CIMExportIndicationRequestMessage * request = |
|
dynamic_cast<CIMExportIndicationRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
CIMExportIndicationResponseMessage * response = |
|
new CIMExportIndicationResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
| |
PEGASUS_ASSERT(response != 0); |
AutoMutex lock(provider->status.getStatusMutex()); |
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
OperationResponseHandler handler(request, response); |
|
| |
try |
if (!provider->status.isInitialized()) |
{ | { |
ProviderName name( |
continue; |
String::EMPTY, |
} |
String::EMPTY, |
|
String::EMPTY, |
|
0); |
|
|
|
// resolve provider name |
|
name = _resolveProviderName(request->destinationPath); |
|
|
|
// get cached or load new provider module |
|
OpProviderHolder ph = |
|
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
|
| |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
struct timeval providerTime = {0, 0}; |
"Calling provider.: " + |
provider->status.getLastOperationEndTime(&providerTime); |
ph.GetProvider().getName()); |
|
|
|
OperationContext context; |
|
|
|
//L10N_TODO |
|
//l10n |
|
// ATTN-CEC 06/04/03 NOTE: I can't find where the consume msg is sent. This |
|
// does not appear to be hooked-up. When it is added, need to |
|
// make sure that Content-Language is set in the consume msg. |
|
// NOTE: A-L is not needed to be set in the consume msg. |
|
// add the langs to the context |
|
context.insert(ContentLanguageListContainer(request->contentLanguages)); |
|
|
|
CIMInstance indication_copy = request->indicationInstance; |
|
pm_service_op_lock op_lock(&ph.GetProvider()); |
|
|
|
ph.GetProvider().consumeIndication(context, |
|
request->destinationPath, |
|
indication_copy); |
|
| |
} |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"provider->status.isIdle() returns: %s", |
|
(const char*)CIMValue(provider->status.isIdle()) |
|
.toString().getCString())); |
| |
catch(CIMException & e) |
if (provider->status.isIdle() && |
|
((now.tv_sec - providerTime.tv_sec) > |
|
((Sint32)PEGASUS_PROVIDER_IDLE_TIMEOUT_SECONDS))) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL3, |
"Exception: " + e.getMessage()); |
"Unloading idle provider: %s", |
|
(const char*)provider->getName().getCString())); |
handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n |
_unloadProvider(provider); |
|
} |
} | } |
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
|
|
handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n |
|
} | } |
catch(...) | catch(...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL1, |
"Exception: Unknown"); |
"Caught unexpected exception in unloadIdleProviders."); |
|
|
handler.setStatus(CIM_ERR_FAILED, "Unknown Error"); |
|
} | } |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
return(response); |
|
} | } |
| |
|
void DefaultProviderManager::_shutdownAllProviders() |
|
|
|
|
// |
|
// This function disables a provider module if disableProviderOnly is not true, |
|
// otherwise, disables a provider. Disable provider module means that |
|
// block all the providers which contain in the module and unload the |
|
// providers. |
|
// Disable provider means unload the provider and the provider is not blocked. |
|
// |
|
// ATTN-YZ-P2-20030519: Provider needs to be blocked when disable a provider. |
|
// |
|
Message * DefaultProviderManager::handleDisableModuleRequest(const Message * message) |
|
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDisableModuleRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
"DefaultProviderManager::_shutdownAllProviders"); |
CIMDisableModuleRequestMessage * request = |
|
dynamic_cast<CIMDisableModuleRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
Array<Uint16> operationalStatus; |
|
Boolean disableProviderOnly = request->disableProviderOnly; |
|
CIMException cimException; |
|
|
|
ProviderRegistrationManager * _providerRegistrationManager = GetProviderRegistrationManager(); |
|
| |
try | try |
{ | { |
// get provider module name |
AutoMutex lock(_providerTableMutex); |
String moduleName; |
|
CIMInstance mInstance = request->providerModule; |
|
Uint32 pos = mInstance.findProperty(CIMName ("Name")); |
|
| |
if(pos != PEG_NOT_FOUND) |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"providers in cache = %d", _providers.size())); |
|
|
|
for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) |
{ | { |
mInstance.getProperty(pos).getValue().get(moduleName); |
ProviderMessageHandler* provider = i.value(); |
} |
PEGASUS_ASSERT(provider != 0); |
| |
Boolean disableProviderOnly = request->disableProviderOnly; |
AutoMutex lock2(provider->status.getStatusMutex()); |
| |
// |
if (provider->status.isInitialized()) |
// get operational status |
|
// |
|
if (!disableProviderOnly) |
|
{ |
|
Uint32 pos2 = mInstance.findProperty(CIMName ("OperationalStatus")); |
|
if (pos2 != PEG_NOT_FOUND) |
|
{ | { |
// |
_unloadProvider(provider); |
// ATTN-CAKG-P2-20020821: Check for null status? |
|
// |
|
mInstance.getProperty(pos2).getValue().get(operationalStatus); |
|
} | } |
|
|
// |
|
// update module status from OK to Stopping |
|
// |
|
for (Uint32 i=0, n = operationalStatus.size(); i < n; i++) |
|
{ |
|
if (operationalStatus[i] == _MODULE_OK) |
|
{ |
|
operationalStatus.remove(i); |
|
} | } |
} | } |
|
catch (...) |
operationalStatus.append(_MODULE_STOPPING); |
|
|
|
if(_providerRegistrationManager->setProviderModuleStatus |
|
(moduleName, operationalStatus) == false) |
|
{ | { |
//l10n |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
//throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, "set module status failed."); |
"Unexpected Exception in _shutdownAllProviders()."); |
throw PEGASUS_CIM_EXCEPTION_L( |
|
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService." |
|
"SET_MODULE_STATUS_FAILED", |
|
"set module status failed.")); |
|
} | } |
} |
|
|
|
// Unload providers |
|
Array<CIMInstance> _pInstances = request->providers; |
|
Array<Boolean> _indicationProviders = request->indicationProviders; |
|
| |
String physicalName=_resolvePhysicalName( |
PEG_METHOD_EXIT(); |
mInstance.getProperty( |
} |
mInstance.findProperty("Location")).getValue().toString()); |
|
| |
for(Uint32 i = 0, n = _pInstances.size(); i < n; i++) |
Sint16 DefaultProviderManager::_disableProvider( |
|
const String& moduleName, |
|
const String& providerName) |
{ | { |
String pName(_pInstances[i].getProperty( |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
_pInstances[i].findProperty("Name")).getValue().toString()); |
"DefaultProviderManager::_disableProvider"); |
|
|
Sint16 ret_value = providerManager.disableProvider(physicalName,pName); |
|
| |
if (ret_value == 0) |
ProviderMessageHandler* pr = _lookupProvider(moduleName, providerName); |
{ |
if (!pr->status.isInitialized()) |
// disable failed since there are pending requests, |
|
// update module status from Stopping to OK if |
|
// disableProviderOnly is not true |
|
if (!disableProviderOnly) |
|
{ | { |
for(Uint32 j=0, m = operationalStatus.size(); j < m; j++) |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
{ |
"Provider %s is not loaded", |
if (operationalStatus[j] == _MODULE_STOPPING) |
(const char*)providerName.getCString())); |
{ |
PEG_METHOD_EXIT(); |
operationalStatus.remove(j); |
return 1; |
} |
|
} | } |
| |
operationalStatus.append(_MODULE_OK); |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,"Disable Provider %s", |
|
(const char*)pr->getName().getCString())); |
if(_providerRegistrationManager->setProviderModuleStatus |
// |
(moduleName, operationalStatus) == false) |
// Check to see if there are pending requests. If there are pending |
{ |
// requests and the disable timeout has not expired, loop and wait one |
throw PEGASUS_CIM_EXCEPTION_L( |
// second until either there is no pending requests or until timeout |
CIM_ERR_FAILED, |
// expires. |
MessageLoaderParms( |
// |
"ProviderManager.ProviderManagerService." |
Uint32 waitTime = PROVIDER_DISABLE_TIMEOUT; |
"SET_MODULE_STATUS_FAILED", |
while ((pr->status.numCurrentOperations() > 0) && (waitTime > 0)) |
"set module status failed.")); |
|
} |
|
} |
|
} |
|
else if (ret_value == 1) |
|
{ |
|
// if It is an indication provider |
|
// remove the entry from the table since the |
|
// provider has been disabled |
|
if (_indicationProviders[i]) |
|
{ |
|
_removeEntry(_generateKey(pName,physicalName)); |
|
} |
|
} |
|
else |
|
{ |
|
// disable failed for other reason, throw exception |
|
// update module status from Stopping to OK if |
|
// disableProviderOnly is not true |
|
if (!disableProviderOnly) |
|
{ |
|
for(Uint32 j=0, m = operationalStatus.size(); j < m; j++) |
|
{ |
|
if (operationalStatus[j] == _MODULE_STOPPING) |
|
{ | { |
operationalStatus.remove(j); |
Threads::sleep(1000); |
|
waitTime = waitTime - 1; |
} | } |
} |
|
|
|
operationalStatus.append(_MODULE_OK); |
|
| |
if(_providerRegistrationManager->setProviderModuleStatus |
// There are still pending requests, do not disable |
(moduleName, operationalStatus) == false) |
if (pr->status.numCurrentOperations() > 0) |
{ | { |
throw PEGASUS_CIM_EXCEPTION_L( |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
CIM_ERR_FAILED, |
"Disable failed since there are pending requests."); |
MessageLoaderParms( |
PEG_METHOD_EXIT(); |
"ProviderManager.ProviderManagerService." |
return 0; |
"SET_MODULE_STATUS_FAILED", |
|
"set module status failed.")); |
|
} |
|
} | } |
| |
throw PEGASUS_CIM_EXCEPTION_L( |
try |
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService." |
|
"DISABLE_PROVIDER_FAILED", |
|
"Failed to disable the provider.")); |
|
} |
|
} |
|
// disable succeed |
|
// update module status from Stopping to Stopped if |
|
// disableProviderOnly is not true |
|
if (!disableProviderOnly) |
|
{ |
|
// update module status from Stopping to Stopped |
|
for(Uint32 j=0, m = operationalStatus.size(); j < m; j++) |
|
{ |
|
if (operationalStatus[j] == _MODULE_STOPPING) |
|
{ | { |
operationalStatus.remove(j); |
AutoMutex lock(pr->status.getStatusMutex()); |
operationalStatus.append(_MODULE_STOPPED); |
|
} |
|
} |
|
| |
if(_providerRegistrationManager->setProviderModuleStatus |
if (pr->status.isInitialized()) |
(moduleName, operationalStatus) == false) |
|
{ |
|
//l10n |
|
//throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, |
|
//"set module status failed."); |
|
throw PEGASUS_CIM_EXCEPTION_L( |
|
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService." |
|
"SET_MODULE_STATUS_FAILED", |
|
"set module status failed.")); |
|
} |
|
} |
|
} |
|
catch(CIMException & e) |
|
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Exception: " + e.getMessage()); |
"Unloading Provider %s", |
cimException = e; |
(const char*)pr->getName().getCString())); |
|
_unloadProvider(pr); |
} | } |
catch(Exception & e) |
|
{ |
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Exception: " + e.getMessage()); |
|
cimException = CIMException(CIM_ERR_FAILED, e.getMessage()); |
|
} | } |
catch(...) | catch(...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"Exception: Unknown"); |
"Unload provider failed %s", |
//l10n |
(const char*)pr->getName().getCString())); |
//response->cimException = CIMException(CIM_ERR_FAILED, "Unknown Error"); |
|
cimException = PEGASUS_CIM_EXCEPTION_L( |
|
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService.UNKNOWN_ERROR", |
|
"Unknown Error")); |
|
} |
|
|
|
CIMDisableModuleResponseMessage * response = |
|
new CIMDisableModuleResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
operationalStatus); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
return -1; |
return(response); |
|
} | } |
| |
Message * DefaultProviderManager::handleEnableModuleRequest(const Message * message) |
PEG_METHOD_EXIT(); |
{ |
return 1; |
// HACK |
|
ProviderRegistrationManager * _providerRegistrationManager = GetProviderRegistrationManager(); |
|
|
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleEnableModuleRequest"); |
|
|
|
CIMEnableModuleRequestMessage * request = |
|
dynamic_cast<CIMEnableModuleRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
|
|
// |
|
// get module status |
|
// |
|
CIMInstance mInstance = request->providerModule; |
|
Array<Uint16> operationalStatus; |
|
Uint32 pos = mInstance.findProperty(CIMName ("OperationalStatus")); |
|
|
|
if(pos != PEG_NOT_FOUND) |
|
{ |
|
// |
|
// ATTN-CAKG-P2-20020821: Check for null status? |
|
// |
|
mInstance.getProperty(pos).getValue().get(operationalStatus); |
|
} | } |
| |
// update module status from Stopped to OK |
void DefaultProviderManager::_unloadProvider(ProviderMessageHandler* provider) |
for(Uint32 i=0, n = operationalStatus.size(); i < n; i++) |
|
{ |
|
if(operationalStatus[i] == _MODULE_STOPPED) |
|
{ | { |
operationalStatus.remove(i); |
|
} |
|
} |
|
|
|
operationalStatus.append(_MODULE_OK); |
|
|
|
// | // |
// get module name |
// NOTE: It is the caller's responsibility to make sure that the |
|
// provider->status.getStatusMutex() mutex is locked before calling |
|
// this method. |
// | // |
String moduleName; |
|
|
|
Uint32 pos2 = mInstance.findProperty(CIMName ("Name")); |
|
| |
if(pos2 != PEG_NOT_FOUND) |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
{ |
"DefaultProviderManager::_unloadProvider"); |
mInstance.getProperty(pos2).getValue().get(moduleName); |
|
} |
|
| |
if(_providerRegistrationManager->setProviderModuleStatus |
if (provider->status.numCurrentOperations() > 0) |
(moduleName, operationalStatus) == false) |
|
{ | { |
//l10n |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
//throw PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, "set module status failed."); |
"Provider cannot be unloaded due to pending operations: %s", |
throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
(const char*)provider->getName().getCString())); |
"ProviderManager.DefaultProviderManager.SET_MODULE_STATUS_FAILED", |
|
"set module status failed.")); |
|
} |
|
|
|
CIMEnableModuleResponseMessage * response = |
|
new CIMEnableModuleResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop(), |
|
operationalStatus); |
|
|
|
PEGASUS_ASSERT(response != 0); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(response); |
|
} | } |
|
else |
Message * DefaultProviderManager::handleStopAllProvidersRequest(const Message * message) |
|
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleStopAllProvidersRequest"); |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Terminating Provider %s", |
CIMStopAllProvidersRequestMessage * request = |
(const char*)provider->getName().getCString())); |
dynamic_cast<CIMStopAllProvidersRequestMessage *>(const_cast<Message *>(message)); |
|
|
|
PEGASUS_ASSERT(request != 0); |
|
| |
CIMStopAllProvidersResponseMessage * response = |
provider->terminate(); |
new CIMStopAllProvidersResponseMessage( |
|
request->messageId, |
|
CIMException(), |
|
request->queueIds.copyAndPop()); |
|
| |
PEGASUS_ASSERT(response != 0); |
// unload provider module |
|
PEGASUS_ASSERT(provider->status.getModule() != 0); |
// preserve message key |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL3, |
response->setKey(request->getKey()); |
"Unloading provider module: %s", |
|
(const char*)provider->getName().getCString())); |
|
provider->status.getModule()->unloadModule(); |
| |
// Set HTTP method in response from request |
PEG_TRACE((TRC_PROVIDERMANAGER,Tracer::LEVEL3, |
response->setHttpMethod (request->getHttpMethod ()); |
"DefaultProviderManager: Unloaded provider %s", |
|
(const char*)provider->getName().getCString())); |
| |
// tell the provider manager to shutdown all the providers |
// NOTE: The "delete provider->status.getCIMOMHandle()" operation |
providerManager.shutdownAllProviders(); |
// was moved to be called after the unloadModule() call above |
|
// as part of a fix for bugzilla 3669. For some providers |
|
// run out-of-process on Windows platforms (i.e. running |
|
// the cimserver with the forceProviderProcesses config option |
|
// set to "true"), deleting the provider's CIMOMHandle before |
|
// unloading the provider library caused the unload mechanism |
|
// to deadlock, making that provider unavailable and preventing |
|
// the cimserver from shutting down. It should NOT be moved back |
|
// above the unloadModule() call. See bugzilla 3669 for details. |
| |
PEG_METHOD_EXIT(); |
// delete the cimom handle |
|
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
|
"Destroying provider's CIMOMHandle: %s", |
|
(const char*)provider->getName().getCString())); |
|
delete provider->status.getCIMOMHandle(); |
| |
return(response); |
// set provider status to uninitialized |
|
provider->status.setInitialized(false); |
} | } |
| |
void DefaultProviderManager::_insertEntry ( |
|
const Provider & provider, |
|
const EnableIndicationsResponseHandler *handler) |
|
{ |
|
PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, |
|
"DefaultProviderManager::_insertEntry"); |
|
|
|
String tableKey = _generateKey |
|
(provider); |
|
|
|
_responseTable.insert (tableKey, const_cast<EnableIndicationsResponseHandler *>(handler)); |
|
|
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |
EnableIndicationsResponseHandler * DefaultProviderManager::_removeEntry( |
ProviderManager* DefaultProviderManager::createDefaultProviderManagerCallback() |
const String & key) |
|
{ | { |
PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, |
return new DefaultProviderManager(); |
"DefaultProviderManager::_removeEntry"); |
|
EnableIndicationsResponseHandler *ret = 0; |
|
|
|
_responseTable.lookup(key, ret); |
|
_responseTable.remove(key); // why is this needed ? - we get killed when removed... |
|
|
|
PEG_METHOD_EXIT(); |
|
|
|
return(ret); |
|
} | } |
| |
String DefaultProviderManager::_generateKey ( |
PEGASUS_NAMESPACE_END |
const Provider & provider) |
|
{ |
|
String tableKey; |
|
|
|
PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, |
|
"DefaultProviderManager::_generateKey"); |
|
|
|
// |
|
// Append provider key values to key |
|
// |
|
String providerName = provider.getName(); |
|
String providerFileName = provider.getModule()->getFileName(); |
|
tableKey.append (providerName); |
|
tableKey.append (providerFileName); |
|
|
|
PEG_METHOD_EXIT(); |
|
| |
return(tableKey); |
PEGASUS_USING_PEGASUS; |
} |
|
| |
String DefaultProviderManager::_generateKey ( |
// This entry point is not needed because the DefaultProviderManager is created |
const String & providerName, |
// using DefaultProviderManager::createDefaultProviderManagerCallback(). |
const String & providerFileName) |
#if 0 |
|
extern "C" PEGASUS_EXPORT ProviderManager* PegasusCreateProviderManager( |
|
const String& providerManagerName) |
{ | { |
String tableKey; |
if (String::equalNoCase(providerManagerName, "Default")) |
|
|
PEG_METHOD_ENTER (TRC_INDICATION_SERVICE, |
|
"DefaultProviderManagerService::_generateKey"); |
|
|
|
// |
|
// Append providerName and providerFileName to key |
|
// |
|
tableKey.append (providerName); |
|
tableKey.append (providerFileName); |
|
|
|
PEG_METHOD_EXIT (); |
|
return tableKey; |
|
} |
|
|
|
ProviderName DefaultProviderManager::_resolveProviderName(const ProviderName & providerName) |
|
{ | { |
ProviderName temp = findProvider(providerName); |
return new DefaultProviderManager(); |
String physicalName = _resolvePhysicalName(temp.getPhysicalName()); |
|
temp.setPhysicalName(physicalName); |
|
|
|
return(temp); |
|
} | } |
| |
ProviderName DefaultProviderManager::_resolveProviderName(String & destinationPath) |
return 0; |
{ |
|
ProviderName temp = findProvider(destinationPath); |
|
|
|
String physicalName = _resolvePhysicalName(temp.getPhysicalName()); |
|
|
|
temp.setPhysicalName(physicalName); |
|
|
|
return(temp); |
|
} | } |
|
#endif |
PEGASUS_NAMESPACE_END |
|