version 1.11.8.4, 2006/03/10 14:30:39
|
version 1.22, 2006/11/09 18:15:29
|
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// Author: Chip Vincent (cvincent@us.ibm.com) |
|
// |
|
// Modified By: |
|
// Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase2 |
|
// Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include "OperationResponseHandler.h" | #include "OperationResponseHandler.h" |
|
#include "CIMOMHandleContext.h" |
| |
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
|
#include <Pegasus/Common/AutoPtr.h> |
#include <Pegasus/Provider/CIMOMHandle.h> | #include <Pegasus/Provider/CIMOMHandle.h> |
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
/********************************************************** |
|
* Define CIMOMHandleContext class |
|
**********************************************************/ |
|
class CIMOMHandleContext : public NormalizerContext |
|
{ |
|
public: |
|
CIMOMHandleContext() {} |
|
virtual ~CIMOMHandleContext() {} |
|
|
|
virtual CIMClass getClass( |
|
const CIMNamespaceName& nameSpace, |
|
const CIMName& name); |
|
|
|
virtual Array<CIMName> enumerateClassNames( |
|
const CIMNamespaceName& nameSpace, const CIMName& className, |
|
bool deepInheritance); |
|
|
|
virtual AutoPtr<NormalizerContext> clone(); |
|
|
|
protected: |
|
CIMOMHandleContext(CIMOMHandle & hndl) : handle(hndl) {} |
|
private: |
|
CIMOMHandle handle; |
|
OperationContext emptyContext; |
|
}; |
|
|
|
CIMClass CIMOMHandleContext::getClass( |
|
const CIMNamespaceName& nameSpace, |
|
const CIMName& name) |
|
{ |
|
// Get the whole class definition |
|
return handle.getClass(emptyContext, nameSpace, name, false, true, true, |
|
CIMPropertyList()); |
|
} |
|
|
|
Array<CIMName> CIMOMHandleContext::enumerateClassNames( |
|
const CIMNamespaceName& nameSpace, const CIMName& className, |
|
bool deepInheritance) |
|
{ |
|
return handle.enumerateClassNames(emptyContext, nameSpace, className, |
|
deepInheritance); |
|
} |
|
|
|
AutoPtr<NormalizerContext> CIMOMHandleContext::clone() |
|
{ |
|
AutoPtr<NormalizerContext> tmpPtr(new CIMOMHandleContext(handle)); |
|
return tmpPtr; |
|
} |
|
|
|
/********************************************************** |
|
* End CIMOMHandleContext class |
|
**********************************************************/ |
|
|
|
// | // |
// OperationResponseHandler | // OperationResponseHandler |
// | // |
|
|
message); | message); |
} | } |
| |
|
void OperationResponseHandler::setCIMException( |
|
const CIMException& cimException) |
|
{ |
|
// Assign the cimException argument to _response->cimException. Note that |
|
// there is no need to use the PEGASUS_CIM_EXCEPTION_LANG() macro to create |
|
// a TraceableCIMException since both _response->cimException and |
|
// cimException are of type CIMException and the TraceableCIMException |
|
// constructor has no side effects. |
|
_response->cimException = cimException; |
|
} |
|
|
Boolean OperationResponseHandler::isAsync(void) const | Boolean OperationResponseHandler::isAsync(void) const |
{ | { |
return(true); |
return _responseChunkCallback != 0; |
} | } |
| |
// This is only called from SimpleResponseHandler.deliver() but lives in this | // This is only called from SimpleResponseHandler.deliver() but lives in this |
|
|
// to go through. Only operation classes have a response pointer | // to go through. Only operation classes have a response pointer |
void OperationResponseHandler::send(Boolean isComplete) | void OperationResponseHandler::send(Boolean isComplete) |
{ | { |
// some handlers do not send async because their callers cannot handle |
// It is possible to instantiate this class directly (not a derived |
// partial responses. If this is the case, stop here. |
// class, which would also inherit from SimpleResponseHandler). |
|
// The caller would do this only if the operation does not have any |
if (isAsync() == false) |
// data to be returned. |
{ |
|
// preserve tradional behavior |
SimpleResponseHandler* simpleP = |
if (isComplete == true) |
dynamic_cast<SimpleResponseHandler*>(this); |
|
if (simpleP == 0) |
{ | { |
transfer(); |
// if there is no data to be returned, then the message should NEVER be |
} |
// incomplete (even on an error) |
|
PEGASUS_ASSERT(isComplete); |
return; | return; |
} | } |
| |
SimpleResponseHandler *simpleP = dynamic_cast<SimpleResponseHandler*>(this); |
// some handlers do not send async because their callers cannot handle |
|
// partial responses. If this is the case, stop here. |
// It is possible to instantiate this class directly (not derived) |
|
// The caller would do this only if the operation does not have any data to |
|
// be returned |
|
| |
if (! simpleP) |
if (!isAsync()) |
{ | { |
// if there is no data to be returned, then the message should NEVER be |
// preserve traditional behavior |
// incomplete (even on an error) |
if (isComplete) |
if (isComplete == false) |
|
{ | { |
PEGASUS_ASSERT(false); |
if (_response != 0) |
|
{ |
|
_response->operationContext.set( |
|
ContentLanguageListContainer(simpleP->getLanguages())); |
|
} |
|
transfer(); |
} | } |
| |
return; | return; |
|
|
// operation. | // operation. |
CIMClass cimClass; | CIMClass cimClass; |
| |
try |
if(request->operationContext.contains(CachedClassDefinitionContainer::NAME)) |
{ | { |
CachedClassDefinitionContainer container = | CachedClassDefinitionContainer container = |
request->operationContext.get(CachedClassDefinitionContainer::NAME); |
request->operationContext.get( |
|
CachedClassDefinitionContainer::NAME); |
| |
cimClass = container.getClass(); | cimClass = container.getClass(); |
} | } |
catch(Exception &) |
|
{ |
|
// Do nothing. Container is missing, which implies normalization is disabled |
|
// for this operation. |
|
} |
|
| |
AutoPtr<NormalizerContext> tmpContext(new CIMOMHandleContext()); | AutoPtr<NormalizerContext> tmpContext(new CIMOMHandleContext()); |
ObjectNormalizer tmpNormalizer( | ObjectNormalizer tmpNormalizer( |
|
|
MessageLoaderParms message( | MessageLoaderParms message( |
"Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED", | "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED", |
"Too few objects delivered."); | "Too few objects delivered."); |
|
// Provider claims success, no instances returned. -V see Bug #4104 |
|
setStatus(CIM_ERR_NOT_FOUND); |
throw CIMException(CIM_ERR_FAILED, message); | throw CIMException(CIM_ERR_FAILED, message); |
} | } |
| |
|
|
// operation. | // operation. |
CIMClass cimClass; | CIMClass cimClass; |
| |
try |
if(request->operationContext.contains(CachedClassDefinitionContainer::NAME)) |
{ | { |
CachedClassDefinitionContainer container = | CachedClassDefinitionContainer container = |
request->operationContext.get(CachedClassDefinitionContainer::NAME); |
request->operationContext.get( |
|
CachedClassDefinitionContainer::NAME); |
cimClass = container.getClass(); | cimClass = container.getClass(); |
} | } |
catch(Exception &) |
|
{ |
|
// Do nothing. Container is missing, which implies normalization is disabled |
|
// for this operation. |
|
} |
|
| |
AutoPtr<NormalizerContext> tmpContext(new CIMOMHandleContext()); | AutoPtr<NormalizerContext> tmpContext(new CIMOMHandleContext()); |
ObjectNormalizer tmpNormalizer( | ObjectNormalizer tmpNormalizer( |
|
|
// operation. | // operation. |
CIMClass cimClass; | CIMClass cimClass; |
| |
try |
if(request->operationContext.contains(CachedClassDefinitionContainer::NAME)) |
{ | { |
CachedClassDefinitionContainer container = | CachedClassDefinitionContainer container = |
request->operationContext.get(CachedClassDefinitionContainer::NAME); |
request->operationContext.get( |
|
CachedClassDefinitionContainer::NAME); |
| |
cimClass = container.getClass(); | cimClass = container.getClass(); |
} | } |
catch(Exception &) |
|
{ |
|
// Do nothing. Container is missing, which implies normalization is disabled |
|
// for this operation. |
|
} |
|
| |
AutoPtr<NormalizerContext> tmpContext(new CIMOMHandleContext()); | AutoPtr<NormalizerContext> tmpContext(new CIMOMHandleContext()); |
ObjectNormalizer tmpNormalizer( | ObjectNormalizer tmpNormalizer( |
|
|
EnableIndicationsResponseHandler::EnableIndicationsResponseHandler( | EnableIndicationsResponseHandler::EnableIndicationsResponseHandler( |
CIMRequestMessage* request, | CIMRequestMessage* request, |
CIMResponseMessage* response, | CIMResponseMessage* response, |
CIMInstance& provider, |
const CIMInstance& provider, |
PEGASUS_INDICATION_CALLBACK_T indicationCallback, | PEGASUS_INDICATION_CALLBACK_T indicationCallback, |
PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback) | PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback) |
: OperationResponseHandler(request, response, responseChunkCallback), | : OperationResponseHandler(request, response, responseChunkCallback), |
|
|
// Get list of subscription instance names from context | // Get list of subscription instance names from context |
Array<CIMObjectPath> subscriptionInstanceNames; | Array<CIMObjectPath> subscriptionInstanceNames; |
| |
try |
if(context.contains(SubscriptionInstanceNamesContainer::NAME)) |
{ | { |
SubscriptionInstanceNamesContainer container = | SubscriptionInstanceNamesContainer container = |
context.get(SubscriptionInstanceNamesContainer::NAME); | context.get(SubscriptionInstanceNamesContainer::NAME); |
| |
subscriptionInstanceNames = container.getInstanceNames(); | subscriptionInstanceNames = container.getInstanceNames(); |
} | } |
catch(Exception &) |
else |
{ | { |
subscriptionInstanceNames.clear(); | subscriptionInstanceNames.clear(); |
} | } |
|
|
// l10n | // l10n |
ContentLanguageList contentLangs; | ContentLanguageList contentLangs; |
| |
try |
if(context.contains(ContentLanguageListContainer::NAME)) |
{ | { |
// Get the Content-Language for this indication. The provider | // Get the Content-Language for this indication. The provider |
// does not have to add specify a language for the indication. | // does not have to add specify a language for the indication. |
|
|
| |
contentLangs = langContainer.getLanguages(); | contentLangs = langContainer.getLanguages(); |
} | } |
catch(Exception &) |
else |
{ | { |
// The provider did not explicitly set a Content-Language for | // The provider did not explicitly set a Content-Language for |
// the indication. Fall back to the lang set in this object. | // the indication. Fall back to the lang set in this object. |
|
|
| |
request->operationContext = context; | request->operationContext = context; |
| |
try |
if(request->operationContext.contains(ContentLanguageListContainer::NAME)) |
{ | { |
request->operationContext.set(ContentLanguageListContainer(contentLangs)); | request->operationContext.set(ContentLanguageListContainer(contentLangs)); |
} | } |
catch(Exception &) |
else |
{ | { |
request->operationContext.insert(ContentLanguageListContainer(contentLangs)); | request->operationContext.insert(ContentLanguageListContainer(contentLangs)); |
} | } |