(file) Return to SCMOXmlWriter.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

   1 thilo.boehm 1.2 //%LICENSE////////////////////////////////////////////////////////////////
   2                 //
   3                 // Licensed to The Open Group (TOG) under one or more contributor license
   4                 // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   5                 // this work for additional information regarding copyright ownership.
   6                 // Each contributor licenses this file to you under the OpenPegasus Open
   7                 // Source License; you may not use this file except in compliance with the
   8                 // License.
   9                 //
  10                 // Permission is hereby granted, free of charge, to any person obtaining a
  11                 // copy of this software and associated documentation files (the "Software"),
  12                 // to deal in the Software without restriction, including without limitation
  13                 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14                 // and/or sell copies of the Software, and to permit persons to whom the
  15                 // Software is furnished to do so, subject to the following conditions:
  16                 //
  17                 // The above copyright notice and this permission notice shall be included
  18                 // in all copies or substantial portions of the Software.
  19                 //
  20                 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21                 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 thilo.boehm 1.2 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23                 // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  24                 // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25                 // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26                 // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27                 //
  28                 //////////////////////////////////////////////////////////////////////////
  29                 //
  30 marek       1.7 // This code implements part of PEP#348 - The CMPI infrastructure using SCMO
  31                 // (Single Chunk Memory Objects).
  32                 // The design document can be found on the OpenPegasus website openpegasus.org
  33                 // at https://collaboration.opengroup.org/pegasus/pp/documents/21210/PEP_348.pdf
  34                 //
  35 thilo.boehm 1.2 //%/////////////////////////////////////////////////////////////////////////////
  36                 
  37                 #include <Pegasus/Common/Config.h>
  38                 #include <cstdlib>
  39                 #include <cstdio>
  40                 #include <Pegasus/Common/SCMOXmlWriter.h>
  41 anusha.kandepu 1.5 #include "Tracer.h"
  42 thilo.boehm    1.2 
  43                    PEGASUS_NAMESPACE_BEGIN
  44 karl           1.10 
  45 karl           1.8  void SCMOXmlWriter::buildPropertyFilterNodesArray(
  46                          Array<Uint32> & nodes,
  47                          const SCMOClass * classPtr,
  48                          const CIMPropertyList & propertyList)
  49                     {
  50                         for (Uint32 i=0,k=propertyList.size(); i<k; i++)
  51                         {
  52                             Uint32 node = 0;
  53                             const CIMName & name = propertyList[i];
  54                             SCMO_RC rc =
  55 karl           1.10             classPtr->_getPropertyNodeIndex(
  56 karl           1.8                  node,
  57                                     (const char *)name.getString().getCString());
  58                             if(rc == SCMO_OK)
  59                             {
  60                                 nodes.append(node);
  61                             }
  62                         }
  63 anusha.kandepu 1.5  }
  64                     
  65 karl           1.8  const Array<Uint32> & SCMOXmlWriter::getFilteredNodesArray(
  66                          Array<propertyFilterNodesArray_t> & propFilterNodesArrays,
  67                          const SCMOInstance& scmoInstance,
  68                          const CIMPropertyList & propertyList)
  69                     {
  70                         //First see if the class ptr is already stored in the propFilterNodesArrays
  71                         const SCMOClass * classPtr = scmoInstance.inst.hdr->theClass.ptr;
  72                         SCMBClass_Main * classPtrMemBlock = classPtr->cls.hdr;
  73                         for (int i=0, k=propFilterNodesArrays.size(); i < k; i++)
  74                         {
  75                             if (classPtrMemBlock == propFilterNodesArrays[i].classPtrMemBlock)
  76                             {
  77                                 return propFilterNodesArrays[i].nodes;
  78                             }
  79                         }
  80                     
  81                         // Could not find the class pointer of this SCMOInstance in the
  82                         // property filter nodes array
  83                         // --> need to create the new entry and return that
  84                         propertyFilterNodesArray_t newEntry;
  85                         newEntry.classPtrMemBlock = classPtrMemBlock;
  86 karl           1.8      SCMOXmlWriter::buildPropertyFilterNodesArray(
  87                             newEntry.nodes,
  88                             classPtr,
  89                             propertyList);
  90                         propFilterNodesArrays.append(newEntry);
  91                     
  92                         // return the new nodes entry, but as a reference into the array
  93                         return propFilterNodesArrays[propFilterNodesArrays.size()-1].nodes;
  94                     }
  95                     
  96                     void SCMOXmlWriter::appendValueSCMOInstanceElements(
  97                          Buffer& out,
  98                          const Array<SCMOInstance> & _scmoInstances,
  99                          const CIMPropertyList & propertyList)
 100                     {
 101                         if (propertyList.isNull())
 102                         {
 103                             Array<Uint32> emptyNodes;
 104                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 105                             {
 106                                 SCMOXmlWriter::appendValueSCMOInstanceElement(
 107 karl           1.8                  out,
 108                                     _scmoInstances[i],
 109                                     false,
 110                                     emptyNodes);
 111                             }
 112                         }
 113                         else
 114                         {
 115                             Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 116                     
 117                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 118                             {
 119                                 // This searches for an already created array of nodes,
 120                                 // if not found, creates it inside propFilterNodesArrays
 121                                 const Array<Uint32> & nodes=
 122                                     SCMOXmlWriter::getFilteredNodesArray(
 123                                         propFilterNodesArrays,
 124                                         _scmoInstances[i],
 125                                         propertyList);
 126                     
 127                                 SCMOXmlWriter::appendValueSCMOInstanceElement(
 128 karl           1.8                  out,
 129                                     _scmoInstances[i],
 130                                     true,
 131                                     nodes);
 132                             }
 133                         }
 134                     }
 135 thilo.boehm    1.2  
 136 karl           1.9  // EXP_PULL_BEGIN
 137                     void SCMOXmlWriter::appendValueSCMOInstanceWithPathElements(
 138                          Buffer& out,
 139                          const Array<SCMOInstance> & _scmoInstances,
 140                          const CIMPropertyList & propertyList)
 141                     {
 142                         if (propertyList.isNull())
 143                         {
 144                             Array<Uint32> emptyNodes;
 145                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 146                             {
 147                                 SCMOXmlWriter::appendValueInstanceWithPathElement(
 148                                     out,
 149                                     _scmoInstances[i],
 150                                     false,
 151                                     emptyNodes);
 152                             }
 153                         }
 154                         else
 155                         {
 156                             Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 157 karl           1.9  
 158                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 159                             {
 160                                 // This searches for an already created array of nodes,
 161                                 // if not found, creates it inside propFilterNodesArrays
 162                                 const Array<Uint32> & nodes=
 163                                     SCMOXmlWriter::getFilteredNodesArray(
 164                                         propFilterNodesArrays,
 165                                         _scmoInstances[i],
 166                                         propertyList);
 167                     
 168                                 SCMOXmlWriter::appendValueInstanceWithPathElement(
 169                                     out,
 170                                     _scmoInstances[i],
 171                                     true,
 172                                     nodes);
 173                             }
 174                         }
 175                     }
 176                     //EXP_PULL_END
 177                     
 178 thilo.boehm    1.2  void SCMOXmlWriter::appendValueSCMOInstanceElement(
 179                         Buffer& out,
 180 anusha.kandepu 1.5      const SCMOInstance& scmoInstance,
 181 karl           1.8      bool filtered,
 182                         const Array<Uint32> & nodes)
 183 anusha.kandepu 1.5  
 184 thilo.boehm    1.2  {
 185                         out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 186                     
 187                         appendInstanceNameElement(out, scmoInstance);
 188 anusha.kandepu 1.5      appendInstanceElement(out, scmoInstance,filtered,nodes);
 189 thilo.boehm    1.2  
 190                         out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
 191                     }
 192                     
 193                     void SCMOXmlWriter::appendInstanceNameElement(
 194                         Buffer& out,
 195                         const SCMOInstance& scmoInstance)
 196                     {
 197                         out << STRLIT("<INSTANCENAME CLASSNAME=\"");
 198                         Uint32 len;
 199                         const char * className = scmoInstance.getClassName_l(len);
 200                         out.append(className,len);
 201                         // TODO: check performance impact
 202                         out.append('"','>','\n');
 203                     
 204                         for (Uint32 i = 0, n = scmoInstance.getKeyBindingCount(); i < n; i++)
 205                         {
 206                             const char * kbName;
 207                             const SCMBUnion * kbValue;
 208                             CIMType kbType;
 209                             Uint32 kbNameLen;
 210 thilo.boehm    1.2  
 211                             SCMO_RC smrc = scmoInstance._getKeyBindingDataAtNodeIndex(
 212                                 i,
 213                                 &kbName,
 214                                 kbNameLen,
 215                                 kbType,
 216                                 &kbValue);
 217                     
 218                             out << STRLIT("<KEYBINDING NAME=\"");
 219                             out.append(kbName,kbNameLen-1);
 220                             out.append('"','>','\n');
 221                     
 222                             if (kbType == CIMTYPE_REFERENCE)
 223                             {
 224                                 if (SCMO_OK == smrc)
 225                                 {
 226                                     SCMOInstance * ref = kbValue->extRefPtr;
 227 karl           1.9                  appendValueReferenceElement(out, *ref);
 228 thilo.boehm    1.2              }
 229                             }
 230                             else
 231                             {
 232                                 out << STRLIT("<KEYVALUE VALUETYPE=\"");
 233                                 out << xmlWriterKeyTypeStrings(kbType);
 234                                 out.append('"','>');
 235                     
 236                                 if (SCMO_OK == smrc)
 237                                 {
 238                                     SCMOXmlWriter::appendSCMBUnion(
 239                                         out,
 240                                         *kbValue,
 241                                         kbType,
 242                                         scmoInstance.inst.base);
 243                                 }
 244                                 out << STRLIT("</KEYVALUE>\n");
 245                             }
 246                             out << STRLIT("</KEYBINDING>\n");
 247                         }
 248                         out << STRLIT("</INSTANCENAME>\n");
 249 thilo.boehm    1.2  }
 250                     
 251                     //------------------------------------------------------------------------------
 252                     //
 253                     // appendInstanceElement()
 254                     //
 255                     //     <!ELEMENT INSTANCE
 256                     //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
 257                     //     <!ATTLIST INSTANCE
 258                     //         %ClassName;>
 259                     //
 260                     //------------------------------------------------------------------------------
 261                     void SCMOXmlWriter::appendInstanceElement(
 262                         Buffer& out,
 263 anusha.kandepu 1.5      const SCMOInstance& scmoInstance,
 264 karl           1.8      bool filtered,
 265                         const Array<Uint32> & nodes)
 266 thilo.boehm    1.2  {
 267                         // Class opening element:
 268                     
 269                         out << STRLIT("<INSTANCE CLASSNAME=\"");
 270                         Uint32 len;
 271                         const char * className = scmoInstance.getClassName_l(len);
 272                         out.append(className,len);
 273                         out.append('"',' ','>','\n');
 274                         //out << STRLIT("\" >\n");
 275                     
 276                         // Append Instance Qualifiers:
 277                         if (scmoInstance.inst.hdr->flags.includeQualifiers)
 278                         {
 279                             SCMBClass_Main *classMain=scmoInstance.inst.hdr->theClass.ptr->cls.hdr;
 280                             char* clsbase = scmoInstance.inst.hdr->theClass.ptr->cls.base;
 281                     
 282                             SCMBQualifier *theArray =
 283                                 (SCMBQualifier*)&(clsbase[classMain->qualifierArray.start]);
 284                             // need to iterate
 285                             for (Uint32 i=0, n=classMain->numberOfQualifiers;i<n;i++)
 286                             {
 287 thilo.boehm    1.2              SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsbase);
 288                             }
 289                         }
 290                     
 291                         // Append Properties:
 292 anusha.kandepu 1.5      if(!filtered)
 293                         {
 294 karl           1.10         for (Uint32 i=0,k=scmoInstance.getPropertyCount();i<k;i++)
 295 anusha.kandepu 1.5          {
 296                                 SCMOXmlWriter::appendPropertyElement(out,scmoInstance,i);
 297 karl           1.8          }
 298 anusha.kandepu 1.5      }
 299                         else
 300 thilo.boehm    1.2      {
 301 anusha.kandepu 1.5          for (Uint32 i=0,k=nodes.size();i<k;i++)
 302                             {
 303                                 SCMOXmlWriter::appendPropertyElement(out,scmoInstance,nodes[i]);
 304                             }
 305 thilo.boehm    1.2      }
 306                         // Instance closing element:
 307                         out << STRLIT("</INSTANCE>\n");
 308                     }
 309                     
 310                     //------------------------------------------------------------------------------
 311                     //
 312                     // appendQualifierElement()
 313                     //
 314                     //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
 315                     //     <!ATTLIST QUALIFIER
 316                     //              %CIMName;
 317                     //              %CIMType;               #REQUIRED
 318                     //              %Propagated;
 319                     //              %QualifierFlavor;>
 320                     //
 321                     //------------------------------------------------------------------------------
 322                     
 323                     void SCMOXmlWriter::appendQualifierElement(
 324                         Buffer& out,
 325                         const SCMBQualifier& theQualifier,
 326 thilo.boehm    1.2      const char* base)
 327                     {
 328                         out << STRLIT("<QUALIFIER NAME=\"");
 329                         if(theQualifier.name == QUALNAME_USERDEFINED)
 330                         {
 331                             if (theQualifier.userDefName.start)
 332                             {
 333                                 out.append(
 334                                     &(base[theQualifier.userDefName.start]),
 335                                     theQualifier.userDefName.size-1);
 336                             }
 337                         }
 338                         else
 339                         {
 340                             out << SCMOClass::qualifierNameStrLit(theQualifier.name);
 341                         }
 342                         out.append('"',' ');
 343                         //out << STRLIT("\" ");
 344                     
 345                         // Append type
 346                         out << xmlWriterTypeStrings(theQualifier.value.valueType);
 347 thilo.boehm    1.2      // append PROPAGATED if set
 348                         if (theQualifier.propagated)
 349                         {
 350                             out << STRLIT(" PROPAGATED=\"true\"");
 351                         }
 352                         // append flavor of the qualifier
 353                         SCMOXmlWriter::appendQualifierFlavorEntity(
 354                             out,
 355                             CIMFlavor(theQualifier.flavor));
 356                     
 357                         out.append('>','\n');
 358                         //out << STRLIT(">\n");
 359                         // append the value of the qualifier
 360                         SCMOXmlWriter::appendValueElement(out, theQualifier.value, base);
 361                     
 362                         out << STRLIT("</QUALIFIER>\n");
 363                     }
 364                     
 365                     //------------------------------------------------------------------------------
 366                     //
 367                     // appendPropertyElement()
 368 thilo.boehm    1.2  //
 369                     //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
 370                     //     <!ATTLIST PROPERTY
 371                     //              %CIMName;
 372                     //              %CIMType;           #REQUIRED
 373                     //              %ClassOrigin;
 374                     //              %Propagated;>
 375                     //
 376                     //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
 377                     //     <!ATTLIST PROPERTY.ARRAY
 378                     //              %CIMName;
 379                     //              %CIMType;           #REQUIRED
 380                     //              %ArraySize;
 381                     //              %ClassOrigin;
 382                     //              %Propagated;>
 383                     //
 384                     //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
 385                     //     <!ATTLIST PROPERTY.REFERENCE
 386                     //              %CIMName;
 387                     //              %ReferenceClass;
 388                     //              %ClassOrigin;
 389 thilo.boehm    1.2  //              %Propagated;>
 390                     //
 391                     //------------------------------------------------------------------------------
 392 karl           1.10 
 393 thilo.boehm    1.2  void SCMOXmlWriter::appendPropertyElement(
 394                         Buffer& out,
 395                         const SCMOInstance& scmoInstance,
 396                         Uint32 pos)
 397                     {
 398                     
 399 karl           1.10     // Absolute pointer to the property SCMBValue
 400 thilo.boehm    1.2      SCMBValue * propertyValue;
 401                         const char * propertyValueBase;
 402 karl           1.10 
 403                         // Absolute pointer at a SCMBValue
 404 thilo.boehm    1.2      SCMBClassProperty * propertyDef;
 405 karl           1.10     // Absolute pointer to the the class info for the given
 406 thilo.boehm    1.2      // instance starts
 407                         const char* clsbase = scmoInstance.inst.hdr->theClass.ptr->cls.base;
 408                     
 409                         scmoInstance._getPropertyAt(
 410                             pos,
 411                             &propertyValue,
 412                             &propertyValueBase,
 413                             &propertyDef);
 414                     
 415 karl           1.10     bool noClassExists = scmoInstance.inst.hdr->flags.noClassForInstance;
 416                         bool includeClassOrigin = scmoInstance.inst.hdr->flags.includeClassOrigin;
 417                         bool includeQualifiers = scmoInstance.inst.hdr->flags.includeQualifiers;
 418                         // This one either false or comes from class definition
 419                         bool propagated = false;
 420                     
 421                         // Get property name and set any output parameter values
 422                         const char * pName;
 423                         Uint32 pLen;
 424                         if (scmoInstance._isClassDefinedProperty(pos))
 425                         {
 426                             // Get name from class Definition
 427                             pName = &(clsbase[propertyDef->name.start]);
 428                             pLen = (propertyDef->name.size-1);
 429                             propagated = propertyDef->flags.propagated;
 430                         }
 431                         else
 432                         {
 433                             // Get name from Instance
 434                             SCMBUserPropertyElement* pElement =
 435                                 scmoInstance._getUserDefinedPropertyElementAt(pos);
 436 karl           1.10 
 437                             pName = _getCharString(pElement->name,scmoInstance.inst.base);
 438                             pLen = pElement->name.size-1;
 439                             includeQualifiers = false;
 440                         }
 441                         // KS_TODO clarify classOrigin acquisition.
 442                         CIMType propertyType = propertyValue->valueType;
 443 thilo.boehm    1.2  
 444                         if (propertyValue->flags.isArray)
 445                         {
 446                             Uint32 arraySize=propertyValue->valueArraySize;
 447                     
 448                             out << STRLIT("<PROPERTY.ARRAY NAME=\"");
 449                     
 450 karl           1.10         out.append(pName, pLen);
 451 thilo.boehm    1.2  
 452                             out.append('"',' ');
 453                             //out << STRLIT("\" ");
 454                             if (propertyType == CIMTYPE_OBJECT)
 455                             {
 456                                 // If the property array type is CIMObject, then
 457                                 //    encode the property in CIM-XML as a string array with the
 458                                 //    EmbeddedObject attribute (there is not currently a CIM-XML
 459                                 //    "object" datatype)
 460                                 out << STRLIT(" TYPE=\"string\"");
 461                                 // If the Embedded Object is an instance, always add the
 462                                 // EmbeddedObject attribute.
 463                                 SCMOInstance * instPtr = propertyValue->value.extRefPtr;
 464                                 if ((0 != instPtr) &&
 465                                         (arraySize > 0) &&
 466                                             !(instPtr->inst.hdr->flags.isClassOnly))
 467                                 {
 468                                     out << STRLIT(" EmbeddedObject=\"object\""
 469                                                     " EMBEDDEDOBJECT=\"object\"");
 470                                 }
 471                             }
 472 thilo.boehm    1.2          else if (propertyType == CIMTYPE_INSTANCE)
 473                             {
 474                                 // If the property array type is CIMInstance, then
 475                                 //   encode the property in CIM-XML as a string array with the
 476                                 //   EmbeddedObject attribute (there is not currently a CIM-XML
 477                                 //   "instance" datatype)
 478                                 out << STRLIT(" TYPE=\"string\"");
 479                                 // add the EmbeddedObject attribute
 480                                 if (arraySize > 0)
 481                                 {
 482                                     out << STRLIT(" EmbeddedObject=\"instance\""
 483                                                   " EMBEDDEDOBJECT=\"instance\"");
 484                                 }
 485                             }
 486 karl           1.10         // Every CYMType but CIMOBject, CIMInstance
 487 thilo.boehm    1.2          else
 488                             {
 489                                 out.append(' ');
 490                                 out << xmlWriterTypeStrings(propertyType);
 491                             }
 492                     
 493                             if (0 != arraySize)
 494                             {
 495                                 out << STRLIT(" ARRAYSIZE=\"");
 496                                 SCMOXmlWriter::append(out, arraySize);
 497                                 out.append('"');
 498                             }
 499                     
 500 karl           1.10         if (includeClassOrigin)
 501 thilo.boehm    1.2          {
 502                                 if (propertyDef->originClassName.start != 0)
 503                                 {
 504                                     out << STRLIT(" CLASSORIGIN=\"");
 505                                     out.append(
 506                                         &(clsbase[propertyDef->originClassName.start]),
 507 r.kieninger    1.3                      (propertyDef->originClassName.size-1));
 508 thilo.boehm    1.2                  out.append('"');
 509                                 }
 510                             }
 511 karl           1.10 
 512                             if (propagated)
 513 thilo.boehm    1.2          {
 514                                 out << STRLIT(" PROPAGATED=\"true\"");
 515                             }
 516                     
 517                             out.append('>','\n');
 518                             //out << STRLIT(">\n");
 519                     
 520                             // Append Instance Qualifiers:
 521 karl           1.10         if (includeQualifiers)
 522 thilo.boehm    1.2          {
 523                                 SCMBQualifier * theArray=
 524                                     (SCMBQualifier*)
 525                                         &(clsbase[propertyDef->qualifierArray.start]);
 526                                 // need to iterate
 527                                 for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 528                                 {
 529                                     SCMOXmlWriter::appendQualifierElement(
 530                                         out,
 531                                         theArray[i],
 532                                         clsbase);
 533                                 }
 534                             }
 535                             SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 536                             out << STRLIT("</PROPERTY.ARRAY>\n");
 537                         }
 538 karl           1.10 
 539                         // else Not an array type
 540 thilo.boehm    1.2      else if (propertyType == CIMTYPE_REFERENCE)
 541                         {
 542                             out << STRLIT("<PROPERTY.REFERENCE NAME=\"");
 543 karl           1.10         out.append(pName, pLen);
 544 thilo.boehm    1.2          out.append('"',' ');
 545                             //out << STRLIT("\" ");
 546                     
 547 karl           1.10         if ((!noClassExists) && (0 != propertyDef->refClassName.start))
 548 thilo.boehm    1.2          {
 549                                 out << STRLIT(" REFERENCECLASS=\"");
 550                                 out.append(
 551 karl           1.10               &(clsbase[propertyDef->refClassName.start]),
 552                                   (propertyDef->refClassName.size-1));
 553 thilo.boehm    1.2              out.append('"');
 554                             }
 555                     
 556 karl           1.10         if (includeClassOrigin)
 557 thilo.boehm    1.2          {
 558                                 if (propertyDef->originClassName.start != 0)
 559                                 {
 560                                     out << STRLIT(" CLASSORIGIN=\"");
 561                                     out.append(
 562                                         &(clsbase[propertyDef->originClassName.start]),
 563 r.kieninger    1.3                      (propertyDef->originClassName.size-1));
 564 thilo.boehm    1.2                  out.append('"');
 565                                 }
 566                             }
 567 karl           1.10         if (propagated)
 568 thilo.boehm    1.2          {
 569                                 out << STRLIT(" PROPAGATED=\"true\"");
 570                             }
 571                             out.append('>','\n');
 572                             //out << STRLIT(">\n");
 573 karl           1.10 
 574 thilo.boehm    1.2          // Append Instance Qualifiers:
 575 karl           1.10         if (includeQualifiers)
 576 thilo.boehm    1.2          {
 577                                 SCMBQualifier * theArray=
 578                                     (SCMBQualifier*)
 579                                         &(clsbase[propertyDef->qualifierArray.start]);
 580                                 // need to iterate
 581                                 for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 582                                 {
 583                                     SCMOXmlWriter::appendQualifierElement(
 584                                         out,
 585                                         theArray[i],
 586                                         clsbase);
 587                                 }
 588                             }
 589                             SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 590                             out << STRLIT("</PROPERTY.REFERENCE>\n");
 591                         }
 592                         else
 593                         {
 594                             out << STRLIT("<PROPERTY NAME=\"");
 595                     
 596 karl           1.10         out.append(pName, pLen);
 597 thilo.boehm    1.2  
 598                             out.append('"',' ');
 599                             //out << STRLIT("\" ");
 600                     
 601 karl           1.10         // User-defined properties will not includeClassOrigin
 602                             if (includeClassOrigin)
 603 thilo.boehm    1.2          {
 604                                 if (propertyDef->originClassName.start != 0)
 605                                 {
 606                                     out << STRLIT(" CLASSORIGIN=\"");
 607                                     out.append(
 608                                         &(clsbase[propertyDef->originClassName.start]),
 609 r.kieninger    1.3                      (propertyDef->originClassName.size-1));
 610 thilo.boehm    1.2                  out.append('"');
 611                                 }
 612                             }
 613 karl           1.10         if (propagated)
 614 thilo.boehm    1.2          {
 615                                 out << STRLIT(" PROPAGATED=\"true\"");
 616                             }
 617                     
 618                             if (propertyType == CIMTYPE_OBJECT)
 619                             {
 620                                 // If the property type is CIMObject, then
 621                                 //   encode the property in CIM-XML as a string with the
 622                                 //   EmbeddedObject attribute (there is not currently a CIM-XML
 623                                 //   "object" datatype)
 624                                 out << STRLIT(" TYPE=\"string\"");
 625                                 // If the Embedded Object is an instance, always add the
 626                                 // EmbeddedObject attribute.
 627                                 SCMOInstance * a = propertyValue->value.extRefPtr;
 628                                 if (a && !(a->inst.hdr->flags.isClassOnly))
 629                                 {
 630                                     out << STRLIT(" EmbeddedObject=\"object\""
 631                                                   " EMBEDDEDOBJECT=\"object\"");
 632                                 }
 633 marek          1.4          }
 634                             else if (propertyType == CIMTYPE_INSTANCE)
 635                             {
 636                                 out << STRLIT(" TYPE=\"string\""
 637                                               " EmbeddedObject=\"instance\""
 638                                               " EMBEDDEDOBJECT=\"instance\"");
 639 thilo.boehm    1.2          }
 640                             else
 641                             {
 642                                 out.append(' ');
 643                                 out << xmlWriterTypeStrings(propertyType);
 644                             }
 645                             out.append('>','\n');
 646                             //out << STRLIT(">\n");
 647                     
 648                             // Append Instance Qualifiers:
 649 karl           1.10         if (includeQualifiers)
 650 thilo.boehm    1.2          {
 651                                 SCMBQualifier * theArray=
 652                                     (SCMBQualifier*)
 653                                         &(clsbase[propertyDef->qualifierArray.start]);
 654 karl           1.10             // Iterate through all qualifiers
 655 thilo.boehm    1.2              for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 656                                 {
 657                                     SCMOXmlWriter::appendQualifierElement(
 658                                         out,
 659                                         theArray[i],
 660                                         clsbase);
 661                                 }
 662                             }
 663                             SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 664                             out << STRLIT("</PROPERTY>\n");
 665                         }
 666                     }
 667                     //------------------------------------------------------------------------------
 668                     //
 669                     // appendValueElement()
 670                     //
 671                     //    <!ELEMENT VALUE (#PCDATA)>
 672                     //    <!ELEMENT VALUE.ARRAY (VALUE*)>
 673                     //    <!ELEMENT VALUE.REFERENCE
 674                     //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 675                     //         INSTANCENAME)>
 676 thilo.boehm    1.2  //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 677                     //
 678                     //------------------------------------------------------------------------------
 679                     
 680                     void SCMOXmlWriter::appendValueElement(
 681                         Buffer& out,
 682                         const SCMBValue & value,
 683                         const char * base)
 684                     {
 685                         if (value.flags.isNull)
 686                         {
 687                             return;
 688                         }
 689                         if (value.flags.isArray)
 690                         {
 691                             appendSCMBUnionArray(
 692                                 out,
 693                                 value.value,
 694                                 value.valueType,
 695                                 value.valueArraySize,
 696                                 base);
 697 thilo.boehm    1.2      }
 698                         else if (value.valueType == CIMTYPE_REFERENCE)
 699                         {
 700                             SCMOInstance * ref = value.value.extRefPtr;
 701                             if (ref)
 702                             {
 703 karl           1.9              appendValueReferenceElement(out, *ref);
 704 thilo.boehm    1.2          }
 705                         }
 706                         else
 707                         {
 708                             out << STRLIT("<VALUE>");
 709                     
 710                             // Call function to write a SCMBUnion + type field
 711                             appendSCMBUnion(out,value.value, value.valueType,base);
 712                     
 713                             out << STRLIT("</VALUE>\n");
 714                         }
 715                     }
 716                     
 717                     //------------------------------------------------------------------------------
 718                     //
 719                     // appendValueReferenceElement()
 720                     //
 721                     //    <!ELEMENT VALUE.REFERENCE
 722                     //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 723                     //         INSTANCENAME)>
 724                     //
 725 thilo.boehm    1.2  //------------------------------------------------------------------------------
 726                     void SCMOXmlWriter::appendValueReferenceElement(
 727                         Buffer& out,
 728 karl           1.9      const SCMOInstance& ref)
 729 thilo.boehm    1.2  {
 730 karl           1.9      out << STRLIT("<VALUE.REFERENCE>\n");
 731                     
 732                         appendClassOrInstancePathElement(out, ref);
 733                     
 734                         out << STRLIT("</VALUE.REFERENCE>\n");
 735                     }
 736 thilo.boehm    1.2  
 737 karl           1.9  // Append either a class or instance Path Element
 738                     void SCMOXmlWriter::appendClassOrInstancePathElement(
 739                         Buffer& out,
 740                         const SCMOInstance& ref)
 741                     {
 742 thilo.boehm    1.2      // See if it is a class or instance reference (instance references have
 743                         // key-bindings; class references do not).
 744                     
 745                         // differentiate between instance and class using the SCMO flag
 746                         if (ref.inst.hdr->flags.isClassOnly)
 747                         {
 748                             // class
 749                             if (0 != ref.inst.hdr->hostName.start)
 750                             {
 751                                 appendClassPathElement(out, ref);
 752                             }
 753                             else if (0 != ref.inst.hdr->instNameSpace.start)
 754                             {
 755                                 appendLocalClassPathElement(out, ref);
 756                             }
 757                             else
 758                             {
 759                                 Uint32 classNameLength=0;
 760                                 const char* className = ref.getClassName_l(classNameLength);
 761                                 appendClassNameElement(out, className, classNameLength);
 762                             }
 763 thilo.boehm    1.2      }
 764                         else
 765                         {
 766                             // instance
 767                             if (0 != ref.inst.hdr->hostName.start)
 768                             {
 769                                 appendInstancePathElement(out, ref);
 770                             }
 771                             else if (0 != ref.inst.hdr->instNameSpace.start)
 772                             {
 773                                 appendLocalInstancePathElement(out, ref);
 774                             }
 775                             else
 776                             {
 777                                 appendInstanceNameElement(out, ref);
 778                             }
 779                         }
 780                     }
 781                     
 782                     // appendLocalInstancePathElement()
 783                     //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 784 thilo.boehm    1.2  void SCMOXmlWriter::appendLocalInstancePathElement(
 785                         Buffer& out,
 786                         const SCMOInstance& instancePath)
 787                     {
 788                         out << STRLIT("<LOCALINSTANCEPATH>\n");
 789                         Uint32 nsLength=0;
 790                         const char* ns=instancePath.getNameSpace_l(nsLength);
 791                         appendLocalNameSpacePathElement(out, ns, nsLength);
 792                         appendInstanceNameElement(out, instancePath);
 793                         out << STRLIT("</LOCALINSTANCEPATH>\n");
 794                     }
 795                     
 796                     // appendInstancePathElement()
 797                     //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 798                     void SCMOXmlWriter::appendInstancePathElement(
 799                         Buffer& out,
 800                         const SCMOInstance& instancePath)
 801                     {
 802                         out << STRLIT("<INSTANCEPATH>\n");
 803                     
 804                         Uint32 hostnameLength=0;
 805 thilo.boehm    1.2      const char* hostname=instancePath.getHostName_l(hostnameLength);
 806                         Uint32 nsLength=0;
 807                         const char* ns=instancePath.getNameSpace_l(nsLength);
 808                         appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 809                     
 810                         appendInstanceNameElement(out, instancePath);
 811                         out << STRLIT("</INSTANCEPATH>\n");
 812                     }
 813 karl           1.9  
 814 anusha.kandepu 1.5  void SCMOXmlWriter::appendValueObjectWithPathElement(
 815                         Buffer& out,
 816                         const Array<SCMOInstance> & objectWithPath,
 817                         const CIMPropertyList& propertyList)
 818                     {
 819 karl           1.8      if (propertyList.isNull())
 820                         {
 821                             Array<Uint32> emptyNodes;
 822                             for (Uint32 i = 0, n = objectWithPath.size(); i < n; i++)
 823                             {
 824 anusha.kandepu 1.5              SCMOXmlWriter::appendValueObjectWithPathElement(
 825                                     out,
 826                                     objectWithPath[i],
 827                                     false,
 828                                     emptyNodes);
 829 karl           1.8          }
 830 anusha.kandepu 1.5      }
 831                         else
 832                         {
 833                             Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 834 karl           1.8          for (Uint32 i = 0, n = objectWithPath.size(); i < n; i++)
 835 anusha.kandepu 1.5          {
 836 karl           1.8              // This searches for an already created array of nodes,
 837                                 // if not found, creates it inside propFilterNodesArrays
 838                                 const Array<Uint32> & nodes=
 839                                     SCMOXmlWriter::getFilteredNodesArray(
 840                                         propFilterNodesArrays,
 841                                         objectWithPath[i],
 842 anusha.kandepu 1.5                      propertyList);
 843                                 SCMOXmlWriter::appendValueObjectWithPathElement(
 844                                     out,
 845                                     objectWithPath[i],
 846                                     true,
 847 karl           1.8                  nodes);
 848 anusha.kandepu 1.5  
 849                             }
 850                         }
 851                     }
 852 thilo.boehm    1.2  
 853 karl           1.9  //EXP_PULL_BEGIN
 854                     //------------------------------------------------------------------------------
 855                     //
 856                     // appendValueInstanceWithPathElement()
 857                     //
 858                     //     <!ELEMENT VALUE.INSTANCEWITHPATH (INSTANCEPATH,INSTANCE)>
 859                     //
 860                     //------------------------------------------------------------------------------
 861                     // EXP_PULL_TBD checkout the INSTANCEPATH vs NAMEDINSTANCE differences
 862                     // Can we create something more common
 863                     void SCMOXmlWriter::appendValueInstanceWithPathElement(
 864                         Buffer& out,
 865                         const SCMOInstance& namedInstance,
 866                         bool filtered,
 867                         const Array<Uint32> & nodes)
 868                     {
 869                         out << STRLIT("<VALUE.INSTANCEWITHPATH>\n");
 870                     
 871                         appendInstancePathElement(out, namedInstance);
 872                         appendInstanceElement(out, namedInstance, filtered, nodes);
 873                     
 874 karl           1.9      out << STRLIT("</VALUE.INSTANCEWITHPATH>\n");
 875                     }
 876                     //EXP_PULL_END
 877                     
 878 thilo.boehm    1.2  // appendValueObjectWithPathElement()
 879                     //     <!ELEMENT VALUE.OBJECTWITHPATH
 880                     //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
 881                     void SCMOXmlWriter::appendValueObjectWithPathElement(
 882                         Buffer& out,
 883 anusha.kandepu 1.5      const SCMOInstance& objectWithPath,
 884 karl           1.8      bool filtered,
 885                         const Array<Uint32> & nodes)
 886 thilo.boehm    1.2  {
 887                         out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
 888                     
 889 karl           1.9      appendClassOrInstancePathElement(out, objectWithPath);
 890 anusha.kandepu 1.5      appendObjectElement(out, objectWithPath,filtered,nodes);
 891 thilo.boehm    1.2  
 892                         out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
 893                     }
 894                     
 895                     // appendObjectElement()
 896                     // May refer to a CLASS or an INSTANCE
 897                     void SCMOXmlWriter::appendObjectElement(
 898                         Buffer& out,
 899 anusha.kandepu 1.5      const SCMOInstance& object,
 900                         bool filtered,
 901                         const Array<Uint32> & nodes)
 902 thilo.boehm    1.2  {
 903                         if (object.inst.hdr->flags.isClassOnly)
 904                         {
 905                             appendClassElement(out, object);
 906                         }
 907                         else
 908                         {
 909 anusha.kandepu 1.5          appendInstanceElement(out, object,filtered,nodes);
 910 thilo.boehm    1.2      }
 911                     }
 912                     
 913                     //------------------------------------------------------------------------------
 914                     //
 915                     // appendClassElement()
 916                     //
 917                     //     <!ELEMENT CLASS
 918                     //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
 919                     //     <!ATTLIST CLASS
 920                     //         %CIMName;
 921                     //         %SuperClass;>
 922                     //
 923                     //------------------------------------------------------------------------------
 924                     
 925                     void SCMOXmlWriter::appendClassElement(
 926                         Buffer& out,
 927                         const SCMOInstance& cimClass)
 928                     {
 929                     
 930                         SCMBClass_Main* ptrClass = cimClass.inst.hdr->theClass.ptr->cls.hdr;
 931 thilo.boehm    1.2      const char* clsBase = cimClass.inst.hdr->theClass.ptr->cls.base;
 932                     
 933                         // Class opening element:
 934                         out << STRLIT("<CLASS NAME=\"");
 935                         out.append(
 936                             &(clsBase[ptrClass->className.start]),
 937 r.kieninger    1.3          (ptrClass->className.size-1));
 938 thilo.boehm    1.2  
 939                         out.append('"',' ');
 940                         if (0 != ptrClass->superClassName.start)
 941                         {
 942                             out << STRLIT(" SUPERCLASS=\"");
 943                             out.append(
 944                                 &(clsBase[ptrClass->superClassName.start]),
 945 r.kieninger    1.3              (ptrClass->superClassName.size-1));
 946 thilo.boehm    1.2          out.append('"',' ');
 947                         }
 948                         out.append('>','\n');
 949                     
 950                         // Append class qualifiers
 951                         SCMBQualifier *theArray =
 952                             (SCMBQualifier*)&(clsBase[ptrClass->qualifierArray.start]);
 953                         for (Uint32 i=0, n=ptrClass->numberOfQualifiers;i<n;i++)
 954                         {
 955                             SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsBase);
 956                         }
 957                     
 958                         // Append Property definitions:
 959                         for (Uint32 i=0,k=cimClass.getPropertyCount();i<k;i++)
 960                         {
 961                                 SCMOXmlWriter::appendPropertyElement(out,cimClass,i);
 962                         }
 963                     
 964                         // ATTN: No method definitions with SCMO today, so do nothing with them
 965                         //       Actually this code does not serve a purpose, but is kept here
 966                         //       for completeness.
 967 thilo.boehm    1.2  
 968                         // Class closing element:
 969                         out << STRLIT("</CLASS>\n");
 970                     }
 971                     
 972                     // appendLocalClassPathElement()
 973                     //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 974                     void SCMOXmlWriter::appendLocalClassPathElement(
 975                         Buffer& out,
 976                         const SCMOInstance& classPath)
 977                     {
 978                         out << STRLIT("<LOCALCLASSPATH>\n");
 979                         Uint32 hostnameLength=0;
 980                         const char* hostname=classPath.getHostName_l(hostnameLength);
 981                         Uint32 nsLength=0;
 982                         const char* ns=classPath.getNameSpace_l(nsLength);
 983                     
 984                         appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 985                     
 986                         Uint32 classNameLength=0;
 987                         const char* className = classPath.getClassName_l(classNameLength);
 988 thilo.boehm    1.2      appendClassNameElement(out, className, classNameLength);
 989                         out << STRLIT("</LOCALCLASSPATH>\n");
 990                     }
 991                     
 992                     // appendClassPathElement()
 993                     //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 994                     void SCMOXmlWriter::appendClassPathElement(
 995                         Buffer& out,
 996                         const SCMOInstance& classPath)
 997                     {
 998                         out << STRLIT("<CLASSPATH>\n");
 999                     
1000                         Uint32 hostnameLength=0;
1001                         const char* hostname=classPath.getHostName_l(hostnameLength);
1002                         Uint32 nsLength=0;
1003                         const char* ns=classPath.getNameSpace_l(nsLength);
1004                     
1005                         appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
1006                     
1007                         Uint32 classNameLength=0;
1008                         const char* className = classPath.getClassName_l(classNameLength);
1009 thilo.boehm    1.2  
1010                         appendClassNameElement(out, className, classNameLength);
1011                         out << STRLIT("</CLASSPATH>\n");
1012                     }
1013                     
1014                     void SCMOXmlWriter::appendSCMBUnion(
1015                         Buffer& out,
1016                         const SCMBUnion & u,
1017                         const CIMType & valueType,
1018                         const char * base)
1019                     {
1020                         switch (valueType)
1021                         {
1022                             case CIMTYPE_BOOLEAN:
1023                             {
1024                                 if (u.simple.hasValue)
1025                                 {
1026                                     SCMOXmlWriter::append(out, u.simple.val.bin);
1027                                 }
1028                                 break;
1029                             }
1030 thilo.boehm    1.2  
1031                             case CIMTYPE_UINT8:
1032                             {
1033                                 if (u.simple.hasValue)
1034                                 {
1035                                     SCMOXmlWriter::append(out, u.simple.val.u8);
1036                                 }
1037                                 break;
1038                             }
1039                     
1040                             case CIMTYPE_SINT8:
1041                             {
1042                                 if (u.simple.hasValue)
1043                                 {
1044                                     SCMOXmlWriter::append(out, u.simple.val.s8);
1045                                 }
1046                                 break;
1047                             }
1048                     
1049                             case CIMTYPE_UINT16:
1050                             {
1051 thilo.boehm    1.2              if (u.simple.hasValue)
1052                                 {
1053                                     SCMOXmlWriter::append(out, u.simple.val.u16);
1054                                 }
1055                                 break;
1056                             }
1057                     
1058                             case CIMTYPE_SINT16:
1059                             {
1060                                 if (u.simple.hasValue)
1061                                 {
1062                                     SCMOXmlWriter::append(out, u.simple.val.s16);
1063                                 }
1064                                 break;
1065                             }
1066                     
1067                             case CIMTYPE_UINT32:
1068                             {
1069                                 if (u.simple.hasValue)
1070                                 {
1071                                     SCMOXmlWriter::append(out, u.simple.val.u32);
1072 thilo.boehm    1.2              }
1073                                 break;
1074                             }
1075                     
1076                             case CIMTYPE_SINT32:
1077                             {
1078                                 if (u.simple.hasValue)
1079                                 {
1080                                     SCMOXmlWriter::append(out, u.simple.val.s32);
1081                                 }
1082                                 break;
1083                             }
1084                     
1085                             case CIMTYPE_UINT64:
1086                             {
1087                                 if (u.simple.hasValue)
1088                                 {
1089                                     SCMOXmlWriter::append(out, u.simple.val.u64);
1090                                 }
1091                                 break;
1092                             }
1093 thilo.boehm    1.2  
1094                             case CIMTYPE_SINT64:
1095                             {
1096                                 if (u.simple.hasValue)
1097                                 {
1098                                     SCMOXmlWriter::append(out, u.simple.val.s64);
1099                                 }
1100                                 break;
1101                             }
1102                     
1103                             case CIMTYPE_REAL32:
1104                             {
1105                                 if (u.simple.hasValue)
1106                                 {
1107                                     SCMOXmlWriter::append(out, u.simple.val.r32);
1108                                 }
1109                                 break;
1110                             }
1111                     
1112                             case CIMTYPE_REAL64:
1113                             {
1114 thilo.boehm    1.2              if (u.simple.hasValue)
1115                                 {
1116                                     SCMOXmlWriter::append(out, u.simple.val.r64);
1117                                 }
1118                                 break;
1119                             }
1120                     
1121                             case CIMTYPE_CHAR16:
1122                             {
1123                                 if (u.simple.hasValue)
1124                                 {
1125                                     SCMOXmlWriter::appendSpecial(
1126                                         out,
1127                                         Char16(u.simple.val.c16));
1128                                 }
1129                                 break;
1130                             }
1131                     
1132                             case CIMTYPE_STRING:
1133                             {
1134                                 if (u.stringValue.start)
1135 thilo.boehm    1.2              {
1136                                     SCMOXmlWriter::appendSpecial(
1137                                         out,
1138                                         &(base[u.stringValue.start]),
1139 r.kieninger    1.3                      (u.stringValue.size-1));
1140 thilo.boehm    1.2              }
1141                                 break;
1142                             }
1143                     
1144                             case CIMTYPE_DATETIME:
1145                             {
1146                                 // an SCMBDateTime is a CIMDateTimeRep
1147                                 // this should help us to reuse existing optimized Datetime
1148                                 char buffer[26];
1149                                 _DateTimetoCStr(u.dateTimeValue, buffer);
1150                                 // datetime value is formatted with a \0 at end, ignore
1151                                 out.append(buffer,sizeof(buffer)-1);
1152                                 break;
1153                             }
1154                             // Object and Instance are both written the same way, namely as
1155                             // object element which then is encoded using appendSpecial
1156                             case CIMTYPE_OBJECT:
1157                             case CIMTYPE_INSTANCE:
1158                             {
1159                                 Buffer toEncodeObject(4000);
1160                                 SCMOInstance * obj = u.extRefPtr;
1161 thilo.boehm    1.2              if (obj)
1162                                 {
1163                                     appendObjectElement(toEncodeObject, *obj);
1164                                     SCMOXmlWriter::appendSpecial(
1165                                         out,
1166                                         toEncodeObject.getData(),
1167                                         toEncodeObject.size());
1168                                 }
1169                                 break;
1170                             }
1171                             default:
1172                                 // CIMTYPE_REFERENCE has been handled upfront, do nothing here
1173                                 break;
1174                         }
1175                     }
1176                     
1177                     void SCMOXmlWriter::appendSCMBUnionArray(
1178                         Buffer& out,
1179                         const SCMBUnion & u,
1180                         const CIMType & valueType,
1181                         Uint32 numElements,
1182 thilo.boehm    1.2      const char * base)
1183                     {
1184                         SCMBUnion* arr = (SCMBUnion*) &(base[u.arrayValue.start]);
1185                         switch (valueType)
1186                         {
1187                             case CIMTYPE_BOOLEAN:
1188                             {
1189                                 out << STRLIT("<VALUE.ARRAY>\n");
1190                                 while (numElements--)
1191                                 {
1192                                     out << STRLIT("<VALUE>");
1193                                     SCMOXmlWriter::append(out, arr->simple.val.bin);
1194                                     arr++;
1195                                     out << STRLIT("</VALUE>\n");
1196                                 }
1197                                 out << STRLIT("</VALUE.ARRAY>\n");
1198                                 break;
1199                             }
1200                             case CIMTYPE_UINT8:
1201                             {
1202                                 out << STRLIT("<VALUE.ARRAY>\n");
1203 thilo.boehm    1.2              while (numElements--)
1204                                 {
1205                                     out << STRLIT("<VALUE>");
1206                                     SCMOXmlWriter::append(out, arr->simple.val.u8);
1207                                     arr++;
1208                                     out << STRLIT("</VALUE>\n");
1209                                 }
1210                                 out << STRLIT("</VALUE.ARRAY>\n");
1211                                 break;
1212                             }
1213                     
1214                             case CIMTYPE_SINT8:
1215                             {
1216                                 out << STRLIT("<VALUE.ARRAY>\n");
1217                                 while (numElements--)
1218                                 {
1219                                     out << STRLIT("<VALUE>");
1220                                     SCMOXmlWriter::append(out, arr->simple.val.s8);
1221                                     arr++;
1222                                     out << STRLIT("</VALUE>\n");
1223                                 }
1224 thilo.boehm    1.2              out << STRLIT("</VALUE.ARRAY>\n");
1225                                 break;
1226                             }
1227                     
1228                             case CIMTYPE_UINT16:
1229                             {
1230                                 out << STRLIT("<VALUE.ARRAY>\n");
1231                                 while (numElements--)
1232                                 {
1233                                     out << STRLIT("<VALUE>");
1234                                     SCMOXmlWriter::append(out, arr->simple.val.u16);
1235                                     arr++;
1236                                     out << STRLIT("</VALUE>\n");
1237                                 }
1238                                 out << STRLIT("</VALUE.ARRAY>\n");
1239                                 break;
1240                             }
1241                     
1242                             case CIMTYPE_SINT16:
1243                             {
1244                                 out << STRLIT("<VALUE.ARRAY>\n");
1245 thilo.boehm    1.2              while (numElements--)
1246                                 {
1247                                     out << STRLIT("<VALUE>");
1248                                     SCMOXmlWriter::append(out, arr->simple.val.s16);
1249                                     arr++;
1250                                     out << STRLIT("</VALUE>\n");
1251                                 }
1252                                 out << STRLIT("</VALUE.ARRAY>\n");
1253                                 break;
1254                             }
1255                     
1256                             case CIMTYPE_UINT32:
1257                             {
1258                                 out << STRLIT("<VALUE.ARRAY>\n");
1259                                 while (numElements--)
1260                                 {
1261                                     out << STRLIT("<VALUE>");
1262                                     SCMOXmlWriter::append(out, arr->simple.val.u32);
1263                                     arr++;
1264                                     out << STRLIT("</VALUE>\n");
1265                                 }
1266 thilo.boehm    1.2              out << STRLIT("</VALUE.ARRAY>\n");
1267                                 break;
1268                             }
1269                     
1270                             case CIMTYPE_SINT32:
1271                             {
1272                                 out << STRLIT("<VALUE.ARRAY>\n");
1273                                 while (numElements--)
1274                                 {
1275                                     out << STRLIT("<VALUE>");
1276                                     SCMOXmlWriter::append(out, arr->simple.val.s32);
1277                                     arr++;
1278                                     out << STRLIT("</VALUE>\n");
1279                                 }
1280                                 out << STRLIT("</VALUE.ARRAY>\n");
1281                                 break;
1282                             }
1283                     
1284                             case CIMTYPE_UINT64:
1285                             {
1286                                 out << STRLIT("<VALUE.ARRAY>\n");
1287 thilo.boehm    1.2              while (numElements--)
1288                                 {
1289                                     out << STRLIT("<VALUE>");
1290                                     SCMOXmlWriter::append(out, arr->simple.val.u64);
1291                                     arr++;
1292                                     out << STRLIT("</VALUE>\n");
1293                                 }
1294                                 out << STRLIT("</VALUE.ARRAY>\n");
1295                                 break;
1296                             }
1297                     
1298                             case CIMTYPE_SINT64:
1299                             {
1300                                 out << STRLIT("<VALUE.ARRAY>\n");
1301                                 while (numElements--)
1302                                 {
1303                                     out << STRLIT("<VALUE>");
1304                                     SCMOXmlWriter::append(out, arr->simple.val.s64);
1305                                     arr++;
1306                                     out << STRLIT("</VALUE>\n");
1307                                 }
1308 thilo.boehm    1.2              out << STRLIT("</VALUE.ARRAY>\n");
1309                                 break;
1310                             }
1311                     
1312                             case CIMTYPE_REAL32:
1313                             {
1314                                 out << STRLIT("<VALUE.ARRAY>\n");
1315                                 while (numElements--)
1316                                 {
1317                                     out << STRLIT("<VALUE>");
1318                                     SCMOXmlWriter::append(out, arr->simple.val.r32);
1319                                     arr++;
1320                                     out << STRLIT("</VALUE>\n");
1321                                 }
1322                                 out << STRLIT("</VALUE.ARRAY>\n");
1323                                 break;
1324                             }
1325                     
1326                             case CIMTYPE_REAL64:
1327                             {
1328                                 out << STRLIT("<VALUE.ARRAY>\n");
1329 thilo.boehm    1.2              while (numElements--)
1330                                 {
1331                                     out << STRLIT("<VALUE>");
1332                                     SCMOXmlWriter::append(out, arr->simple.val.r64);
1333                                     arr++;
1334                                     out << STRLIT("</VALUE>\n");
1335                                 }
1336                                 out << STRLIT("</VALUE.ARRAY>\n");
1337                                 break;
1338                             }
1339                     
1340                             case CIMTYPE_CHAR16:
1341                             {
1342                                 out << STRLIT("<VALUE.ARRAY>\n");
1343                                 while (numElements--)
1344                                 {
1345                                     out << STRLIT("<VALUE>");
1346                                     SCMOXmlWriter::appendSpecial(out, Char16(arr->simple.val.c16));
1347                                     arr++;
1348                                     out << STRLIT("</VALUE>\n");
1349                                 }
1350 thilo.boehm    1.2              out << STRLIT("</VALUE.ARRAY>\n");
1351                                 break;
1352                             }
1353                     
1354                             case CIMTYPE_STRING:
1355                             {
1356                                 out << STRLIT("<VALUE.ARRAY>\n");
1357                                 while (numElements--)
1358                                 {
1359                                     out << STRLIT("<VALUE>");
1360                                     if (0!=arr->stringValue.start)
1361                                     {
1362                                         SCMOXmlWriter::appendSpecial(
1363                                             out,
1364                                             &(base[arr->stringValue.start]),
1365 r.kieninger    1.3                          (arr->stringValue.size-1));
1366 thilo.boehm    1.2                  }
1367                                     arr++;
1368                                     out << STRLIT("</VALUE>\n");
1369                                 }
1370                                 out << STRLIT("</VALUE.ARRAY>\n");
1371                     
1372                                 break;
1373                             }
1374                     
1375                             case CIMTYPE_DATETIME:
1376                             {
1377                                 out << STRLIT("<VALUE.ARRAY>\n");
1378                                 char buffer[26];
1379                                 while (numElements--)
1380                                 {
1381                                     out << STRLIT("<VALUE>");
1382                                     // an SCMBDateTime is a CIMDateTimeRep
1383                                     // this should help us to reuse existing optimized Datetime
1384                                     _DateTimetoCStr(arr->dateTimeValue, buffer);
1385                                     // datetime value is formatted with a \0 at end, ignore
1386                                     out.append(buffer,sizeof(buffer)-1);
1387 thilo.boehm    1.2                  arr++;
1388                                     out << STRLIT("</VALUE>\n");
1389                                 }
1390                                 out << STRLIT("</VALUE.ARRAY>\n");
1391                                 break;
1392                             }
1393                             case CIMTYPE_REFERENCE:
1394                             {
1395                                 out << STRLIT("<VALUE.REFARRAY>\n");
1396                                 while (numElements--)
1397                                 {
1398                                     SCMOInstance * ref = arr->extRefPtr;
1399                                     if (ref)
1400                                     {
1401 karl           1.9                      appendValueReferenceElement(out, *ref);
1402 thilo.boehm    1.2                  }
1403                                     arr++;
1404                                 }
1405                                 out << STRLIT("</VALUE.REFARRAY>\n");
1406 ashok.pathak   1.6              break;
1407 thilo.boehm    1.2          }
1408                             case CIMTYPE_OBJECT:
1409                             case CIMTYPE_INSTANCE:
1410                             {
1411                                 out << STRLIT("<VALUE.ARRAY>\n");
1412                                 Buffer toEncodeObject(4000);
1413                                 while (numElements--)
1414                                 {
1415                                     toEncodeObject.clear();
1416                                     out << STRLIT("<VALUE>");
1417                                     SCMOInstance * obj = arr->extRefPtr;
1418                                     if (obj)
1419                                     {
1420                                         appendObjectElement(toEncodeObject, *obj);
1421                                         SCMOXmlWriter::appendSpecial(
1422                                             out,
1423                                             toEncodeObject.getData(),
1424                                             toEncodeObject.size());
1425                                     }
1426                                     arr++;
1427                                     out << STRLIT("</VALUE>\n");
1428 thilo.boehm    1.2              }
1429                                 out << STRLIT("</VALUE.ARRAY>\n");
1430                                 break;
1431                             }
1432                             default:
1433                                 PEGASUS_DEBUG_ASSERT(false);
1434                         }
1435                     
1436                     }
1437                     
1438                     
1439                     
1440                     PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2