version 1.10.2.1, 2004/02/17 01:35:03
|
version 1.17, 2004/02/26 14:35:07
|
|
|
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
#include <Pegasus/Common/MessageLoader.h> //l10n | #include <Pegasus/Common/MessageLoader.h> //l10n |
| |
|
#include <Pegasus/Common/QueryExpression.h> |
|
#include <Pegasus/ProviderManager2/QueryExpressionFactory.h> |
|
|
#include <Pegasus/Config/ConfigManager.h> | #include <Pegasus/Config/ConfigManager.h> |
| |
#include <Pegasus/ProviderManager2/Default/Provider.h> | #include <Pegasus/ProviderManager2/Default/Provider.h> |
|
|
| |
break; | break; |
case CIM_EXEC_QUERY_REQUEST_MESSAGE: | case CIM_EXEC_QUERY_REQUEST_MESSAGE: |
response = handleExecuteQueryRequest(request); |
response = handleExecQueryRequest(request); |
| |
break; | break; |
case CIM_ASSOCIATORS_REQUEST_MESSAGE: | case CIM_ASSOCIATORS_REQUEST_MESSAGE: |
|
|
response = handleConsumeIndicationRequest(request); | response = handleConsumeIndicationRequest(request); |
break; | break; |
| |
|
case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: |
|
response = handleExportIndicationRequest(request); |
|
break; |
|
|
case CIM_DISABLE_MODULE_REQUEST_MESSAGE: | case CIM_DISABLE_MODULE_REQUEST_MESSAGE: |
response = handleDisableModuleRequest(request); | response = handleDisableModuleRequest(request); |
| |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::INSTANCE); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::INSTANCE); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
| |
// get cached or load new provider module | // get cached or load new provider module |
OpProviderHolder ph = |
OpProviderHolder ph = providerManager.getProvider(name.getPhysicalName(), |
providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY); |
name.getLogicalName(), String::EMPTY); |
| |
// convert arguments | // convert arguments |
OperationContext context; | OperationContext context; |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::INSTANCE); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::INSTANCE); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::INSTANCE); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::INSTANCE); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
return(response); | return(response); |
} | } |
| |
Message * DefaultProviderManager::handleExecuteQueryRequest(const Message * message) throw() |
Message * DefaultProviderManager::handleExecQueryRequest(const Message * message) throw() |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleExecuteQueryRequest"); |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleExecQueryRequest"); |
| |
CIMExecQueryRequestMessage * request = | CIMExecQueryRequestMessage * request = |
dynamic_cast<CIMExecQueryRequestMessage *>(const_cast<Message *>(message)); | dynamic_cast<CIMExecQueryRequestMessage *>(const_cast<Message *>(message)); |
| |
PEGASUS_ASSERT(request != 0); | PEGASUS_ASSERT(request != 0); |
| |
//l10n |
|
CIMExecQueryResponseMessage * response = | CIMExecQueryResponseMessage * response = |
new CIMExecQueryResponseMessage( | new CIMExecQueryResponseMessage( |
request->messageId, | request->messageId, |
PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms( |
CIMException(), |
"ProviderManager.DefaultProviderManager.NOT_IMPLEMENTED", |
|
"not implemented")), |
|
request->queueIds.copyAndPop(), | request->queueIds.copyAndPop(), |
Array<CIMObject>()); | Array<CIMObject>()); |
| |
|
|
// Set HTTP method in response from request | // Set HTTP method in response from request |
response->setHttpMethod(request->getHttpMethod()); | response->setHttpMethod(request->getHttpMethod()); |
| |
// l10n |
// create a handler for this request |
// ATTN: when this is implemented, need to add the language containers to the |
ExecQueryResponseHandler handler(request, response); |
// OperationContext. See how the other requests do it. |
|
|
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.toString(), |
|
String::EMPTY, |
|
String::EMPTY, |
|
String::EMPTY, |
|
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(); | PEG_METHOD_EXIT(); |
| |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::ASSOCIATION); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::ASSOCIATION); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::ASSOCIATION); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::ASSOCIATION); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
String::EMPTY, | String::EMPTY, |
0); |
ProviderType::METHOD, |
|
request->methodName); |
| |
// resolve provider name | // resolve provider name |
name = _resolveProviderName(name); | name = _resolveProviderName(name); |
|
|
{ | { |
String temp; | String temp; |
| |
|
if (request->classNames.size()==0) { |
|
cout<<"--- Internal error: empty classlist found in CIMDeleteSubscriptionRequestMessage"<< |
|
endl; |
|
throw CIMException(CIM_ERR_FAILED, |
|
"Internal error: empty classlist found in CIMDeleteSubscriptionRequestMessage"); |
|
} |
|
|
for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) | for(Uint32 i = 0, n = request->classNames.size(); i < n; i++) |
{ | { |
temp.append(request->classNames[i].getString()); | temp.append(request->classNames[i].getString()); |
|
|
| |
response->dest = request->queueIds.top(); | response->dest = request->queueIds.top(); |
| |
|
// ATTN: need pointer to Provider Manager Server! |
EnableIndicationsResponseHandler *handler = | EnableIndicationsResponseHandler *handler = |
new EnableIndicationsResponseHandler(request, response, | new EnableIndicationsResponseHandler(request, response, |
request->provider, ProviderManagerService::providerManagerService); | request->provider, ProviderManagerService::providerManagerService); |
|
|
request->providerModule.findProperty("Location")).getValue().toString()); | request->providerModule.findProperty("Location")).getValue().toString()); |
| |
ProviderName name(String::EMPTY, | ProviderName name(String::EMPTY, |
request->provider.getProperty(request->providerModule.findProperty |
request->provider.getProperty(request->provider.findProperty |
("Name")).getValue ().toString (), | ("Name")).getValue ().toString (), |
physicalName, | physicalName, |
request->providerModule.getProperty(request->providerModule.findProperty | request->providerModule.getProperty(request->providerModule.findProperty |
|
|
request->providerModule.findProperty("Location")).getValue().toString()); | request->providerModule.findProperty("Location")).getValue().toString()); |
| |
ProviderName name(String::EMPTY, | ProviderName name(String::EMPTY, |
request->provider.getProperty(request->providerModule.findProperty |
request->provider.getProperty(request->provider.findProperty |
("Name")).getValue ().toString (), | ("Name")).getValue ().toString (), |
physicalName, | physicalName, |
request->providerModule.getProperty(request->providerModule.findProperty | request->providerModule.getProperty(request->providerModule.findProperty |
|
|
return(response); | return(response); |
} | } |
| |
|
|
|
Message *DefaultProviderManager::handleExportIndicationRequest(const Message *message) throw() |
|
{ |
|
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManagerService::handlExportIndicationRequest"); |
|
|
|
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); |
|
|
|
// preserve message key |
|
response->setKey(request->getKey()); |
|
|
|
// Set HTTP method in response from request |
|
response->setHttpMethod (request->getHttpMethod ()); |
|
|
|
OperationResponseHandler handler(request, response); |
|
|
|
try |
|
{ |
|
ProviderName name( |
|
String::EMPTY, |
|
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, |
|
"Calling provider.: " + |
|
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); |
|
|
|
} |
|
|
|
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); |
|
} |
|
|
|
|
|
|
|
|
// | // |
// This function disables a provider module if disableProviderOnly is not true, | // This function disables a provider module if disableProviderOnly is not true, |
// otherwise, disables a provider. Disable provider module means that | // otherwise, disables a provider. Disable provider module means that |
|
|
| |
for(Uint32 i = 0, n = _pInstances.size(); i < n; i++) | for(Uint32 i = 0, n = _pInstances.size(); i < n; i++) |
{ | { |
providerManager.unloadProvider(_pInstances[i].getProperty( |
providerManager.unloadProvider(physicalName,_pInstances[i].getProperty( |
request->providerModule.findProperty |
_pInstances[i].findProperty |
("Name")).getValue ().toString (), |
("Name")).getValue().toString()); |
physicalName); |
|
} | } |
| |
if(!disableProviderOnly) | if(!disableProviderOnly) |
|
|
EnableIndicationsResponseHandler *ret = 0; | EnableIndicationsResponseHandler *ret = 0; |
| |
_responseTable.lookup(key, ret); | _responseTable.lookup(key, ret); |
|
_responseTable.remove(key); // why is this needed ? - we get killed when removed... |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
| |
|
|
return(tableKey); | return(tableKey); |
} | } |
| |
String DefaultProviderManager::_resolvePhysicalName(const String & name) |
ProviderName DefaultProviderManager::_resolveProviderName(const ProviderName & providerName) |
{ | { |
String physicalName; |
ProviderName temp = findProvider(providerName); |
| |
#if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC) |
String physicalName = _resolvePhysicalName(temp.getPhysicalName()); |
physicalName = name + String(".dll"); |
|
#elif defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) || defined(PEGASUS_PLATFORM_LINUX_IA86_GNU) |
temp.setPhysicalName(physicalName); |
String root = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir")); |
|
physicalName = root + String("/lib") + name + String(".so"); |
|
#elif defined(PEGASUS_OS_HPUX) |
|
String root = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir")); |
|
physicalName = root + String("/lib") + name + String(".sl"); |
|
#elif defined(PEGASUS_OS_OS400) |
|
physicalName = name; |
|
#else |
|
String root = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir")); |
|
physicalName = root + String("/lib") + name + String(".so"); |
|
#endif |
|
| |
return physicalName; |
return(temp); |
} | } |
| |
ProviderName DefaultProviderManager::_resolveProviderName(const ProviderName & providerName) |
ProviderName DefaultProviderManager::_resolveProviderName(String & destinationPath) |
{ | { |
ProviderName temp = findProvider(providerName); |
ProviderName temp = findProvider(destinationPath); |
| |
String physicalName = _resolvePhysicalName(temp.getPhysicalName()); | String physicalName = _resolvePhysicalName(temp.getPhysicalName()); |
| |