version 1.3.2.1, 2009/08/17 13:47:46
|
version 1.3.2.9, 2009/11/10 09:43:32
|
|
|
#undef PEGASUS_ARRAY_T | #undef PEGASUS_ARRAY_T |
| |
| |
//----------------------------------------------------------------------------- |
class PEGASUS_COMMON_LINKAGE CIMResponseData |
// |
|
// CIMInstanceNamesResponseData |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class PEGASUS_COMMON_LINKAGE CIMInstanceNamesResponseData |
|
{ | { |
public: | public: |
| |
enum ResponseDataEncoding { | enum ResponseDataEncoding { |
RESP_ENC_CIM, |
RESP_ENC_CIM = 1, |
RESP_ENC_BINARY, |
RESP_ENC_BINARY = 2, |
RESP_ENC_XML, |
RESP_ENC_XML = 4, |
RESP_ENC_SCMO |
RESP_ENC_SCMO = 8 |
}; | }; |
| |
CIMInstanceNamesResponseData(): |
enum ResponseDataContent { |
_resolveCallback(0), |
RESP_INSTNAMES = 1, |
_encoding(RESP_ENC_CIM) |
RESP_INSTANCES = 2, |
{ |
RESP_INSTANCE = 3, |
} |
RESP_OBJECTS = 4, |
|
RESP_OBJECTPATHS =5 |
|
}; |
| |
Array<CIMObjectPath>& getInstanceNames() |
CIMResponseData(ResponseDataContent content):_encoding(0),_dataType(content) |
{ |
{}; |
_resolve(); |
|
return _instanceNames; |
|
} |
|
| |
/*const Array<CIMConstObjectPath>& getInstanceNames() const |
// C++ objects interface handling |
{ |
|
// Resolve the instances before returning them. The resolve step |
// Instance Names handling |
// requires non-const access, but does not fundamentally change the |
Array<CIMObjectPath>& getInstanceNames(); |
// message contents. |
|
const_cast<CIMInstanceNamesResponseData*>(this)->_resolve(); |
|
|
|
// The Array<CIMInstance> is masqueraded as an Array<CIMConstInstance> |
|
// for expedience, since the internal representations are the same. |
|
return *((Array<CIMConstObjectPath>*)(void*)&_instanceNames); |
|
}*/ |
|
| |
void setInstanceNames(const Array<CIMObjectPath>& x) | void setInstanceNames(const Array<CIMObjectPath>& x) |
{ | { |
_resolveCallback = 0; |
|
_instanceNames = x; | _instanceNames = x; |
|
_encoding |= RESP_ENC_CIM; |
} | } |
|
|
void appendInstanceName(const CIMObjectPath& x) | void appendInstanceName(const CIMObjectPath& x) |
{ | { |
_resolveCallback = 0; |
|
_instanceNames.append(x); | _instanceNames.append(x); |
|
_encoding |= RESP_ENC_CIM; |
} | } |
| |
void setSCMOInstanceNames(const Array<SCMOInstance>& x) |
// Instance handling |
{ |
CIMInstance& getInstance(); |
_resolveCallback = _resolveSCMOInstanceNames; |
|
fprintf( |
|
stderr, |
|
"CIMResponseData::setSCMOInstanceNames(cb=%p)\n", |
|
_resolveCallback); |
|
_scmoInstanceNames = x; |
|
} |
|
|
|
void appendSCMOInstanceName(const SCMOInstance& x) |
|
{ |
|
_resolveCallback = _resolveSCMOInstanceNames; |
|
fprintf( |
|
stderr, |
|
"CIMResponseData::appendSCMOInstanceName(cb=%p)\n", |
|
_resolveCallback); |
|
_scmoInstanceNames.append(x); |
|
} |
|
|
|
Array<Uint8>& getBinaryCimInstanceNames() |
|
{ |
|
return _binaryData; |
|
} |
|
|
|
bool setBinaryCimInstanceNames(CIMBuffer& in, bool hasLen=true); |
|
bool setXmlCimInstanceNames(CIMBuffer& in); |
|
| |
void encodeBinaryResponse(CIMBuffer& out); |
void setInstance(const CIMInstance& x) |
void encodeXmlResponse(Buffer& out); |
|
|
|
private: |
|
|
|
CIMInstanceNamesResponseData(const CIMInstanceNamesResponseData&); |
|
CIMInstanceNamesResponseData& operator=( |
|
const CIMInstanceNamesResponseData&); |
|
|
|
static Boolean _resolveXMLInstanceNames( |
|
CIMInstanceNamesResponseData* data, |
|
Array<CIMObjectPath>& instanceNames); |
|
|
|
static Boolean _resolveBinaryInstanceNames( |
|
CIMInstanceNamesResponseData* data, |
|
Array<CIMObjectPath>& instanceNames); |
|
|
|
static Boolean _resolveSCMOInstanceNames( |
|
CIMInstanceNamesResponseData* data, |
|
Array<CIMObjectPath>& instanceNames); |
|
|
|
Boolean (*_resolveCallback)( |
|
CIMInstanceNamesResponseData* data, |
|
Array<CIMObjectPath>& cimInstance); |
|
|
|
void _resolve() |
|
{ | { |
if (_resolveCallback) |
_instances.clear(); |
{ |
_instances.append(x); |
(*_resolveCallback)(this, _instanceNames); |
_encoding |= RESP_ENC_CIM; |
_resolveCallback = 0; |
|
} |
|
} | } |
| |
ResponseDataEncoding _encoding; |
// Instances handling |
|
Array<CIMInstance>& getInstances(); |
// For XML encoding. |
|
Array<ArraySint8> _referencesData; |
|
Array<String> _hostsData; |
|
Array<CIMNamespaceName> _nameSpacesData; |
|
|
|
// For binary encoding. |
|
Array<Uint8> _binaryData; |
|
|
|
Array<CIMObjectPath> _instanceNames; |
|
Array<SCMOInstance> _scmoInstanceNames; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// CIMInstanceResponseData |
|
// |
|
//----------------------------------------------------------------------------- |
|
| |
class PEGASUS_COMMON_LINKAGE CIMInstanceResponseData |
void setInstances(const Array<CIMInstance>& x) |
{ |
|
public: |
|
|
|
CIMInstanceResponseData(): |
|
_resolveCallback(0), |
|
_binaryEncoding(false) |
|
{ | { |
|
_instances=x; |
|
_encoding |= RESP_ENC_CIM; |
} | } |
|
void appendInstance(const CIMInstance& x) |
CIMInstance& getCimInstance() |
|
{ | { |
_resolve(); |
_instances.append(x); |
return _cimInstance; |
_encoding |= RESP_ENC_CIM; |
} | } |
| |
const CIMConstInstance& getCimInstance() const |
// Objects handling |
|
Array<CIMObject>& getObjects(); |
|
void setObjects(const Array<CIMObject>& x) |
{ | { |
// Resolve the instance before returning it. The resolve step requires |
_objects=x; |
// non-const access, but does not fundamentally change the response |
_encoding |= RESP_ENC_CIM; |
const_cast<CIMInstanceResponseData*>(this)->_resolve(); |
|
|
|
// The CIMInstance is masqueraded as a CIMConstInstance for expedience, |
|
// since the internal representations are the same. |
|
return *((CIMConstInstance*)(void*)&_cimInstance); |
|
} | } |
|
void appendObject(const CIMObject& x) |
void setCimInstance(const CIMInstance& x) |
|
{ |
|
_resolveCallback = 0; |
|
_cimInstance = x; |
|
} |
|
|
|
Array<Uint8>& getBinaryCimInstance() |
|
{ | { |
return _binaryData; |
_objects.append(x); |
|
_encoding |= RESP_ENC_CIM; |
} | } |
| |
bool setBinaryCimInstance(CIMBuffer& in, bool hasLen=true); |
// SCMO representation, single instance stored as one element array |
bool setXmlCimInstance(CIMBuffer& in); |
// object paths are represented as SCMOInstance |
|
Array<SCMOInstance>& getSCMO(); |
| |
void encodeBinaryResponse(CIMBuffer& out) const; |
void setSCMO(const Array<SCMOInstance>& x); |
void encodeXmlResponse(Buffer& out) const; |
|
| |
private: |
void appendSCMO(const Array<SCMOInstance>& x) |
|
|
CIMInstanceResponseData(const CIMInstanceResponseData&); |
|
CIMInstanceResponseData& operator=( |
|
const CIMInstanceResponseData&); |
|
|
|
static Boolean _resolveXMLInstance( |
|
CIMInstanceResponseData* data, |
|
CIMInstance& instance); |
|
|
|
static Boolean _resolveBinaryInstance( |
|
CIMInstanceResponseData* data, |
|
CIMInstance& instance); |
|
|
|
Boolean (*_resolveCallback)( |
|
CIMInstanceResponseData* msg, |
|
CIMInstance& cimInstance); |
|
|
|
void _resolve() |
|
{ |
|
if (_resolveCallback) |
|
{ | { |
(*_resolveCallback)(this, _cimInstance); |
_scmoInstances.appendArray(x); |
_resolveCallback = 0; |
_encoding |= RESP_ENC_SCMO; |
} |
|
} | } |
| |
Boolean _binaryEncoding; |
// Binary data is just a data stream |
|
Array<Uint8>& getBinary(); |
|
bool setBinary(CIMBuffer& in, bool hasLen=true); |
| |
// For XML encoding: |
// Xml data is unformatted, no need to differentiate between instance |
Array<Sint8> _instanceData; |
// instances and object paths or objects |
Array<Sint8> _referenceData; |
bool setXml(CIMBuffer& in); |
CIMNamespaceName _nameSpaceData; |
|
String _hostData; |
|
| |
// For Binary encoding: |
// function used by OperationAggregator to aggregate response data in a |
Array<Uint8> _binaryData; |
// single ResponseData object |
|
void appendResponseData(const CIMResponseData & x); |
| |
CIMInstance _cimInstance; |
// Function used by CMPI layer to complete the namespace on all data held |
|
// Input (x) has to have a valid namespace |
|
void completeNamespace(const SCMOInstance * x); |
| |
}; |
// Function primarily used by CIMOperationRequestDispatcher to complete |
|
// namespace and hostname on a,an,r and rn operations in the |
|
// OperationAggregator |
|
void completeHostNameAndNamespace( |
|
const String & hn, |
|
const CIMNamespaceName & ns); |
| |
|
// Encoding responses |
| |
//----------------------------------------------------------------------------- |
// binary format used with Provider Agents and OP Clients |
// |
|
// CIMInstancesResponseData |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class PEGASUS_COMMON_LINKAGE CIMInstancesResponseData |
|
{ |
|
public: |
|
|
|
enum ResponseDataEncoding { |
|
RESP_ENC_CIM, |
|
RESP_ENC_BINARY, |
|
RESP_ENC_XML, |
|
RESP_ENC_SCMO |
|
}; |
|
|
|
CIMInstancesResponseData(): |
|
_resolveCallback(0), |
|
_encoding(RESP_ENC_CIM) |
|
{ |
|
} |
|
|
|
Array<CIMInstance>& getNamedInstances() |
|
{ |
|
_resolve(); |
|
return _namedInstances; |
|
} |
|
|
|
const Array<CIMConstInstance>& getNamedInstances() const |
|
{ |
|
// Resolve the instances before returning them. The resolve step |
|
// requires non-const access, but does not fundamentally change the |
|
// message contents. |
|
const_cast<CIMInstancesResponseData*>(this)->_resolve(); |
|
|
|
// The Array<CIMInstance> is masqueraded as an Array<CIMConstInstance> |
|
// for expedience, since the internal representations are the same. |
|
return *((Array<CIMConstInstance>*)(void*)&_namedInstances); |
|
} |
|
|
|
void setNamedInstances(const Array<CIMInstance>& x) |
|
{ |
|
_resolveCallback = 0; |
|
_namedInstances = x; |
|
} |
|
|
|
void appendNamedInstance(const CIMInstance& x) |
|
{ |
|
_resolveCallback = 0; |
|
_namedInstances.append(x); |
|
} |
|
|
|
void setSCMOInstances(const Array<SCMOInstance>& x) |
|
{ |
|
_resolveCallback = _resolveSCMOInstances; |
|
fprintf( |
|
stderr, |
|
"CIMResponseData::setSCMOInstances(cb=%p)\n", |
|
_resolveCallback); |
|
_scmoInstances = x; |
|
} |
|
|
|
void appendSCMOInstance(const SCMOInstance& x) |
|
{ |
|
_resolveCallback = _resolveSCMOInstances; |
|
fprintf( |
|
stderr, |
|
"CIMResponseData::appendSCMOInstance(cb=%p)\n", |
|
_resolveCallback); |
|
_scmoInstances.append(x); |
|
} |
|
|
|
Array<Uint8>& getBinaryCimInstances() |
|
{ |
|
return _binaryData; |
|
} |
|
|
|
bool setBinaryCimInstances(CIMBuffer& in, bool hasLen=true); |
|
bool setXmlCimInstances(CIMBuffer& in); |
|
|
|
void encodeBinaryResponse(CIMBuffer& out); | void encodeBinaryResponse(CIMBuffer& out); |
|
// Xml format used with Provider Agents only |
|
void encodeInternalXmlResponse(CIMBuffer& out); |
|
// official Xml format(CIM over Http) used to communicate to clients |
void encodeXmlResponse(Buffer& out); | void encodeXmlResponse(Buffer& out); |
| |
private: | private: |
| |
CIMInstancesResponseData(const CIMInstancesResponseData&); |
// helper functions to transform different formats into one-another |
CIMInstancesResponseData& operator=( |
// functions work on the internal data and calling of them should be |
const CIMInstancesResponseData&); |
// avoided |
|
|
static Boolean _resolveXMLInstances( |
void _resolveToCIM(); |
CIMInstancesResponseData* data, |
void _resolveToSCMO(); |
Array<CIMInstance>& instances); |
|
|
void _resolveBinary(); |
static Boolean _resolveBinaryInstances( |
|
CIMInstancesResponseData* data, |
void _resolveXmlToSCMO(); |
Array<CIMInstance>& instances); |
void _resolveXmlToCIM(); |
|
|
static Boolean _resolveSCMOInstances( |
void _resolveSCMOToCIM(); |
CIMInstancesResponseData* data, |
void _resolveCIMToSCMO(); |
Array<CIMInstance>& instances); |
|
|
// Helper functions for this class only, do NOT externalize |
Boolean (*_resolveCallback)( |
SCMOInstance _getSCMOFromCIMInstance(const CIMInstance& cimInst); |
CIMInstancesResponseData* data, |
SCMOInstance _getSCMOFromCIMObject(const CIMObject& cimObj); |
Array<CIMInstance>& cimInstance); |
SCMOInstance _getSCMOFromCIMObjectPath(const CIMObjectPath& cimPath); |
|
SCMOClass* _getSCMOClass(const char* ns,const char* cls); |
void _resolve() |
|
{ |
// Bitflags in this integer will reflect what data representation types |
if (_resolveCallback) |
// are currently stored in this CIMResponseData object |
{ |
Uint32 _encoding; |
(*_resolveCallback)(this, _namedInstances); |
|
_resolveCallback = 0; |
// Storing type of data in this enumeration |
} |
ResponseDataContent _dataType; |
} |
|
|
// unused arrays are represented by ArrayRepBase _empty_rep |
ResponseDataEncoding _encoding; |
// which is a 16 byte large static shared across all of them |
|
// so, even though this object looks large, it holds just |
|
// 2 integer and 9 pointers |
| |
// For XML encoding. | // For XML encoding. |
Array<ArraySint8> _instancesData; |
|
Array<ArraySint8> _referencesData; | Array<ArraySint8> _referencesData; |
|
Array<ArraySint8> _instanceData; |
Array<String> _hostsData; | Array<String> _hostsData; |
Array<CIMNamespaceName> _nameSpacesData; | Array<CIMNamespaceName> _nameSpacesData; |
| |
// For binary encoding. | // For binary encoding. |
Array<Uint8> _binaryData; | Array<Uint8> _binaryData; |
| |
Array<CIMInstance> _namedInstances; |
// Default C++ encoding |
Array<SCMOInstance> _scmoInstances; |
Array<CIMObjectPath> _instanceNames; |
}; |
Array<CIMInstance> _instances; |
|
Array<CIMObject> _objects; |
|
|
//----------------------------------------------------------------------------- |
|
// |
|
// CIMObjectsResponseData |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class PEGASUS_COMMON_LINKAGE CIMObjectsResponseData |
|
{ |
|
public: |
|
|
|
CIMObjectsResponseData(): |
|
_resolveCallback(0), |
|
_binaryEncoding(false) |
|
{ |
|
} |
|
|
|
Array<CIMObject>& getCIMObjects() |
|
{ |
|
_resolve(); |
|
return _cimObjects; |
|
} |
|
|
|
const Array<CIMConstObject>& getCIMObjects() const |
|
{ |
|
// Resolve the instances before returning them. The resolve step |
|
// requires non-const access, but does not fundamentally change the |
|
// message contents. |
|
const_cast<CIMObjectsResponseData*>(this)->_resolve(); |
|
|
|
// The Array<CIMInstance> is masqueraded as an Array<CIMConstInstance> |
|
// for expedience, since the internal representations are the same. |
|
return *((Array<CIMConstObject>*)(void*)&_cimObjects); |
|
} |
|
|
|
void setCIMObjects(const Array<CIMObject>& x) |
|
{ |
|
_resolveCallback = 0; |
|
_cimObjects = x; |
|
} |
|
|
|
Array<Uint8>& getBinaryCimObjects() |
|
{ |
|
return _binaryData; |
|
} |
|
|
|
bool setBinaryCimObjects(CIMBuffer& in, bool hasLen=true); |
|
bool setXmlCimObjects(CIMBuffer& in); |
|
|
|
void encodeBinaryResponse(CIMBuffer& out) const; |
|
void encodeXmlResponse(Buffer& out) const; |
|
|
|
private: |
|
|
|
CIMObjectsResponseData(const CIMObjectsResponseData&); |
|
CIMObjectsResponseData& operator=( |
|
const CIMObjectsResponseData&); |
|
|
|
static Boolean _resolveXMLObjects( |
|
CIMObjectsResponseData* data, |
|
Array<CIMObject>& objects); |
|
|
|
static Boolean _resolveBinaryObjects( |
|
CIMObjectsResponseData* data, |
|
Array<CIMObject>& objects); |
|
|
|
Boolean (*_resolveCallback)( |
|
CIMObjectsResponseData* data, |
|
Array<CIMObject>& cimObjects); |
|
|
|
void _resolve() |
|
{ |
|
if (_resolveCallback) |
|
{ |
|
(*_resolveCallback)(this, _cimObjects); |
|
_resolveCallback = 0; |
|
} |
|
} |
|
|
|
Boolean _binaryEncoding; |
|
|
|
// For XML encoding. |
|
// For XML encoding. |
|
Array<ArraySint8> _cimObjectsData; |
|
Array<ArraySint8> _referencesData; |
|
Array<String> _hostsData; |
|
Array<CIMNamespaceName> _nameSpacesData; |
|
| |
// For binary encoding. |
// SCMO encoding |
Array<Uint8> _binaryData; |
Array<SCMOInstance> _scmoInstances; |
| |
Array<CIMObject> _cimObjects; |
|
}; | }; |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |