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

   1 marek 1.1.2.1 //%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 marek 1.1.2.1 // 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               //%/////////////////////////////////////////////////////////////////////////////
  31               
  32               #include <Pegasus/Common/Config.h>
  33               #include <cstdlib>
  34               #include <cstdio>
  35               #include <Pegasus/Common/SCMOXmlWriter.h>
  36               
  37               PEGASUS_NAMESPACE_BEGIN
  38               
  39 marek 1.1.2.2 void SCMOXmlWriter::appendValueSCMOInstanceElement(
  40                   Buffer& out,
  41                   const SCMOInstance& scmoInstance)
  42               {
  43                   out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
  44               
  45                   appendInstanceNameElement(out, scmoInstance);
  46                   appendInstanceElement(out, scmoInstance);
  47               
  48                   out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
  49               }
  50               
  51               void SCMOXmlWriter::appendInstanceNameElement(
  52                   Buffer& out,
  53                   const SCMOInstance& scmoInstance)
  54               {
  55                   out << STRLIT("<INSTANCENAME CLASSNAME=\"");
  56                   Uint64 len;
  57                   const char * className = scmoInstance.getClassName_l(len);
  58                   out.append(className,len-1);
  59                   out << STRLIT("\">\n");
  60 marek 1.1.2.2 
  61                   for (Uint32 i = 0, n = scmoInstance.getKeyBindingCount(); i < n; i++)
  62                   {
  63                       const char * kbName;
  64                       const SCMBUnion * kbValue;
  65                       CIMType kbType;
  66                       Uint32 kbNameLen;
  67               
  68                       scmoInstance._getKeyBindingDataAtNodeIndex(
  69                           i,
  70                           &kbName,
  71                           kbNameLen,
  72                           kbType,
  73                           &kbValue);
  74               
  75                       out << STRLIT("<KEYBINDING NAME=\"");
  76                       out.append(kbName,kbNameLen-1);
  77                       out << STRLIT("\">\n");
  78               
  79                       if (kbType == CIMTYPE_REFERENCE)
  80                       {
  81 marek 1.1.2.6             SCMOInstance * ref = kbValue->extRefPtr;
  82                           appendValueReferenceElement(out, *ref, true);
  83 marek 1.1.2.2         }
  84                       else
  85                       {
  86                           out << STRLIT("<KEYVALUE VALUETYPE=\"");
  87                           out << xmlWriterKeyTypeStrings(kbType);
  88                           out << STRLIT("\">");
  89               
  90                           SCMOXmlWriter::appendSCMBUnion(
  91                               out,
  92                               *kbValue,
  93                               kbType,
  94                               scmoInstance.inst.base);
  95               
  96                           out << STRLIT("</KEYVALUE>\n");
  97                       }
  98                       out << STRLIT("</KEYBINDING>\n");
  99                   }
 100                   out << STRLIT("</INSTANCENAME>\n");
 101               }
 102               
 103               //------------------------------------------------------------------------------
 104 marek 1.1.2.2 //
 105               // appendInstanceElement()
 106               //
 107               //     <!ELEMENT INSTANCE
 108               //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
 109               //     <!ATTLIST INSTANCE
 110               //         %ClassName;>
 111               //
 112               //------------------------------------------------------------------------------
 113               void SCMOXmlWriter::appendInstanceElement(
 114                   Buffer& out,
 115                   const SCMOInstance& scmoInstance)
 116               {
 117                   // Class opening element:
 118               
 119                   out << STRLIT("<INSTANCE CLASSNAME=\"");
 120                   Uint64 len;
 121                   const char * className = scmoInstance.getClassName_l(len);
 122                   out.append(className,len-1);
 123                   out << STRLIT("\" >\n");
 124               
 125 marek 1.1.2.2     // Append Instance Qualifiers:
 126                   if (scmoInstance.inst.hdr->flags.includeQualifiers)
 127                   {
 128                       SCMBClass_Main *classMain=scmoInstance.inst.hdr->theClass->cls.hdr;
 129                       char* clsbase = scmoInstance.inst.hdr->theClass->cls.base;
 130               
 131                       SCMBQualifier *theArray =
 132                           (SCMBQualifier*)&(clsbase[classMain->qualifierArray.start]);
 133                       // need to iterate
 134                       for (Uint32 i=0, n=classMain->numberOfQualifiers;i<n;i++)
 135                       {
 136                           SCMOXmlWriter::appendQualifierElement(out,theArray[i],clsbase);
 137                       }
 138                   }
 139               
 140                   // Append Properties:
 141 marek 1.1.2.5     for (Uint32 i=0,k=scmoInstance.getPropertyCount();i<k;i++)
 142 marek 1.1.2.2     {
 143                       if (scmoInstance.inst.hdr->flags.isFiltered &&
 144                           !scmoInstance._isPropertyInFilter(i))
 145                       {
 146                           // Property is filtered, ignore and go to next
 147                           continue;
 148                       }
 149                       else
 150                       {
 151                           SCMOXmlWriter::appendPropertyElement(out,scmoInstance,i);
 152                       }
 153                   }
 154                   // Instance closing element:
 155                   out << STRLIT("</INSTANCE>\n");
 156               }
 157               
 158               //------------------------------------------------------------------------------
 159               //
 160               // appendQualifierElement()
 161               //
 162               //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
 163 marek 1.1.2.2 //     <!ATTLIST QUALIFIER
 164               //              %CIMName;
 165               //              %CIMType;               #REQUIRED
 166               //              %Propagated;
 167               //              %QualifierFlavor;>
 168               //
 169               //------------------------------------------------------------------------------
 170               
 171               void SCMOXmlWriter::appendQualifierElement(
 172                   Buffer& out,
 173                   const SCMBQualifier& theQualifier,
 174                   const char* base)
 175               {
 176                   out << STRLIT("<QUALIFIER NAME=\"");
 177                   if(theQualifier.name == QUALNAME_USERDEFINED)
 178                   {
 179                       if (theQualifier.userDefName.start)
 180                       {
 181                           out.append(
 182                               &(base[theQualifier.userDefName.start]),
 183                               theQualifier.userDefName.length-1);
 184 marek 1.1.2.2         }
 185                   }
 186                   else
 187                   {
 188                       out << SCMOClass::qualifierNameStrLit(theQualifier.name);
 189                   }
 190               
 191                   out << STRLIT("\" ");
 192               
 193                   // Append type
 194                   out << xmlWriterTypeStrings(theQualifier.value.valueType);
 195                   // append PROPAGATED if set
 196                   if (theQualifier.propagated)
 197                   {
 198                       out << STRLIT(" PROPAGATED=\"true\"");
 199                   }
 200                   // append flavor of the qualifier
 201                   SCMOXmlWriter::appendQualifierFlavorEntity(
 202                       out,
 203                       CIMFlavor(theQualifier.flavor));
 204               
 205 marek 1.1.2.2     out << STRLIT(">\n");
 206                   // append the value of the qualifier
 207 marek 1.1.2.4     SCMOXmlWriter::appendValueElement(out, theQualifier.value, base);
 208 marek 1.1.2.2 
 209                   out << STRLIT("</QUALIFIER>\n");
 210               }
 211               
 212               //------------------------------------------------------------------------------
 213               //
 214               // appendPropertyElement()
 215               //
 216               //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
 217               //     <!ATTLIST PROPERTY
 218               //              %CIMName;
 219               //              %CIMType;           #REQUIRED
 220               //              %ClassOrigin;
 221               //              %Propagated;>
 222               //
 223               //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
 224               //     <!ATTLIST PROPERTY.ARRAY
 225               //              %CIMName;
 226               //              %CIMType;           #REQUIRED
 227               //              %ArraySize;
 228               //              %ClassOrigin;
 229 marek 1.1.2.2 //              %Propagated;>
 230               //
 231               //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
 232               //     <!ATTLIST PROPERTY.REFERENCE
 233               //              %CIMName;
 234               //              %ReferenceClass;
 235               //              %ClassOrigin;
 236               //              %Propagated;>
 237               //
 238               //------------------------------------------------------------------------------
 239               
 240               void SCMOXmlWriter::appendPropertyElement(
 241                   Buffer& out,
 242                   const SCMOInstance& scmoInstance,
 243                   Uint32 pos)
 244               {
 245                   // Get most of the property data from the instance
 246                   const char* propertyName;
 247                   Uint32 propertyNameLen;
 248                   CIMType propertyType;
 249               
 250 marek 1.1.2.2     // This is an absolute pointer at a SCMBValue
 251                   SCMBValue * propertyValue;
 252                   const char * propertyValueBase;
 253                   // This is an absolute pointer at a SCMBValue
 254                   SCMBClassProperty * propertyDef;
 255                   // This is the absolute pointer at which the class info for the given
 256                   // instance starts
 257                   const char* clsbase = scmoInstance.inst.hdr->theClass->cls.base;
 258               
 259                   SCMO_RC rc = scmoInstance.getPropertyAt(
 260                       pos,
 261                       &propertyValue,
 262                       &propertyValueBase,
 263                       &propertyDef);
 264               
 265                   propertyType = propertyValue->valueType;
 266               
 267               
 268                   if (propertyValue->flags.isArray)
 269                   {
 270 marek 1.1.2.3         out << STRLIT("<PROPERTY.ARRAY NAME=\"");
 271 marek 1.1.2.2 
 272 marek 1.1.2.3         out.append(
 273                           &(clsbase[propertyDef->name.start]),
 274                           propertyDef->name.length-1);
 275               
 276                       out << STRLIT("\" ");
 277 marek 1.1.2.2         if (propertyType == CIMTYPE_OBJECT)
 278                       {
 279 marek 1.1.2.4 /*          TODO: Implement writing CIM_OBJECT
 280 marek 1.1.2.2             // If the property array type is CIMObject, then
 281                           //    encode the property in CIM-XML as a string array with the
 282                           //    EmbeddedObject attribute (there is not currently a CIM-XML
 283                           //    "object" datatype)
 284               
 285                           Array<CIMObject> a;
 286                           rep->getValue().get(a);
 287                           out << STRLIT(" TYPE=\"string\"");
 288                           // If the Embedded Object is an instance, always add the
 289                           // EmbeddedObject attribute.
 290                           if (a.size() > 0 && a[0].isInstance())
 291                           {
 292                               out << STRLIT(" EmbeddedObject=\"object\""
 293                                             " EMBEDDEDOBJECT=\"object\"");
 294                           }
 295               #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
 296                           else
 297               #endif
 298                           {
 299                               // Else the Embedded Object is a class, always add the
 300                               // EmbeddedObject qualifier.  Note that if the macro
 301 marek 1.1.2.2                 // PEGASUS_SNIA_INTEROP_COMPATIBILITY is defined, then
 302                               // the EmbeddedObject qualifier will always be added,
 303                               // whether it's a class or an instance.
 304                               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
 305                                  == PEG_NOT_FOUND)
 306                               {
 307                                   // Note that addQualifiers() cannot be called on a const
 308                                   // CIMQualifierRep.In this case we really do want to add
 309                                   // the EmbeddedObject qualifier, so we cast away the
 310                                   // constness.
 311                                   CIMPropertyRep* tmpRep=const_cast<CIMPropertyRep*>(rep);
 312                                   tmpRep->addQualifier(
 313                                       CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
 314                                                    true));
 315                               }
 316                           }
 317 marek 1.1.2.6 */
 318 marek 1.1.2.2         }
 319                       else if (propertyType == CIMTYPE_INSTANCE)
 320                       {
 321 marek 1.1.2.4 /*          TODO: Implement writing embedded instance
 322 marek 1.1.2.2             // If the property array type is CIMInstance, then
 323                           //   encode the property in CIM-XML as a string array with the
 324                           //   EmbeddedObject attribute (there is not currently a CIM-XML
 325                           //   "instance" datatype)
 326               
 327                           Array<CIMInstance> a;
 328                           rep->getValue().get(a);
 329                           out << STRLIT(" TYPE=\"string\"");
 330               
 331                           // add the EmbeddedObject attribute
 332                           if (a.size() > 0)
 333                           {
 334                               out << STRLIT(" EmbeddedObject=\"instance\""
 335                                             " EMBEDDEDOBJECT=\"instance\"");
 336               
 337                               // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY
 338                               // is defined, then the EmbeddedInstance qualifier will be
 339                               // added
 340               # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
 341                               if (rep->findQualifier(
 342                                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE ==
 343 marek 1.1.2.2                         PEG_NOT_FOUND)
 344                               {
 345                                   // Note that addQualifiers() cannot be called on a const
 346                                   // CIMQualifierRep.In this case we really do want to add
 347                                   // the EmbeddedInstance qualifier, so we cast away the
 348                                   // constness.
 349               
 350                                   // For now, we assume that all the embedded instances in
 351                                   // the array are of the same type
 352                                   CIMPropertyRep* tmpRep=const_cast<CIMPropertyRep*>(rep);
 353                                   tmpRep->addQualifier(CIMQualifier(
 354                                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
 355                                       a[0].getClassName().getString()));
 356                               }
 357               # endif
 358                           }
 359 marek 1.1.2.6 */
 360 marek 1.1.2.2         }
 361                       else
 362 marek 1.1.2.6         {
 363 marek 1.1.2.2             out.append(' ');
 364 marek 1.1.2.3             out << xmlWriterTypeStrings(propertyType);
 365 marek 1.1.2.2         }
 366 marek 1.1.2.6 
 367 marek 1.1.2.3         Uint32 arraySize=propertyValue->valueArraySize;
 368 marek 1.1.2.2 
 369 marek 1.1.2.3         if (0 != arraySize)
 370 marek 1.1.2.2         {
 371 marek 1.1.2.3             out << STRLIT(" ARRAYSIZE=\"");
 372                           SCMOXmlWriter::append(out, arraySize);
 373 marek 1.1.2.2             out.append('"');
 374                       }
 375               
 376 marek 1.1.2.3 
 377                       if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 378 marek 1.1.2.2         {
 379 marek 1.1.2.3             if (propertyDef->originClassName.start != 0)
 380                           {
 381                               out << STRLIT(" CLASSORIGIN=\"");
 382                               out.append(
 383                                   &(clsbase[propertyDef->originClassName.start]),
 384                                   propertyDef->originClassName.length-1);
 385                               out.append('"');
 386                           }
 387 marek 1.1.2.2         }
 388 marek 1.1.2.3         if (propertyDef->flags.propagated)
 389 marek 1.1.2.2         {
 390                           out << STRLIT(" PROPAGATED=\"true\"");
 391                       }
 392               
 393                       out << STRLIT(">\n");
 394               
 395 marek 1.1.2.3         // Append Instance Qualifiers:
 396                       if (scmoInstance.inst.hdr->flags.includeQualifiers)
 397                       {
 398                           SCMBQualifier * theArray=
 399                               (SCMBQualifier*)
 400                                   &(clsbase[propertyDef->qualifierArray.start]);
 401                           // need to iterate
 402                           for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 403                           {
 404                               SCMOXmlWriter::appendQualifierElement(
 405                                   out,
 406                                   theArray[i],
 407                                   clsbase);
 408                           }
 409                       }
 410 marek 1.1.2.2 
 411 marek 1.1.2.3         SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 412 marek 1.1.2.2 
 413                       out << STRLIT("</PROPERTY.ARRAY>\n");
 414                   }
 415                   else if (propertyType == CIMTYPE_REFERENCE)
 416                   {
 417 marek 1.1.2.6         out << STRLIT("<PROPERTY.REFERENCE NAME=\"");
 418 marek 1.1.2.5         out.append(
 419                           &(clsbase[propertyDef->name.start]),
 420                           propertyDef->name.length-1);
 421                       out << STRLIT("\" ");
 422 marek 1.1.2.2 
 423 marek 1.1.2.5         if (0 != propertyDef->refClassName.start)
 424 marek 1.1.2.2         {
 425 marek 1.1.2.5             out << STRLIT(" REFERENCECLASS=\"");
 426                           out.append(
 427                               &(clsbase[propertyDef->refClassName.start]),
 428                               propertyDef->refClassName.length-1);
 429 marek 1.1.2.2             out.append('"');
 430                       }
 431               
 432 marek 1.1.2.5         if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 433 marek 1.1.2.2         {
 434 marek 1.1.2.5             if (propertyDef->originClassName.start != 0)
 435                           {
 436                               out << STRLIT(" CLASSORIGIN=\"");
 437                               out.append(
 438                                   &(clsbase[propertyDef->originClassName.start]),
 439                                   propertyDef->originClassName.length-1);
 440                               out.append('"');
 441                           }
 442 marek 1.1.2.2         }
 443 marek 1.1.2.5         if (propertyDef->flags.propagated)
 444 marek 1.1.2.2         {
 445                           out << STRLIT(" PROPAGATED=\"true\"");
 446                       }
 447                       out << STRLIT(">\n");
 448 marek 1.1.2.5         // Append Instance Qualifiers:
 449                       if (scmoInstance.inst.hdr->flags.includeQualifiers)
 450                       {
 451                           SCMBQualifier * theArray=
 452                               (SCMBQualifier*)
 453                                   &(clsbase[propertyDef->qualifierArray.start]);
 454                           // need to iterate
 455                           for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 456                           {
 457                               SCMOXmlWriter::appendQualifierElement(
 458                                   out,
 459                                   theArray[i],
 460                                   clsbase);
 461                           }
 462                       }
 463                       SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 464 marek 1.1.2.2         out << STRLIT("</PROPERTY.REFERENCE>\n");
 465                   }
 466                   else
 467                   {
 468                       out << STRLIT("<PROPERTY NAME=\"");
 469               
 470                       out.append(
 471                           &(clsbase[propertyDef->name.start]),
 472                           propertyDef->name.length-1);
 473               
 474                       out << STRLIT("\" ");
 475               
 476                       if (scmoInstance.inst.hdr->flags.includeClassOrigin)
 477                       {
 478                           if (propertyDef->originClassName.start != 0)
 479                           {
 480                               out << STRLIT(" CLASSORIGIN=\"");
 481                               out.append(
 482                                   &(clsbase[propertyDef->originClassName.start]),
 483                                   propertyDef->originClassName.length-1);
 484                               out.append('"');
 485 marek 1.1.2.2             }
 486                       }
 487                       if (propertyDef->flags.propagated)
 488                       {
 489                           out << STRLIT(" PROPAGATED=\"true\"");
 490                       }
 491               
 492                       if (propertyType == CIMTYPE_OBJECT)
 493                       {
 494 marek 1.1.2.4 /*          TODO: Implement writing Embedded Object
 495 marek 1.1.2.2             // If the property type is CIMObject, then
 496                           //   encode the property in CIM-XML as a string with the
 497                           //   EmbeddedObject attribute (there is not currently a CIM-XML
 498                           //   "object" datatype)
 499               
 500                           CIMObject a;
 501                           rep->getValue().get(a);
 502                           out << STRLIT(" TYPE=\"string\"");
 503               
 504                           // If the Embedded Object is an instance, always add the
 505                           // EmbeddedObject attribute.
 506                           if (a.isInstance())
 507                           {
 508                               out << STRLIT(" EmbeddedObject=\"object\""
 509                                             " EMBEDDEDOBJECT=\"object\"");
 510                           }
 511                           // Else the Embedded Object is a class, always add the
 512                           // EmbeddedObject qualifier.
 513               #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
 514                           else
 515               #endif
 516 marek 1.1.2.2             {
 517                               // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY
 518                               // is defined, then the EmbeddedObject qualifier will always
 519                               // be added, whether it's a class or an instance.
 520                               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
 521                                   == PEG_NOT_FOUND)
 522                               {
 523                                   // Note that addQualifiers() cannot be called on a const
 524                                   // CIMQualifierRep.  In this case we really do want to
 525                                   // add the EmbeddedObject qualifier, so we cast away the
 526                                   // constness.
 527                                   CIMPropertyRep* tmpRep=const_cast<CIMPropertyRep*>(rep);
 528                                   tmpRep->addQualifier(
 529                                       CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
 530                                                    true));
 531                               }
 532                           }
 533               */
 534                           }
 535                           else if (propertyType == CIMTYPE_INSTANCE)
 536                           {
 537 marek 1.1.2.4 /*              TODO: Implement writing Embedded Instance
 538 marek 1.1.2.2                 CIMInstance a;
 539                               rep->getValue().get(a);
 540                               out << STRLIT(" TYPE=\"string\""
 541                                             " EmbeddedObject=\"instance\""
 542                                             " EMBEDDEDOBJECT=\"instance\"");
 543               
 544               # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
 545                               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
 546                                   == PEG_NOT_FOUND)
 547                               {
 548                                   // Note that addQualifiers() cannot be called on a const
 549                                   // CIMQualifierRep.  In this case we really do want to add
 550                                   // the EmbeddedInstance qualifier, so we cast away the
 551                                   // constness.
 552                                   CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
 553                                   tmpRep->addQualifier(CIMQualifier(
 554                                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
 555                                       a.getClassName().getString()));
 556                               }
 557               # endif
 558               */
 559 marek 1.1.2.2         }
 560                       else
 561                       {
 562                           out.append(' ');
 563                           out << xmlWriterTypeStrings(propertyType);
 564                       }
 565                       out << STRLIT(">\n");
 566               
 567                       // Append Instance Qualifiers:
 568                       if (scmoInstance.inst.hdr->flags.includeQualifiers)
 569                       {
 570                           SCMBQualifier * theArray=
 571                               (SCMBQualifier*)
 572                                   &(clsbase[propertyDef->qualifierArray.start]);
 573                           // need to iterate
 574                           for (Uint32 i=0, n=propertyDef->numberOfQualifiers;i<n;i++)
 575                           {
 576                               SCMOXmlWriter::appendQualifierElement(
 577                                   out,
 578                                   theArray[i],
 579                                   clsbase);
 580 marek 1.1.2.2             }
 581                       }
 582 marek 1.1.2.3         SCMOXmlWriter::appendValueElement(out,*propertyValue,propertyValueBase);
 583 marek 1.1.2.2         out << STRLIT("</PROPERTY>\n");
 584                   }
 585               }
 586               //------------------------------------------------------------------------------
 587               //
 588               // appendValueElement()
 589               //
 590               //    <!ELEMENT VALUE (#PCDATA)>
 591               //    <!ELEMENT VALUE.ARRAY (VALUE*)>
 592               //    <!ELEMENT VALUE.REFERENCE
 593               //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 594               //         INSTANCENAME)>
 595               //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 596               //
 597               //------------------------------------------------------------------------------
 598               
 599               void SCMOXmlWriter::appendValueElement(
 600                   Buffer& out,
 601 marek 1.1.2.4     const SCMBValue & value,
 602 marek 1.1.2.2     const char * base)
 603               {
 604                   if (value.flags.isNull)
 605                   {
 606                       return;
 607                   }
 608                   if (value.flags.isArray)
 609                   {
 610 marek 1.1.2.3         appendSCMBUnionArray(
 611                           out,
 612                           value.value,
 613                           value.valueType,
 614                           value.valueArraySize,
 615                           base);
 616 marek 1.1.2.2     }
 617                   else if (value.valueType == CIMTYPE_REFERENCE)
 618                   {
 619 marek 1.1.2.6         SCMOInstance * ref = value.value.extRefPtr;
 620                       appendValueReferenceElement(out, *ref, true);
 621 marek 1.1.2.2     }
 622                   else
 623                   {
 624                       out << STRLIT("<VALUE>");
 625               
 626                       // Call function to write a SCMBUnion + type field
 627                       appendSCMBUnion(out,value.value, value.valueType,base);
 628               
 629                       out << STRLIT("</VALUE>\n");
 630                   }
 631               }
 632               
 633 marek 1.1.2.5 //------------------------------------------------------------------------------
 634               //
 635               // appendValueReferenceElement()
 636               //
 637               //    <!ELEMENT VALUE.REFERENCE
 638               //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 639               //         INSTANCENAME)>
 640               //
 641               //------------------------------------------------------------------------------
 642               void SCMOXmlWriter::appendValueReferenceElement(
 643                   Buffer& out,
 644                   const SCMOInstance& ref,
 645                   Boolean putValueWrapper)
 646               {
 647                   if (putValueWrapper)
 648 marek 1.1.2.6     {
 649 marek 1.1.2.5         out << STRLIT("<VALUE.REFERENCE>\n");
 650 marek 1.1.2.6     }
 651 marek 1.1.2.5 
 652                   // See if it is a class or instance reference (instance references have
 653                   // key-bindings; class references do not).
 654               
 655                   // differentiate between instance and class using the SCMO flag
 656                   if (ref.inst.hdr->flags.isClassOnly)
 657                   {
 658                       // class
 659                       if (0 != ref.inst.hdr->hostName.start)
 660                       {
 661                           appendClassPathElement(out, ref);
 662                       }
 663 marek 1.1.2.6         else if (0 != ref.inst.hdr->instNameSpace.start)
 664 marek 1.1.2.5         {
 665 marek 1.1.2.6             appendLocalClassPathElement(out, ref);
 666 marek 1.1.2.5         }
 667                       else
 668                       {
 669 marek 1.1.2.6             Uint64 classNameLength=0;
 670                           const char* className = ref.getClassName_l(classNameLength);
 671                           appendClassNameElement(out, className, classNameLength-1);
 672 marek 1.1.2.5         }
 673                   }
 674                   else
 675                   {
 676                       // instance
 677                       if (0 != ref.inst.hdr->hostName.start)
 678                       {
 679 marek 1.1.2.6             appendInstancePathElement(out, ref);
 680 marek 1.1.2.5         }
 681 marek 1.1.2.6         else if (0 != ref.inst.hdr->instNameSpace.start)
 682 marek 1.1.2.5         {
 683 marek 1.1.2.6             appendLocalInstancePathElement(out, ref);
 684 marek 1.1.2.5         }
 685                       else
 686                       {
 687 marek 1.1.2.6             appendInstanceNameElement(out, ref);
 688 marek 1.1.2.5         }
 689                   }
 690                   if (putValueWrapper)
 691 marek 1.1.2.6     {
 692 marek 1.1.2.5         out << STRLIT("</VALUE.REFERENCE>\n");
 693 marek 1.1.2.6     }
 694               }
 695               
 696               // appendLocalInstancePathElement()
 697               //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 698               void SCMOXmlWriter::appendLocalInstancePathElement(
 699                   Buffer& out,
 700                   const SCMOInstance& instancePath)
 701               {
 702                   out << STRLIT("<LOCALINSTANCEPATH>\n");
 703                   Uint64 nsLength=0;
 704                   const char* ns=instancePath.getNameSpace_l(nsLength);
 705                   appendLocalNameSpacePathElement(out, ns, nsLength-1);
 706                   appendInstanceNameElement(out, instancePath);
 707                   out << STRLIT("</LOCALINSTANCEPATH>\n");
 708               }
 709               
 710               // appendInstancePathElement()
 711               //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 712               void SCMOXmlWriter::appendInstancePathElement(
 713                   Buffer& out,
 714 marek 1.1.2.6     const SCMOInstance& instancePath)
 715               {
 716                   out << STRLIT("<INSTANCEPATH>\n");
 717               
 718                   Uint64 hostnameLength=0;
 719                   const char* hostname=instancePath.getHostName_l(hostnameLength);
 720                   Uint64 nsLength=0;
 721                   const char* ns=instancePath.getNameSpace_l(nsLength);
 722                   appendNameSpacePathElement(out,hostname,hostnameLength-1,ns,nsLength-1);
 723               
 724                   appendInstanceNameElement(out, instancePath);
 725                   out << STRLIT("</INSTANCEPATH>\n");
 726               }
 727               
 728               // appendLocalClassPathElement()
 729               //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 730               void SCMOXmlWriter::appendLocalClassPathElement(
 731                   Buffer& out,
 732                   const SCMOInstance& classPath)
 733               {
 734                   out << STRLIT("<LOCALCLASSPATH>\n");
 735 marek 1.1.2.6     Uint64 hostnameLength=0;
 736                   const char* hostname=classPath.getHostName_l(hostnameLength);
 737                   Uint64 nsLength=0;
 738                   const char* ns=classPath.getNameSpace_l(nsLength);
 739               
 740                   appendNameSpacePathElement(out,hostname,hostnameLength-1,ns,nsLength-1);
 741               
 742                   Uint64 classNameLength=0;
 743                   const char* className = classPath.getClassName_l(classNameLength);
 744                   appendClassNameElement(out, className, classNameLength-1);
 745                   out << STRLIT("</LOCALCLASSPATH>\n");
 746 marek 1.1.2.5 }
 747               
 748               // appendClassPathElement()
 749               //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 750               void SCMOXmlWriter::appendClassPathElement(
 751                   Buffer& out,
 752                   const SCMOInstance& classPath)
 753               {
 754                   out << STRLIT("<CLASSPATH>\n");
 755               
 756                   Uint64 hostnameLength=0;
 757                   const char* hostname=classPath.getHostName_l(hostnameLength);
 758                   Uint64 nsLength=0;
 759                   const char* ns=classPath.getNameSpace_l(nsLength);
 760               
 761                   appendNameSpacePathElement(out,hostname,hostnameLength,ns,nsLength);
 762               
 763                   Uint64 classNameLength=0;
 764                   const char* className = classPath.getClassName_l(classNameLength);
 765               
 766                   appendClassNameElement(out, className, classNameLength-1);
 767 marek 1.1.2.5     out << STRLIT("</CLASSPATH>\n");
 768               }
 769               
 770 marek 1.1.2.2 void SCMOXmlWriter::appendSCMBUnion(
 771                   Buffer& out,
 772                   const SCMBUnion & u,
 773                   const CIMType & valueType,
 774                   const char * base)
 775               {
 776                   switch (valueType)
 777                   {
 778                       case CIMTYPE_BOOLEAN:
 779                       {
 780                           SCMOXmlWriter::append(out, u.simple.val.bin);
 781                           break;
 782                       }
 783               
 784                       case CIMTYPE_UINT8:
 785                       {
 786                           SCMOXmlWriter::append(out, u.simple.val.u8);
 787                           break;
 788                       }
 789               
 790                       case CIMTYPE_SINT8:
 791 marek 1.1.2.2         {
 792                           SCMOXmlWriter::append(out, u.simple.val.s8);
 793                           break;
 794                       }
 795               
 796                       case CIMTYPE_UINT16:
 797                       {
 798                           SCMOXmlWriter::append(out, u.simple.val.u16);
 799                           break;
 800                       }
 801               
 802                       case CIMTYPE_SINT16:
 803                       {
 804                           SCMOXmlWriter::append(out, u.simple.val.s16);
 805                           break;
 806                       }
 807               
 808                       case CIMTYPE_UINT32:
 809                       {
 810                           SCMOXmlWriter::append(out, u.simple.val.u32);
 811                           break;
 812 marek 1.1.2.2         }
 813               
 814                       case CIMTYPE_SINT32:
 815                       {
 816                           SCMOXmlWriter::append(out, u.simple.val.s32);
 817                           break;
 818                       }
 819               
 820                       case CIMTYPE_UINT64:
 821                       {
 822                           SCMOXmlWriter::append(out, u.simple.val.u64);
 823                           break;
 824                       }
 825               
 826                       case CIMTYPE_SINT64:
 827                       {
 828                           SCMOXmlWriter::append(out, u.simple.val.s64);
 829                           break;
 830                       }
 831               
 832                       case CIMTYPE_REAL32:
 833 marek 1.1.2.2         {
 834                           SCMOXmlWriter::append(out, u.simple.val.r32);
 835                           break;
 836                       }
 837               
 838                       case CIMTYPE_REAL64:
 839                       {
 840                           SCMOXmlWriter::append(out, u.simple.val.r64);
 841                           break;
 842                       }
 843               
 844                       case CIMTYPE_CHAR16:
 845                       {
 846                           SCMOXmlWriter::appendSpecial(
 847                               out,
 848                               u.simple.val.c16);
 849                           break;
 850                       }
 851               
 852                       case CIMTYPE_STRING:
 853                       {
 854 marek 1.1.2.2             SCMOXmlWriter::appendSpecial(
 855                               out,
 856                               &(base[u.stringValue.start]),
 857                               u.stringValue.length-1);
 858                           break;
 859                       }
 860               
 861                       case CIMTYPE_DATETIME:
 862                       {
 863                           // an SCMBDateTime is a CIMDateTimeRep
 864                           // this should help us to reuse existing optimized Datetime
 865                           char buffer[26];
 866                           _DateTimetoCStr(&(u.dateTimeValue), buffer);
 867                           // datetime value is formatted with a \0 at end, ignore
 868                           out.append(buffer,sizeof(buffer)-1);
 869                           break;
 870                       }
 871               /*
 872                       case CIMTYPE_OBJECT:
 873                       {
 874                           CIMObject v;
 875 marek 1.1.2.2             value.get(v);
 876                           _xmlWritter_appendValue(out, v);
 877                           break;
 878                       }
 879                       case CIMTYPE_INSTANCE:
 880                       {
 881                           CIMInstance v;
 882                           value.get(v);
 883                           _xmlWritter_appendValue(out, v);
 884                           break;
 885                       }
 886                       default:
 887                           PEGASUS_ASSERT(false);
 888               */
 889                   }
 890               }
 891               
 892 marek 1.1.2.3 void SCMOXmlWriter::appendSCMBUnionArray(
 893                   Buffer& out,
 894                   const SCMBUnion & u,
 895                   const CIMType & valueType,
 896                   Uint32 numElements,
 897                   const char * base)
 898               {
 899                   SCMBUnion* arr = (SCMBUnion*) &(base[u.arrayValue.start]);
 900                   switch (valueType)
 901                   {
 902                       case CIMTYPE_BOOLEAN:
 903                       {
 904                           out << STRLIT("<VALUE.ARRAY>\n");
 905                           while (numElements--)
 906                           {
 907                               out << STRLIT("<VALUE>");
 908                               SCMOXmlWriter::append(out, arr->simple.val.bin);
 909                               arr++;
 910                               out << STRLIT("</VALUE>\n");
 911                           }
 912                           out << STRLIT("</VALUE.ARRAY>\n");
 913 marek 1.1.2.3             break;
 914                       }
 915                       case CIMTYPE_UINT8:
 916                       {
 917                           out << STRLIT("<VALUE.ARRAY>\n");
 918                           while (numElements--)
 919                           {
 920                               out << STRLIT("<VALUE>");
 921                               SCMOXmlWriter::append(out, arr->simple.val.u8);
 922                               arr++;
 923                               out << STRLIT("</VALUE>\n");
 924                           }
 925                           out << STRLIT("</VALUE.ARRAY>\n");
 926                           break;
 927                       }
 928 marek 1.1.2.6 
 929 marek 1.1.2.3         case CIMTYPE_SINT8:
 930                       {
 931                           out << STRLIT("<VALUE.ARRAY>\n");
 932                           while (numElements--)
 933                           {
 934                               out << STRLIT("<VALUE>");
 935                               SCMOXmlWriter::append(out, arr->simple.val.s8);
 936                               arr++;
 937                               out << STRLIT("</VALUE>\n");
 938                           }
 939                           out << STRLIT("</VALUE.ARRAY>\n");
 940                           break;
 941                       }
 942 marek 1.1.2.6 
 943 marek 1.1.2.3         case CIMTYPE_UINT16:
 944                       {
 945                           out << STRLIT("<VALUE.ARRAY>\n");
 946                           while (numElements--)
 947                           {
 948                               out << STRLIT("<VALUE>");
 949                               SCMOXmlWriter::append(out, arr->simple.val.u16);
 950                               arr++;
 951                               out << STRLIT("</VALUE>\n");
 952                           }
 953                           out << STRLIT("</VALUE.ARRAY>\n");
 954                           break;
 955                       }
 956 marek 1.1.2.6 
 957 marek 1.1.2.3         case CIMTYPE_SINT16:
 958                       {
 959                           out << STRLIT("<VALUE.ARRAY>\n");
 960                           while (numElements--)
 961                           {
 962                               out << STRLIT("<VALUE>");
 963                               SCMOXmlWriter::append(out, arr->simple.val.s16);
 964                               arr++;
 965                               out << STRLIT("</VALUE>\n");
 966                           }
 967                           out << STRLIT("</VALUE.ARRAY>\n");
 968                           break;
 969                       }
 970 marek 1.1.2.6 
 971 marek 1.1.2.3         case CIMTYPE_UINT32:
 972                       {
 973                           out << STRLIT("<VALUE.ARRAY>\n");
 974                           while (numElements--)
 975                           {
 976                               out << STRLIT("<VALUE>");
 977                               SCMOXmlWriter::append(out, arr->simple.val.u32);
 978                               arr++;
 979                               out << STRLIT("</VALUE>\n");
 980                           }
 981                           out << STRLIT("</VALUE.ARRAY>\n");
 982                           break;
 983                       }
 984 marek 1.1.2.6 
 985 marek 1.1.2.3         case CIMTYPE_SINT32:
 986                       {
 987                           out << STRLIT("<VALUE.ARRAY>\n");
 988                           while (numElements--)
 989                           {
 990                               out << STRLIT("<VALUE>");
 991                               SCMOXmlWriter::append(out, arr->simple.val.s32);
 992                               arr++;
 993                               out << STRLIT("</VALUE>\n");
 994                           }
 995                           out << STRLIT("</VALUE.ARRAY>\n");
 996                           break;
 997                       }
 998 marek 1.1.2.6 
 999 marek 1.1.2.3         case CIMTYPE_UINT64:
1000                       {
1001                           out << STRLIT("<VALUE.ARRAY>\n");
1002                           while (numElements--)
1003                           {
1004                               out << STRLIT("<VALUE>");
1005                               SCMOXmlWriter::append(out, arr->simple.val.u64);
1006                               arr++;
1007                               out << STRLIT("</VALUE>\n");
1008                           }
1009                           out << STRLIT("</VALUE.ARRAY>\n");
1010                           break;
1011                       }
1012 marek 1.1.2.6 
1013 marek 1.1.2.3         case CIMTYPE_SINT64:
1014                       {
1015                           out << STRLIT("<VALUE.ARRAY>\n");
1016                           while (numElements--)
1017                           {
1018                               out << STRLIT("<VALUE>");
1019                               SCMOXmlWriter::append(out, arr->simple.val.s64);
1020                               arr++;
1021                               out << STRLIT("</VALUE>\n");
1022                           }
1023                           out << STRLIT("</VALUE.ARRAY>\n");
1024                           break;
1025                       }
1026 marek 1.1.2.6 
1027 marek 1.1.2.3         case CIMTYPE_REAL32:
1028                       {
1029                           out << STRLIT("<VALUE.ARRAY>\n");
1030                           while (numElements--)
1031                           {
1032                               out << STRLIT("<VALUE>");
1033                               SCMOXmlWriter::append(out, arr->simple.val.r32);
1034                               arr++;
1035                               out << STRLIT("</VALUE>\n");
1036                           }
1037                           out << STRLIT("</VALUE.ARRAY>\n");
1038                           break;
1039                       }
1040 marek 1.1.2.6 
1041 marek 1.1.2.3         case CIMTYPE_REAL64:
1042                       {
1043                           out << STRLIT("<VALUE.ARRAY>\n");
1044                           while (numElements--)
1045                           {
1046                               out << STRLIT("<VALUE>");
1047                               SCMOXmlWriter::append(out, arr->simple.val.r64);
1048                               arr++;
1049                               out << STRLIT("</VALUE>\n");
1050                           }
1051                           out << STRLIT("</VALUE.ARRAY>\n");
1052                           break;
1053                       }
1054 marek 1.1.2.6 
1055 marek 1.1.2.3         case CIMTYPE_CHAR16:
1056                       {
1057                           out << STRLIT("<VALUE.ARRAY>\n");
1058                           while (numElements--)
1059                           {
1060                               out << STRLIT("<VALUE>");
1061                               SCMOXmlWriter::append(out, arr->simple.val.bin);
1062                               SCMOXmlWriter::appendSpecial(out, arr->simple.val.c16);
1063                               arr++;
1064                               out << STRLIT("</VALUE>\n");
1065                           }
1066                           out << STRLIT("</VALUE.ARRAY>\n");
1067                           break;
1068                       }
1069 marek 1.1.2.6 
1070 marek 1.1.2.3         case CIMTYPE_STRING:
1071                       {
1072                           out << STRLIT("<VALUE.ARRAY>\n");
1073                           while (numElements--)
1074                           {
1075                               out << STRLIT("<VALUE>");
1076                               SCMOXmlWriter::appendSpecial(
1077                                   out,
1078                                   &(base[arr->stringValue.start]),
1079                                   arr->stringValue.length-1);
1080                               arr++;
1081                               out << STRLIT("</VALUE>\n");
1082                           }
1083                           out << STRLIT("</VALUE.ARRAY>\n");
1084 marek 1.1.2.6 
1085 marek 1.1.2.3             break;
1086                       }
1087 marek 1.1.2.6 
1088 marek 1.1.2.3         case CIMTYPE_DATETIME:
1089                       {
1090                           out << STRLIT("<VALUE.ARRAY>\n");
1091                           char buffer[26];
1092                           while (numElements--)
1093                           {
1094                               out << STRLIT("<VALUE>");
1095                               // an SCMBDateTime is a CIMDateTimeRep
1096                               // this should help us to reuse existing optimized Datetime
1097                               _DateTimetoCStr(&(arr->dateTimeValue), buffer);
1098                               // datetime value is formatted with a \0 at end, ignore
1099                               out.append(buffer,sizeof(buffer)-1);
1100                               arr++;
1101                               out << STRLIT("</VALUE>\n");
1102                           }
1103 marek 1.1.2.6             out << STRLIT("</VALUE.ARRAY>\n");
1104 marek 1.1.2.3             break;
1105 marek 1.1.2.6         }
1106 marek 1.1.2.3 /*
1107                       case CIMTYPE_OBJECT:
1108                       {
1109                           CIMObject v;
1110                           value.get(v);
1111                           _xmlWritter_appendValue(out, v);
1112                           break;
1113                       }
1114                       case CIMTYPE_INSTANCE:
1115                       {
1116                           CIMInstance v;
1117                           value.get(v);
1118                           _xmlWritter_appendValue(out, v);
1119                           break;
1120                       }
1121                       default:
1122                           PEGASUS_ASSERT(false);
1123               */
1124                   }
1125               
1126               }
1127 marek 1.1.2.3 
1128               
1129 marek 1.1.2.2 
1130 marek 1.1.2.1 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2