00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_CIMClass.hpp"
00038 #include "OW_StringBuffer.hpp"
00039 #include "OW_Assertion.hpp"
00040 #include "OW_CIMQualifier.hpp"
00041 #include "OW_CIMQualifierType.hpp"
00042 #include "OW_CIMProperty.hpp"
00043 #include "OW_CIMMethod.hpp"
00044 #include "OW_CIMInstance.hpp"
00045 #include "OW_CIMUrl.hpp"
00046 #include "OW_CIMValue.hpp"
00047 #include "OW_CIMName.hpp"
00048 #include "OW_BinarySerialization.hpp"
00049 #include "OW_StrictWeakOrdering.hpp"
00050 #include "OW_COWIntrusiveCountableBase.hpp"
00051
00052 #include <algorithm>
00053
00054 namespace OW_NAMESPACE
00055 {
00056
00057 using std::istream;
00058 using std::ostream;
00059 using namespace WBEMFlags;
00060
00062 struct CIMClass::CLSData : public COWIntrusiveCountableBase
00063 {
00064 CLSData() :
00065 m_associationFlag(false), m_isKeyed(false){ }
00066 CIMName m_name;
00067 CIMName m_parentClassName;
00068 CIMQualifierArray m_qualifiers;
00069 CIMPropertyArray m_properties;
00070 CIMMethodArray m_methods;
00071 Bool m_associationFlag;
00072 Bool m_isKeyed;
00073 CLSData* clone() const { return new CLSData(*this); }
00074 };
00076 bool operator<(const CIMClass::CLSData& x, const CIMClass::CLSData& y)
00077 {
00078 return StrictWeakOrdering(x.m_name, y.m_name,
00079 x.m_parentClassName, y.m_parentClassName,
00080 x.m_qualifiers, y.m_qualifiers,
00081 x.m_properties, y.m_properties,
00082 x.m_methods, y.m_methods);
00083 }
00085 bool operator==(const CIMClass::CLSData& x, const CIMClass::CLSData& y)
00086 {
00087 return x.m_name == y.m_name &&
00088 x.m_parentClassName == y.m_parentClassName &&
00089 x.m_qualifiers == y.m_qualifiers &&
00090 x.m_properties == y.m_properties &&
00091 x.m_methods == y.m_methods;
00092 }
00094 CIMClass::CIMClass() :
00095 m_pdata(new CLSData)
00096 {
00097 }
00099 CIMClass::CIMClass(CIMNULL_t) :
00100 m_pdata(0)
00101 {
00102 }
00104 CIMClass::CIMClass(const char* name) :
00105 m_pdata(new CLSData)
00106 {
00107 m_pdata->m_name = name;
00108 }
00110 CIMClass::CIMClass(const CIMName& name) :
00111 m_pdata(new CLSData)
00112 {
00113 m_pdata->m_name = name;
00114 }
00116 void
00117 CIMClass::setName(const CIMName& name)
00118 {
00119 m_pdata->m_name = name;
00120 }
00122 String
00123 CIMClass::getSuperClass() const
00124 {
00125 return m_pdata->m_parentClassName.toString();
00126 }
00128 CIMClass&
00129 CIMClass::setSuperClass(const CIMName& pname)
00130 {
00131 m_pdata->m_parentClassName = pname;
00132 return *this;
00133 }
00135 bool
00136 CIMClass::isKeyed() const
00137 {
00138 return m_pdata->m_isKeyed;
00139 }
00141 CIMClass&
00142 CIMClass::setIsKeyed(bool isKeyedParm)
00143 {
00144 m_pdata->m_isKeyed = isKeyedParm;
00145 return *this;
00146 }
00148 CIMPropertyArray
00149 CIMClass::getKeys() const
00150 {
00151 CIMPropertyArray v;
00152 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00153 {
00154 const CIMProperty& p = m_pdata->m_properties[i];
00155 if (p.isKey())
00156 {
00157 v.append(p);
00158 }
00159 }
00160 return v;
00161 }
00163 CIMQualifier
00164 CIMClass::getQualifier(const CIMName& name) const
00165 {
00166 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00167 {
00168 CIMQualifier q = m_pdata->m_qualifiers[i];
00169 if (q.getName() == name)
00170 {
00171 return q;
00172 }
00173 }
00174 return CIMQualifier(CIMNULL);
00175 }
00177 CIMProperty
00178 CIMClass::getProperty(const CIMName& prpName) const
00179 {
00180 return getProperty(prpName, "");
00181 }
00183 CIMProperty
00184 CIMClass::getProperty(const CIMName& name,
00185 const CIMName& originClass) const
00186 {
00187
00188
00189
00190
00191 if (originClass != "")
00192 {
00193 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00194 {
00195 CIMProperty cp = m_pdata->m_properties[i];
00196 if (cp.getOriginClass() == originClass && cp.getName() == name)
00197 {
00198 return cp;
00199 }
00200 }
00201 }
00202 else
00203 {
00204 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00205 {
00206 CIMProperty cp = m_pdata->m_properties[i];
00207 if (cp.getName() == name)
00208 {
00209 return(cp);
00210 }
00211 }
00212 }
00213 return CIMProperty(CIMNULL);
00214 }
00216 CIMMethod
00217 CIMClass::getMethod(const CIMName& name) const
00218 {
00219 return getMethod(name, "");
00220 }
00222 CIMMethod
00223 CIMClass::getMethod(const CIMName& name,
00224 const CIMName& originClass) const
00225 {
00226
00227
00228
00229
00230 if (originClass != "")
00231 {
00232 int tsize = m_pdata->m_methods.size();
00233 for (int i = 0; i < tsize; i++)
00234 {
00235 CIMMethod q = m_pdata->m_methods[i];
00236 if (q.getOriginClass() == originClass && (q.getName() == name))
00237 {
00238 return q;
00239 }
00240 }
00241 }
00242 else
00243 {
00244 int tsize = m_pdata->m_methods.size();
00245 for (int i = 0; i < tsize; i++)
00246 {
00247 CIMMethod q = m_pdata->m_methods[i];
00248 if (q.getName() == name)
00249 {
00250 return q;
00251 }
00252 }
00253 }
00254 return CIMMethod(CIMNULL);
00255 }
00257 bool
00258 CIMClass::isAssociation() const
00259 {
00260 return m_pdata->m_associationFlag;
00261 }
00263 CIMClass&
00264 CIMClass::setIsAssociation(bool isAssocFlag)
00265 {
00266 m_pdata->m_associationFlag = isAssocFlag;
00267 return *this;
00268 }
00270 CIMQualifierArray
00271 CIMClass::getQualifiers() const
00272 {
00273 return m_pdata->m_qualifiers;
00274 }
00276 CIMPropertyArray
00277 CIMClass::getAllProperties() const
00278 {
00279 return m_pdata->m_properties;
00280 }
00282 String
00283 CIMClass::getKeyClass() const
00284 {
00285 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00286 {
00287 CIMProperty p = m_pdata->m_properties[i];
00288 if (p.isKey())
00289 {
00290 return p.getOriginClass();
00291 }
00292 }
00293 return String();
00294 }
00296 CIMPropertyArray
00297 CIMClass::getProperties() const
00298 {
00299 CIMPropertyArray prop;
00300 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00301 {
00302 CIMProperty cp = m_pdata->m_properties[i];
00303 if (!cp.hasTrueQualifier(CIMQualifier::CIM_QUAL_OVERRIDE))
00304 {
00305 prop.append(cp);
00306 }
00307 }
00308 return(prop);
00309 }
00311 CIMMethodArray
00312 CIMClass::getAllMethods() const
00313 {
00314 return m_pdata->m_methods;
00315 }
00317 CIMMethodArray
00318 CIMClass::getMethods() const
00319 {
00320 CIMMethodArray meth;
00321 int tsize = m_pdata->m_methods.size();
00322 for (int i = 0; i < tsize; i++)
00323 {
00324 CIMMethod cm = m_pdata->m_methods[i];
00325 if (cm.getQualifier(CIMQualifier::CIM_QUAL_OVERRIDE))
00326 {
00327 meth.append(cm);
00328 }
00329 }
00330 return meth;
00331 }
00333 CIMClass&
00334 CIMClass::addProperty(const CIMProperty& prop)
00335 {
00336 if (prop)
00337 {
00338 m_pdata->m_properties.append(prop);
00339 if (prop.isKey())
00340 {
00341 m_pdata->m_isKeyed = true;
00342 }
00343 }
00344 return *this;
00345 }
00347 int
00348 CIMClass::numberOfProperties() const
00349 {
00350 return m_pdata->m_properties.size();
00351 }
00353 CIMClass&
00354 CIMClass::setProperties(const CIMPropertyArray& props)
00355 {
00356 m_pdata->m_properties = props;
00357 return *this;
00358 }
00360 CIMClass&
00361 CIMClass::setProperty(const CIMProperty& prop)
00362 {
00363 CIMName argName = prop.getName();
00364 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00365 {
00366 if (argName == m_pdata->m_properties[i].getName())
00367 {
00368 m_pdata->m_properties[i] = prop;
00369 return *this;
00370 }
00371 }
00372 m_pdata->m_properties.append(prop);
00373 return *this;
00374 }
00376 CIMClass&
00377 CIMClass::setMethod(const CIMMethod& meth)
00378 {
00379 CIMName argName = meth.getName();
00380 for (size_t i = 0; i < m_pdata->m_methods.size(); i++)
00381 {
00382 if (argName == m_pdata->m_methods[i].getName())
00383 {
00384 m_pdata->m_methods[i] = meth;
00385 return *this;
00386 }
00387 }
00388 m_pdata->m_methods.append(meth);
00389 return *this;
00390 }
00392 CIMClass&
00393 CIMClass::addQualifier(const CIMQualifier& qual)
00394 {
00395 if (!qual)
00396 {
00397 return *this;
00398 }
00399
00400
00401
00402 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00403 {
00404 if (m_pdata->m_qualifiers[i].equals(qual))
00405 {
00406 m_pdata->m_qualifiers.remove(i);
00407 break;
00408 }
00409 }
00410 if (qual.getName().equalsIgnoreCase(CIMQualifier::CIM_QUAL_ASSOCIATION))
00411 {
00412 CIMValue v = qual.getValue();
00413 if (v && v.getType() == CIMDataType::BOOLEAN)
00414 {
00415 Bool b;
00416 qual.getValue().get(b);
00417 m_pdata->m_associationFlag = b;
00418 }
00419 else
00420 {
00421 m_pdata->m_associationFlag = false;
00422 }
00423 }
00424 m_pdata->m_qualifiers.append(qual);
00425 return *this;
00426 }
00428 bool
00429 CIMClass::hasQualifier(const CIMQualifier& qual) const
00430 {
00431 if (qual)
00432 {
00433 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00434 {
00435 if (m_pdata->m_qualifiers[i].equals(qual))
00436 {
00437 return true;
00438 }
00439 }
00440 }
00441 return false;
00442 }
00444 int
00445 CIMClass::numberOfQualifiers() const
00446 {
00447 return m_pdata->m_qualifiers.size();
00448 }
00450 bool
00451 CIMClass::removeQualifier(const CIMQualifier& qual)
00452 {
00453 bool cc = false;
00454 if (qual)
00455 {
00456 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00457 {
00458 CIMQualifier cq = m_pdata->m_qualifiers[i];
00459 if (cq.equals(qual))
00460 {
00461 m_pdata->m_qualifiers.remove(i);
00462 cc = true;
00463 break;
00464 }
00465 }
00466 }
00467 return cc;
00468 }
00470 bool
00471 CIMClass::removeQualifier(const CIMName& name)
00472 {
00473 bool cc = false;
00474 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00475 {
00476 CIMQualifier cq = m_pdata->m_qualifiers[i];
00477 if (cq.getName() == name)
00478 {
00479 m_pdata->m_qualifiers.remove(i);
00480 cc = true;
00481 break;
00482 }
00483 }
00484 return cc;
00485 }
00487 bool
00488 CIMClass::removeProperty(const CIMName& name)
00489 {
00490 bool cc = false;
00491 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00492 {
00493 CIMProperty prop = m_pdata->m_properties[i];
00494 if (prop.getName() == name)
00495 {
00496 m_pdata->m_properties.remove(i);
00497 cc = true;
00498 break;
00499 }
00500 }
00501 return cc;
00502 }
00504 CIMClass&
00505 CIMClass::setQualifiers(const CIMQualifierArray& quals)
00506 {
00507 m_pdata->m_qualifiers = quals;
00508 return *this;
00509 }
00511 CIMClass&
00512 CIMClass::setQualifier(const CIMQualifier& qual)
00513 {
00514 if (qual)
00515 {
00516 bool found = false;
00517 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00518 {
00519 CIMQualifier cq = m_pdata->m_qualifiers[i];
00520 if (cq.equals(qual))
00521 {
00522 m_pdata->m_qualifiers[i] = qual;
00523 found = true;
00524 break;
00525 }
00526 }
00527 if (!found)
00528 {
00529 m_pdata->m_qualifiers.append(qual);
00530 }
00531 }
00532 return *this;
00533 }
00535 CIMClass&
00536 CIMClass::addMethod(const CIMMethod& meth)
00537 {
00538 if (meth)
00539 {
00540 m_pdata->m_methods.append(meth);
00541 }
00542 return *this;
00543 }
00545 CIMClass&
00546 CIMClass::setMethods(const CIMMethodArray& meths)
00547 {
00548 m_pdata->m_methods = meths;
00549 return *this;
00550 }
00552 CIMInstance
00553 CIMClass::newInstance() const
00554 {
00555 CIMInstance cInstance;
00556 cInstance.syncWithClass(*this, E_INCLUDE_QUALIFIERS);
00557 cInstance.setClassName(m_pdata->m_name);
00558 return cInstance;
00559 }
00561 CIMClass
00562 CIMClass::filterProperties(const StringArray& propertyList,
00563 EIncludeQualifiersFlag includeQualifiers,
00564 EIncludeClassOriginFlag includeClassOrigin) const
00565 {
00566 return clone(E_NOT_LOCAL_ONLY, includeQualifiers, includeClassOrigin,
00567 propertyList, false);
00568 }
00570 CIMClass
00571 CIMClass::clone(ELocalOnlyFlag localOnly, EIncludeQualifiersFlag includeQualifiers,
00572 EIncludeClassOriginFlag includeClassOrigin, const StringArray& propertyList,
00573 bool noProps) const
00574 {
00575 if (!m_pdata)
00576 {
00577 return CIMClass(CIMNULL);
00578 }
00579 CIMClass theClass;
00580 theClass.m_pdata->m_name = m_pdata->m_name;
00581 theClass.m_pdata->m_parentClassName = m_pdata->m_parentClassName;
00582 theClass.m_pdata->m_associationFlag = m_pdata->m_associationFlag;
00583 theClass.m_pdata->m_isKeyed = m_pdata->m_isKeyed;
00584
00585
00586
00587 if (includeQualifiers)
00588 {
00589 CIMQualifierArray qra;
00590 for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00591 {
00592 CIMQualifier cq = m_pdata->m_qualifiers[i];
00593 if (localOnly && cq.getPropagated() == true)
00594 {
00595 continue;
00596 }
00597 qra.append(cq);
00598 }
00599 theClass.m_pdata->m_qualifiers = qra;
00600 }
00601 if (!noProps)
00602 {
00603 CIMPropertyArray pra;
00604 for (size_t i = 0; i < m_pdata->m_properties.size(); i++)
00605 {
00606 CIMProperty prop = m_pdata->m_properties[i];
00607 if (localOnly && prop.getPropagated() == true)
00608 {
00609 continue;
00610 }
00611
00612
00613 if (propertyList.size() > 0)
00614 {
00615 CIMName pName = prop.getName();
00616 for (size_t j = 0; j < propertyList.size(); j++)
00617 {
00618 if (pName == propertyList[j])
00619 {
00620 pra.append(prop.clone(includeQualifiers,
00621 includeClassOrigin));
00622 break;
00623 }
00624 }
00625 }
00626 else
00627 {
00628 pra.append(prop.clone(includeQualifiers,
00629 includeClassOrigin));
00630 }
00631 }
00632 theClass.m_pdata->m_properties = pra;
00633 }
00634
00635 CIMMethodArray mra;
00636 for (size_t i = 0; i < m_pdata->m_methods.size(); i++)
00637 {
00638 CIMMethod meth = m_pdata->m_methods[i];
00639 if (localOnly && meth.getPropagated() == true)
00640 {
00641 continue;
00642 }
00643 mra.append(meth.clone(includeQualifiers, includeClassOrigin));
00644 }
00645 theClass.m_pdata->m_methods = mra;
00646 return theClass;
00647 }
00649 void
00650 CIMClass::readObject(istream &istrm)
00651 {
00652 CIMName name;
00653 CIMName pcName;
00654 CIMQualifierArray qra;
00655 CIMPropertyArray pra;
00656 CIMMethodArray mra;
00657 Bool isAssocFlag;
00658 Bool isK;
00659
00660 UInt32 version = CIMBase::readSig(istrm, OW_CIMCLASSSIG, OW_CIMCLASSSIG_V, CIMClass::SERIALIZATION_VERSION);
00661 name.readObject(istrm);
00662 pcName.readObject(istrm);
00663 isAssocFlag.readObject(istrm);
00664 isK.readObject(istrm);
00665 BinarySerialization::readArray(istrm, qra);
00666 BinarySerialization::readArray(istrm, pra);
00667 BinarySerialization::readArray(istrm, mra);
00668
00669
00670 if (version == 1)
00671 {
00672 String language;
00673 language.readObject(istrm);
00674 }
00675 if (!m_pdata)
00676 {
00677 m_pdata = new CLSData;
00678 }
00679 m_pdata->m_name = name;
00680 m_pdata->m_parentClassName = pcName;
00681 m_pdata->m_associationFlag = isAssocFlag;
00682 m_pdata->m_isKeyed = isK;
00683 m_pdata->m_qualifiers = qra;
00684 m_pdata->m_properties = pra;
00685 m_pdata->m_methods = mra;
00686 }
00688 void
00689 CIMClass::writeObject(ostream &ostrm) const
00690 {
00691
00692
00693
00694
00695
00696
00697 CIMBase::writeSig(ostrm, OW_CIMCLASSSIG);
00698 m_pdata->m_name.writeObject(ostrm);
00699 m_pdata->m_parentClassName.writeObject(ostrm);
00700 m_pdata->m_associationFlag.writeObject(ostrm);
00701 m_pdata->m_isKeyed.writeObject(ostrm);
00702 BinarySerialization::writeArray(ostrm, m_pdata->m_qualifiers);
00703 BinarySerialization::writeArray(ostrm, m_pdata->m_properties);
00704 BinarySerialization::writeArray(ostrm, m_pdata->m_methods);
00705 }
00707 String
00708 CIMClass::toMOF() const
00709 {
00710 size_t i;
00711 StringBuffer rv;
00712 if (m_pdata->m_qualifiers.size() != 0)
00713 {
00714 rv += "[";
00715 CIMQualifierArray qra = m_pdata->m_qualifiers;
00716
00717
00718
00719
00720 CIMQualifierArray::iterator iter = std::find(
00721 qra.begin(), qra.end(),
00722 CIMQualifier(CIMQualifier::CIM_QUAL_ASSOCIATION));
00723 if (iter != qra.end())
00724 {
00725 if (iter != qra.begin())
00726 {
00727
00728 CIMQualifier tmp = *iter;
00729 qra.erase(iter);
00730 qra.insert(qra.begin(), tmp);
00731 }
00732 }
00733 else
00734 {
00735
00736
00737
00738
00739
00740
00741
00742
00743 }
00744 iter = std::find( qra.begin(), qra.end(),
00745 CIMQualifier(CIMQualifier::CIM_QUAL_INDICATION));
00746 if (iter != qra.end())
00747 {
00748 std::swap(*iter, *qra.begin());
00749 }
00750 for (i = 0; i < qra.size(); i++)
00751 {
00752 if (i > 0)
00753 {
00754 rv += ",\n ";
00755 }
00756 rv += qra[i].toMOF();
00757 }
00758 rv += "]\n";
00759 }
00760 rv += "class ";
00761 rv += getName();
00762 if (m_pdata->m_parentClassName != "")
00763 {
00764 rv += ':';
00765 rv += m_pdata->m_parentClassName.toString();
00766 }
00767 rv += "\n{\n";
00768 for (i = 0; i < m_pdata->m_properties.size(); i++)
00769 {
00770 rv += m_pdata->m_properties[i].toMOF();
00771
00772 }
00773 for (i = 0; i < m_pdata->m_methods.size(); i++)
00774 {
00775 rv += m_pdata->m_methods[i].toMOF();
00776
00777 }
00778 rv += "};\n";
00779 return rv.releaseString();
00780 }
00782 String
00783 CIMClass::toString() const
00784 {
00785 return toMOF();
00786 }
00788 CIMClass::~CIMClass()
00789 {
00790 }
00792 CIMClass::CIMClass(const CIMClass& x)
00793 : CIMElement(x)
00794 , m_pdata(x.m_pdata)
00795 {
00796 }
00798 CIMClass& CIMClass::operator=(const CIMClass& x)
00799 {
00800 m_pdata = x.m_pdata;
00801 return *this;
00802 }
00804 void
00805 CIMClass::setNull()
00806 {
00807 m_pdata = NULL;
00808 }
00810 String
00811 CIMClass::getName() const
00812 {
00813 return m_pdata->m_name.toString();
00814 }
00816 bool operator<(const CIMClass& x, const CIMClass& y)
00817 {
00818 return *x.m_pdata < *y.m_pdata;
00819 }
00820
00822 bool operator==(const CIMClass& x, const CIMClass& y)
00823 {
00824 return *x.m_pdata == *y.m_pdata;
00825 }
00826
00828 bool operator<=(const CIMClass& x, const CIMClass& y)
00829 {
00830 return !(y < x);
00831 }
00832
00834 bool operator>(const CIMClass& x, const CIMClass& y)
00835 {
00836 return y < x;
00837 }
00838
00840 bool operator>=(const CIMClass& x, const CIMClass& y)
00841 {
00842 return !(x < y);
00843 }
00844
00846 bool operator!=(const CIMClass& x, const CIMClass& y)
00847 {
00848 return !(x == y);
00849 }
00850
00852 const char* const CIMClass::NAMESPACECLASS = "__Namespace";
00854 StringArray
00855 CIMClass::getCloneProps(ELocalOnlyFlag localOnly, EDeepFlag deep,
00856 const StringArray* propertyList,
00857 const CIMClass& requestedClass) const
00858 {
00859 if (propertyList && propertyList->size() == 0)
00860 {
00861 return StringArray();
00862 }
00863 StringArray rv = this->getCloneProps(E_NOT_LOCAL_ONLY, propertyList);
00864
00865
00866 if (deep != E_DEEP || localOnly != E_NOT_LOCAL_ONLY)
00867 {
00868 CIMPropertyArray props = this->getAllProperties();
00869 CIMName requestedClassName = requestedClass.getName();
00870 for (size_t i = 0; i < props.size(); ++i)
00871 {
00872 CIMProperty p = props[i];
00873 CIMProperty clsp = requestedClass.getProperty(p.getName());
00874 if (clsp)
00875 {
00876 if (clsp.getOriginClass() == requestedClassName)
00877 {
00878 rv.push_back(p.getName());
00879 continue;
00880 }
00881 }
00882 if (deep == E_DEEP)
00883 {
00884 if (!clsp || p.getOriginClass() != clsp.getOriginClass())
00885 {
00886
00887 rv.push_back(p.getName());
00888 continue;
00889 }
00890 }
00891 if (localOnly == E_NOT_LOCAL_ONLY)
00892 {
00893 if (clsp)
00894 {
00895
00896 rv.push_back(p.getName());
00897 continue;
00898 }
00899 }
00900 }
00901 }
00902 return rv;
00903 }
00905 StringArray
00906 CIMClass::getCloneProps(ELocalOnlyFlag localOnly,
00907 const StringArray* propertyList) const
00908 {
00909 StringArray props;
00910 if (propertyList && propertyList->size() == 0)
00911 {
00912 return props;
00913 }
00914 for (size_t i = 0; i < this->getAllProperties().size(); i++)
00915 {
00916 CIMProperty prop = this->getAllProperties()[i];
00917 if (localOnly && prop.getPropagated())
00918 {
00919 continue;
00920 }
00921
00922
00923
00924 if (propertyList)
00925 {
00926 CIMName pName = prop.getName();
00927 for (size_t j = 0; j < propertyList->size(); j++)
00928 {
00929 if (pName == (*propertyList)[j])
00930 {
00931 props.push_back(prop.getName());
00932 break;
00933 }
00934 }
00935 }
00936 else
00937 {
00938 props.append(prop.getName());
00939 }
00940 }
00941 return props;
00942 }
00943
00944 }
00945