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_CIMMethod.hpp"
00038 #include "OW_StringBuffer.hpp"
00039 #include "OW_CIMDataType.hpp"
00040 #include "OW_CIMQualifier.hpp"
00041 #include "OW_CIMParameter.hpp"
00042 #include "OW_CIMName.hpp"
00043 #include "OW_Array.hpp"
00044 #include "OW_BinarySerialization.hpp"
00045 #include "OW_StrictWeakOrdering.hpp"
00046 #include "OW_COWIntrusiveCountableBase.hpp"
00047
00048 namespace OW_NAMESPACE
00049 {
00050
00051 using std::ostream;
00052 using std::istream;
00053 using namespace WBEMFlags;
00055 struct CIMMethod::METHData : public COWIntrusiveCountableBase
00056 {
00057 METHData()
00058 : m_propagated(false)
00059 {
00060 }
00061 CIMName m_name;
00062 CIMDataType m_returnDatatype;
00063 CIMQualifierArray m_qualifiers;
00064 CIMParameterArray m_parameters;
00065 CIMName m_originClass;
00066 CIMName m_override;
00067 Bool m_propagated;
00068 METHData* clone() const { return new METHData(*this); }
00069 };
00071 bool operator<(const CIMMethod::METHData& x, const CIMMethod::METHData& y)
00072 {
00073 return StrictWeakOrdering(
00074 x.m_name, y.m_name,
00075 x.m_returnDatatype, y.m_returnDatatype,
00076 x.m_qualifiers, y.m_qualifiers,
00077 x.m_parameters, y.m_parameters,
00078 x.m_originClass, y.m_originClass,
00079 x.m_override, y.m_override,
00080 x.m_propagated, y.m_propagated);
00081 }
00083 CIMMethod::CIMMethod() :
00084 CIMElement(), m_pdata(new METHData)
00085 {
00086 }
00088 CIMMethod::CIMMethod(CIMNULL_t) :
00089 CIMElement(), m_pdata(0)
00090 {
00091 }
00093 CIMMethod::CIMMethod(const char* name) :
00094 CIMElement(), m_pdata(new METHData)
00095 {
00096 m_pdata->m_name = name;
00097 }
00099 CIMMethod::CIMMethod(const CIMName& name) :
00100 CIMElement(), m_pdata(new METHData)
00101 {
00102 m_pdata->m_name = name;
00103 }
00105 CIMMethod::CIMMethod(const CIMMethod& x)
00106 : CIMElement(), m_pdata(x.m_pdata)
00107 {
00108 }
00110 CIMMethod::~CIMMethod()
00111 {
00112 }
00114 void
00115 CIMMethod::setNull()
00116 {
00117 m_pdata = NULL;
00118 }
00120 CIMMethod&
00121 CIMMethod::operator= (const CIMMethod& x)
00122 {
00123 m_pdata = x.m_pdata;
00124 return *this;
00125 }
00127 CIMMethod&
00128 CIMMethod::addQualifier(const CIMQualifier& qual)
00129 {
00130 m_pdata->m_qualifiers.append(qual);
00131 return *this;
00132 }
00134 CIMMethod&
00135 CIMMethod::setQualifiers(const CIMQualifierArray& quals)
00136 {
00137 m_pdata->m_qualifiers = quals;
00138 return *this;
00139 }
00141 CIMQualifierArray
00142 CIMMethod::getQualifiers() const
00143 {
00144 return m_pdata->m_qualifiers;
00145 }
00147 CIMQualifier
00148 CIMMethod::getQualifier(const CIMName& name) const
00149 {
00150 int tsize = m_pdata->m_qualifiers.size();
00151 for (int i = 0; i < tsize; i++)
00152 {
00153 CIMQualifier nq = m_pdata->m_qualifiers[i];
00154 if (nq.getName() == name)
00155 {
00156 return nq;
00157 }
00158 }
00159 return CIMQualifier(CIMNULL);
00160 }
00162 String
00163 CIMMethod::getOriginClass() const
00164 {
00165 return m_pdata->m_originClass.toString();
00166 }
00168 CIMMethod&
00169 CIMMethod::setOriginClass(const CIMName& originCls)
00170 {
00171 m_pdata->m_originClass = originCls;
00172 return *this;
00173 }
00175 CIMMethod&
00176 CIMMethod::addParameter(const CIMParameter& param)
00177 {
00178 m_pdata->m_parameters.append(param);
00179 return *this;
00180 }
00182 CIMMethod&
00183 CIMMethod::setParameters(const CIMParameterArray& inParms)
00184 {
00185 m_pdata->m_parameters = inParms;
00186 return *this;
00187 }
00189 CIMParameterArray
00190 CIMMethod::getParameters() const
00191 {
00192 return m_pdata->m_parameters;
00193 }
00195 CIMParameterArray
00196 CIMMethod::getINParameters() const
00197 {
00198 CIMParameterArray rval;
00199 for (size_t i = 0; i < m_pdata->m_parameters.size(); ++i)
00200 {
00201
00202
00203
00204
00205
00206 CIMQualifier q = m_pdata->m_parameters[i].getQualifier(CIMQualifier::CIM_QUAL_IN);
00207 if (!q || q.getValue() == CIMValue(true))
00208 {
00209 rval.push_back(m_pdata->m_parameters[i]);
00210 }
00211 }
00212
00213 return rval;
00214 }
00216 CIMParameterArray
00217 CIMMethod::getOUTParameters() const
00218 {
00219 CIMParameterArray rval;
00220 for (size_t i = 0; i < m_pdata->m_parameters.size(); ++i)
00221 {
00222 if (m_pdata->m_parameters[i].hasTrueQualifier(CIMQualifier::CIM_QUAL_OUT))
00223 {
00224 rval.push_back(m_pdata->m_parameters[i]);
00225 }
00226 }
00227
00228 return rval;
00229 }
00231 CIMMethod&
00232 CIMMethod::setReturnType(const CIMDataType& type)
00233 {
00234 m_pdata->m_returnDatatype = type;
00235 return *this;
00236 }
00238 CIMDataType
00239 CIMMethod::getReturnType() const
00240 {
00241 return m_pdata->m_returnDatatype;
00242 }
00244 Int32
00245 CIMMethod::getReturnDataSize() const
00246 {
00247 return m_pdata->m_returnDatatype.getSize();
00248 }
00250 CIMMethod&
00251 CIMMethod::setOverridingMethod(const CIMName& omname)
00252 {
00253 m_pdata->m_override = omname;
00254 return *this;
00255 }
00257 String
00258 CIMMethod::getOverridingMethod() const
00259 {
00260 return m_pdata->m_override.toString();
00261 }
00263 CIMMethod
00264 CIMMethod::clone(EIncludeQualifiersFlag includeQualifiers,
00265 EIncludeClassOriginFlag includeClassOrigin) const
00266 {
00267 if (!m_pdata)
00268 {
00269 return CIMMethod(CIMNULL);
00270 }
00271 CIMMethod theMethod;
00272 theMethod.m_pdata->m_name = m_pdata->m_name;
00273 theMethod.m_pdata->m_returnDatatype = m_pdata->m_returnDatatype;
00274 theMethod.m_pdata->m_parameters = m_pdata->m_parameters;
00275 theMethod.m_pdata->m_override = m_pdata->m_override;
00276 theMethod.m_pdata->m_propagated = m_pdata->m_propagated;
00277 if (includeQualifiers)
00278 {
00279 theMethod.m_pdata->m_qualifiers = m_pdata->m_qualifiers;
00280 }
00281 if (includeClassOrigin)
00282 {
00283 theMethod.m_pdata->m_originClass = m_pdata->m_originClass;
00284 }
00285 return theMethod;
00286 }
00288 CIMMethod&
00289 CIMMethod::setPropagated(bool propagated)
00290 {
00291 m_pdata->m_propagated = propagated;
00292 return *this;
00293 }
00295 bool
00296 CIMMethod::getPropagated() const
00297 {
00298 return m_pdata->m_propagated;
00299 }
00301 String
00302 CIMMethod::getName() const
00303 {
00304 return m_pdata->m_name.toString();
00305 }
00307 void
00308 CIMMethod::setName(const CIMName& name)
00309 {
00310 m_pdata->m_name = name;
00311 }
00313 void
00314 CIMMethod::readObject(istream &istrm)
00315 {
00316 CIMName name;
00317 CIMDataType returnDatatype(CIMNULL);
00318 CIMQualifierArray qualifiers;
00319 CIMParameterArray parameters;
00320 CIMName originClass;
00321 CIMName override;
00322 Bool propagated;
00323 CIMBase::readSig( istrm, OW_CIMMETHODSIG );
00324 name.readObject(istrm);
00325 returnDatatype.readObject(istrm);
00326 BinarySerialization::readArray(istrm, qualifiers);
00327 BinarySerialization::readArray(istrm, parameters);
00328 originClass.readObject(istrm);
00329 override.readObject(istrm);
00330 propagated.readObject(istrm);
00331 if (!m_pdata)
00332 {
00333 m_pdata = new METHData;
00334 }
00335 m_pdata->m_name = name;
00336 m_pdata->m_originClass = originClass;
00337 m_pdata->m_override = override;
00338 m_pdata->m_parameters = parameters;
00339 m_pdata->m_propagated = propagated;
00340 m_pdata->m_qualifiers = qualifiers;
00341 m_pdata->m_returnDatatype = returnDatatype;
00342 }
00344 void
00345 CIMMethod::writeObject(ostream &ostrm) const
00346 {
00347 CIMBase::writeSig( ostrm, OW_CIMMETHODSIG );
00348 m_pdata->m_name.writeObject(ostrm);
00349 m_pdata->m_returnDatatype.writeObject(ostrm);
00350 BinarySerialization::writeArray(ostrm, m_pdata->m_qualifiers);
00351 BinarySerialization::writeArray(ostrm, m_pdata->m_parameters);
00352 m_pdata->m_originClass.writeObject(ostrm);
00353 m_pdata->m_override.writeObject(ostrm);
00354 m_pdata->m_propagated.writeObject(ostrm);
00355 }
00357 String
00358 CIMMethod::toMOF() const
00359 {
00360 StringBuffer rv;
00361 size_t i;
00362 if (m_pdata->m_qualifiers.size() > 0)
00363 {
00364 rv += '[';
00365 for (i = 0; i < m_pdata->m_qualifiers.size(); i++)
00366 {
00367 CIMQualifier nq = m_pdata->m_qualifiers[i];
00368 if (i > 0)
00369 {
00370 rv += ',';
00371 }
00372 rv += nq.toMOF();
00373 }
00374 rv += ']';
00375 }
00376 rv += m_pdata->m_returnDatatype.toMOF();
00377 rv += ' ';
00378 rv += m_pdata->m_name.toString();
00379 rv += '(';
00380 if (m_pdata->m_parameters.size() > 0)
00381 {
00382 for (i = 0; i < m_pdata->m_parameters.size(); i++)
00383 {
00384 CIMParameter nq = m_pdata->m_parameters[i];
00385 if (i > 0)
00386 {
00387 rv += ',';
00388 }
00389 rv += nq.toMOF();
00390 }
00391 }
00392 rv += ");\n";
00393 return rv.releaseString();
00394 }
00396 String
00397 CIMMethod::toString() const
00398 {
00399 String rv("CIMMethod NAME = ");
00400 rv += m_pdata->m_name.toString();
00401 return rv;
00402 }
00404 bool operator<(const CIMMethod& x, const CIMMethod& y)
00405 {
00406 return *x.m_pdata < *y.m_pdata;
00407 }
00408
00409 }
00410