(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 anusha.kandepu 1.5 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                    }
  63                    
  64                    const Array<Uint32> & SCMOXmlWriter::getFilteredNodesArray( 
  65 anusha.kandepu 1.5      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                        SCMOXmlWriter::buildPropertyFilterNodesArray( 
  86 anusha.kandepu 1.5         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                                    out, 
 107 anusha.kandepu 1.5                 _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                                    out, 
 128 anusha.kandepu 1.5                 _scmoInstances[i], 
 129                                    true, 
 130                                    nodes); 
 131                            } 
 132                        } 
 133                    } 
 134 thilo.boehm    1.2 
 135                    void SCMOXmlWriter::appendValueSCMOInstanceElement(
 136                        Buffer& out,
 137 anusha.kandepu 1.5     const SCMOInstance& scmoInstance,
 138                        bool filtered, 
 139                        const Array<Uint32> & nodes) 
 140                    
 141 thilo.boehm    1.2 {
 142                        out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 143                    
 144                        appendInstanceNameElement(out, scmoInstance);
 145 anusha.kandepu 1.5     appendInstanceElement(out, scmoInstance,filtered,nodes);
 146 thilo.boehm    1.2 
 147                        out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
 148                    }
 149                    
 150                    void SCMOXmlWriter::appendInstanceNameElement(
 151                        Buffer& out,
 152                        const SCMOInstance& scmoInstance)
 153                    {
 154                        out << STRLIT("<INSTANCENAME CLASSNAME=\"");
 155                        Uint32 len;
 156                        const char * className = scmoInstance.getClassName_l(len);
 157                        out.append(className,len);
 158                        // TODO: check performance impact
 159                        out.append('"','>','\n');
 160                    
 161                        for (Uint32 i = 0, n = scmoInstance.getKeyBindingCount(); i < n; i++)
 162                        {
 163                            const char * kbName;
 164                            const SCMBUnion * kbValue;
 165                            CIMType kbType;
 166                            Uint32 kbNameLen;
 167 thilo.boehm    1.2 
 168                            SCMO_RC smrc = scmoInstance._getKeyBindingDataAtNodeIndex(
 169                                i,
 170                                &kbName,
 171                                kbNameLen,
 172                                kbType,
 173                                &kbValue);
 174                    
 175                            out << STRLIT("<KEYBINDING NAME=\"");
 176                            out.append(kbName,kbNameLen-1);
 177                            out.append('"','>','\n');
 178                    
 179                            if (kbType == CIMTYPE_REFERENCE)
 180                            {
 181                                if (SCMO_OK == smrc)
 182                                {
 183                                    SCMOInstance * ref = kbValue->extRefPtr;
 184                                    appendValueReferenceElement(out, *ref, true);
 185                                }
 186                            }
 187                            else
 188 thilo.boehm    1.2         {
 189                                out << STRLIT("<KEYVALUE VALUETYPE=\"");
 190                                out << xmlWriterKeyTypeStrings(kbType);
 191                                out.append('"','>');
 192                    
 193                                if (SCMO_OK == smrc)
 194                                {
 195                                    SCMOXmlWriter::appendSCMBUnion(
 196                                        out,
 197                                        *kbValue,
 198                                        kbType,
 199                                        scmoInstance.inst.base);
 200                                }
 201                                out << STRLIT("</KEYVALUE>\n");
 202                            }
 203                            out << STRLIT("</KEYBINDING>\n");
 204                        }
 205                        out << STRLIT("</INSTANCENAME>\n");
 206                    }
 207                    
 208                    //------------------------------------------------------------------------------
 209 thilo.boehm    1.2 //
 210                    // appendInstanceElement()
 211                    //
 212                    //     <!ELEMENT INSTANCE
 213                    //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
 214                    //     <!ATTLIST INSTANCE
 215                    //         %ClassName;>
 216                    //
 217                    //------------------------------------------------------------------------------
 218                    void SCMOXmlWriter::appendInstanceElement(
 219                        Buffer& out,
 220 anusha.kandepu 1.5     const SCMOInstance& scmoInstance,
 221                        bool filtered, 
 222                        const Array<Uint32> & nodes) 
 223 thilo.boehm    1.2 {
 224                        // Class opening element:
 225                    
 226                        out << STRLIT("<INSTANCE CLASSNAME=\"");
 227                        Uint32 len;
 228                        const char * className = scmoInstance.getClassName_l(len);
 229                        out.append(className,len);
 230                        out.append('"',' ','>','\n');
 231                        //out << STRLIT("\" >\n");
 232                    
 233                        // Append Instance Qualifiers:
 234                        if (scmoInstance.inst.hdr->flags.includeQualifiers)
 235                        {
 236                            SCMBClass_Main *classMain=scmoInstance.inst.hdr->theClass.ptr->cls.hdr;
 237                            char* clsbase = scmoInstance.inst.hdr->theClass.ptr->cls.base;
 238                    
 239                            SCMBQualifier *theArray =
 240                                (SCMBQualifier*)&(clsbase[classMain->qualifierArray.start]);
 241                            // need to iterate
 242                            for (Uint32 i=0, n=classMain->numberOfQualifiers;i<n;i++)
 243                            {
 244 thilo.boehm    1.2             SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsbase);
 245                            }
 246                        }
 247                    
 248                        // Append Properties:
 249 anusha.kandepu 1.5     if(!filtered)
 250                        {
 251                            for (Uint32 i=0,k=scmoInstance.inst.hdr->numberProperties;i<k;i++)
 252                            {
 253                                SCMOXmlWriter::appendPropertyElement(out,scmoInstance,i);
 254                            } 
 255                        }
 256                        else
 257 thilo.boehm    1.2     {
 258 anusha.kandepu 1.5         for (Uint32 i=0,k=nodes.size();i<k;i++)
 259                            {
 260                                SCMOXmlWriter::appendPropertyElement(out,scmoInstance,nodes[i]);
 261                            }
 262 thilo.boehm    1.2     }
 263                        // Instance closing element:
 264                        out << STRLIT("</INSTANCE>\n");
 265                    }
 266                    
 267                    //------------------------------------------------------------------------------
 268                    //
 269                    // appendQualifierElement()
 270                    //
 271                    //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
 272                    //     <!ATTLIST QUALIFIER
 273                    //              %CIMName;
 274                    //              %CIMType;               #REQUIRED
 275                    //              %Propagated;
 276                    //              %QualifierFlavor;>
 277                    //
 278                    //------------------------------------------------------------------------------
 279                    
 280                    void SCMOXmlWriter::appendQualifierElement(
 281                        Buffer& out,
 282                        const SCMBQualifier& theQualifier,
 283 thilo.boehm    1.2     const char* base)
 284                    {
 285                        out << STRLIT("<QUALIFIER NAME=\"");
 286                        if(theQualifier.name == QUALNAME_USERDEFINED)
 287                        {
 288                            if (theQualifier.userDefName.start)
 289                            {
 290                                out.append(
 291                                    &(base[theQualifier.userDefName.start]),
 292                                    theQualifier.userDefName.size-1);
 293                            }
 294                        }
 295                        else
 296                        {
 297                            out << SCMOClass::qualifierNameStrLit(theQualifier.name);
 298                        }
 299                        out.append('"',' ');
 300                        //out << STRLIT("\" ");
 301                    
 302                        // Append type
 303                        out << xmlWriterTypeStrings(theQualifier.value.valueType);
 304 thilo.boehm    1.2     // append PROPAGATED if set
 305                        if (theQualifier.propagated)
 306                        {
 307                            out << STRLIT(" PROPAGATED=\"true\"");
 308                        }
 309                        // append flavor of the qualifier
 310                        SCMOXmlWriter::appendQualifierFlavorEntity(
 311                            out,
 312                            CIMFlavor(theQualifier.flavor));
 313                    
 314                        out.append('>','\n');
 315                        //out << STRLIT(">\n");
 316                        // append the value of the qualifier
 317                        SCMOXmlWriter::appendValueElement(out, theQualifier.value, base);
 318                    
 319                        out << STRLIT("</QUALIFIER>\n");
 320                    }
 321                    
 322                    //------------------------------------------------------------------------------
 323                    //
 324                    // appendPropertyElement()
 325 thilo.boehm    1.2 //
 326                    //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
 327                    //     <!ATTLIST PROPERTY
 328                    //              %CIMName;
 329                    //              %CIMType;           #REQUIRED
 330                    //              %ClassOrigin;
 331                    //              %Propagated;>
 332                    //
 333                    //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
 334                    //     <!ATTLIST PROPERTY.ARRAY
 335                    //              %CIMName;
 336                    //              %CIMType;           #REQUIRED
 337                    //              %ArraySize;
 338                    //              %ClassOrigin;
 339                    //              %Propagated;>
 340                    //
 341                    //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
 342                    //     <!ATTLIST PROPERTY.REFERENCE
 343                    //              %CIMName;
 344                    //              %ReferenceClass;
 345                    //              %ClassOrigin;
 346 thilo.boehm    1.2 //              %Propagated;>
 347                    //
 348                    //------------------------------------------------------------------------------
 349                    void SCMOXmlWriter::appendPropertyElement(
 350                        Buffer& out,
 351                        const SCMOInstance& scmoInstance,
 352                        Uint32 pos)
 353                    {
 354                        CIMType propertyType;
 355                    
 356                        // This is an absolute pointer at a SCMBValue
 357                        SCMBValue * propertyValue;
 358                        const char * propertyValueBase;
 359                        // This is an absolute pointer at a SCMBValue
 360                        SCMBClassProperty * propertyDef;
 361                        // This is the absolute pointer at which the class info for the given
 362                        // instance starts
 363                        const char* clsbase = scmoInstance.inst.hdr->theClass.ptr->cls.base;
 364                    
 365                        scmoInstance._getPropertyAt(
 366                            pos,
 367 thilo.boehm    1.2         &propertyValue,
 368                            &propertyValueBase,
 369                            &propertyDef);
 370                    
 371                        propertyType = propertyValue->valueType;
 372                    
 373                        if (propertyValue->flags.isArray)
 374                        {
 375                            Uint32 arraySize=propertyValue->valueArraySize;
 376                    
 377                            out << STRLIT("<PROPERTY.ARRAY NAME=\"");
 378                    
 379                            out.append(
 380                                &(clsbase[propertyDef->name.start]),
 381 r.kieninger    1.3             (propertyDef->name.size-1));
 382 thilo.boehm    1.2 
 383                            out.append('"',' ');
 384                            //out << STRLIT("\" ");
 385                            if (propertyType == CIMTYPE_OBJECT)
 386                            {
 387                                // If the property array type is CIMObject, then
 388                                //    encode the property in CIM-XML as a string array with the
 389                                //    EmbeddedObject attribute (there is not currently a CIM-XML
 390                                //    "object" datatype)
 391                                out << STRLIT(" TYPE=\"string\"");
 392                                // If the Embedded Object is an instance, always add the
 393                                // EmbeddedObject attribute.
 394                                SCMOInstance * instPtr = propertyValue->value.extRefPtr;
 395                                if ((0 != instPtr) &&
 396                                        (arraySize > 0) &&
 397                                            !(instPtr->inst.hdr->flags.isClassOnly))
 398                                {
 399                                    out << STRLIT(" EmbeddedObject=\"object\""
 400                                                    " EMBEDDEDOBJECT=\"object\"");
 401                                }
 402                            }
 403 thilo.boehm    1.2         else if (propertyType == CIMTYPE_INSTANCE)
 404                            {
 405                                // If the property array type is CIMInstance, then
 406                                //   encode the property in CIM-XML as a string array with the
 407                                //   EmbeddedObject attribute (there is not currently a CIM-XML
 408                                //   "instance" datatype)
 409                                out << STRLIT(" TYPE=\"string\"");
 410                                // add the EmbeddedObject attribute
 411                                if (arraySize > 0)
 412                                {
 413                                    out << STRLIT(" EmbeddedObject=\"instance\""
 414                                                  " EMBEDDEDOBJECT=\"instance\"");
 415                                }
 416                            }
 417                            else
 418                            {
 419                                out.append(' ');
 420                                out << xmlWriterTypeStrings(propertyType);
 421                            }
 422                    
 423                            if (0 != arraySize)
 424 thilo.boehm    1.2         {
 425                                out << STRLIT(" ARRAYSIZE=\"");
 426                                SCMOXmlWriter::append(out, arraySize);
 427                                out.append('"');
 428                            }
 429                    
 430                    
 431                            if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 432                            {
 433                                if (propertyDef->originClassName.start != 0)
 434                                {
 435                                    out << STRLIT(" CLASSORIGIN=\"");
 436                                    out.append(
 437                                        &(clsbase[propertyDef->originClassName.start]),
 438 r.kieninger    1.3                     (propertyDef->originClassName.size-1));
 439 thilo.boehm    1.2                 out.append('"');
 440                                }
 441                            }
 442                            if (propertyDef->flags.propagated)
 443                            {
 444                                out << STRLIT(" PROPAGATED=\"true\"");
 445                            }
 446                    
 447                            out.append('>','\n');
 448                            //out << STRLIT(">\n");
 449                    
 450                            // Append Instance Qualifiers:
 451                            if (scmoInstance.inst.hdr->flags.includeQualifiers)
 452                            {
 453                                SCMBQualifier * theArray=
 454                                    (SCMBQualifier*)
 455                                        &(clsbase[propertyDef->qualifierArray.start]);
 456                                // need to iterate
 457                                for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 458                                {
 459                                    SCMOXmlWriter::appendQualifierElement(
 460 thilo.boehm    1.2                     out,
 461                                        theArray[i],
 462                                        clsbase);
 463                                }
 464                            }
 465                            SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 466                            out << STRLIT("</PROPERTY.ARRAY>\n");
 467                        }
 468                        else if (propertyType == CIMTYPE_REFERENCE)
 469                        {
 470                            out << STRLIT("<PROPERTY.REFERENCE NAME=\"");
 471                            out.append(
 472                                &(clsbase[propertyDef->name.start]),
 473 r.kieninger    1.3             (propertyDef->name.size-1));
 474 thilo.boehm    1.2         out.append('"',' ');
 475                            //out << STRLIT("\" ");
 476                    
 477                            if (0 != propertyDef->refClassName.start)
 478                            {
 479                                out << STRLIT(" REFERENCECLASS=\"");
 480                                out.append(
 481                                    &(clsbase[propertyDef->refClassName.start]),
 482 r.kieninger    1.3                 (propertyDef->refClassName.size-1));
 483 thilo.boehm    1.2             out.append('"');
 484                            }
 485                    
 486                            if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 487                            {
 488                                if (propertyDef->originClassName.start != 0)
 489                                {
 490                                    out << STRLIT(" CLASSORIGIN=\"");
 491                                    out.append(
 492                                        &(clsbase[propertyDef->originClassName.start]),
 493 r.kieninger    1.3                     (propertyDef->originClassName.size-1));
 494 thilo.boehm    1.2                 out.append('"');
 495                                }
 496                            }
 497                            if (propertyDef->flags.propagated)
 498                            {
 499                                out << STRLIT(" PROPAGATED=\"true\"");
 500                            }
 501                            out.append('>','\n');
 502                            //out << STRLIT(">\n");
 503                            // Append Instance Qualifiers:
 504                            if (scmoInstance.inst.hdr->flags.includeQualifiers)
 505                            {
 506                                SCMBQualifier * theArray=
 507                                    (SCMBQualifier*)
 508                                        &(clsbase[propertyDef->qualifierArray.start]);
 509                                // need to iterate
 510                                for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 511                                {
 512                                    SCMOXmlWriter::appendQualifierElement(
 513                                        out,
 514                                        theArray[i],
 515 thilo.boehm    1.2                     clsbase);
 516                                }
 517                            }
 518                            SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 519                            out << STRLIT("</PROPERTY.REFERENCE>\n");
 520                        }
 521                        else
 522                        {
 523                            out << STRLIT("<PROPERTY NAME=\"");
 524                    
 525                            out.append(
 526                                &(clsbase[propertyDef->name.start]),
 527 r.kieninger    1.3             (propertyDef->name.size-1));
 528 thilo.boehm    1.2 
 529                            out.append('"',' ');
 530                            //out << STRLIT("\" ");
 531                    
 532                            if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 533                            {
 534                                if (propertyDef->originClassName.start != 0)
 535                                {
 536                                    out << STRLIT(" CLASSORIGIN=\"");
 537                                    out.append(
 538                                        &(clsbase[propertyDef->originClassName.start]),
 539 r.kieninger    1.3                     (propertyDef->originClassName.size-1));
 540 thilo.boehm    1.2                 out.append('"');
 541                                }
 542                            }
 543                            if (propertyDef->flags.propagated)
 544                            {
 545                                out << STRLIT(" PROPAGATED=\"true\"");
 546                            }
 547                    
 548                            if (propertyType == CIMTYPE_OBJECT)
 549                            {
 550                                // If the property type is CIMObject, then
 551                                //   encode the property in CIM-XML as a string with the
 552                                //   EmbeddedObject attribute (there is not currently a CIM-XML
 553                                //   "object" datatype)
 554                                out << STRLIT(" TYPE=\"string\"");
 555                                // If the Embedded Object is an instance, always add the
 556                                // EmbeddedObject attribute.
 557                                SCMOInstance * a = propertyValue->value.extRefPtr;
 558                                if (a && !(a->inst.hdr->flags.isClassOnly))
 559                                {
 560                                    out << STRLIT(" EmbeddedObject=\"object\""
 561 thilo.boehm    1.2                               " EMBEDDEDOBJECT=\"object\"");
 562                                }
 563 marek          1.4         }
 564                            else if (propertyType == CIMTYPE_INSTANCE)
 565                            {
 566                                out << STRLIT(" TYPE=\"string\""
 567                                              " EmbeddedObject=\"instance\""
 568                                              " EMBEDDEDOBJECT=\"instance\"");
 569 thilo.boehm    1.2         }
 570                            else
 571                            {
 572                                out.append(' ');
 573                                out << xmlWriterTypeStrings(propertyType);
 574                            }
 575                            out.append('>','\n');
 576                            //out << STRLIT(">\n");
 577                    
 578                            // Append Instance Qualifiers:
 579                            if (scmoInstance.inst.hdr->flags.includeQualifiers)
 580                            {
 581                                SCMBQualifier * theArray=
 582                                    (SCMBQualifier*)
 583                                        &(clsbase[propertyDef->qualifierArray.start]);
 584                                // need to iterate
 585                                for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 586                                {
 587                                    SCMOXmlWriter::appendQualifierElement(
 588                                        out,
 589                                        theArray[i],
 590 thilo.boehm    1.2                     clsbase);
 591                                }
 592                            }
 593                            SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 594                            out << STRLIT("</PROPERTY>\n");
 595                        }
 596                    }
 597                    //------------------------------------------------------------------------------
 598                    //
 599                    // appendValueElement()
 600                    //
 601                    //    <!ELEMENT VALUE (#PCDATA)>
 602                    //    <!ELEMENT VALUE.ARRAY (VALUE*)>
 603                    //    <!ELEMENT VALUE.REFERENCE
 604                    //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 605                    //         INSTANCENAME)>
 606                    //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 607                    //
 608                    //------------------------------------------------------------------------------
 609                    
 610                    void SCMOXmlWriter::appendValueElement(
 611 thilo.boehm    1.2     Buffer& out,
 612                        const SCMBValue & value,
 613                        const char * base)
 614                    {
 615                        if (value.flags.isNull)
 616                        {
 617                            return;
 618                        }
 619                        if (value.flags.isArray)
 620                        {
 621                            appendSCMBUnionArray(
 622                                out,
 623                                value.value,
 624                                value.valueType,
 625                                value.valueArraySize,
 626                                base);
 627                        }
 628                        else if (value.valueType == CIMTYPE_REFERENCE)
 629                        {
 630                            SCMOInstance * ref = value.value.extRefPtr;
 631                            if (ref)
 632 thilo.boehm    1.2         {
 633                                appendValueReferenceElement(out, *ref, true);
 634                            }
 635                        }
 636                        else
 637                        {
 638                            out << STRLIT("<VALUE>");
 639                    
 640                            // Call function to write a SCMBUnion + type field
 641                            appendSCMBUnion(out,value.value, value.valueType,base);
 642                    
 643                            out << STRLIT("</VALUE>\n");
 644                        }
 645                    }
 646                    
 647                    //------------------------------------------------------------------------------
 648                    //
 649                    // appendValueReferenceElement()
 650                    //
 651                    //    <!ELEMENT VALUE.REFERENCE
 652                    //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 653 thilo.boehm    1.2 //         INSTANCENAME)>
 654                    //
 655                    //------------------------------------------------------------------------------
 656                    void SCMOXmlWriter::appendValueReferenceElement(
 657                        Buffer& out,
 658                        const SCMOInstance& ref,
 659                        Boolean putValueWrapper)
 660                    {
 661                        if (putValueWrapper)
 662                        {
 663                            out << STRLIT("<VALUE.REFERENCE>\n");
 664                        }
 665                    
 666                        // See if it is a class or instance reference (instance references have
 667                        // key-bindings; class references do not).
 668                    
 669                        // differentiate between instance and class using the SCMO flag
 670                        if (ref.inst.hdr->flags.isClassOnly)
 671                        {
 672                            // class
 673                            if (0 != ref.inst.hdr->hostName.start)
 674 thilo.boehm    1.2         {
 675                                appendClassPathElement(out, ref);
 676                            }
 677                            else if (0 != ref.inst.hdr->instNameSpace.start)
 678                            {
 679                                appendLocalClassPathElement(out, ref);
 680                            }
 681                            else
 682                            {
 683                                Uint32 classNameLength=0;
 684                                const char* className = ref.getClassName_l(classNameLength);
 685                                appendClassNameElement(out, className, classNameLength);
 686                            }
 687                        }
 688                        else
 689                        {
 690                            // instance
 691                            if (0 != ref.inst.hdr->hostName.start)
 692                            {
 693                                appendInstancePathElement(out, ref);
 694                            }
 695 thilo.boehm    1.2         else if (0 != ref.inst.hdr->instNameSpace.start)
 696                            {
 697                                appendLocalInstancePathElement(out, ref);
 698                            }
 699                            else
 700                            {
 701                                appendInstanceNameElement(out, ref);
 702                            }
 703                        }
 704                        if (putValueWrapper)
 705                        {
 706                            out << STRLIT("</VALUE.REFERENCE>\n");
 707                        }
 708                    }
 709                    
 710                    // appendLocalInstancePathElement()
 711                    //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 712                    void SCMOXmlWriter::appendLocalInstancePathElement(
 713                        Buffer& out,
 714                        const SCMOInstance& instancePath)
 715                    {
 716 thilo.boehm    1.2     out << STRLIT("<LOCALINSTANCEPATH>\n");
 717                        Uint32 nsLength=0;
 718                        const char* ns=instancePath.getNameSpace_l(nsLength);
 719                        appendLocalNameSpacePathElement(out, ns, nsLength);
 720                        appendInstanceNameElement(out, instancePath);
 721                        out << STRLIT("</LOCALINSTANCEPATH>\n");
 722                    }
 723                    
 724                    // appendInstancePathElement()
 725                    //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 726                    void SCMOXmlWriter::appendInstancePathElement(
 727                        Buffer& out,
 728                        const SCMOInstance& instancePath)
 729                    {
 730                        out << STRLIT("<INSTANCEPATH>\n");
 731                    
 732                        Uint32 hostnameLength=0;
 733                        const char* hostname=instancePath.getHostName_l(hostnameLength);
 734                        Uint32 nsLength=0;
 735                        const char* ns=instancePath.getNameSpace_l(nsLength);
 736                        appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 737 thilo.boehm    1.2 
 738                        appendInstanceNameElement(out, instancePath);
 739                        out << STRLIT("</INSTANCEPATH>\n");
 740                    }
 741 anusha.kandepu 1.5 void SCMOXmlWriter::appendValueObjectWithPathElement(
 742                        Buffer& out,
 743                        const Array<SCMOInstance> & objectWithPath,
 744                        const CIMPropertyList& propertyList)
 745                    {
 746                        if (propertyList.isNull()) 
 747                        { 
 748                            Array<Uint32> emptyNodes; 
 749                            for (Uint32 i = 0, n = objectWithPath.size(); i < n; i++) 
 750                            { 
 751                                SCMOXmlWriter::appendValueObjectWithPathElement(
 752                                    out,
 753                                    objectWithPath[i],
 754                                    false,
 755                                    emptyNodes);
 756                            } 
 757                        }
 758                        else
 759                        {
 760                            Array<propertyFilterNodesArray_t> propFilterNodesArrays;
 761                            for (Uint32 i = 0, n = objectWithPath.size(); i < n; i++) 
 762 anusha.kandepu 1.5         {
 763                                // This searches for an already created array of nodes, 
 764                                // if not found, creates it inside propFilterNodesArrays 
 765                                const Array<Uint32> & nodes= 
 766                                    SCMOXmlWriter::getFilteredNodesArray( 
 767                                        propFilterNodesArrays, 
 768                                        objectWithPath[i], 
 769                                        propertyList);
 770                                SCMOXmlWriter::appendValueObjectWithPathElement(
 771                                    out,
 772                                    objectWithPath[i],
 773                                    true,
 774                                    nodes); 
 775                    
 776                            }
 777                        }
 778                    }
 779 thilo.boehm    1.2 
 780                    // appendValueObjectWithPathElement()
 781                    //     <!ELEMENT VALUE.OBJECTWITHPATH
 782                    //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
 783                    void SCMOXmlWriter::appendValueObjectWithPathElement(
 784                        Buffer& out,
 785 anusha.kandepu 1.5     const SCMOInstance& objectWithPath,
 786                        bool filtered, 
 787                        const Array<Uint32> & nodes) 
 788 thilo.boehm    1.2 {
 789                        out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
 790                    
 791                        appendValueReferenceElement(out, objectWithPath, false);
 792 anusha.kandepu 1.5     appendObjectElement(out, objectWithPath,filtered,nodes);
 793 thilo.boehm    1.2 
 794                        out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
 795                    }
 796                    
 797                    // appendObjectElement()
 798                    // May refer to a CLASS or an INSTANCE
 799                    void SCMOXmlWriter::appendObjectElement(
 800                        Buffer& out,
 801 anusha.kandepu 1.5     const SCMOInstance& object,
 802                        bool filtered,
 803                        const Array<Uint32> & nodes)
 804 thilo.boehm    1.2 {
 805                        if (object.inst.hdr->flags.isClassOnly)
 806                        {
 807                            appendClassElement(out, object);
 808                        }
 809                        else
 810                        {
 811 anusha.kandepu 1.5         appendInstanceElement(out, object,filtered,nodes);
 812 thilo.boehm    1.2     }
 813                    }
 814                    
 815                    //------------------------------------------------------------------------------
 816                    //
 817                    // appendClassElement()
 818                    //
 819                    //     <!ELEMENT CLASS
 820                    //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
 821                    //     <!ATTLIST CLASS
 822                    //         %CIMName;
 823                    //         %SuperClass;>
 824                    //
 825                    //------------------------------------------------------------------------------
 826                    
 827                    void SCMOXmlWriter::appendClassElement(
 828                        Buffer& out,
 829                        const SCMOInstance& cimClass)
 830                    {
 831                    
 832                        SCMBClass_Main* ptrClass = cimClass.inst.hdr->theClass.ptr->cls.hdr;
 833 thilo.boehm    1.2     const char* clsBase = cimClass.inst.hdr->theClass.ptr->cls.base;
 834                    
 835                        // Class opening element:
 836                        out << STRLIT("<CLASS NAME=\"");
 837                        out.append(
 838                            &(clsBase[ptrClass->className.start]),
 839 r.kieninger    1.3         (ptrClass->className.size-1));
 840 thilo.boehm    1.2 
 841                        out.append('"',' ');
 842                        if (0 != ptrClass->superClassName.start)
 843                        {
 844                            out << STRLIT(" SUPERCLASS=\"");
 845                            out.append(
 846                                &(clsBase[ptrClass->superClassName.start]),
 847 r.kieninger    1.3             (ptrClass->superClassName.size-1));
 848 thilo.boehm    1.2         out.append('"',' ');
 849                        }
 850                        out.append('>','\n');
 851                    
 852                        // Append class qualifiers
 853                        SCMBQualifier *theArray =
 854                            (SCMBQualifier*)&(clsBase[ptrClass->qualifierArray.start]);
 855                        for (Uint32 i=0, n=ptrClass->numberOfQualifiers;i<n;i++)
 856                        {
 857                            SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsBase);
 858                        }
 859                    
 860                        // Append Property definitions:
 861                        for (Uint32 i=0,k=cimClass.getPropertyCount();i<k;i++)
 862                        {
 863                                SCMOXmlWriter::appendPropertyElement(out,cimClass,i);
 864                        }
 865                    
 866                        // ATTN: No method definitions with SCMO today, so do nothing with them
 867                        //       Actually this code does not serve a purpose, but is kept here
 868                        //       for completeness.
 869 thilo.boehm    1.2 
 870                        // Class closing element:
 871                        out << STRLIT("</CLASS>\n");
 872                    }
 873                    
 874                    // appendLocalClassPathElement()
 875                    //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 876                    void SCMOXmlWriter::appendLocalClassPathElement(
 877                        Buffer& out,
 878                        const SCMOInstance& classPath)
 879                    {
 880                        out << STRLIT("<LOCALCLASSPATH>\n");
 881                        Uint32 hostnameLength=0;
 882                        const char* hostname=classPath.getHostName_l(hostnameLength);
 883                        Uint32 nsLength=0;
 884                        const char* ns=classPath.getNameSpace_l(nsLength);
 885                    
 886                        appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 887                    
 888                        Uint32 classNameLength=0;
 889                        const char* className = classPath.getClassName_l(classNameLength);
 890 thilo.boehm    1.2     appendClassNameElement(out, className, classNameLength);
 891                        out << STRLIT("</LOCALCLASSPATH>\n");
 892                    }
 893                    
 894                    // appendClassPathElement()
 895                    //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 896                    void SCMOXmlWriter::appendClassPathElement(
 897                        Buffer& out,
 898                        const SCMOInstance& classPath)
 899                    {
 900                        out << STRLIT("<CLASSPATH>\n");
 901                    
 902                        Uint32 hostnameLength=0;
 903                        const char* hostname=classPath.getHostName_l(hostnameLength);
 904                        Uint32 nsLength=0;
 905                        const char* ns=classPath.getNameSpace_l(nsLength);
 906                    
 907                        appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 908                    
 909                        Uint32 classNameLength=0;
 910                        const char* className = classPath.getClassName_l(classNameLength);
 911 thilo.boehm    1.2 
 912                        appendClassNameElement(out, className, classNameLength);
 913                        out << STRLIT("</CLASSPATH>\n");
 914                    }
 915                    
 916                    void SCMOXmlWriter::appendSCMBUnion(
 917                        Buffer& out,
 918                        const SCMBUnion & u,
 919                        const CIMType & valueType,
 920                        const char * base)
 921                    {
 922                        switch (valueType)
 923                        {
 924                            case CIMTYPE_BOOLEAN:
 925                            {
 926                                if (u.simple.hasValue)
 927                                {
 928                                    SCMOXmlWriter::append(out, u.simple.val.bin);
 929                                }
 930                                break;
 931                            }
 932 thilo.boehm    1.2 
 933                            case CIMTYPE_UINT8:
 934                            {
 935                                if (u.simple.hasValue)
 936                                {
 937                                    SCMOXmlWriter::append(out, u.simple.val.u8);
 938                                }
 939                                break;
 940                            }
 941                    
 942                            case CIMTYPE_SINT8:
 943                            {
 944                                if (u.simple.hasValue)
 945                                {
 946                                    SCMOXmlWriter::append(out, u.simple.val.s8);
 947                                }
 948                                break;
 949                            }
 950                    
 951                            case CIMTYPE_UINT16:
 952                            {
 953 thilo.boehm    1.2             if (u.simple.hasValue)
 954                                {
 955                                    SCMOXmlWriter::append(out, u.simple.val.u16);
 956                                }
 957                                break;
 958                            }
 959                    
 960                            case CIMTYPE_SINT16:
 961                            {
 962                                if (u.simple.hasValue)
 963                                {
 964                                    SCMOXmlWriter::append(out, u.simple.val.s16);
 965                                }
 966                                break;
 967                            }
 968                    
 969                            case CIMTYPE_UINT32:
 970                            {
 971                                if (u.simple.hasValue)
 972                                {
 973                                    SCMOXmlWriter::append(out, u.simple.val.u32);
 974 thilo.boehm    1.2             }
 975                                break;
 976                            }
 977                    
 978                            case CIMTYPE_SINT32:
 979                            {
 980                                if (u.simple.hasValue)
 981                                {
 982                                    SCMOXmlWriter::append(out, u.simple.val.s32);
 983                                }
 984                                break;
 985                            }
 986                    
 987                            case CIMTYPE_UINT64:
 988                            {
 989                                if (u.simple.hasValue)
 990                                {
 991                                    SCMOXmlWriter::append(out, u.simple.val.u64);
 992                                }
 993                                break;
 994                            }
 995 thilo.boehm    1.2 
 996                            case CIMTYPE_SINT64:
 997                            {
 998                                if (u.simple.hasValue)
 999                                {
1000                                    SCMOXmlWriter::append(out, u.simple.val.s64);
1001                                }
1002                                break;
1003                            }
1004                    
1005                            case CIMTYPE_REAL32:
1006                            {
1007                                if (u.simple.hasValue)
1008                                {
1009                                    SCMOXmlWriter::append(out, u.simple.val.r32);
1010                                }
1011                                break;
1012                            }
1013                    
1014                            case CIMTYPE_REAL64:
1015                            {
1016 thilo.boehm    1.2             if (u.simple.hasValue)
1017                                {
1018                                    SCMOXmlWriter::append(out, u.simple.val.r64);
1019                                }
1020                                break;
1021                            }
1022                    
1023                            case CIMTYPE_CHAR16:
1024                            {
1025                                if (u.simple.hasValue)
1026                                {
1027                                    SCMOXmlWriter::appendSpecial(
1028                                        out,
1029                                        Char16(u.simple.val.c16));
1030                                }
1031                                break;
1032                            }
1033                    
1034                            case CIMTYPE_STRING:
1035                            {
1036                                if (u.stringValue.start)
1037 thilo.boehm    1.2             {
1038                                    SCMOXmlWriter::appendSpecial(
1039                                        out,
1040                                        &(base[u.stringValue.start]),
1041 r.kieninger    1.3                     (u.stringValue.size-1));
1042 thilo.boehm    1.2             }
1043                                break;
1044                            }
1045                    
1046                            case CIMTYPE_DATETIME:
1047                            {
1048                                // an SCMBDateTime is a CIMDateTimeRep
1049                                // this should help us to reuse existing optimized Datetime
1050                                char buffer[26];
1051                                _DateTimetoCStr(u.dateTimeValue, buffer);
1052                                // datetime value is formatted with a \0 at end, ignore
1053                                out.append(buffer,sizeof(buffer)-1);
1054                                break;
1055                            }
1056                            // Object and Instance are both written the same way, namely as
1057                            // object element which then is encoded using appendSpecial
1058                            case CIMTYPE_OBJECT:
1059                            case CIMTYPE_INSTANCE:
1060                            {
1061                                Buffer toEncodeObject(4000);
1062                                SCMOInstance * obj = u.extRefPtr;
1063 thilo.boehm    1.2             if (obj)
1064                                {
1065                                    appendObjectElement(toEncodeObject, *obj);
1066                                    SCMOXmlWriter::appendSpecial(
1067                                        out,
1068                                        toEncodeObject.getData(),
1069                                        toEncodeObject.size());
1070                                }
1071                                break;
1072                            }
1073                            default:
1074                                // CIMTYPE_REFERENCE has been handled upfront, do nothing here
1075                                break;
1076                        }
1077                    }
1078                    
1079                    void SCMOXmlWriter::appendSCMBUnionArray(
1080                        Buffer& out,
1081                        const SCMBUnion & u,
1082                        const CIMType & valueType,
1083                        Uint32 numElements,
1084 thilo.boehm    1.2     const char * base)
1085                    {
1086                        SCMBUnion* arr = (SCMBUnion*) &(base[u.arrayValue.start]);
1087                        switch (valueType)
1088                        {
1089                            case CIMTYPE_BOOLEAN:
1090                            {
1091                                out << STRLIT("<VALUE.ARRAY>\n");
1092                                while (numElements--)
1093                                {
1094                                    out << STRLIT("<VALUE>");
1095                                    SCMOXmlWriter::append(out, arr->simple.val.bin);
1096                                    arr++;
1097                                    out << STRLIT("</VALUE>\n");
1098                                }
1099                                out << STRLIT("</VALUE.ARRAY>\n");
1100                                break;
1101                            }
1102                            case CIMTYPE_UINT8:
1103                            {
1104                                out << STRLIT("<VALUE.ARRAY>\n");
1105 thilo.boehm    1.2             while (numElements--)
1106                                {
1107                                    out << STRLIT("<VALUE>");
1108                                    SCMOXmlWriter::append(out, arr->simple.val.u8);
1109                                    arr++;
1110                                    out << STRLIT("</VALUE>\n");
1111                                }
1112                                out << STRLIT("</VALUE.ARRAY>\n");
1113                                break;
1114                            }
1115                    
1116                            case CIMTYPE_SINT8:
1117                            {
1118                                out << STRLIT("<VALUE.ARRAY>\n");
1119                                while (numElements--)
1120                                {
1121                                    out << STRLIT("<VALUE>");
1122                                    SCMOXmlWriter::append(out, arr->simple.val.s8);
1123                                    arr++;
1124                                    out << STRLIT("</VALUE>\n");
1125                                }
1126 thilo.boehm    1.2             out << STRLIT("</VALUE.ARRAY>\n");
1127                                break;
1128                            }
1129                    
1130                            case CIMTYPE_UINT16:
1131                            {
1132                                out << STRLIT("<VALUE.ARRAY>\n");
1133                                while (numElements--)
1134                                {
1135                                    out << STRLIT("<VALUE>");
1136                                    SCMOXmlWriter::append(out, arr->simple.val.u16);
1137                                    arr++;
1138                                    out << STRLIT("</VALUE>\n");
1139                                }
1140                                out << STRLIT("</VALUE.ARRAY>\n");
1141                                break;
1142                            }
1143                    
1144                            case CIMTYPE_SINT16:
1145                            {
1146                                out << STRLIT("<VALUE.ARRAY>\n");
1147 thilo.boehm    1.2             while (numElements--)
1148                                {
1149                                    out << STRLIT("<VALUE>");
1150                                    SCMOXmlWriter::append(out, arr->simple.val.s16);
1151                                    arr++;
1152                                    out << STRLIT("</VALUE>\n");
1153                                }
1154                                out << STRLIT("</VALUE.ARRAY>\n");
1155                                break;
1156                            }
1157                    
1158                            case CIMTYPE_UINT32:
1159                            {
1160                                out << STRLIT("<VALUE.ARRAY>\n");
1161                                while (numElements--)
1162                                {
1163                                    out << STRLIT("<VALUE>");
1164                                    SCMOXmlWriter::append(out, arr->simple.val.u32);
1165                                    arr++;
1166                                    out << STRLIT("</VALUE>\n");
1167                                }
1168 thilo.boehm    1.2             out << STRLIT("</VALUE.ARRAY>\n");
1169                                break;
1170                            }
1171                    
1172                            case CIMTYPE_SINT32:
1173                            {
1174                                out << STRLIT("<VALUE.ARRAY>\n");
1175                                while (numElements--)
1176                                {
1177                                    out << STRLIT("<VALUE>");
1178                                    SCMOXmlWriter::append(out, arr->simple.val.s32);
1179                                    arr++;
1180                                    out << STRLIT("</VALUE>\n");
1181                                }
1182                                out << STRLIT("</VALUE.ARRAY>\n");
1183                                break;
1184                            }
1185                    
1186                            case CIMTYPE_UINT64:
1187                            {
1188                                out << STRLIT("<VALUE.ARRAY>\n");
1189 thilo.boehm    1.2             while (numElements--)
1190                                {
1191                                    out << STRLIT("<VALUE>");
1192                                    SCMOXmlWriter::append(out, arr->simple.val.u64);
1193                                    arr++;
1194                                    out << STRLIT("</VALUE>\n");
1195                                }
1196                                out << STRLIT("</VALUE.ARRAY>\n");
1197                                break;
1198                            }
1199                    
1200                            case CIMTYPE_SINT64:
1201                            {
1202                                out << STRLIT("<VALUE.ARRAY>\n");
1203                                while (numElements--)
1204                                {
1205                                    out << STRLIT("<VALUE>");
1206                                    SCMOXmlWriter::append(out, arr->simple.val.s64);
1207                                    arr++;
1208                                    out << STRLIT("</VALUE>\n");
1209                                }
1210 thilo.boehm    1.2             out << STRLIT("</VALUE.ARRAY>\n");
1211                                break;
1212                            }
1213                    
1214                            case CIMTYPE_REAL32:
1215                            {
1216                                out << STRLIT("<VALUE.ARRAY>\n");
1217                                while (numElements--)
1218                                {
1219                                    out << STRLIT("<VALUE>");
1220                                    SCMOXmlWriter::append(out, arr->simple.val.r32);
1221                                    arr++;
1222                                    out << STRLIT("</VALUE>\n");
1223                                }
1224                                out << STRLIT("</VALUE.ARRAY>\n");
1225                                break;
1226                            }
1227                    
1228                            case CIMTYPE_REAL64:
1229                            {
1230                                out << STRLIT("<VALUE.ARRAY>\n");
1231 thilo.boehm    1.2             while (numElements--)
1232                                {
1233                                    out << STRLIT("<VALUE>");
1234                                    SCMOXmlWriter::append(out, arr->simple.val.r64);
1235                                    arr++;
1236                                    out << STRLIT("</VALUE>\n");
1237                                }
1238                                out << STRLIT("</VALUE.ARRAY>\n");
1239                                break;
1240                            }
1241                    
1242                            case CIMTYPE_CHAR16:
1243                            {
1244                                out << STRLIT("<VALUE.ARRAY>\n");
1245                                while (numElements--)
1246                                {
1247                                    out << STRLIT("<VALUE>");
1248                                    SCMOXmlWriter::appendSpecial(out, Char16(arr->simple.val.c16));
1249                                    arr++;
1250                                    out << STRLIT("</VALUE>\n");
1251                                }
1252 thilo.boehm    1.2             out << STRLIT("</VALUE.ARRAY>\n");
1253                                break;
1254                            }
1255                    
1256                            case CIMTYPE_STRING:
1257                            {
1258                                out << STRLIT("<VALUE.ARRAY>\n");
1259                                while (numElements--)
1260                                {
1261                                    out << STRLIT("<VALUE>");
1262                                    if (0!=arr->stringValue.start)
1263                                    {
1264                                        SCMOXmlWriter::appendSpecial(
1265                                            out,
1266                                            &(base[arr->stringValue.start]),
1267 r.kieninger    1.3                         (arr->stringValue.size-1));
1268 thilo.boehm    1.2                 }
1269                                    arr++;
1270                                    out << STRLIT("</VALUE>\n");
1271                                }
1272                                out << STRLIT("</VALUE.ARRAY>\n");
1273                    
1274                                break;
1275                            }
1276                    
1277                            case CIMTYPE_DATETIME:
1278                            {
1279                                out << STRLIT("<VALUE.ARRAY>\n");
1280                                char buffer[26];
1281                                while (numElements--)
1282                                {
1283                                    out << STRLIT("<VALUE>");
1284                                    // an SCMBDateTime is a CIMDateTimeRep
1285                                    // this should help us to reuse existing optimized Datetime
1286                                    _DateTimetoCStr(arr->dateTimeValue, buffer);
1287                                    // datetime value is formatted with a \0 at end, ignore
1288                                    out.append(buffer,sizeof(buffer)-1);
1289 thilo.boehm    1.2                 arr++;
1290                                    out << STRLIT("</VALUE>\n");
1291                                }
1292                                out << STRLIT("</VALUE.ARRAY>\n");
1293                                break;
1294                            }
1295                            case CIMTYPE_REFERENCE:
1296                            {
1297                                out << STRLIT("<VALUE.REFARRAY>\n");
1298                                while (numElements--)
1299                                {
1300                                    SCMOInstance * ref = arr->extRefPtr;
1301                                    if (ref)
1302                                    {
1303                                        appendValueReferenceElement(out, *ref, true);
1304                                    }
1305                                    arr++;
1306                                }
1307                                out << STRLIT("</VALUE.REFARRAY>\n");
1308 ashok.pathak   1.6             break;
1309 thilo.boehm    1.2         }
1310                            case CIMTYPE_OBJECT:
1311                            case CIMTYPE_INSTANCE:
1312                            {
1313                                out << STRLIT("<VALUE.ARRAY>\n");
1314                                Buffer toEncodeObject(4000);
1315                                while (numElements--)
1316                                {
1317                                    toEncodeObject.clear();
1318                                    out << STRLIT("<VALUE>");
1319                                    SCMOInstance * obj = arr->extRefPtr;
1320                                    if (obj)
1321                                    {
1322                                        appendObjectElement(toEncodeObject, *obj);
1323                                        SCMOXmlWriter::appendSpecial(
1324                                            out,
1325                                            toEncodeObject.getData(),
1326                                            toEncodeObject.size());
1327                                    }
1328                                    arr++;
1329                                    out << STRLIT("</VALUE>\n");
1330 thilo.boehm    1.2             }
1331                                out << STRLIT("</VALUE.ARRAY>\n");
1332                                break;
1333                            }
1334                            default:
1335                                PEGASUS_DEBUG_ASSERT(false);
1336                        }
1337                    
1338                    }
1339                    
1340                    
1341                    
1342                    PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2