version 1.58.4.4, 2008/02/19 22:09:39
|
version 1.62.4.3, 2007/11/08 09:16:19
|
|
|
return result; | return result; |
} | } |
| |
static void _BubbleSort(Array<CIMKeyBinding>& x) |
static int _compare(const void* p1, const void* p2) |
{ | { |
Uint32 n = x.size(); |
const CIMKeyBinding* kb1 = (const CIMKeyBinding*)p1; |
|
const CIMKeyBinding* kb2 = (const CIMKeyBinding*)p2; |
|
|
|
return String::compareNoCase( |
|
kb1->getName().getString(), |
|
kb2->getName().getString()); |
|
} |
|
|
|
static void _Sort(Array<CIMKeyBinding>& x) |
|
{ |
|
CIMKeyBinding* data = (CIMKeyBinding*)x.getData(); |
|
Uint32 size = x.size(); |
| |
// | // |
// If the key is a reference, the keys in the reference must also be | // If the key is a reference, the keys in the reference must also be |
// sorted | // sorted |
// | // |
for (Uint32 k = 0; k < n ; k++) |
for (Uint32 k = 0; k < size; k++) |
if (x[k].getType () == CIMKeyBinding::REFERENCE) |
|
{ | { |
CIMObjectPath tmp (x[k].getValue ()); |
CIMKeyBinding& kb = data[k]; |
|
|
|
if (kb.getType() == CIMKeyBinding::REFERENCE) |
|
{ |
|
CIMObjectPath tmp(kb.getValue()); |
Array <CIMKeyBinding> keyBindings = tmp.getKeyBindings (); | Array <CIMKeyBinding> keyBindings = tmp.getKeyBindings (); |
_BubbleSort (keyBindings); |
_Sort(keyBindings); |
tmp.setKeyBindings (keyBindings); | tmp.setKeyBindings (keyBindings); |
x[k].setValue (tmp.toString ()); |
kb.setValue(tmp.toString()); |
|
} |
} | } |
| |
if (n < 2) |
if (size < 2) |
return; | return; |
| |
for (Uint32 i = 0; i < n - 1; i++) |
qsort((void*)data, size, sizeof(CIMKeyBinding), _compare); |
{ |
|
for (Uint32 j = 0; j < n - 1; j++) |
|
{ |
|
if (String::compareNoCase(x[j].getName().getString(), |
|
x[j+1].getName().getString()) > 0) |
|
{ |
|
CIMKeyBinding t = x[j]; |
|
x[j] = x[j+1]; |
|
x[j+1] = t; |
|
} |
|
} |
|
} |
|
} | } |
| |
//////////////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////////////// |
|
|
class CIMObjectPathRep | class CIMObjectPathRep |
{ | { |
public: | public: |
CIMObjectPathRep() |
CIMObjectPathRep(): _refCounter(1) |
{ | { |
} | } |
| |
CIMObjectPathRep(const CIMObjectPathRep& x) | CIMObjectPathRep(const CIMObjectPathRep& x) |
: _host(x._host), _nameSpace(x._nameSpace), |
: _refCounter(1), _host(x._host), _nameSpace(x._nameSpace), |
_className(x._className), _keyBindings(x._keyBindings) | _className(x._className), _keyBindings(x._keyBindings) |
{ | { |
} | } |
|
|
const CIMNamespaceName& nameSpace, | const CIMNamespaceName& nameSpace, |
const CIMName& className, | const CIMName& className, |
const Array<CIMKeyBinding>& keyBindings) | const Array<CIMKeyBinding>& keyBindings) |
: _host(host), _nameSpace(nameSpace), |
: _refCounter(1), _host(host), _nameSpace(nameSpace), |
_className(className), _keyBindings(keyBindings) | _className(className), _keyBindings(keyBindings) |
{ | { |
} | } |
|
|
return addr.isValid(); | return addr.isValid(); |
} | } |
| |
|
// reference counter as member to avoid |
|
// virtual function resolution overhead |
|
AtomicInt _refCounter; |
// | // |
// Contains port as well (e.g., myhost:1234). | // Contains port as well (e.g., myhost:1234). |
// | // |
|
|
Array<CIMKeyBinding> _keyBindings; | Array<CIMKeyBinding> _keyBindings; |
}; | }; |
| |
|
template<class REP> |
|
inline void Ref(REP* rep) |
|
{ |
|
rep->_refCounter++; |
|
} |
|
|
|
template<class REP> |
|
inline void Unref(REP* rep) |
|
{ |
|
if (rep->_refCounter.decAndTestIfZero()) |
|
delete rep; |
|
} |
| |
CIMObjectPath::CIMObjectPath() | CIMObjectPath::CIMObjectPath() |
{ | { |
|
|
| |
CIMObjectPath::CIMObjectPath(const CIMObjectPath& x) | CIMObjectPath::CIMObjectPath(const CIMObjectPath& x) |
{ | { |
_rep = new CIMObjectPathRep(*x._rep); |
_rep = x._rep; |
|
Ref(_rep); |
} | } |
| |
CIMObjectPath::CIMObjectPath(const String& objectName) | CIMObjectPath::CIMObjectPath(const String& objectName) |
|
|
CIMObjectPath tmpRef; | CIMObjectPath tmpRef; |
tmpRef.set(objectName); | tmpRef.set(objectName); |
| |
_rep = new CIMObjectPathRep(*tmpRef._rep); |
_rep = tmpRef._rep; |
|
Ref(_rep); |
} | } |
| |
CIMObjectPath::CIMObjectPath( | CIMObjectPath::CIMObjectPath( |
|
|
// Test the objectName out to see if we get an exception | // Test the objectName out to see if we get an exception |
CIMObjectPath tmpRef; | CIMObjectPath tmpRef; |
tmpRef.set(host, nameSpace, className, keyBindings); | tmpRef.set(host, nameSpace, className, keyBindings); |
|
_rep = tmpRef._rep; |
_rep = new CIMObjectPathRep(*tmpRef._rep); |
Ref(_rep); |
} | } |
| |
CIMObjectPath::~CIMObjectPath() | CIMObjectPath::~CIMObjectPath() |
{ | { |
delete _rep; |
Unref(_rep); |
} | } |
| |
CIMObjectPath& CIMObjectPath::operator=(const CIMObjectPath& x) | CIMObjectPath& CIMObjectPath::operator=(const CIMObjectPath& x) |
{ | { |
*_rep = *x._rep; |
if (x._rep != _rep) |
|
{ |
|
Unref(_rep); |
|
_rep = x._rep; |
|
Ref(_rep); |
|
} |
return *this; | return *this; |
} | } |
| |
|
static inline CIMObjectPathRep* _copyOnWriteCIMObjectPathRep( |
|
CIMObjectPathRep* rep) |
|
{ |
|
if (rep->_refCounter.get() > 1) |
|
{ |
|
CIMObjectPathRep* tmpRep= new CIMObjectPathRep(*rep); |
|
Unref(rep); |
|
return tmpRep; |
|
} |
|
else |
|
{ |
|
return rep; |
|
} |
|
} |
|
|
void CIMObjectPath::clear() | void CIMObjectPath::clear() |
{ | { |
|
// If there is more than one reference |
|
// remove reference and get a new shiny empty representation |
|
if (_rep->_refCounter.get() > 1) |
|
{ |
|
Unref(_rep); |
|
_rep = new CIMObjectPathRep(); |
|
} |
|
else |
|
{ |
|
// If there is only one reference |
|
// no need to copy the data, we own it |
|
// just clear the fields |
_rep->_host.clear(); | _rep->_host.clear(); |
_rep->_nameSpace.clear(); | _rep->_nameSpace.clear(); |
_rep->_className.clear(); | _rep->_className.clear(); |
_rep->_keyBindings.clear(); | _rep->_keyBindings.clear(); |
} | } |
|
} |
| |
void CIMObjectPath::set( | void CIMObjectPath::set( |
const String& host, | const String& host, |
|
|
const CIMName& className, | const CIMName& className, |
const Array<CIMKeyBinding>& keyBindings) | const Array<CIMKeyBinding>& keyBindings) |
{ | { |
setHost(host); |
if ((host != String::EMPTY) && !CIMObjectPathRep::isValidHostname(host)) |
setNameSpace(nameSpace); |
{ |
setClassName(className); |
throw MalformedObjectNameException(host); |
setKeyBindings(keyBindings); |
} |
|
|
|
_rep = _copyOnWriteCIMObjectPathRep(_rep); |
|
|
|
_rep->_host.assign(host); |
|
_rep->_nameSpace = nameSpace; |
|
_rep->_className = className; |
|
_rep->_keyBindings = keyBindings; |
|
_Sort(_rep->_keyBindings); |
} | } |
| |
Boolean _parseHostElement( | Boolean _parseHostElement( |
|
|
*/ | */ |
type = CIMKeyBinding::STRING; | type = CIMKeyBinding::STRING; |
| |
/* Performance shortcut will check for |
|
equal sign instead of doing the full |
|
CIMObjectPath creation and exception handling |
|
*/ |
|
keyValueUTF8.append('\0'); |
|
if (strchr((const char*)keyValueUTF8.getData(), '=')) |
|
{ |
|
// found an equal sign, high probability for a reference |
|
try | try |
{ | { |
CIMObjectPath testForPath(valueString); | CIMObjectPath testForPath(valueString); |
|
|
// Not a reference value; leave type as STRING | // Not a reference value; leave type as STRING |
} | } |
} | } |
} |
|
else if (toupper(*p) == 'T' || toupper(*p) == 'F') | else if (toupper(*p) == 'T' || toupper(*p) == 'F') |
{ | { |
type = CIMKeyBinding::BOOLEAN; | type = CIMKeyBinding::BOOLEAN; |
|
|
} | } |
} | } |
| |
_BubbleSort(keyBindings); |
_Sort(keyBindings); |
} | } |
| |
void CIMObjectPath::set(const String& objectName) | void CIMObjectPath::set(const String& objectName) |
{ | { |
|
// the clear automatically ensures |
|
// we have our own copy of the representation |
clear(); | clear(); |
| |
//-------------------------------------------------------------------------- | //-------------------------------------------------------------------------- |
|
|
| |
CIMObjectPath& CIMObjectPath::operator=(const String& objectName) | CIMObjectPath& CIMObjectPath::operator=(const String& objectName) |
{ | { |
|
// set will call clear, which will cause copyOnWrite if necessary |
set(objectName); | set(objectName); |
return *this; | return *this; |
} | } |
|
|
| |
void CIMObjectPath::setHost(const String& host) | void CIMObjectPath::setHost(const String& host) |
{ | { |
if ((host != String::EMPTY) && !CIMObjectPathRep::isValidHostname(host)) |
if ((host != String::EMPTY) && |
|
(host != System::getHostName()) && |
|
!CIMObjectPathRep::isValidHostname(host)) |
{ | { |
throw MalformedObjectNameException(host); | throw MalformedObjectNameException(host); |
} | } |
|
_rep = _copyOnWriteCIMObjectPathRep(_rep); |
| |
_rep->_host = host; | _rep->_host = host; |
} | } |
|
|
| |
void CIMObjectPath::setNameSpace(const CIMNamespaceName& nameSpace) | void CIMObjectPath::setNameSpace(const CIMNamespaceName& nameSpace) |
{ | { |
|
_rep = _copyOnWriteCIMObjectPathRep(_rep); |
_rep->_nameSpace = nameSpace; | _rep->_nameSpace = nameSpace; |
} | } |
| |
|
|
| |
void CIMObjectPath::setClassName(const CIMName& className) | void CIMObjectPath::setClassName(const CIMName& className) |
{ | { |
|
_rep = _copyOnWriteCIMObjectPathRep(_rep); |
_rep->_className = className; | _rep->_className = className; |
} | } |
| |
|
|
| |
void CIMObjectPath::setKeyBindings(const Array<CIMKeyBinding>& keyBindings) | void CIMObjectPath::setKeyBindings(const Array<CIMKeyBinding>& keyBindings) |
{ | { |
|
_rep = _copyOnWriteCIMObjectPathRep(_rep); |
_rep->_keyBindings = keyBindings; | _rep->_keyBindings = keyBindings; |
_BubbleSort(_rep->_keyBindings); |
_Sort(_rep->_keyBindings); |
} | } |
| |
String CIMObjectPath::toString() const | String CIMObjectPath::toString() const |
|
|
| |
String CIMObjectPath::_toStringCanonical() const | String CIMObjectPath::_toStringCanonical() const |
{ | { |
CIMObjectPath ref = *this; |
CIMObjectPath ref; |
|
*ref._rep = *this->_rep; |
| |
// Normalize hostname by changing to lower case | // Normalize hostname by changing to lower case |
ref._rep->_host.toLower(); // ICU_TODO: | ref._rep->_host.toLower(); // ICU_TODO: |