version 1.1.2.32, 2009/11/03 13:11:51
|
version 1.4, 2011/01/25 11:24:25
|
|
|
} | } |
| |
/** | /** |
|
* Constructs a SCMOInstance from a memory object of type SCMBInstance_Main. |
|
* It incremets the referece counter of the memory object. |
|
* @param hdr A memory object of type SCMBInstance_Main. |
|
**/ |
|
SCMOInstance(SCMBInstance_Main* hdr) |
|
{ |
|
inst.hdr = hdr; |
|
Ref(); |
|
} |
|
|
|
|
|
/** |
|
* Assignment operator for the SCMO instance, |
|
* @param theSCMOInstance The right hand value |
|
**/ |
|
SCMOInstance& operator=(const SCMOInstance& theSCMOInstance) |
|
{ |
|
if (inst.hdr != theSCMOInstance.inst.hdr) |
|
{ |
|
Unref(); |
|
inst.hdr = theSCMOInstance.inst.hdr; |
|
Ref(); |
|
} |
|
return *this; |
|
} |
|
|
|
/** |
* Destructor is decrementing the refcount. If refcount is zero, the | * Destructor is decrementing the refcount. If refcount is zero, the |
* singele chunk memory object is deallocated. | * singele chunk memory object is deallocated. |
*/ | */ |
|
|
SCMOInstance( | SCMOInstance( |
const CIMInstance& cimInstance, | const CIMInstance& cimInstance, |
const char* altNameSpace=0, | const char* altNameSpace=0, |
Uint64 altNSLen=0); |
Uint32 altNSLen=0); |
| |
/** | /** |
* Builds a SCMOInstance from the given CIMObjectPath copying all data. | * Builds a SCMOInstance from the given CIMObjectPath copying all data. |
|
|
SCMOInstance( | SCMOInstance( |
const CIMObjectPath& cimObj, | const CIMObjectPath& cimObj, |
const char* altNameSpace=0, | const char* altNameSpace=0, |
Uint64 altNSLen=0); |
Uint32 altNSLen=0); |
| |
/** | /** |
* Builds a SCMOInstance from the given CIMObject copying all data. | * Builds a SCMOInstance from the given CIMObject copying all data. |
|
|
SCMOInstance( | SCMOInstance( |
const CIMObject& cimObject, | const CIMObject& cimObject, |
const char* altNameSpace=0, | const char* altNameSpace=0, |
Uint64 altNSLen=0); |
Uint32 altNSLen=0); |
| |
/** | /** |
* Converts the SCMOInstance into a CIMInstance. | * Converts the SCMOInstance into a CIMInstance. |
|
|
* Has to be copied by caller. | * Has to be copied by caller. |
* It is set to NULL if rc != SCMO_OK. | * It is set to NULL if rc != SCMO_OK. |
* @param pvalue Returns a pointer to the value of property. | * @param pvalue Returns a pointer to the value of property. |
* The value is strored in a SCMBUnion |
* The value is stored in a SCMBUnion |
* and has to be copied by the caller ! | * and has to be copied by the caller ! |
* It returns NULL if rc != SCMO_OK. | * It returns NULL if rc != SCMO_OK. |
* | * |
|
|
Boolean& isArray, | Boolean& isArray, |
Uint32& size ) const; | Uint32& size ) const; |
| |
|
void getSCMBValuePropertyAt( |
|
Uint32 pos, |
|
SCMBValue** value, |
|
const char ** valueBase, |
|
SCMBClassProperty ** propDef, |
|
const char ** classBase) const; |
|
|
/** | /** |
* Gets the type and value of the named property. | * Gets the type and value of the named property. |
* The value has to be copied by the caller ! | * The value has to be copied by the caller ! |
* @param name The property name | * @param name The property name |
* @param pvalue Returns a pointer to the value of property. | * @param pvalue Returns a pointer to the value of property. |
* The value is strored in a SCMBUnion |
* The value is stored in a SCMBUnion |
* and has to be copied by the caller ! | * and has to be copied by the caller ! |
* It returns NULL if rc != SCMO_OK. | * It returns NULL if rc != SCMO_OK. |
* | * |
|
|
*/ | */ |
void buildKeyBindingsFromProperties(); | void buildKeyBindingsFromProperties(); |
| |
/** |
//This function is not implemented and now Property filtering is done by |
* Set/replace a property filter on an instance. |
//the CIMOM infrastructure |
* The filter is a white list of property names. |
|
* A property part of the list can be accessed by name or index and |
|
* is eligible to be returned to requester. |
|
* Key properties can not be filtered. They are always a part of the |
|
* instance. If a key property is not part of the property list, |
|
* it will not be filtered out. |
|
* @param propertyList Is an NULL terminated array of char* to |
|
* property names |
|
*/ |
|
void setPropertyFilter(const char **propertyList); | void setPropertyFilter(const char **propertyList); |
| |
/** | /** |
|
|
CIMType& type, | CIMType& type, |
const SCMBUnion** keyvalue) const; | const SCMBUnion** keyvalue) const; |
| |
|
SCMO_RC getKeyBindingAtUnresolved( |
|
Uint32 node, |
|
const char** pname, |
|
Uint32 & pnameLen, |
|
CIMType& type, |
|
const SCMBUnion** pdata, |
|
const char** valueBase) const; |
|
|
/** | /** |
* Get the named key binding. | * Get the named key binding. |
* @parm name The name of the key binding. | * @parm name The name of the key binding. |
* @param type Returns the type as CIMType. | * @param type Returns the type as CIMType. |
* It is invalid if rc == SCMO_INDEX_OUT_OF_BOUND. | * It is invalid if rc == SCMO_INDEX_OUT_OF_BOUND. |
* @param keyvalue Returns a pointer to the value of keybinding. | * @param keyvalue Returns a pointer to the value of keybinding. |
* The value is strored in a SCMBUnion |
* The value is stored in a SCMBUnion |
* and has to be copied by the caller ! | * and has to be copied by the caller ! |
* It returns NULL if rc != SCMO_OK. | * It returns NULL if rc != SCMO_OK. |
* | * |
|
|
* Maybe only the class name and/or name space are available. | * Maybe only the class name and/or name space are available. |
* @return True if the SCMOInstacne is empty, false otherwise. | * @return True if the SCMOInstacne is empty, false otherwise. |
*/ | */ |
Boolean isEmpty( ) const {return (inst.hdr->theClass->isEmpty()); }; |
Boolean isEmpty( ) const {return (inst.hdr->theClass.ptr->isEmpty()); }; |
| |
/** | /** |
* Determines whether the instance is used as a class container. | * Determines whether the instance is used as a class container. |
|
|
* @param hostName The host name as UTF8. | * @param hostName The host name as UTF8. |
* @param len The strlen of the host name. | * @param len The strlen of the host name. |
*/ | */ |
void setHostName_l(const char* hostName, Uint64 len); |
void setHostName_l(const char* hostName, Uint32 len); |
| |
/** | /** |
* Get the host name of the instance. The caller has to make a copy ! | * Get the host name of the instance. The caller has to make a copy ! |
|
|
* @param Return strlen of result string. | * @param Return strlen of result string. |
* @return The class name as UTF8. | * @return The class name as UTF8. |
*/ | */ |
const char* getHostName_l(Uint64 & length) const; |
const char* getHostName_l(Uint32 & length) const; |
| |
/** | /** |
* Sets the provided class name at the instance. By caling this function | * Sets the provided class name at the instance. By caling this function |
|
|
* @param className The class name as UTF8. | * @param className The class name as UTF8. |
* @param len The strlen of the name space. | * @param len The strlen of the name space. |
*/ | */ |
void setClassName_l(const char* className, Uint64 len); |
void setClassName_l(const char* className, Uint32 len); |
| |
/** | /** |
* Get the class name of the instance. The caller has to make a copy ! | * Get the class name of the instance. The caller has to make a copy ! |
|
|
* @param lenght Return strlen of result string. | * @param lenght Return strlen of result string. |
* @return The class name as UTF8. | * @return The class name as UTF8. |
*/ | */ |
const char* getClassName_l(Uint64 & length) const; |
const char* getClassName_l(Uint32 & length) const; |
| |
/** | /** |
* Sets the provided name space name at the instance. | * Sets the provided name space name at the instance. |
|
|
* @param nameSpaceName The name space name as UTF8. | * @param nameSpaceName The name space name as UTF8. |
* @param len The strlen of the name space. | * @param len The strlen of the name space. |
*/ | */ |
void setNameSpace_l(const char* nameSpace, Uint64 len); |
void setNameSpace_l(const char* nameSpace, Uint32 len); |
| |
/** | /** |
* Get the name space of the instance. The caller has to make a copy ! | * Get the name space of the instance. The caller has to make a copy ! |
|
|
* @param Return strlen of result string. | * @param Return strlen of result string. |
* @return The class name as UTF8. | * @return The class name as UTF8. |
*/ | */ |
const char* getNameSpace_l(Uint64 & length) const; |
const char* getNameSpace_l(Uint32 & length) const; |
| |
/** | /** |
* Is the name space or class name of the instance the origianl values | * Is the name space or class name of the instance the origianl values |
|
|
inst.hdr->flags.includeClassOrigin = false; | inst.hdr->flags.includeClassOrigin = false; |
} | } |
| |
|
|
|
/** |
|
* Returns the number of external references hosted by the instance. |
|
**/ |
|
Uint32 numberExtRef() const |
|
{ |
|
return inst.mem->numberExtRef; |
|
} |
|
|
|
/** |
|
* Gets the pointer of an external reference of the instance. |
|
* Warning: The pointer is purely returned. No management is done. |
|
* @parm idx The index of the external reference. |
|
**/ |
|
SCMOInstance* getExtRef(Uint32 idx) const; |
|
|
|
/** |
|
* Sets a pointer of an external reference of the instance. |
|
* Warning: The pointer is purely returned. No management is done. |
|
* @parm idx The index of the external reference. |
|
* @parm ptr The pointer to an SCMOInstance |
|
**/ |
|
void putExtRef(Uint32 idx,SCMOInstance* ptr); |
|
|
private: | private: |
| |
void Ref() | void Ref() |
{ | { |
inst.hdr->refCount++; | inst.hdr->refCount++; |
// printf("\ninst.hdr->refCount=%u\n",inst.hdr->refCount.get()); |
|
}; | }; |
| |
void Unref() | void Unref() |
{ | { |
if (inst.hdr->refCount.decAndTestIfZero()) | if (inst.hdr->refCount.decAndTestIfZero()) |
{ | { |
// printf("\ninst.hdr->refCount=%u\n",inst.hdr->refCount.get()); |
|
// All external references has to be destroyed. | // All external references has to be destroyed. |
_destroyExternalReferences(); | _destroyExternalReferences(); |
// The class has also be dereferenced. | // The class has also be dereferenced. |
delete inst.hdr->theClass; |
delete inst.hdr->theClass.ptr; |
free(inst.base); | free(inst.base); |
inst.base=NULL; | inst.base=NULL; |
} | } |
else |
|
|
}; |
|
|
|
|
|
void _copyOnWrite() |
{ | { |
// printf("\ninst.hdr->refCount=%u\n",inst.hdr->refCount.get()); |
if ( 1 < inst.hdr->refCount.get() ) |
} |
{ |
|
SCMBInstance_Main * oldRef = inst.hdr; |
|
SCMBMgmt_Header* oldMgmt = inst.mem; |
| |
|
_clone(); |
|
if (oldRef->refCount.decAndTestIfZero()) |
|
{ |
|
// All external references has to be destroyed. |
|
_destroyExternalReferencesInternal(oldMgmt); |
|
// The class has also be dereferenced. |
|
delete oldRef->theClass.ptr; |
|
free((void*)oldRef); |
|
oldRef=0; |
|
} |
|
} |
}; | }; |
| |
|
void _clone(); |
| |
void _destroyExternalReferences(); | void _destroyExternalReferences(); |
| |
|
|
| |
void _copyExternalReferences(); | void _copyExternalReferences(); |
| |
|
void _setExtRefIndex(Uint64 idx); |
|
|
void _initSCMOInstance(SCMOClass* pClass); | void _initSCMOInstance(SCMOClass* pClass); |
| |
void _setCIMInstance(const CIMInstance& cimInstance); | void _setCIMInstance(const CIMInstance& cimInstance); |
|
|
static SCMOClass _getSCMOClass( | static SCMOClass _getSCMOClass( |
const CIMObjectPath& theCIMObj, | const CIMObjectPath& theCIMObj, |
const char* altNS, | const char* altNS, |
Uint64 altNSlength); |
Uint32 altNSlength); |
| |
CIMProperty _getCIMPropertyAtNodeIndex(Uint32 nodeIdx) const; | CIMProperty _getCIMPropertyAtNodeIndex(Uint32 nodeIdx) const; |
| |
|
|
SCMBMgmt_Header** pmem, | SCMBMgmt_Header** pmem, |
CIMType type, | CIMType type, |
Uint64 startNS, | Uint64 startNS, |
Uint64 lenNS, |
Uint32 lenNS, |
Union& u); | Union& u); |
| |
static void _setUnionArrayValue( | static void _setUnionArrayValue( |
|
|
CIMType type, | CIMType type, |
Uint32& n, | Uint32& n, |
Uint64 startNS, | Uint64 startNS, |
Uint64 lenNS, |
Uint32 lenNS, |
Union& u); | Union& u); |
| |
|
static void _setExtRefIndex(SCMBUnion* pInst, SCMBMgmt_Header** pmem); |
|
|
SCMO_RC _getKeyBindingDataAtNodeIndex( | SCMO_RC _getKeyBindingDataAtNodeIndex( |
Uint32 node, | Uint32 node, |
const char** pname, | const char** pname, |
|
|
friend class SCMOClass; | friend class SCMOClass; |
friend class SCMODump; | friend class SCMODump; |
friend class SCMOXmlWriter; | friend class SCMOXmlWriter; |
|
friend class SCMOStreamer; |
}; | }; |
| |
inline void SCMOInstance::_getPropertyAt( | inline void SCMOInstance::_getPropertyAt( |
|
|
const char ** valueBase, | const char ** valueBase, |
SCMBClassProperty ** propDef) const | SCMBClassProperty ** propDef) const |
{ | { |
Uint32 node; |
|
// is filtering on ? |
|
if (inst.hdr->flags.isFiltered) |
|
{ |
|
// Get absolut pointer to property filter index map of the instance |
|
Uint32* propertyFilterIndexMap = |
|
(Uint32*)&(inst.base[inst.hdr->propertyFilterIndexMap.start]); |
|
// get the real node index of the property. |
|
node = propertyFilterIndexMap[pos]; |
|
} |
|
else |
|
{ |
|
// the index is used as node index. |
|
node = pos; |
|
} |
|
|
|
SCMBValue* theInstPropNodeArray = | SCMBValue* theInstPropNodeArray = |
(SCMBValue*)&(inst.base[inst.hdr->propertyArray.start]); | (SCMBValue*)&(inst.base[inst.hdr->propertyArray.start]); |
| |
// create a pointer to property node array of the class. | // create a pointer to property node array of the class. |
Uint64 idx = inst.hdr->theClass->cls.hdr->propertySet.nodeArray.start; |
Uint64 idx = inst.hdr->theClass.ptr->cls.hdr->propertySet.nodeArray.start; |
SCMBClassPropertyNode* theClassPropNodeArray = | SCMBClassPropertyNode* theClassPropNodeArray = |
(SCMBClassPropertyNode*)&(inst.hdr->theClass->cls.base)[idx]; |
(SCMBClassPropertyNode*)&(inst.hdr->theClass.ptr->cls.base)[idx]; |
| |
// return the absolute pointer to the property definition | // return the absolute pointer to the property definition |
*propDef= &(theClassPropNodeArray[node].theProperty); |
*propDef= &(theClassPropNodeArray[pos].theProperty); |
| |
// need check if property set or not, if not set use the default value | // need check if property set or not, if not set use the default value |
if (theInstPropNodeArray[node].flags.isSet) |
if (theInstPropNodeArray[pos].flags.isSet) |
{ | { |
// return the absolute pointer to the property value in the instance | // return the absolute pointer to the property value in the instance |
*value = &(theInstPropNodeArray[node]); |
*value = &(theInstPropNodeArray[pos]); |
*valueBase = inst.base; | *valueBase = inst.base; |
} | } |
else | else |
{ | { |
// return the absolute pointer to | // return the absolute pointer to |
*value = &(theClassPropNodeArray[node].theProperty.defaultValue); |
*value = &(theClassPropNodeArray[pos].theProperty.defaultValue); |
*valueBase = inst.hdr->theClass->cls.base; |
*valueBase = inst.hdr->theClass.ptr->cls.base; |
} | } |
} | } |
| |
|
inline void SCMOInstance::getSCMBValuePropertyAt( |
|
Uint32 pos, |
|
SCMBValue** value, |
|
const char ** valueBase, |
|
SCMBClassProperty ** propDef, |
|
const char ** propDefBase) const |
|
{ |
|
_getPropertyAt(pos,value,valueBase,propDef); |
|
|
|
*propDefBase = inst.hdr->theClass.ptr->cls.base; |
|
} |
|
|
|
inline SCMO_RC SCMOInstance::getKeyBindingAtUnresolved( |
|
Uint32 node, |
|
const char** pname, |
|
Uint32 & pnameLen, |
|
CIMType& type, |
|
const SCMBUnion** pdata, |
|
const char** valueBase) const |
|
{ |
|
SCMO_RC rc = _getKeyBindingDataAtNodeIndex(node,pname,pnameLen,type,pdata); |
|
// Adjust size to string length |
|
if (pnameLen) |
|
{ |
|
pnameLen--; |
|
} |
|
*valueBase = inst.base; |
|
return rc; |
|
} |
|
|
|
|
|
|
#define PEGASUS_ARRAY_T SCMOInstance | #define PEGASUS_ARRAY_T SCMOInstance |
# include <Pegasus/Common/ArrayInter.h> | # include <Pegasus/Common/ArrayInter.h> |
#undef PEGASUS_ARRAY_T | #undef PEGASUS_ARRAY_T |