(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 karl        1.4.2.5 // 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 karl        1.4.2.2 #include "Tracer.h"
  42 thilo.boehm 1.2     
  43                     PEGASUS_NAMESPACE_BEGIN
  44 karl        1.4.2.7 void SCMOXmlWriter::buildPropertyFilterNodesArray(
  45                          Array<Uint32> & nodes,
  46                          const SCMOClass * classPtr,
  47                          const CIMPropertyList & propertyList)
  48                     {
  49                         for (Uint32 i=0,k=propertyList.size(); i<k; i++)
  50                         {
  51                             Uint32 node = 0;
  52                             const CIMName & name = propertyList[i];
  53                             SCMO_RC rc =
  54                                 classPtr->_getProperyNodeIndex(
  55                                     node,
  56                                     (const char *)name.getString().getCString());
  57                             if(rc == SCMO_OK)
  58                             {
  59                                 nodes.append(node);
  60                             }
  61                         }
  62 karl        1.4.2.2 }
  63                     
  64 karl        1.4.2.9 const Array<Uint32> & SCMOXmlWriter::getFilteredNodesArray(
  65                          Array<propertyFilterNodesArray_t> & propFilterNodesArrays,
  66                          const SCMOInstance& scmoInstance,
  67                          const CIMPropertyList & propertyList)
  68                     {
  69                         //First see if the class ptr is already stored in the propFilterNodesArrays
  70                         const SCMOClass * classPtr = scmoInstance.inst.hdr->theClass.ptr;
  71                         SCMBClass_Main * classPtrMemBlock = classPtr->cls.hdr;
  72                         for (int i=0, k=propFilterNodesArrays.size(); i < k; i++)
  73                         {
  74                             if (classPtrMemBlock == propFilterNodesArrays[i].classPtrMemBlock)
  75                             {
  76                                 return propFilterNodesArrays[i].nodes;
  77                             }
  78                         }
  79                     
  80                         // Could not find the class pointer of this SCMOInstance in the
  81                         // property filter nodes array
  82                         // --> need to create the new entry and return that
  83                         propertyFilterNodesArray_t newEntry;
  84                         newEntry.classPtrMemBlock = classPtrMemBlock;
  85 karl        1.4.2.9     SCMOXmlWriter::buildPropertyFilterNodesArray(
  86                             newEntry.nodes,
  87                             classPtr,
  88                             propertyList);
  89                         propFilterNodesArrays.append(newEntry);
  90                     
  91                         // return the new nodes entry, but as a reference into the array
  92                         return propFilterNodesArrays[propFilterNodesArrays.size()-1].nodes;
  93                     }
  94                     
  95                     void SCMOXmlWriter::appendValueSCMOInstanceElements(
  96                          Buffer& out,
  97                          const Array<SCMOInstance> & _scmoInstances,
  98                          const CIMPropertyList & propertyList)
  99                     {
 100                         if (propertyList.isNull())
 101                         {
 102                             Array<Uint32> emptyNodes;
 103                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 104                             {
 105                                 SCMOXmlWriter::appendValueSCMOInstanceElement(
 106 karl        1.4.2.9                 out,
 107                                     _scmoInstances[i],
 108                                     false,
 109                                     emptyNodes);
 110                             }
 111                         }
 112                         else
 113                         {
 114                             Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 115                     
 116                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 117                             {
 118                                 // This searches for an already created array of nodes,
 119                                 // if not found, creates it inside propFilterNodesArrays
 120                                 const Array<Uint32> & nodes=
 121                                     SCMOXmlWriter::getFilteredNodesArray(
 122                                         propFilterNodesArrays,
 123                                         _scmoInstances[i],
 124                                         propertyList);
 125                     
 126                                 SCMOXmlWriter::appendValueSCMOInstanceElement(
 127 karl        1.4.2.9                 out,
 128                                     _scmoInstances[i],
 129                                     true,
 130                                     nodes);
 131                             }
 132                         }
 133                     }
 134                     
 135                     // EXP_PULL_BEGIN
 136                     void SCMOXmlWriter::appendValueSCMOInstanceWithPathElements(
 137                          Buffer& out,
 138                          const Array<SCMOInstance> & _scmoInstances,
 139                          const CIMPropertyList & propertyList)
 140                     {
 141                         if (propertyList.isNull())
 142                         {
 143                             Array<Uint32> emptyNodes;
 144                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 145                             {
 146                                 SCMOXmlWriter::appendValueInstanceWithPathElement(
 147                                     out,
 148 karl        1.4.2.9                 _scmoInstances[i],
 149                                     false,
 150                                     emptyNodes);
 151                             }
 152                         }
 153                         else
 154                         {
 155                             Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 156                     
 157                             for (Uint32 i = 0, n = _scmoInstances.size(); i < n; i++)
 158                             {
 159                                 // This searches for an already created array of nodes,
 160                                 // if not found, creates it inside propFilterNodesArrays
 161                                 const Array<Uint32> & nodes=
 162                                     SCMOXmlWriter::getFilteredNodesArray(
 163                                         propFilterNodesArrays,
 164                                         _scmoInstances[i],
 165                                         propertyList);
 166                     
 167                                 SCMOXmlWriter::appendValueInstanceWithPathElement(
 168                                     out,
 169 karl        1.4.2.9                 _scmoInstances[i],
 170                                     true,
 171                                     nodes);
 172                             }
 173                         }
 174                     }
 175 karl        1.4.2.3 //EXP_PULL_END
 176 thilo.boehm 1.2     
 177 karl        1.4.2.1 // KS_TODO - Show the XML statement for this function
 178 thilo.boehm 1.2     void SCMOXmlWriter::appendValueSCMOInstanceElement(
 179                         Buffer& out,
 180 karl        1.4.2.2     const SCMOInstance& scmoInstance,
 181 karl        1.4.2.7     bool filtered,
 182                         const Array<Uint32> & nodes)
 183                     
 184 thilo.boehm 1.2     {
 185                         out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 186                     
 187                         appendInstanceNameElement(out, scmoInstance);
 188 karl        1.4.2.2     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                                     appendValueReferenceElement(out, *ref, true);
 228                                 }
 229                             }
 230                             else
 231 thilo.boehm 1.2             {
 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                     }
 250                     
 251                     //------------------------------------------------------------------------------
 252 thilo.boehm 1.2     //
 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 karl        1.4.2.2     const SCMOInstance& scmoInstance,
 264 karl        1.4.2.7     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 karl        1.4.2.2     if(!filtered)
 293 thilo.boehm 1.2         {
 294 karl        1.4.2.2         for (Uint32 i=0,k=scmoInstance.inst.hdr->numberProperties;i<k;i++)
 295                             {
 296                                 SCMOXmlWriter::appendPropertyElement(out,scmoInstance,i);
 297 karl        1.4.2.7         }
 298 karl        1.4.2.2     }
 299                         else
 300                         {
 301                             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                     void SCMOXmlWriter::appendPropertyElement(
 393                         Buffer& out,
 394                         const SCMOInstance& scmoInstance,
 395                         Uint32 pos)
 396                     {
 397                         CIMType propertyType;
 398                     
 399                         // This is an absolute pointer at a SCMBValue
 400                         SCMBValue * propertyValue;
 401                         const char * propertyValueBase;
 402                         // This is an absolute pointer at a SCMBValue
 403                         SCMBClassProperty * propertyDef;
 404                         // This is the absolute pointer at which the class info for the given
 405                         // instance starts
 406                         const char* clsbase = scmoInstance.inst.hdr->theClass.ptr->cls.base;
 407                     
 408                         scmoInstance._getPropertyAt(
 409                             pos,
 410 thilo.boehm 1.2             &propertyValue,
 411                             &propertyValueBase,
 412                             &propertyDef);
 413                     
 414                         propertyType = propertyValue->valueType;
 415                     
 416                         if (propertyValue->flags.isArray)
 417                         {
 418                             Uint32 arraySize=propertyValue->valueArraySize;
 419                     
 420                             out << STRLIT("<PROPERTY.ARRAY NAME=\"");
 421                     
 422                             out.append(
 423                                 &(clsbase[propertyDef->name.start]),
 424 r.kieninger 1.3                 (propertyDef->name.size-1));
 425 thilo.boehm 1.2     
 426                             out.append('"',' ');
 427                             //out << STRLIT("\" ");
 428                             if (propertyType == CIMTYPE_OBJECT)
 429                             {
 430                                 // If the property array type is CIMObject, then
 431                                 //    encode the property in CIM-XML as a string array with the
 432                                 //    EmbeddedObject attribute (there is not currently a CIM-XML
 433                                 //    "object" datatype)
 434                                 out << STRLIT(" TYPE=\"string\"");
 435                                 // If the Embedded Object is an instance, always add the
 436                                 // EmbeddedObject attribute.
 437                                 SCMOInstance * instPtr = propertyValue->value.extRefPtr;
 438                                 if ((0 != instPtr) &&
 439                                         (arraySize > 0) &&
 440                                             !(instPtr->inst.hdr->flags.isClassOnly))
 441                                 {
 442                                     out << STRLIT(" EmbeddedObject=\"object\""
 443                                                     " EMBEDDEDOBJECT=\"object\"");
 444                                 }
 445                             }
 446 thilo.boehm 1.2             else if (propertyType == CIMTYPE_INSTANCE)
 447                             {
 448                                 // If the property array type is CIMInstance, then
 449                                 //   encode the property in CIM-XML as a string array with the
 450                                 //   EmbeddedObject attribute (there is not currently a CIM-XML
 451                                 //   "instance" datatype)
 452                                 out << STRLIT(" TYPE=\"string\"");
 453                                 // add the EmbeddedObject attribute
 454                                 if (arraySize > 0)
 455                                 {
 456                                     out << STRLIT(" EmbeddedObject=\"instance\""
 457                                                   " EMBEDDEDOBJECT=\"instance\"");
 458                                 }
 459                             }
 460                             else
 461                             {
 462                                 out.append(' ');
 463                                 out << xmlWriterTypeStrings(propertyType);
 464                             }
 465                     
 466                             if (0 != arraySize)
 467 thilo.boehm 1.2             {
 468                                 out << STRLIT(" ARRAYSIZE=\"");
 469                                 SCMOXmlWriter::append(out, arraySize);
 470                                 out.append('"');
 471                             }
 472                     
 473                     
 474                             if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 475                             {
 476                                 if (propertyDef->originClassName.start != 0)
 477                                 {
 478                                     out << STRLIT(" CLASSORIGIN=\"");
 479                                     out.append(
 480                                         &(clsbase[propertyDef->originClassName.start]),
 481 r.kieninger 1.3                         (propertyDef->originClassName.size-1));
 482 thilo.boehm 1.2                     out.append('"');
 483                                 }
 484                             }
 485                             if (propertyDef->flags.propagated)
 486                             {
 487                                 out << STRLIT(" PROPAGATED=\"true\"");
 488                             }
 489                     
 490                             out.append('>','\n');
 491                             //out << STRLIT(">\n");
 492                     
 493                             // Append Instance Qualifiers:
 494                             if (scmoInstance.inst.hdr->flags.includeQualifiers)
 495                             {
 496                                 SCMBQualifier * theArray=
 497                                     (SCMBQualifier*)
 498                                         &(clsbase[propertyDef->qualifierArray.start]);
 499                                 // need to iterate
 500                                 for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 501                                 {
 502                                     SCMOXmlWriter::appendQualifierElement(
 503 thilo.boehm 1.2                         out,
 504                                         theArray[i],
 505                                         clsbase);
 506                                 }
 507                             }
 508                             SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 509                             out << STRLIT("</PROPERTY.ARRAY>\n");
 510                         }
 511                         else if (propertyType == CIMTYPE_REFERENCE)
 512                         {
 513                             out << STRLIT("<PROPERTY.REFERENCE NAME=\"");
 514                             out.append(
 515                                 &(clsbase[propertyDef->name.start]),
 516 r.kieninger 1.3                 (propertyDef->name.size-1));
 517 thilo.boehm 1.2             out.append('"',' ');
 518                             //out << STRLIT("\" ");
 519                     
 520                             if (0 != propertyDef->refClassName.start)
 521                             {
 522                                 out << STRLIT(" REFERENCECLASS=\"");
 523                                 out.append(
 524                                     &(clsbase[propertyDef->refClassName.start]),
 525 r.kieninger 1.3                     (propertyDef->refClassName.size-1));
 526 thilo.boehm 1.2                 out.append('"');
 527                             }
 528                     
 529                             if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 530                             {
 531                                 if (propertyDef->originClassName.start != 0)
 532                                 {
 533                                     out << STRLIT(" CLASSORIGIN=\"");
 534                                     out.append(
 535                                         &(clsbase[propertyDef->originClassName.start]),
 536 r.kieninger 1.3                         (propertyDef->originClassName.size-1));
 537 thilo.boehm 1.2                     out.append('"');
 538                                 }
 539                             }
 540                             if (propertyDef->flags.propagated)
 541                             {
 542                                 out << STRLIT(" PROPAGATED=\"true\"");
 543                             }
 544                             out.append('>','\n');
 545                             //out << STRLIT(">\n");
 546                             // Append Instance Qualifiers:
 547                             if (scmoInstance.inst.hdr->flags.includeQualifiers)
 548                             {
 549                                 SCMBQualifier * theArray=
 550                                     (SCMBQualifier*)
 551                                         &(clsbase[propertyDef->qualifierArray.start]);
 552                                 // need to iterate
 553                                 for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 554                                 {
 555                                     SCMOXmlWriter::appendQualifierElement(
 556                                         out,
 557                                         theArray[i],
 558 thilo.boehm 1.2                         clsbase);
 559                                 }
 560                             }
 561                             SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 562                             out << STRLIT("</PROPERTY.REFERENCE>\n");
 563                         }
 564                         else
 565                         {
 566                             out << STRLIT("<PROPERTY NAME=\"");
 567                     
 568                             out.append(
 569                                 &(clsbase[propertyDef->name.start]),
 570 r.kieninger 1.3                 (propertyDef->name.size-1));
 571 thilo.boehm 1.2     
 572                             out.append('"',' ');
 573                             //out << STRLIT("\" ");
 574                     
 575                             if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 576                             {
 577                                 if (propertyDef->originClassName.start != 0)
 578                                 {
 579                                     out << STRLIT(" CLASSORIGIN=\"");
 580                                     out.append(
 581                                         &(clsbase[propertyDef->originClassName.start]),
 582 r.kieninger 1.3                         (propertyDef->originClassName.size-1));
 583 thilo.boehm 1.2                     out.append('"');
 584                                 }
 585                             }
 586                             if (propertyDef->flags.propagated)
 587                             {
 588                                 out << STRLIT(" PROPAGATED=\"true\"");
 589                             }
 590                     
 591                             if (propertyType == CIMTYPE_OBJECT)
 592                             {
 593                                 // If the property type is CIMObject, then
 594                                 //   encode the property in CIM-XML as a string with the
 595                                 //   EmbeddedObject attribute (there is not currently a CIM-XML
 596                                 //   "object" datatype)
 597                                 out << STRLIT(" TYPE=\"string\"");
 598                                 // If the Embedded Object is an instance, always add the
 599                                 // EmbeddedObject attribute.
 600                                 SCMOInstance * a = propertyValue->value.extRefPtr;
 601                                 if (a && !(a->inst.hdr->flags.isClassOnly))
 602                                 {
 603                                     out << STRLIT(" EmbeddedObject=\"object\""
 604 thilo.boehm 1.2                                   " EMBEDDEDOBJECT=\"object\"");
 605                                 }
 606 marek       1.4             }
 607                             else if (propertyType == CIMTYPE_INSTANCE)
 608                             {
 609                                 out << STRLIT(" TYPE=\"string\""
 610                                               " EmbeddedObject=\"instance\""
 611                                               " EMBEDDEDOBJECT=\"instance\"");
 612 thilo.boehm 1.2             }
 613                             else
 614                             {
 615                                 out.append(' ');
 616                                 out << xmlWriterTypeStrings(propertyType);
 617                             }
 618                             out.append('>','\n');
 619                             //out << STRLIT(">\n");
 620                     
 621                             // Append Instance Qualifiers:
 622                             if (scmoInstance.inst.hdr->flags.includeQualifiers)
 623                             {
 624                                 SCMBQualifier * theArray=
 625                                     (SCMBQualifier*)
 626                                         &(clsbase[propertyDef->qualifierArray.start]);
 627                                 // need to iterate
 628                                 for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 629                                 {
 630                                     SCMOXmlWriter::appendQualifierElement(
 631                                         out,
 632                                         theArray[i],
 633 thilo.boehm 1.2                         clsbase);
 634                                 }
 635                             }
 636                             SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 637                             out << STRLIT("</PROPERTY>\n");
 638                         }
 639                     }
 640                     //------------------------------------------------------------------------------
 641                     //
 642                     // appendValueElement()
 643                     //
 644                     //    <!ELEMENT VALUE (#PCDATA)>
 645                     //    <!ELEMENT VALUE.ARRAY (VALUE*)>
 646                     //    <!ELEMENT VALUE.REFERENCE
 647                     //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 648                     //         INSTANCENAME)>
 649                     //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 650                     //
 651                     //------------------------------------------------------------------------------
 652                     
 653                     void SCMOXmlWriter::appendValueElement(
 654 thilo.boehm 1.2         Buffer& out,
 655                         const SCMBValue & value,
 656                         const char * base)
 657                     {
 658                         if (value.flags.isNull)
 659                         {
 660                             return;
 661                         }
 662                         if (value.flags.isArray)
 663                         {
 664                             appendSCMBUnionArray(
 665                                 out,
 666                                 value.value,
 667                                 value.valueType,
 668                                 value.valueArraySize,
 669                                 base);
 670                         }
 671                         else if (value.valueType == CIMTYPE_REFERENCE)
 672                         {
 673                             SCMOInstance * ref = value.value.extRefPtr;
 674                             if (ref)
 675 thilo.boehm 1.2             {
 676                                 appendValueReferenceElement(out, *ref, true);
 677                             }
 678                         }
 679                         else
 680                         {
 681                             out << STRLIT("<VALUE>");
 682                     
 683                             // Call function to write a SCMBUnion + type field
 684                             appendSCMBUnion(out,value.value, value.valueType,base);
 685                     
 686                             out << STRLIT("</VALUE>\n");
 687                         }
 688                     }
 689                     
 690                     //------------------------------------------------------------------------------
 691                     //
 692                     // appendValueReferenceElement()
 693                     //
 694                     //    <!ELEMENT VALUE.REFERENCE
 695                     //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 696 thilo.boehm 1.2     //         INSTANCENAME)>
 697                     //
 698                     //------------------------------------------------------------------------------
 699                     void SCMOXmlWriter::appendValueReferenceElement(
 700                         Buffer& out,
 701                         const SCMOInstance& ref,
 702                         Boolean putValueWrapper)
 703                     {
 704                         if (putValueWrapper)
 705                         {
 706                             out << STRLIT("<VALUE.REFERENCE>\n");
 707                         }
 708                     
 709                         // See if it is a class or instance reference (instance references have
 710                         // key-bindings; class references do not).
 711                     
 712                         // differentiate between instance and class using the SCMO flag
 713                         if (ref.inst.hdr->flags.isClassOnly)
 714                         {
 715                             // class
 716                             if (0 != ref.inst.hdr->hostName.start)
 717 thilo.boehm 1.2             {
 718                                 appendClassPathElement(out, ref);
 719                             }
 720                             else if (0 != ref.inst.hdr->instNameSpace.start)
 721                             {
 722                                 appendLocalClassPathElement(out, ref);
 723                             }
 724                             else
 725                             {
 726                                 Uint32 classNameLength=0;
 727                                 const char* className = ref.getClassName_l(classNameLength);
 728                                 appendClassNameElement(out, className, classNameLength);
 729                             }
 730                         }
 731                         else
 732                         {
 733                             // instance
 734                             if (0 != ref.inst.hdr->hostName.start)
 735                             {
 736                                 appendInstancePathElement(out, ref);
 737                             }
 738 thilo.boehm 1.2             else if (0 != ref.inst.hdr->instNameSpace.start)
 739                             {
 740                                 appendLocalInstancePathElement(out, ref);
 741                             }
 742                             else
 743                             {
 744                                 appendInstanceNameElement(out, ref);
 745                             }
 746                         }
 747                         if (putValueWrapper)
 748                         {
 749                             out << STRLIT("</VALUE.REFERENCE>\n");
 750                         }
 751                     }
 752                     
 753                     // appendLocalInstancePathElement()
 754                     //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 755                     void SCMOXmlWriter::appendLocalInstancePathElement(
 756                         Buffer& out,
 757                         const SCMOInstance& instancePath)
 758                     {
 759 thilo.boehm 1.2         out << STRLIT("<LOCALINSTANCEPATH>\n");
 760                         Uint32 nsLength=0;
 761                         const char* ns=instancePath.getNameSpace_l(nsLength);
 762                         appendLocalNameSpacePathElement(out, ns, nsLength);
 763                         appendInstanceNameElement(out, instancePath);
 764                         out << STRLIT("</LOCALINSTANCEPATH>\n");
 765                     }
 766                     
 767                     // appendInstancePathElement()
 768                     //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 769                     void SCMOXmlWriter::appendInstancePathElement(
 770                         Buffer& out,
 771                         const SCMOInstance& instancePath)
 772                     {
 773                         out << STRLIT("<INSTANCEPATH>\n");
 774                     
 775                         Uint32 hostnameLength=0;
 776                         const char* hostname=instancePath.getHostName_l(hostnameLength);
 777                         Uint32 nsLength=0;
 778                         const char* ns=instancePath.getNameSpace_l(nsLength);
 779                         appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 780 thilo.boehm 1.2     
 781                         appendInstanceNameElement(out, instancePath);
 782                         out << STRLIT("</INSTANCEPATH>\n");
 783                     }
 784 karl        1.4.2.4 
 785 karl        1.4.2.2 void SCMOXmlWriter::appendValueObjectWithPathElement(
 786                         Buffer& out,
 787                         const Array<SCMOInstance> & objectWithPath,
 788                         const CIMPropertyList& propertyList)
 789                     {
 790 karl        1.4.2.7     if (propertyList.isNull())
 791                         {
 792                             Array<Uint32> emptyNodes;
 793                             for (Uint32 i = 0, n = objectWithPath.size(); i < n; i++)
 794                             {
 795 karl        1.4.2.2             SCMOXmlWriter::appendValueObjectWithPathElement(
 796                                     out,
 797                                     objectWithPath[i],
 798                                     false,
 799                                     emptyNodes);
 800 karl        1.4.2.7         }
 801 karl        1.4.2.2     }
 802                         else
 803                         {
 804                             Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 805 karl        1.4.2.7         for (Uint32 i = 0, n = objectWithPath.size(); i < n; i++)
 806 karl        1.4.2.2         {
 807 karl        1.4.2.7             // This searches for an already created array of nodes,
 808                                 // if not found, creates it inside propFilterNodesArrays
 809                                 const Array<Uint32> & nodes=
 810                                     SCMOXmlWriter::getFilteredNodesArray(
 811                                         propFilterNodesArrays,
 812                                         objectWithPath[i],
 813 karl        1.4.2.2                     propertyList);
 814                                 SCMOXmlWriter::appendValueObjectWithPathElement(
 815                                     out,
 816                                     objectWithPath[i],
 817                                     true,
 818 karl        1.4.2.7                 nodes);
 819 karl        1.4.2.2 
 820                             }
 821                         }
 822                     }
 823 thilo.boehm 1.2     
 824 karl        1.4.2.3 //EXP_PULL_BEGIN
 825 karl        1.4.2.1 //------------------------------------------------------------------------------
 826                     //
 827                     // appendValueInstanceWithPathElement()
 828                     //
 829                     //     <!ELEMENT VALUE.INSTANCEWITHPATH (INSTANCEPATH,INSTANCE)>
 830                     //
 831                     //------------------------------------------------------------------------------
 832                     // EXP_PULL_TBD checkout the INSTANCEPATH vs NAMEDINSTANCE differences
 833                     // Can we create something more common
 834                     void SCMOXmlWriter::appendValueInstanceWithPathElement(
 835                         Buffer& out,
 836 karl        1.4.2.2     const SCMOInstance& namedInstance,
 837 karl        1.4.2.9     bool filtered,
 838 karl        1.4.2.2     const Array<Uint32> & nodes)
 839 karl        1.4.2.1 {
 840                         out << STRLIT("<VALUE.INSTANCEWITHPATH>\n");
 841                     
 842                         appendInstancePathElement(out, namedInstance);
 843 karl        1.4.2.2     appendInstanceElement(out, namedInstance, filtered, nodes);
 844 karl        1.4.2.1 
 845                         out << STRLIT("</VALUE.INSTANCEWITHPATH>\n");
 846                     }
 847 karl        1.4.2.3 //EXP_PULL_END
 848 karl        1.4.2.1 
 849 thilo.boehm 1.2     // appendValueObjectWithPathElement()
 850                     //     <!ELEMENT VALUE.OBJECTWITHPATH
 851                     //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
 852                     void SCMOXmlWriter::appendValueObjectWithPathElement(
 853                         Buffer& out,
 854 karl        1.4.2.2     const SCMOInstance& objectWithPath,
 855 karl        1.4.2.7     bool filtered,
 856                         const Array<Uint32> & nodes)
 857 thilo.boehm 1.2     {
 858                         out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
 859                     
 860                         appendValueReferenceElement(out, objectWithPath, false);
 861 karl        1.4.2.2     appendObjectElement(out, objectWithPath,filtered,nodes);
 862 thilo.boehm 1.2     
 863                         out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
 864                     }
 865                     
 866                     // appendObjectElement()
 867                     // May refer to a CLASS or an INSTANCE
 868                     void SCMOXmlWriter::appendObjectElement(
 869                         Buffer& out,
 870 karl        1.4.2.2     const SCMOInstance& object,
 871                         bool filtered,
 872                         const Array<Uint32> & nodes)
 873 thilo.boehm 1.2     {
 874                         if (object.inst.hdr->flags.isClassOnly)
 875                         {
 876                             appendClassElement(out, object);
 877                         }
 878                         else
 879                         {
 880 karl        1.4.2.2         appendInstanceElement(out, object,filtered,nodes);
 881 thilo.boehm 1.2         }
 882                     }
 883                     
 884                     //------------------------------------------------------------------------------
 885                     //
 886                     // appendClassElement()
 887                     //
 888                     //     <!ELEMENT CLASS
 889                     //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
 890                     //     <!ATTLIST CLASS
 891                     //         %CIMName;
 892                     //         %SuperClass;>
 893                     //
 894                     //------------------------------------------------------------------------------
 895                     
 896                     void SCMOXmlWriter::appendClassElement(
 897                         Buffer& out,
 898                         const SCMOInstance& cimClass)
 899                     {
 900                     
 901                         SCMBClass_Main* ptrClass = cimClass.inst.hdr->theClass.ptr->cls.hdr;
 902 thilo.boehm 1.2         const char* clsBase = cimClass.inst.hdr->theClass.ptr->cls.base;
 903                     
 904                         // Class opening element:
 905                         out << STRLIT("<CLASS NAME=\"");
 906                         out.append(
 907                             &(clsBase[ptrClass->className.start]),
 908 r.kieninger 1.3             (ptrClass->className.size-1));
 909 thilo.boehm 1.2     
 910                         out.append('"',' ');
 911                         if (0 != ptrClass->superClassName.start)
 912                         {
 913                             out << STRLIT(" SUPERCLASS=\"");
 914                             out.append(
 915                                 &(clsBase[ptrClass->superClassName.start]),
 916 r.kieninger 1.3                 (ptrClass->superClassName.size-1));
 917 thilo.boehm 1.2             out.append('"',' ');
 918                         }
 919                         out.append('>','\n');
 920                     
 921                         // Append class qualifiers
 922                         SCMBQualifier *theArray =
 923                             (SCMBQualifier*)&(clsBase[ptrClass->qualifierArray.start]);
 924                         for (Uint32 i=0, n=ptrClass->numberOfQualifiers;i<n;i++)
 925                         {
 926                             SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsBase);
 927                         }
 928                     
 929                         // Append Property definitions:
 930                         for (Uint32 i=0,k=cimClass.getPropertyCount();i<k;i++)
 931                         {
 932                                 SCMOXmlWriter::appendPropertyElement(out,cimClass,i);
 933                         }
 934                     
 935                         // ATTN: No method definitions with SCMO today, so do nothing with them
 936                         //       Actually this code does not serve a purpose, but is kept here
 937                         //       for completeness.
 938 thilo.boehm 1.2     
 939                         // Class closing element:
 940                         out << STRLIT("</CLASS>\n");
 941                     }
 942                     
 943                     // appendLocalClassPathElement()
 944                     //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 945                     void SCMOXmlWriter::appendLocalClassPathElement(
 946                         Buffer& out,
 947                         const SCMOInstance& classPath)
 948                     {
 949                         out << STRLIT("<LOCALCLASSPATH>\n");
 950                         Uint32 hostnameLength=0;
 951                         const char* hostname=classPath.getHostName_l(hostnameLength);
 952                         Uint32 nsLength=0;
 953                         const char* ns=classPath.getNameSpace_l(nsLength);
 954                     
 955                         appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 956                     
 957                         Uint32 classNameLength=0;
 958                         const char* className = classPath.getClassName_l(classNameLength);
 959 thilo.boehm 1.2         appendClassNameElement(out, className, classNameLength);
 960                         out << STRLIT("</LOCALCLASSPATH>\n");
 961                     }
 962                     
 963                     // appendClassPathElement()
 964                     //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 965                     void SCMOXmlWriter::appendClassPathElement(
 966                         Buffer& out,
 967                         const SCMOInstance& classPath)
 968                     {
 969                         out << STRLIT("<CLASSPATH>\n");
 970                     
 971                         Uint32 hostnameLength=0;
 972                         const char* hostname=classPath.getHostName_l(hostnameLength);
 973                         Uint32 nsLength=0;
 974                         const char* ns=classPath.getNameSpace_l(nsLength);
 975                     
 976                         appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 977                     
 978                         Uint32 classNameLength=0;
 979                         const char* className = classPath.getClassName_l(classNameLength);
 980 thilo.boehm 1.2     
 981                         appendClassNameElement(out, className, classNameLength);
 982                         out << STRLIT("</CLASSPATH>\n");
 983                     }
 984                     
 985                     void SCMOXmlWriter::appendSCMBUnion(
 986                         Buffer& out,
 987                         const SCMBUnion & u,
 988                         const CIMType & valueType,
 989                         const char * base)
 990                     {
 991                         switch (valueType)
 992                         {
 993                             case CIMTYPE_BOOLEAN:
 994                             {
 995                                 if (u.simple.hasValue)
 996                                 {
 997                                     SCMOXmlWriter::append(out, u.simple.val.bin);
 998                                 }
 999                                 break;
1000                             }
1001 thilo.boehm 1.2     
1002                             case CIMTYPE_UINT8:
1003                             {
1004                                 if (u.simple.hasValue)
1005                                 {
1006                                     SCMOXmlWriter::append(out, u.simple.val.u8);
1007                                 }
1008                                 break;
1009                             }
1010                     
1011                             case CIMTYPE_SINT8:
1012                             {
1013                                 if (u.simple.hasValue)
1014                                 {
1015                                     SCMOXmlWriter::append(out, u.simple.val.s8);
1016                                 }
1017                                 break;
1018                             }
1019                     
1020                             case CIMTYPE_UINT16:
1021                             {
1022 thilo.boehm 1.2                 if (u.simple.hasValue)
1023                                 {
1024                                     SCMOXmlWriter::append(out, u.simple.val.u16);
1025                                 }
1026                                 break;
1027                             }
1028                     
1029                             case CIMTYPE_SINT16:
1030                             {
1031                                 if (u.simple.hasValue)
1032                                 {
1033                                     SCMOXmlWriter::append(out, u.simple.val.s16);
1034                                 }
1035                                 break;
1036                             }
1037                     
1038                             case CIMTYPE_UINT32:
1039                             {
1040                                 if (u.simple.hasValue)
1041                                 {
1042                                     SCMOXmlWriter::append(out, u.simple.val.u32);
1043 thilo.boehm 1.2                 }
1044                                 break;
1045                             }
1046                     
1047                             case CIMTYPE_SINT32:
1048                             {
1049                                 if (u.simple.hasValue)
1050                                 {
1051                                     SCMOXmlWriter::append(out, u.simple.val.s32);
1052                                 }
1053                                 break;
1054                             }
1055                     
1056                             case CIMTYPE_UINT64:
1057                             {
1058                                 if (u.simple.hasValue)
1059                                 {
1060                                     SCMOXmlWriter::append(out, u.simple.val.u64);
1061                                 }
1062                                 break;
1063                             }
1064 thilo.boehm 1.2     
1065                             case CIMTYPE_SINT64:
1066                             {
1067                                 if (u.simple.hasValue)
1068                                 {
1069                                     SCMOXmlWriter::append(out, u.simple.val.s64);
1070                                 }
1071                                 break;
1072                             }
1073                     
1074                             case CIMTYPE_REAL32:
1075                             {
1076                                 if (u.simple.hasValue)
1077                                 {
1078                                     SCMOXmlWriter::append(out, u.simple.val.r32);
1079                                 }
1080                                 break;
1081                             }
1082                     
1083                             case CIMTYPE_REAL64:
1084                             {
1085 thilo.boehm 1.2                 if (u.simple.hasValue)
1086                                 {
1087                                     SCMOXmlWriter::append(out, u.simple.val.r64);
1088                                 }
1089                                 break;
1090                             }
1091                     
1092                             case CIMTYPE_CHAR16:
1093                             {
1094                                 if (u.simple.hasValue)
1095                                 {
1096                                     SCMOXmlWriter::appendSpecial(
1097                                         out,
1098                                         Char16(u.simple.val.c16));
1099                                 }
1100                                 break;
1101                             }
1102                     
1103                             case CIMTYPE_STRING:
1104                             {
1105                                 if (u.stringValue.start)
1106 thilo.boehm 1.2                 {
1107                                     SCMOXmlWriter::appendSpecial(
1108                                         out,
1109                                         &(base[u.stringValue.start]),
1110 r.kieninger 1.3                         (u.stringValue.size-1));
1111 thilo.boehm 1.2                 }
1112                                 break;
1113                             }
1114                     
1115                             case CIMTYPE_DATETIME:
1116                             {
1117                                 // an SCMBDateTime is a CIMDateTimeRep
1118                                 // this should help us to reuse existing optimized Datetime
1119                                 char buffer[26];
1120                                 _DateTimetoCStr(u.dateTimeValue, buffer);
1121                                 // datetime value is formatted with a \0 at end, ignore
1122                                 out.append(buffer,sizeof(buffer)-1);
1123                                 break;
1124                             }
1125                             // Object and Instance are both written the same way, namely as
1126                             // object element which then is encoded using appendSpecial
1127                             case CIMTYPE_OBJECT:
1128                             case CIMTYPE_INSTANCE:
1129                             {
1130                                 Buffer toEncodeObject(4000);
1131                                 SCMOInstance * obj = u.extRefPtr;
1132 thilo.boehm 1.2                 if (obj)
1133                                 {
1134                                     appendObjectElement(toEncodeObject, *obj);
1135                                     SCMOXmlWriter::appendSpecial(
1136                                         out,
1137                                         toEncodeObject.getData(),
1138                                         toEncodeObject.size());
1139                                 }
1140                                 break;
1141                             }
1142                             default:
1143                                 // CIMTYPE_REFERENCE has been handled upfront, do nothing here
1144                                 break;
1145                         }
1146                     }
1147                     
1148                     void SCMOXmlWriter::appendSCMBUnionArray(
1149                         Buffer& out,
1150                         const SCMBUnion & u,
1151                         const CIMType & valueType,
1152                         Uint32 numElements,
1153 thilo.boehm 1.2         const char * base)
1154                     {
1155                         SCMBUnion* arr = (SCMBUnion*) &(base[u.arrayValue.start]);
1156                         switch (valueType)
1157                         {
1158                             case CIMTYPE_BOOLEAN:
1159                             {
1160                                 out << STRLIT("<VALUE.ARRAY>\n");
1161                                 while (numElements--)
1162                                 {
1163                                     out << STRLIT("<VALUE>");
1164                                     SCMOXmlWriter::append(out, arr->simple.val.bin);
1165                                     arr++;
1166                                     out << STRLIT("</VALUE>\n");
1167                                 }
1168                                 out << STRLIT("</VALUE.ARRAY>\n");
1169                                 break;
1170                             }
1171                             case CIMTYPE_UINT8:
1172                             {
1173                                 out << STRLIT("<VALUE.ARRAY>\n");
1174 thilo.boehm 1.2                 while (numElements--)
1175                                 {
1176                                     out << STRLIT("<VALUE>");
1177                                     SCMOXmlWriter::append(out, arr->simple.val.u8);
1178                                     arr++;
1179                                     out << STRLIT("</VALUE>\n");
1180                                 }
1181                                 out << STRLIT("</VALUE.ARRAY>\n");
1182                                 break;
1183                             }
1184                     
1185                             case CIMTYPE_SINT8:
1186                             {
1187                                 out << STRLIT("<VALUE.ARRAY>\n");
1188                                 while (numElements--)
1189                                 {
1190                                     out << STRLIT("<VALUE>");
1191                                     SCMOXmlWriter::append(out, arr->simple.val.s8);
1192                                     arr++;
1193                                     out << STRLIT("</VALUE>\n");
1194                                 }
1195 thilo.boehm 1.2                 out << STRLIT("</VALUE.ARRAY>\n");
1196                                 break;
1197                             }
1198                     
1199                             case CIMTYPE_UINT16:
1200                             {
1201                                 out << STRLIT("<VALUE.ARRAY>\n");
1202                                 while (numElements--)
1203                                 {
1204                                     out << STRLIT("<VALUE>");
1205                                     SCMOXmlWriter::append(out, arr->simple.val.u16);
1206                                     arr++;
1207                                     out << STRLIT("</VALUE>\n");
1208                                 }
1209                                 out << STRLIT("</VALUE.ARRAY>\n");
1210                                 break;
1211                             }
1212                     
1213                             case CIMTYPE_SINT16:
1214                             {
1215                                 out << STRLIT("<VALUE.ARRAY>\n");
1216 thilo.boehm 1.2                 while (numElements--)
1217                                 {
1218                                     out << STRLIT("<VALUE>");
1219                                     SCMOXmlWriter::append(out, arr->simple.val.s16);
1220                                     arr++;
1221                                     out << STRLIT("</VALUE>\n");
1222                                 }
1223                                 out << STRLIT("</VALUE.ARRAY>\n");
1224                                 break;
1225                             }
1226                     
1227                             case CIMTYPE_UINT32:
1228                             {
1229                                 out << STRLIT("<VALUE.ARRAY>\n");
1230                                 while (numElements--)
1231                                 {
1232                                     out << STRLIT("<VALUE>");
1233                                     SCMOXmlWriter::append(out, arr->simple.val.u32);
1234                                     arr++;
1235                                     out << STRLIT("</VALUE>\n");
1236                                 }
1237 thilo.boehm 1.2                 out << STRLIT("</VALUE.ARRAY>\n");
1238                                 break;
1239                             }
1240                     
1241                             case CIMTYPE_SINT32:
1242                             {
1243                                 out << STRLIT("<VALUE.ARRAY>\n");
1244                                 while (numElements--)
1245                                 {
1246                                     out << STRLIT("<VALUE>");
1247                                     SCMOXmlWriter::append(out, arr->simple.val.s32);
1248                                     arr++;
1249                                     out << STRLIT("</VALUE>\n");
1250                                 }
1251                                 out << STRLIT("</VALUE.ARRAY>\n");
1252                                 break;
1253                             }
1254                     
1255                             case CIMTYPE_UINT64:
1256                             {
1257                                 out << STRLIT("<VALUE.ARRAY>\n");
1258 thilo.boehm 1.2                 while (numElements--)
1259                                 {
1260                                     out << STRLIT("<VALUE>");
1261                                     SCMOXmlWriter::append(out, arr->simple.val.u64);
1262                                     arr++;
1263                                     out << STRLIT("</VALUE>\n");
1264                                 }
1265                                 out << STRLIT("</VALUE.ARRAY>\n");
1266                                 break;
1267                             }
1268                     
1269                             case CIMTYPE_SINT64:
1270                             {
1271                                 out << STRLIT("<VALUE.ARRAY>\n");
1272                                 while (numElements--)
1273                                 {
1274                                     out << STRLIT("<VALUE>");
1275                                     SCMOXmlWriter::append(out, arr->simple.val.s64);
1276                                     arr++;
1277                                     out << STRLIT("</VALUE>\n");
1278                                 }
1279 thilo.boehm 1.2                 out << STRLIT("</VALUE.ARRAY>\n");
1280                                 break;
1281                             }
1282                     
1283                             case CIMTYPE_REAL32:
1284                             {
1285                                 out << STRLIT("<VALUE.ARRAY>\n");
1286                                 while (numElements--)
1287                                 {
1288                                     out << STRLIT("<VALUE>");
1289                                     SCMOXmlWriter::append(out, arr->simple.val.r32);
1290                                     arr++;
1291                                     out << STRLIT("</VALUE>\n");
1292                                 }
1293                                 out << STRLIT("</VALUE.ARRAY>\n");
1294                                 break;
1295                             }
1296                     
1297                             case CIMTYPE_REAL64:
1298                             {
1299                                 out << STRLIT("<VALUE.ARRAY>\n");
1300 thilo.boehm 1.2                 while (numElements--)
1301                                 {
1302                                     out << STRLIT("<VALUE>");
1303                                     SCMOXmlWriter::append(out, arr->simple.val.r64);
1304                                     arr++;
1305                                     out << STRLIT("</VALUE>\n");
1306                                 }
1307                                 out << STRLIT("</VALUE.ARRAY>\n");
1308                                 break;
1309                             }
1310                     
1311                             case CIMTYPE_CHAR16:
1312                             {
1313                                 out << STRLIT("<VALUE.ARRAY>\n");
1314                                 while (numElements--)
1315                                 {
1316                                     out << STRLIT("<VALUE>");
1317                                     SCMOXmlWriter::appendSpecial(out, Char16(arr->simple.val.c16));
1318                                     arr++;
1319                                     out << STRLIT("</VALUE>\n");
1320                                 }
1321 thilo.boehm 1.2                 out << STRLIT("</VALUE.ARRAY>\n");
1322                                 break;
1323                             }
1324                     
1325                             case CIMTYPE_STRING:
1326                             {
1327                                 out << STRLIT("<VALUE.ARRAY>\n");
1328                                 while (numElements--)
1329                                 {
1330                                     out << STRLIT("<VALUE>");
1331                                     if (0!=arr->stringValue.start)
1332                                     {
1333                                         SCMOXmlWriter::appendSpecial(
1334                                             out,
1335                                             &(base[arr->stringValue.start]),
1336 r.kieninger 1.3                             (arr->stringValue.size-1));
1337 thilo.boehm 1.2                     }
1338                                     arr++;
1339                                     out << STRLIT("</VALUE>\n");
1340                                 }
1341                                 out << STRLIT("</VALUE.ARRAY>\n");
1342                     
1343                                 break;
1344                             }
1345                     
1346                             case CIMTYPE_DATETIME:
1347                             {
1348                                 out << STRLIT("<VALUE.ARRAY>\n");
1349                                 char buffer[26];
1350                                 while (numElements--)
1351                                 {
1352                                     out << STRLIT("<VALUE>");
1353                                     // an SCMBDateTime is a CIMDateTimeRep
1354                                     // this should help us to reuse existing optimized Datetime
1355                                     _DateTimetoCStr(arr->dateTimeValue, buffer);
1356                                     // datetime value is formatted with a \0 at end, ignore
1357                                     out.append(buffer,sizeof(buffer)-1);
1358 thilo.boehm 1.2                     arr++;
1359                                     out << STRLIT("</VALUE>\n");
1360                                 }
1361                                 out << STRLIT("</VALUE.ARRAY>\n");
1362                                 break;
1363                             }
1364                             case CIMTYPE_REFERENCE:
1365                             {
1366                                 out << STRLIT("<VALUE.REFARRAY>\n");
1367                                 while (numElements--)
1368                                 {
1369                                     SCMOInstance * ref = arr->extRefPtr;
1370                                     if (ref)
1371                                     {
1372                                         appendValueReferenceElement(out, *ref, true);
1373                                     }
1374                                     arr++;
1375                                 }
1376                                 out << STRLIT("</VALUE.REFARRAY>\n");
1377 karl        1.4.2.2             break;
1378 thilo.boehm 1.2             }
1379                             case CIMTYPE_OBJECT:
1380                             case CIMTYPE_INSTANCE:
1381                             {
1382                                 out << STRLIT("<VALUE.ARRAY>\n");
1383                                 Buffer toEncodeObject(4000);
1384                                 while (numElements--)
1385                                 {
1386                                     toEncodeObject.clear();
1387                                     out << STRLIT("<VALUE>");
1388                                     SCMOInstance * obj = arr->extRefPtr;
1389                                     if (obj)
1390                                     {
1391                                         appendObjectElement(toEncodeObject, *obj);
1392                                         SCMOXmlWriter::appendSpecial(
1393                                             out,
1394                                             toEncodeObject.getData(),
1395                                             toEncodeObject.size());
1396                                     }
1397                                     arr++;
1398                                     out << STRLIT("</VALUE>\n");
1399 thilo.boehm 1.2                 }
1400                                 out << STRLIT("</VALUE.ARRAY>\n");
1401                                 break;
1402                             }
1403                             default:
1404                                 PEGASUS_DEBUG_ASSERT(false);
1405                         }
1406                     
1407                     }
1408                     
1409                     
1410                     
1411                     PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2