version 1.25.2.4, 2006/05/19 17:31:41
|
version 1.31, 2006/07/21 18:44:08
|
|
|
ProviderAgentContainer( | ProviderAgentContainer( |
const String & moduleName, | const String & moduleName, |
const String & userName, | const String & userName, |
|
Uint16 userContext, |
PEGASUS_INDICATION_CALLBACK_T indicationCallback, | PEGASUS_INDICATION_CALLBACK_T indicationCallback, |
PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, | PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, |
|
PEGASUS_PROVIDERMODULEFAIL_CALLBACK_T providerModuleFailCallback, |
Boolean subscriptionInitComplete); | Boolean subscriptionInitComplete); |
| |
~ProviderAgentContainer(); | ~ProviderAgentContainer(); |
|
|
String _userName; | String _userName; |
| |
/** | /** |
|
User Context setting of the provider module served by this Provider |
|
Agent. |
|
*/ |
|
Uint16 _userContext; |
|
|
|
/** |
Callback function to which all generated indications are sent for | Callback function to which all generated indications are sent for |
processing. | processing. |
*/ | */ |
|
|
PEGASUS_RESPONSE_CHUNK_CALLBACK_T _responseChunkCallback; | PEGASUS_RESPONSE_CHUNK_CALLBACK_T _responseChunkCallback; |
| |
/** | /** |
|
Callback function to be called upon detection of failure of a |
|
provider module. |
|
*/ |
|
PEGASUS_PROVIDERMODULEFAIL_CALLBACK_T _providerModuleFailCallback; |
|
|
|
/** |
Indicates whether the Provider Agent is active. | Indicates whether the Provider Agent is active. |
*/ | */ |
Boolean _isInitialized; | Boolean _isInitialized; |
|
|
ProviderAgentContainer::ProviderAgentContainer( | ProviderAgentContainer::ProviderAgentContainer( |
const String & moduleName, | const String & moduleName, |
const String & userName, | const String & userName, |
|
Uint16 userContext, |
PEGASUS_INDICATION_CALLBACK_T indicationCallback, | PEGASUS_INDICATION_CALLBACK_T indicationCallback, |
PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, | PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, |
|
PEGASUS_PROVIDERMODULEFAIL_CALLBACK_T providerModuleFailCallback, |
Boolean subscriptionInitComplete) | Boolean subscriptionInitComplete) |
: _moduleName(moduleName), | : _moduleName(moduleName), |
_userName(userName), | _userName(userName), |
|
_userContext(userContext), |
_indicationCallback(indicationCallback), | _indicationCallback(indicationCallback), |
_responseChunkCallback(responseChunkCallback), | _responseChunkCallback(responseChunkCallback), |
|
_providerModuleFailCallback(providerModuleFailCallback), |
_isInitialized(false), | _isInitialized(false), |
_subscriptionInitComplete(subscriptionInitComplete) | _subscriptionInitComplete(subscriptionInitComplete) |
{ | { |
|
|
} | } |
#elif defined (PEGASUS_OS_OS400) | #elif defined (PEGASUS_OS_OS400) |
| |
//Out of provider support for OS400 goes here when needed. |
//Out of process provider support for OS400 goes here when needed. |
| |
#else | #else |
| |
|
|
// connection | // connection |
// | // |
{ | { |
// |
|
// If not a clean shutdown, log a warning message in case module |
|
// included indication providers |
|
// |
|
if (!cleanShutdown) |
|
{ |
|
Logger::put_l( |
|
Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING, |
|
"ProviderManager.OOPProviderManagerRouter." |
|
"OOP_PROVIDER_MODULE_FAILURE_DETECTED", |
|
"A failure was detected in provider module $0. The" |
|
" generation of indications by providers in this module" |
|
" may be affected. To ensure these providers are" |
|
" serving active subscriptions, disable and then" |
|
" re-enable this module using the cimprovider command.", |
|
_moduleName); |
|
} |
|
|
|
AutoMutex tableLock(_outstandingRequestTableMutex); | AutoMutex tableLock(_outstandingRequestTableMutex); |
| |
CIMResponseMessage* response = | CIMResponseMessage* response = |
|
|
} | } |
| |
_outstandingRequestTable.clear(); | _outstandingRequestTable.clear(); |
|
|
|
// |
|
// If not a clean shutdown, call the provider module failure |
|
// callback |
|
// |
|
if (!cleanShutdown) |
|
{ |
|
// |
|
// Call the provider module failure callback to |
|
// communicate the failure to the Provider Manager Service |
|
// Provider Manager Service will inform Indication Service |
|
// |
|
_providerModuleFailCallback (_moduleName, _userName, |
|
_userContext); |
|
} |
} | } |
} | } |
catch (...) | catch (...) |
|
|
// Get the provider module from the ProviderIdContainer to see if | // Get the provider module from the ProviderIdContainer to see if |
// we can optimize out the transmission of this instance to the | // we can optimize out the transmission of this instance to the |
// Provider Agent. (See the _providerModuleCache description.) | // Provider Agent. (See the _providerModuleCache description.) |
try |
if(request->operationContext.contains(ProviderIdContainer::NAME)) |
{ | { |
ProviderIdContainer pidc = request->operationContext.get( | ProviderIdContainer pidc = request->operationContext.get( |
ProviderIdContainer::NAME); | ProviderIdContainer::NAME); |
|
|
doProviderModuleOptimization = true; | doProviderModuleOptimization = true; |
} | } |
} | } |
catch (...) |
|
{ |
|
// No ProviderIdContainer to optimize |
|
} |
|
| |
// | // |
// Write the message to the pipe | // Write the message to the pipe |
|
|
| |
OOPProviderManagerRouter::OOPProviderManagerRouter( | OOPProviderManagerRouter::OOPProviderManagerRouter( |
PEGASUS_INDICATION_CALLBACK_T indicationCallback, | PEGASUS_INDICATION_CALLBACK_T indicationCallback, |
PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback) |
PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback, |
|
PEGASUS_PROVIDERMODULEFAIL_CALLBACK_T providerModuleFailCallback) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, | PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"OOPProviderManagerRouter::OOPProviderManagerRouter"); | "OOPProviderManagerRouter::OOPProviderManagerRouter"); |
| |
_indicationCallback = indicationCallback; | _indicationCallback = indicationCallback; |
_responseChunkCallback = responseChunkCallback; | _responseChunkCallback = responseChunkCallback; |
|
_providerModuleFailCallback = providerModuleFailCallback; |
_subscriptionInitComplete = false; | _subscriptionInitComplete = false; |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
} | } |
else | else |
{ | { |
|
// |
|
// Look up the Provider Agent for this module instance and requesting |
|
// user |
|
// |
|
ProviderAgentContainer* pa = _lookupProviderAgent(providerModule, |
|
request); |
|
PEGASUS_ASSERT(pa != 0); |
|
|
|
// |
|
// Forward the request to the provider agent |
|
// |
|
response.reset(pa->processMessage(request)); |
|
} |
|
|
|
response->syncAttributes(request); |
|
|
|
PEG_METHOD_EXIT(); |
|
return response.release(); |
|
} |
|
|
|
ProviderAgentContainer* OOPProviderManagerRouter::_lookupProviderAgent( |
|
const CIMInstance& providerModule, |
|
CIMRequestMessage* request) |
|
{ |
// Retrieve the provider module name | // Retrieve the provider module name |
String moduleName; | String moduleName; |
CIMValue nameValue = providerModule.getProperty( | CIMValue nameValue = providerModule.getProperty( |
|
|
| |
if (userContext == 0) | if (userContext == 0) |
{ | { |
userContext = PG_PROVMODULE_USERCTXT_PRIVILEGED; |
userContext = PEGASUS_DEFAULT_PROV_USERCTXT; |
} | } |
| |
String userName; | String userName; |
| |
if (userContext == PG_PROVMODULE_USERCTXT_REQUESTOR) | if (userContext == PG_PROVMODULE_USERCTXT_REQUESTOR) |
{ | { |
try |
if(request->operationContext.contains(IdentityContainer::NAME)) |
{ | { |
// User Name is in the OperationContext | // User Name is in the OperationContext |
IdentityContainer ic = (IdentityContainer) | IdentityContainer ic = (IdentityContainer) |
request->operationContext.get(IdentityContainer::NAME); | request->operationContext.get(IdentityContainer::NAME); |
userName = ic.getUserName(); | userName = ic.getUserName(); |
} | } |
catch (Exception&) |
//else |
{ |
//{ |
// If no IdentityContainer is present, default to the CIM | // If no IdentityContainer is present, default to the CIM |
// Server's user context | // Server's user context |
} |
//} |
| |
// If authentication is disabled, use the CIM Server's user context | // If authentication is disabled, use the CIM Server's user context |
if (!userName.size()) | if (!userName.size()) |
|
|
} | } |
else if (userContext == PG_PROVMODULE_USERCTXT_DESIGNATED) | else if (userContext == PG_PROVMODULE_USERCTXT_DESIGNATED) |
{ | { |
// Retrieve the provider module name |
// Retrieve the provider module designated user property value |
providerModule.getProperty(providerModule.findProperty( | providerModule.getProperty(providerModule.findProperty( |
PEGASUS_PROPERTYNAME_MODULE_DESIGNATEDUSER)).getValue(). | PEGASUS_PROPERTYNAME_MODULE_DESIGNATEDUSER)).getValue(). |
get(userName); | get(userName); |
|
|
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"User name = " + userName); | "User name = " + userName); |
| |
// Look up the Provider Agent for this module and user |
|
ProviderAgentContainer* pa = _lookupProviderAgent(moduleName, userName); |
|
PEGASUS_ASSERT(pa != 0); |
|
|
|
// |
|
// Forward the request to the provider agent |
|
// |
|
response.reset(pa->processMessage(request)); |
|
} |
|
|
|
response->syncAttributes(request); |
|
|
|
PEG_METHOD_EXIT(); |
|
return response.release(); |
|
} |
|
|
|
ProviderAgentContainer* OOPProviderManagerRouter::_lookupProviderAgent( |
|
const String& moduleName, |
|
const String& userName) |
|
{ |
|
ProviderAgentContainer* pa = 0; | ProviderAgentContainer* pa = 0; |
String key = moduleName + ":" + userName; | String key = moduleName + ":" + userName; |
| |
|
|
if (!_providerAgentTable.lookup(key, pa)) | if (!_providerAgentTable.lookup(key, pa)) |
{ | { |
pa = new ProviderAgentContainer( | pa = new ProviderAgentContainer( |
moduleName, userName, _indicationCallback, _responseChunkCallback, |
moduleName, userName, userContext, |
|
_indicationCallback, _responseChunkCallback, |
|
_providerModuleFailCallback, |
_subscriptionInitComplete); | _subscriptionInitComplete); |
_providerAgentTable.insert(key, pa); | _providerAgentTable.insert(key, pa); |
} | } |