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_CIMParameter.hpp"
00038 #include "OW_StringBuffer.hpp"
00039 #include "OW_BinarySerialization.hpp"
00040 #include "OW_StrictWeakOrdering.hpp"
00041 #include "OW_CIMDataType.hpp"
00042 #include "OW_CIMQualifier.hpp"
00043 #include "OW_CIMName.hpp"
00044 #include "OW_COWIntrusiveCountableBase.hpp"
00045 
00046 namespace OW_NAMESPACE
00047 {
00048 
00049 using std::istream;
00050 using std::ostream;
00052 struct CIMParameter::PARMData : public COWIntrusiveCountableBase
00053 {
00054    CIMName m_name;
00055    CIMDataType m_dataType;
00056    CIMQualifierArray m_qualifiers;
00057    PARMData* clone() const { return new PARMData(*this); }
00058 };
00060 bool operator<(const CIMParameter::PARMData& x, const CIMParameter::PARMData& y)
00061 {
00062    return StrictWeakOrdering(
00063       x.m_name, y.m_name,
00064       x.m_dataType, y.m_dataType,
00065       x.m_qualifiers, y.m_qualifiers);
00066 }
00068 CIMParameter::CIMParameter() :
00069    CIMElement(), m_pdata(new PARMData)
00070 {
00071 }
00073 CIMParameter::CIMParameter(CIMNULL_t) :
00074    CIMElement(), m_pdata(0)
00075 {
00076 }
00078 CIMParameter::CIMParameter(const char* name) :
00079    CIMElement(), m_pdata(new PARMData)
00080 {
00081    m_pdata->m_name = name;
00082 }
00084 CIMParameter::CIMParameter(const CIMName& name) :
00085    CIMElement(), m_pdata(new PARMData)
00086 {
00087    m_pdata->m_name = name;
00088 }
00090 CIMParameter::CIMParameter(const CIMParameter& x) :
00091    CIMElement(), m_pdata(x.m_pdata)
00092 {
00093 }
00095 CIMParameter::~CIMParameter()
00096 {
00097 }
00099 void
00100 CIMParameter::setNull()
00101 {
00102    m_pdata = NULL;
00103 }
00105 CIMParameter&
00106 CIMParameter::operator= (const CIMParameter& x)
00107 {
00108    m_pdata = x.m_pdata;
00109    return *this;
00110 }
00112 CIMParameter&
00113 CIMParameter::setQualifiers(const CIMQualifierArray& quals)
00114 {
00115    m_pdata->m_qualifiers = quals;
00116    return *this;
00117 }
00119 CIMQualifierArray
00120 CIMParameter::getQualifiers() const
00121 {
00122    return m_pdata->m_qualifiers;
00123 }
00125 CIMParameter&
00126 CIMParameter::setDataType(const CIMDataType& type)
00127 {
00128    m_pdata->m_dataType = type;
00129    return *this;
00130 }
00132 CIMDataType
00133 CIMParameter::getType() const
00134 {
00135    return m_pdata->m_dataType;
00136 }
00138 Int32
00139 CIMParameter::getDataSize() const
00140 {
00141    return m_pdata->m_dataType.getSize();
00142 }
00144 CIMQualifier
00145 CIMParameter::getQualifier(const CIMName& name) const
00146 {
00147    for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00148    {
00149       CIMQualifier nq = m_pdata->m_qualifiers[i];
00150       if (nq.getName() == name)
00151       {
00152          return nq;
00153       }
00154    }
00155    return CIMQualifier(CIMNULL);
00156 }
00158 String
00159 CIMParameter::getName() const
00160 {
00161    return m_pdata->m_name.toString();
00162 }
00164 void
00165 CIMParameter::setName(const CIMName& name)
00166 {
00167    m_pdata->m_name = name;
00168 }
00170 void
00171 CIMParameter::writeObject(ostream &ostrm) const
00172 {
00173    CIMBase::writeSig( ostrm, OW_CIMPARAMETERSIG );
00174    m_pdata->m_name.writeObject(ostrm);
00175    m_pdata->m_dataType.writeObject(ostrm);
00176    BinarySerialization::writeArray(ostrm, m_pdata->m_qualifiers);
00177 }
00179 void
00180 CIMParameter::readObject(istream &istrm)
00181 {
00182    CIMName name;
00183    CIMDataType dataType(CIMNULL);
00184    CIMQualifierArray qualifiers;
00185    CIMBase::readSig( istrm, OW_CIMPARAMETERSIG );
00186    name.readObject(istrm);
00187    dataType.readObject(istrm);
00188    BinarySerialization::readArray(istrm, qualifiers);
00189    if (!m_pdata)
00190    {
00191       m_pdata = new PARMData;
00192    }
00193    m_pdata->m_name = name;
00194    m_pdata->m_dataType = dataType;
00195    m_pdata->m_qualifiers = qualifiers;
00196 }
00198 String
00199 CIMParameter::toString() const
00200 {
00201    return "CIMParameter(" + m_pdata->m_name.toString() + ")";
00202 }
00204 String
00205 CIMParameter::toMOF() const
00206 {
00207    StringBuffer rv;
00208    if (m_pdata->m_qualifiers.size() > 0)
00209    {
00210       rv += '[';
00211       for (size_t i = 0; i < m_pdata->m_qualifiers.size(); i++)
00212       {
00213          CIMQualifier nq = m_pdata->m_qualifiers[i];
00214          if (i > 0)
00215          {
00216             rv += ',';
00217          }
00218          rv += nq.toMOF();
00219       }
00220       rv += ']';
00221    }
00222    rv += m_pdata->m_dataType.toMOF();
00223    rv += ' ';
00224    rv += m_pdata->m_name.toString();
00225    if (m_pdata->m_dataType.isArrayType())
00226    {
00227       rv += '[';
00228       int arraySize = m_pdata->m_dataType.getSize();
00229       if (arraySize != -1)
00230       {
00231          rv += arraySize;
00232       }
00233       rv += ']';
00234    }
00235    return rv.releaseString();
00236 }
00238 bool operator<(const CIMParameter& x, const CIMParameter& y)
00239 {
00240    return *x.m_pdata < *y.m_pdata;
00241 }
00243 bool 
00244 CIMParameter::hasTrueQualifier(const CIMName& name) const
00245 {
00246    CIMQualifier q = getQualifier(name);
00247    if (!q)
00248    {
00249       return false;
00250    }
00251    CIMValue v = q.getValue();
00252    if (!v)
00253    {
00254       return false;
00255    }
00256    if (v.getType() != CIMDataType::BOOLEAN)
00257    {
00258       return false;
00259    }
00260    Bool b;
00261    v.get(b);
00262    return b;
00263 }
00264 
00265 } 
00266