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

   1 martin 1.165 //%LICENSE////////////////////////////////////////////////////////////////
   2 martin 1.166 //
   3 martin 1.165 // 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 martin 1.166 //
  10 martin 1.165 // 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 martin 1.166 //
  17 martin 1.165 // The above copyright notice and this permission notice shall be included
  18              // in all copies or substantial portions of the Software.
  19 martin 1.166 //
  20 martin 1.165 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21 martin 1.166 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 martin 1.165 // 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 martin 1.166 //
  28 martin 1.165 //////////////////////////////////////////////////////////////////////////
  29 mike   1.23  //
  30              //%/////////////////////////////////////////////////////////////////////////////
  31              
  32 sage   1.49  #include <Pegasus/Common/Config.h>
  33 mike   1.23  #include <cstdlib>
  34              #include <cstdio>
  35 kumpf  1.46  #include "Constants.h"
  36 mike   1.23  #include "CIMClass.h"
  37 kumpf  1.55  #include "CIMClassRep.h"
  38 mike   1.23  #include "CIMInstance.h"
  39 kumpf  1.55  #include "CIMInstanceRep.h"
  40 kumpf  1.56  #include "CIMProperty.h"
  41              #include "CIMPropertyRep.h"
  42              #include "CIMMethod.h"
  43              #include "CIMMethodRep.h"
  44              #include "CIMParameter.h"
  45              #include "CIMParameterRep.h"
  46              #include "CIMParamValue.h"
  47              #include "CIMParamValueRep.h"
  48              #include "CIMQualifier.h"
  49              #include "CIMQualifierRep.h"
  50              #include "CIMQualifierDecl.h"
  51              #include "CIMQualifierDeclRep.h"
  52 kumpf  1.54  #include "CIMValue.h"
  53 mike   1.23  #include "XmlWriter.h"
  54 kumpf  1.44  #include "Tracer.h"
  55 sage   1.49  #include <Pegasus/Common/StatisticalData.h>
  56 david  1.92  #include "CommonUTF.h"
  57 mike   1.125 #include "Buffer.h"
  58 mike   1.127 #include "StrLit.h"
  59 mike   1.139 #include "IDFactory.h"
  60 marek  1.151 #include "StringConversion.h"
  61 mike   1.23  PEGASUS_NAMESPACE_BEGIN
  62              
  63 kumpf  1.29  //------------------------------------------------------------------------------
  64              //
  65              // appendLocalNameSpacePathElement()
  66              //
  67              //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
  68              //
  69              //------------------------------------------------------------------------------
  70              
  71              void XmlWriter::appendLocalNameSpacePathElement(
  72 mike   1.125     Buffer& out,
  73 kumpf  1.80      const CIMNamespaceName& nameSpace)
  74 mike   1.23  {
  75 mike   1.126     out << STRLIT("<LOCALNAMESPACEPATH>\n");
  76 mike   1.23  
  77 david  1.103     char* nameSpaceCopy = strdup(nameSpace.getString().getCString());
  78 chuck  1.105 
  79 marek  1.140 #if !defined(PEGASUS_COMPILER_MSVC) && !defined(PEGASUS_OS_ZOS)
  80 keith.petley 1.91      char *last;
  81                        for (const char* p = strtok_r(nameSpaceCopy, "/", &last); p;
  82 kumpf        1.93           p = strtok_r(NULL, "/", &last))
  83 keith.petley 1.91  #else
  84 kumpf        1.76      for (const char* p = strtok(nameSpaceCopy, "/"); p; p = strtok(NULL, "/"))
  85 keith.petley 1.91  #endif
  86 mike         1.23      {
  87 david.dillard 1.131         out << STRLIT("<NAMESPACE NAME=\"") << p << STRLIT("\"/>\n");
  88 mike          1.23      }
  89 kumpf         1.96      free(nameSpaceCopy);
  90 mike          1.23  
  91 mike          1.126     out << STRLIT("</LOCALNAMESPACEPATH>\n");
  92 mike          1.23  }
  93                     
  94                     //------------------------------------------------------------------------------
  95                     //
  96 kumpf         1.29  // appendNameSpacePathElement()
  97                     //
  98                     //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
  99                     //
 100                     //------------------------------------------------------------------------------
 101                     
 102                     void XmlWriter::appendNameSpacePathElement(
 103 mike          1.125     Buffer& out,
 104 kumpf         1.29      const String& host,
 105 kumpf         1.80      const CIMNamespaceName& nameSpace)
 106 kumpf         1.29  {
 107 kumpf         1.167     out << STRLIT("<NAMESPACEPATH>\n"
 108 thilo.boehm   1.162                   "<HOST>") << host << STRLIT("</HOST>\n");
 109 kumpf         1.29      appendLocalNameSpacePathElement(out, nameSpace);
 110 mike          1.126     out << STRLIT("</NAMESPACEPATH>\n");
 111 kumpf         1.29  }
 112                     
 113                     //------------------------------------------------------------------------------
 114                     //
 115                     // appendClassNameElement()
 116                     //
 117                     //     <!ELEMENT CLASSNAME EMPTY>
 118                     //     <!ATTLIST CLASSNAME
 119                     //              %CIMName;>
 120                     //
 121                     //------------------------------------------------------------------------------
 122                     
 123                     void XmlWriter::appendClassNameElement(
 124 mike          1.125     Buffer& out,
 125 kumpf         1.80      const CIMName& className)
 126 kumpf         1.29  {
 127 mike          1.126     out << STRLIT("<CLASSNAME NAME=\"") << className << STRLIT("\"/>\n");
 128 kumpf         1.29  }
 129                     
 130                     //------------------------------------------------------------------------------
 131                     //
 132                     // appendInstanceNameElement()
 133                     //
 134                     //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
 135                     //    <!ATTLIST INSTANCENAME
 136                     //              %ClassName;>
 137                     //
 138                     //------------------------------------------------------------------------------
 139                     
 140                     void XmlWriter::appendInstanceNameElement(
 141 mike          1.125     Buffer& out,
 142 kumpf         1.59      const CIMObjectPath& instanceName)
 143 kumpf         1.29  {
 144 mike          1.126     out << STRLIT("<INSTANCENAME CLASSNAME=\"");
 145                         out << instanceName.getClassName() << STRLIT("\">\n");
 146 kumpf         1.29  
 147 mike          1.126     const Array<CIMKeyBinding>& keyBindings = instanceName.getKeyBindings();
 148 kumpf         1.29      for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
 149                         {
 150 mike          1.126         out << STRLIT("<KEYBINDING NAME=\"");
 151 kumpf         1.146         out << keyBindings[i].getName() << STRLIT("\">\n");
 152 kumpf         1.29  
 153 kumpf         1.79          if (keyBindings[i].getType() == CIMKeyBinding::REFERENCE)
 154 kumpf         1.29          {
 155 kumpf         1.59              CIMObjectPath ref = keyBindings[i].getValue();
 156 karl          1.169.4.5             // create an instancePath (i.e. isClassPath = false)
 157                                     appendValueReferenceElement(out, ref, false, true);
 158 kumpf         1.29              }
 159 kumpf         1.146             else
 160                                 {
 161 mike          1.126                 out << STRLIT("<KEYVALUE VALUETYPE=\"");
 162 kumpf         1.68                  out << keyBindingTypeToString(keyBindings[i].getType());
 163 mike          1.126                 out << STRLIT("\">");
 164 kumpf         1.29      
 165 karl          1.169.4.5             // fixed the special characters
 166 kumpf         1.29      
 167                                     appendSpecial(out, keyBindings[i].getValue());
 168 mike          1.126                 out << STRLIT("</KEYVALUE>\n");
 169 kumpf         1.29              }
 170 mike          1.126             out << STRLIT("</KEYBINDING>\n");
 171 kumpf         1.29          }
 172 mike          1.126         out << STRLIT("</INSTANCENAME>\n");
 173 kumpf         1.29      }
 174                         
 175                         //------------------------------------------------------------------------------
 176                         //
 177                         // appendClassPathElement()
 178                         //
 179                         //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 180                         //
 181                         //------------------------------------------------------------------------------
 182                         
 183                         void XmlWriter::appendClassPathElement(
 184 mike          1.125         Buffer& out,
 185 kumpf         1.59          const CIMObjectPath& classPath)
 186 kumpf         1.29      {
 187 mike          1.126         out << STRLIT("<CLASSPATH>\n");
 188 kumpf         1.29          appendNameSpacePathElement(out,
 189                                                        classPath.getHost(),
 190                                                        classPath.getNameSpace());
 191                             appendClassNameElement(out, classPath.getClassName());
 192 mike          1.126         out << STRLIT("</CLASSPATH>\n");
 193 kumpf         1.29      }
 194                         
 195                         //------------------------------------------------------------------------------
 196                         //
 197                         // appendInstancePathElement()
 198                         //
 199                         //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 200                         //
 201                         //------------------------------------------------------------------------------
 202                         
 203                         void XmlWriter::appendInstancePathElement(
 204 mike          1.125         Buffer& out,
 205 kumpf         1.59          const CIMObjectPath& instancePath)
 206 kumpf         1.29      {
 207 mike          1.126         out << STRLIT("<INSTANCEPATH>\n");
 208 kumpf         1.29          appendNameSpacePathElement(out,
 209                                                        instancePath.getHost(),
 210                                                        instancePath.getNameSpace());
 211                             appendInstanceNameElement(out, instancePath);
 212 mike          1.126         out << STRLIT("</INSTANCEPATH>\n");
 213 kumpf         1.29      }
 214                         
 215                         //------------------------------------------------------------------------------
 216                         //
 217                         // appendLocalClassPathElement()
 218                         //
 219                         //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 220                         //
 221                         //------------------------------------------------------------------------------
 222                         
 223                         void XmlWriter::appendLocalClassPathElement(
 224 mike          1.125         Buffer& out,
 225 kumpf         1.59          const CIMObjectPath& classPath)
 226 kumpf         1.29      {
 227 mike          1.126         out << STRLIT("<LOCALCLASSPATH>\n");
 228 kumpf         1.29          appendLocalNameSpacePathElement(out, classPath.getNameSpace());
 229                             appendClassNameElement(out, classPath.getClassName());
 230 mike          1.126         out << STRLIT("</LOCALCLASSPATH>\n");
 231 kumpf         1.29      }
 232                         
 233                         //------------------------------------------------------------------------------
 234                         //
 235                         // appendLocalInstancePathElement()
 236                         //
 237                         //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 238                         //
 239                         //------------------------------------------------------------------------------
 240                         
 241                         void XmlWriter::appendLocalInstancePathElement(
 242 mike          1.125         Buffer& out,
 243 kumpf         1.59          const CIMObjectPath& instancePath)
 244 kumpf         1.29      {
 245 mike          1.126         out << STRLIT("<LOCALINSTANCEPATH>\n");
 246 kumpf         1.29          appendLocalNameSpacePathElement(out, instancePath.getNameSpace());
 247                             appendInstanceNameElement(out, instancePath);
 248 mike          1.126         out << STRLIT("</LOCALINSTANCEPATH>\n");
 249 kumpf         1.29      }
 250                         
 251                         //------------------------------------------------------------------------------
 252                         //
 253 kumpf         1.30      // appendLocalObjectPathElement()
 254                         //
 255 kumpf         1.31      //     If the reference refers to an instance, write a LOCALINSTANCEPATH;
 256                         //     otherwise write a LOCALCLASSPATH.
 257 kumpf         1.30      //
 258                         //------------------------------------------------------------------------------
 259                         
 260 karl          1.169.4.5 // appendValueReferenceElement does this correctly with isClassPath flag
 261                         // Called only but formatSimple
 262 kumpf         1.30      void XmlWriter::appendLocalObjectPathElement(
 263 mike          1.125         Buffer& out,
 264 kumpf         1.59          const CIMObjectPath& objectPath)
 265 kumpf         1.30      {
 266 kumpf         1.68          //
 267                             //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
 268                             //  distinguish instanceNames from classNames in every case
 269 david.dillard 1.121         //  The instanceName of a singleton instance of a keyless class has no
 270 kumpf         1.68          //  key bindings
 271 karl          1.169.4.5     //  See bBUG_3302.
 272 kumpf         1.68          //
 273                             if (objectPath.getKeyBindings ().size () != 0)
 274 kumpf         1.30          {
 275                                 appendLocalInstancePathElement(out, objectPath);
 276                             }
 277                             else
 278                             {
 279                                 appendLocalClassPathElement(out, objectPath);
 280                             }
 281                         }
 282                         
 283                         //------------------------------------------------------------------------------
 284                         //
 285 kumpf         1.54      // Helper functions for appendValueElement()
 286                         //
 287                         //------------------------------------------------------------------------------
 288                         
 289 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Boolean x)
 290 kumpf         1.54      {
 291                             XmlWriter::append(out, x);
 292                         }
 293                         
 294 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Uint8 x)
 295 kumpf         1.54      {
 296                             XmlWriter::append(out, Uint32(x));
 297                         }
 298                         
 299 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Sint8 x)
 300 kumpf         1.54      {
 301                             XmlWriter::append(out, Sint32(x));
 302                         }
 303                         
 304 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Uint16 x)
 305 kumpf         1.54      {
 306                             XmlWriter::append(out, Uint32(x));
 307                         }
 308                         
 309 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Sint16 x)
 310 kumpf         1.54      {
 311                             XmlWriter::append(out, Sint32(x));
 312                         }
 313                         
 314 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Uint32 x)
 315 kumpf         1.54      {
 316                             XmlWriter::append(out, x);
 317                         }
 318                         
 319 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Sint32 x)
 320 kumpf         1.54      {
 321                             XmlWriter::append(out, x);
 322                         }
 323                         
 324 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Uint64 x)
 325 kumpf         1.54      {
 326                             XmlWriter::append(out, x);
 327                         }
 328                         
 329 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Sint64 x)
 330 kumpf         1.54      {
 331                             XmlWriter::append(out, x);
 332                         }
 333                         
 334 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Real32 x)
 335 kumpf         1.54      {
 336 chuck         1.102         XmlWriter::append(out, x);
 337 kumpf         1.54      }
 338                         
 339 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, Real64 x)
 340 kumpf         1.54      {
 341                             XmlWriter::append(out, x);
 342                         }
 343                         
 344 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, const Char16& x)
 345 kumpf         1.54      {
 346                             XmlWriter::appendSpecial(out, x);
 347                         }
 348                         
 349 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, const String& x)
 350 kumpf         1.54      {
 351                             XmlWriter::appendSpecial(out, x);
 352                         }
 353                         
 354 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, const CIMDateTime& x)
 355 kumpf         1.54      {
 356 kumpf         1.136         // It is not necessary to use XmlWriter::appendSpecial(), because
 357                             // CIMDateTime values do not contain special characters.
 358                             out << x.toString();
 359 kumpf         1.54      }
 360                         
 361 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, const CIMObjectPath& x)
 362 kumpf         1.54      {
 363 karl          1.169.4.5     // Emit Instance Path with value wrapper
 364                             XmlWriter::appendValueReferenceElement(out, x, false, true);
 365 kumpf         1.54      }
 366                         
 367 mike          1.125     inline void _xmlWritter_appendValue(Buffer& out, const CIMObject& x)
 368 dave.sudlik   1.114     {
 369 dave.sudlik   1.120         String myStr = x.toString();
 370                             _xmlWritter_appendValue(out, myStr);
 371 dave.sudlik   1.114     }
 372                         
 373 mike          1.126     void _xmlWritter_appendValueArray(
 374                             Buffer& out, const CIMObjectPath* p, Uint32 size)
 375 kumpf         1.54      {
 376 mike          1.126         out << STRLIT("<VALUE.REFARRAY>\n");
 377 kumpf         1.54          while (size--)
 378                             {
 379 s.hills       1.99              _xmlWritter_appendValue(out, *p++);
 380 kumpf         1.54          }
 381 mike          1.126         out << STRLIT("</VALUE.REFARRAY>\n");
 382 kumpf         1.54      }
 383                         
 384                         template<class T>
 385 mike          1.125     void _xmlWritter_appendValueArray(Buffer& out, const T* p, Uint32 size)
 386 kumpf         1.54      {
 387 mike          1.126         out << STRLIT("<VALUE.ARRAY>\n");
 388 kumpf         1.54      
 389                             while (size--)
 390                             {
 391 mike          1.126             out << STRLIT("<VALUE>");
 392 s.hills       1.99              _xmlWritter_appendValue(out, *p++);
 393 mike          1.126             out << STRLIT("</VALUE>\n");
 394 kumpf         1.54          }
 395                         
 396 mike          1.126         out << STRLIT("</VALUE.ARRAY>\n");
 397 kumpf         1.54      }
 398                         
 399                         //------------------------------------------------------------------------------
 400                         //
 401                         // appendValueElement()
 402                         //
 403 kumpf         1.55      //    <!ELEMENT VALUE (#PCDATA)>
 404                         //    <!ELEMENT VALUE.ARRAY (VALUE*)>
 405                         //    <!ELEMENT VALUE.REFERENCE
 406                         //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 407                         //         INSTANCENAME)>
 408                         //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 409                         //
 410 kumpf         1.54      //------------------------------------------------------------------------------
 411                         
 412                         void XmlWriter::appendValueElement(
 413 mike          1.125         Buffer& out,
 414 kumpf         1.54          const CIMValue& value)
 415                         {
 416                             if (value.isNull())
 417                             {
 418                                 return;
 419                             }
 420                             if (value.isArray())
 421                             {
 422                                 switch (value.getType())
 423                                 {
 424 kumpf         1.66                  case CIMTYPE_BOOLEAN:
 425 kumpf         1.54                  {
 426                                         Array<Boolean> a;
 427                                         value.get(a);
 428 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 429 kumpf         1.54                      break;
 430                                     }
 431                         
 432 kumpf         1.66                  case CIMTYPE_UINT8:
 433 kumpf         1.54                  {
 434                                         Array<Uint8> a;
 435                                         value.get(a);
 436 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 437 kumpf         1.54                      break;
 438                                     }
 439                         
 440 kumpf         1.66                  case CIMTYPE_SINT8:
 441 kumpf         1.54                  {
 442                                         Array<Sint8> a;
 443                                         value.get(a);
 444 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 445 kumpf         1.54                      break;
 446                                     }
 447                         
 448 kumpf         1.66                  case CIMTYPE_UINT16:
 449 kumpf         1.54                  {
 450                                         Array<Uint16> a;
 451                                         value.get(a);
 452 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 453 kumpf         1.54                      break;
 454                                     }
 455                         
 456 kumpf         1.66                  case CIMTYPE_SINT16:
 457 kumpf         1.54                  {
 458                                         Array<Sint16> a;
 459                                         value.get(a);
 460 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 461 kumpf         1.54                      break;
 462                                     }
 463                         
 464 kumpf         1.66                  case CIMTYPE_UINT32:
 465 kumpf         1.54                  {
 466                                         Array<Uint32> a;
 467                                         value.get(a);
 468 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 469 kumpf         1.54                      break;
 470                                     }
 471                         
 472 kumpf         1.66                  case CIMTYPE_SINT32:
 473 kumpf         1.54                  {
 474                                         Array<Sint32> a;
 475                                         value.get(a);
 476 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 477 kumpf         1.54                      break;
 478                                     }
 479                         
 480 kumpf         1.66                  case CIMTYPE_UINT64:
 481 kumpf         1.54                  {
 482                                         Array<Uint64> a;
 483                                         value.get(a);
 484 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 485 kumpf         1.54                      break;
 486                                     }
 487                         
 488 kumpf         1.66                  case CIMTYPE_SINT64:
 489 kumpf         1.54                  {
 490                                         Array<Sint64> a;
 491                                         value.get(a);
 492 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 493 kumpf         1.54                      break;
 494                                     }
 495                         
 496 kumpf         1.66                  case CIMTYPE_REAL32:
 497 kumpf         1.54                  {
 498                                         Array<Real32> a;
 499                                         value.get(a);
 500 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 501 kumpf         1.54                      break;
 502                                     }
 503                         
 504 kumpf         1.66                  case CIMTYPE_REAL64:
 505 kumpf         1.54                  {
 506                                         Array<Real64> a;
 507                                         value.get(a);
 508 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 509 kumpf         1.54                      break;
 510                                     }
 511                         
 512 kumpf         1.66                  case CIMTYPE_CHAR16:
 513 kumpf         1.54                  {
 514                                         Array<Char16> a;
 515                                         value.get(a);
 516 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 517 kumpf         1.54                      break;
 518                                     }
 519                         
 520 kumpf         1.66                  case CIMTYPE_STRING:
 521 kumpf         1.54                  {
 522 kumpf         1.146                     const String* data;
 523                                         Uint32 size;
 524                                         value._get(data, size);
 525 mike          1.126                     _xmlWritter_appendValueArray(out, data, size);
 526 kumpf         1.54                      break;
 527                                     }
 528                         
 529 kumpf         1.66                  case CIMTYPE_DATETIME:
 530 kumpf         1.54                  {
 531                                         Array<CIMDateTime> a;
 532                                         value.get(a);
 533 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 534 kumpf         1.54                      break;
 535                                     }
 536                         
 537 kumpf         1.66                  case CIMTYPE_REFERENCE:
 538 kumpf         1.54                  {
 539 kumpf         1.59                      Array<CIMObjectPath> a;
 540 kumpf         1.54                      value.get(a);
 541 s.hills       1.99                      _xmlWritter_appendValueArray(out, a.getData(), a.size());
 542 kumpf         1.54                      break;
 543                                     }
 544                         
 545 dave.sudlik   1.114                 case CIMTYPE_OBJECT:
 546                                     {
 547                                         Array<CIMObject> a;
 548                                         value.get(a);
 549                                         _xmlWritter_appendValueArray(out, a.getData(), a.size());
 550                                         break;
 551                                     }
 552 a.dunfey      1.137                 case CIMTYPE_INSTANCE:
 553                                     {
 554                                         Array<CIMInstance> a;
 555                                         value.get(a);
 556                                         _xmlWritter_appendValueArray(out, a.getData(), a.size());
 557                                         break;
 558                                     }
 559 kumpf         1.54                  default:
 560 karl          1.169.4.5                 PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);)
 561 kumpf         1.54              }
 562                             }
 563 kumpf         1.66          else if (value.getType() == CIMTYPE_REFERENCE)
 564 kumpf         1.54          {
 565                                 // Has to be separate because it uses VALUE.REFERENCE tag
 566 kumpf         1.59              CIMObjectPath v;
 567 kumpf         1.54              value.get(v);
 568 s.hills       1.99              _xmlWritter_appendValue(out, v);
 569 kumpf         1.54          }
 570                             else
 571                             {
 572 mike          1.126             out << STRLIT("<VALUE>");
 573 kumpf         1.54      
 574                                 switch (value.getType())
 575                                 {
 576 kumpf         1.66                  case CIMTYPE_BOOLEAN:
 577 kumpf         1.54                  {
 578                                         Boolean v;
 579                                         value.get(v);
 580 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 581 kumpf         1.54                      break;
 582                                     }
 583                         
 584 kumpf         1.66                  case CIMTYPE_UINT8:
 585 kumpf         1.54                  {
 586                                         Uint8 v;
 587                                         value.get(v);
 588 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 589 kumpf         1.54                      break;
 590                                     }
 591                         
 592 kumpf         1.66                  case CIMTYPE_SINT8:
 593 kumpf         1.54                  {
 594                                         Sint8 v;
 595                                         value.get(v);
 596 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 597 kumpf         1.54                      break;
 598                                     }
 599                         
 600 kumpf         1.66                  case CIMTYPE_UINT16:
 601 kumpf         1.54                  {
 602                                         Uint16 v;
 603                                         value.get(v);
 604 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 605 kumpf         1.54                      break;
 606                                     }
 607                         
 608 kumpf         1.66                  case CIMTYPE_SINT16:
 609 kumpf         1.54                  {
 610                                         Sint16 v;
 611                                         value.get(v);
 612 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 613 kumpf         1.54                      break;
 614                                     }
 615                         
 616 kumpf         1.66                  case CIMTYPE_UINT32:
 617 kumpf         1.54                  {
 618                                         Uint32 v;
 619                                         value.get(v);
 620 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 621 kumpf         1.54                      break;
 622                                     }
 623                         
 624 kumpf         1.66                  case CIMTYPE_SINT32:
 625 kumpf         1.54                  {
 626                                         Sint32 v;
 627                                         value.get(v);
 628 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 629 kumpf         1.54                      break;
 630                                     }
 631                         
 632 kumpf         1.66                  case CIMTYPE_UINT64:
 633 kumpf         1.54                  {
 634                                         Uint64 v;
 635                                         value.get(v);
 636 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 637 kumpf         1.54                      break;
 638                                     }
 639                         
 640 kumpf         1.66                  case CIMTYPE_SINT64:
 641 kumpf         1.54                  {
 642                                         Sint64 v;
 643                                         value.get(v);
 644 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 645 kumpf         1.54                      break;
 646                                     }
 647                         
 648 kumpf         1.66                  case CIMTYPE_REAL32:
 649 kumpf         1.54                  {
 650                                         Real32 v;
 651                                         value.get(v);
 652 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 653 kumpf         1.54                      break;
 654                                     }
 655                         
 656 kumpf         1.66                  case CIMTYPE_REAL64:
 657 kumpf         1.54                  {
 658                                         Real64 v;
 659                                         value.get(v);
 660 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 661 kumpf         1.54                      break;
 662                                     }
 663                         
 664 kumpf         1.66                  case CIMTYPE_CHAR16:
 665 kumpf         1.54                  {
 666                                         Char16 v;
 667                                         value.get(v);
 668 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 669 kumpf         1.54                      break;
 670                                     }
 671                         
 672 kumpf         1.66                  case CIMTYPE_STRING:
 673 kumpf         1.54                  {
 674                                         String v;
 675                                         value.get(v);
 676 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 677 kumpf         1.54                      break;
 678                                     }
 679                         
 680 kumpf         1.66                  case CIMTYPE_DATETIME:
 681 kumpf         1.54                  {
 682                                         CIMDateTime v;
 683                                         value.get(v);
 684 s.hills       1.99                      _xmlWritter_appendValue(out, v);
 685 kumpf         1.54                      break;
 686                                     }
 687                         
 688 dave.sudlik   1.114                 case CIMTYPE_OBJECT:
 689                                     {
 690                                         CIMObject v;
 691                                         value.get(v);
 692                                         _xmlWritter_appendValue(out, v);
 693                                         break;
 694                                     }
 695 a.dunfey      1.137                 case CIMTYPE_INSTANCE:
 696                                     {
 697                                         CIMInstance v;
 698                                         value.get(v);
 699                                         _xmlWritter_appendValue(out, v);
 700                                         break;
 701                                     }
 702 kumpf         1.54                  default:
 703 karl          1.169.4.5                 PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);)
 704 kumpf         1.54              }
 705                         
 706 mike          1.126             out << STRLIT("</VALUE>\n");
 707 kumpf         1.54          }
 708                         }
 709                         
 710                         void XmlWriter::printValueElement(
 711                             const CIMValue& value,
 712                             PEGASUS_STD(ostream)& os)
 713                         {
 714 mike          1.125         Buffer tmp;
 715 kumpf         1.54          appendValueElement(tmp, value);
 716                             os << tmp.getData() << PEGASUS_STD(endl);
 717                         }
 718                         
 719                         //------------------------------------------------------------------------------
 720                         //
 721 kumpf         1.56      // appendValueObjectWithPathElement()
 722                         //
 723                         //     <!ELEMENT VALUE.OBJECTWITHPATH
 724                         //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
 725                         //
 726                         //------------------------------------------------------------------------------
 727                         
 728                         void XmlWriter::appendValueObjectWithPathElement(
 729 mike          1.125         Buffer& out,
 730 karl          1.169.4.2     const CIMObject& objectWithPath,
 731                             Boolean includeQualifiers,
 732                             Boolean includeClassOrigin,
 733 karl          1.169.4.5     Boolean isClassObject,
 734 karl          1.169.4.2     const CIMPropertyList& propertyList)
 735 kumpf         1.56      {
 736 mike          1.126         out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
 737 kumpf         1.56      
 738 karl          1.169.4.5     appendValueReferenceElement(out, objectWithPath.getPath (),
 739                                 isClassObject , false);
 740                         
 741 karl          1.169.4.2     appendObjectElement(
 742                                 out,
 743                                 objectWithPath,
 744                                 includeQualifiers,
 745                                 includeClassOrigin,
 746                                 propertyList);
 747 kumpf         1.56      
 748 mike          1.126         out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
 749 kumpf         1.56      }
 750                         
 751                         //------------------------------------------------------------------------------
 752                         //
 753                         // appendValueReferenceElement()
 754                         //
 755                         //    <!ELEMENT VALUE.REFERENCE
 756                         //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 757                         //         INSTANCENAME)>
 758                         //
 759                         //------------------------------------------------------------------------------
 760                         
 761 karl          1.169.4.5 // appends INSTANCEPATH | LOCALINSTANCEPATH | INSTANCENAME
 762                         void XmlWriter::appendValueInstancePathElement(
 763 mike          1.125         Buffer& out,
 764 karl          1.169.4.5     const CIMObjectPath& reference)
 765 kumpf         1.56      {
 766 karl          1.169.4.5     if (reference.getHost().size())
 767                             {
 768                                 appendInstancePathElement(out, reference);
 769                             }
 770                             else if (!reference.getNameSpace().isNull())
 771                             {
 772                                 appendLocalInstancePathElement(out, reference);
 773                             }
 774                             else
 775                             {
 776                                 appendInstanceNameElement(out, reference);
 777                             }
 778                         }
 779 kumpf         1.56      
 780 karl          1.169.4.5 // appends CLASSPATH | LOCALCLASSPATH | CLASSNAME
 781                         void XmlWriter::appendValueClassPathElement(
 782                             Buffer& out,
 783                             const CIMObjectPath& reference)
 784                         {
 785                             if (reference.getHost().size())
 786                             {
 787                                 appendClassPathElement(out, reference);
 788                             }
 789                             else if (!reference.getNameSpace().isNull())
 790                             {
 791                                 appendLocalClassPathElement(out, reference);
 792                             }
 793                             else
 794                             {
 795                                 appendClassNameElement(out, reference.getClassName());
 796                             }
 797                         }
 798 sage          1.60      
 799 karl          1.169.4.5 // Builds either a classPath or InstancePath based on isClassPath
 800                         // parameter which was carried forward from, for example, the
 801                         // request. If wrapper true, wrap output with <VALUE.REFERENCE>
 802                         void XmlWriter::appendValueReferenceElement(
 803                             Buffer& out,
 804                             const CIMObjectPath& reference,
 805                             Boolean isClassPath,
 806                             Boolean addValueWrapper)
 807                         {
 808                             if (addValueWrapper)
 809 kumpf         1.56          {
 810 karl          1.169.4.5          out << STRLIT("<VALUE.REFERENCE>\n");
 811                             }
 812                             if (isClassPath)
 813                             {
 814                                 appendValueClassPathElement(out,reference);
 815 kumpf         1.56          }
 816                             else
 817                             {
 818 karl          1.169.4.5         appendValueInstancePathElement(out,reference);
 819 kumpf         1.56          }
 820                         
 821 karl          1.169.4.5     if (addValueWrapper)
 822                             {
 823 mike          1.126             out << STRLIT("</VALUE.REFERENCE>\n");
 824 karl          1.169.4.5     }
 825 kumpf         1.56      }
 826                         
 827                         void XmlWriter::printValueReferenceElement(
 828 kumpf         1.59          const CIMObjectPath& reference,
 829 karl          1.169.4.5     Boolean isClassPath,
 830 kumpf         1.56          PEGASUS_STD(ostream)& os)
 831                         {
 832 mike          1.125         Buffer tmp;
 833 karl          1.169.4.5     appendValueReferenceElement(tmp, reference, isClassPath, true);
 834 kumpf         1.56          indentedPrint(os, tmp.getData());
 835                         }
 836                         
 837                         //------------------------------------------------------------------------------
 838                         //
 839                         // appendValueNamedInstanceElement()
 840                         //
 841                         //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
 842                         //
 843                         //------------------------------------------------------------------------------
 844                         
 845                         void XmlWriter::appendValueNamedInstanceElement(
 846 mike          1.125         Buffer& out,
 847 karl          1.169.4.2     const CIMInstance& namedInstance,
 848                             Boolean includeQualifiers,
 849                             Boolean includeClassOrigin,
 850                             const CIMPropertyList& propertyList)
 851 kumpf         1.56      {
 852 mike          1.126         out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
 853 kumpf         1.56      
 854 kumpf         1.61          appendInstanceNameElement(out, namedInstance.getPath ());
 855 karl          1.169.4.2     appendInstanceElement(
 856                                 out,
 857                                 namedInstance,
 858                                 includeQualifiers,
 859                                 includeClassOrigin,
 860                                 propertyList);
 861 kumpf         1.56      
 862 mike          1.126         out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
 863 kumpf         1.56      }
 864                         
 865 karl          1.169.4.3 //EXP_PULL_BEGIN
 866 karl          1.169.4.1 //------------------------------------------------------------------------------
 867                         //
 868                         // appendValueInstanceWithPathElement()
 869                         //
 870                         //     <!ELEMENT VALUE.INSTANCEWITHPATH (INSTANCEPATH,INSTANCE)>
 871                         //
 872                         //------------------------------------------------------------------------------
 873 karl          1.169.4.4 //
 874 karl          1.169.4.1 void XmlWriter::appendValueInstanceWithPathElement(
 875                             Buffer& out,
 876 karl          1.169.4.2     const CIMInstance& namedInstance,
 877                                 Boolean includeQualifiers,
 878                                 Boolean includeClassOrigin,
 879                                 const CIMPropertyList& propertyList)
 880 karl          1.169.4.1 {
 881                             out << STRLIT("<VALUE.INSTANCEWITHPATH>\n");
 882                         
 883                             appendInstancePathElement(out, namedInstance.getPath ());
 884 karl          1.169.4.2     appendInstanceElement(
 885                                 out,
 886                                 namedInstance,
 887                                 includeQualifiers,
 888                                 includeClassOrigin,
 889                                 propertyList);
 890 karl          1.169.4.1 
 891                             out << STRLIT("</VALUE.INSTANCEWITHPATH>\n");
 892                         }
 893                         //EXP_PULL_END
 894 kumpf         1.56      //------------------------------------------------------------------------------
 895                         //
 896 kumpf         1.55      // appendClassElement()
 897                         //
 898                         //     <!ELEMENT CLASS
 899                         //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
 900 kumpf         1.56      //     <!ATTLIST CLASS
 901 kumpf         1.55      //         %CIMName;
 902                         //         %SuperClass;>
 903                         //
 904                         //------------------------------------------------------------------------------
 905                         
 906                         void XmlWriter::appendClassElement(
 907 mike          1.125         Buffer& out,
 908 kumpf         1.156         const CIMConstClass& cimClass)
 909 kumpf         1.55      {
 910 kumpf         1.156         CheckRep(cimClass._rep);
 911                             const CIMClassRep* rep = cimClass._rep;
 912                         
 913                             // Class opening element:
 914                         
 915                             out << STRLIT("<CLASS NAME=\"")
 916                                 << rep->getClassName()
 917                                 << STRLIT("\" ");
 918                         
 919                             if (!rep->getSuperClassName().isNull())
 920                             {
 921                                 out << STRLIT(" SUPERCLASS=\"")
 922                                     << rep->getSuperClassName()
 923                                     << STRLIT("\" ");
 924                             }
 925                         
 926                             out << STRLIT(">\n");
 927                         
 928                             // Append Class Qualifiers:
 929                         
 930                             for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
 931 kumpf         1.156             XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
 932                         
 933                             // Append Property definitions:
 934                         
 935                             for (Uint32 i = 0, n = rep->getPropertyCount(); i < n; i++)
 936                                 XmlWriter::appendPropertyElement(out, rep->getProperty(i));
 937                         
 938                             // Append Method definitions:
 939                         
 940                             for (Uint32 i = 0, n = rep->getMethodCount(); i < n; i++)
 941                                 XmlWriter::appendMethodElement(out, rep->getMethod(i));
 942                         
 943                             // Class closing element:
 944                         
 945                             out << STRLIT("</CLASS>\n");
 946 kumpf         1.55      }
 947                         
 948                         void XmlWriter::printClassElement(
 949                             const CIMConstClass& cimclass,
 950                             PEGASUS_STD(ostream)& os)
 951                         {
 952 mike          1.125         Buffer tmp;
 953 kumpf         1.55          appendClassElement(tmp, cimclass);
 954                             indentedPrint(os, tmp.getData(), 4);
 955                         }
 956                         
 957                         //------------------------------------------------------------------------------
 958                         //
 959                         // appendInstanceElement()
 960                         //
 961                         //     <!ELEMENT INSTANCE
 962                         //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
 963                         //     <!ATTLIST INSTANCE
 964                         //         %ClassName;>
 965                         //
 966                         //------------------------------------------------------------------------------
 967                         
 968                         void XmlWriter::appendInstanceElement(
 969 mike          1.125         Buffer& out,
 970 karl          1.169.4.2     const CIMConstInstance& instance,
 971                             Boolean includeQualifiers,
 972                             Boolean includeClassOrigin,
 973                             const CIMPropertyList& propertyList)
 974 kumpf         1.55      {
 975 marek         1.152         CheckRep(instance._rep);
 976 kumpf         1.156         const CIMInstanceRep* rep = instance._rep;
 977                         
 978                             // Class opening element:
 979                         
 980                             out << STRLIT("<INSTANCE CLASSNAME=\"")
 981                                 << rep->getClassName()
 982                                 << STRLIT("\" >\n");
 983                         
 984                             // Append Instance Qualifiers:
 985 karl          1.169.4.2     if(includeQualifiers)
 986                             {
 987                                 for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
 988                                     XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
 989                             }
 990                             if(propertyList.isNull())
 991 karl          1.169.4.5     {
 992 karl          1.169.4.2         for (Uint32 i = 0, n = rep->getPropertyCount(); i < n; i++)
 993                                 {
 994                                     XmlWriter::appendPropertyElement(
 995                                         out,
 996                                         rep->getProperty(i),
 997                                         includeQualifiers,includeClassOrigin);
 998                                 }
 999                             }
1000                             else
1001                             {
1002                                 for (Uint32 i = 0, n = propertyList.size(); i < n; i++)
1003                                 {
1004                                     CIMName name = propertyList[i];
1005                                     Uint32 pos = rep->_properties.find(
1006                                         propertyList[i],
1007                                         propertyList.getCIMNameTag(i));
1008                                     if(pos != PEG_NOT_FOUND)
1009                                     {
1010                                         PEG_TRACE((TRC_XML,Tracer::LEVEL4,
1011                                             "XmlWriter::appendInstanceElement"
1012                                                 " Filtering the property name:%s for the className:%s"
1013 karl          1.169.4.2                     "since it was not filtered by the provider.",
1014                                             (const char *)name.getString().getCString(),
1015                                             (const char *)instance.getClassName().
1016                                                 getString().getCString()));
1017                         
1018                                         XmlWriter::appendPropertyElement(
1019                                             out,
1020                                             rep->getProperty(pos),
1021                                             includeQualifiers,includeClassOrigin);
1022                                     }
1023                                 }
1024 kumpf         1.156     
1025 karl          1.169.4.2     }
1026 kumpf         1.156     
1027                             // Instance closing element:
1028                         
1029                             out << STRLIT("</INSTANCE>\n");
1030 kumpf         1.55      }
1031                         
1032                         void XmlWriter::printInstanceElement(
1033                             const CIMConstInstance& instance,
1034                             PEGASUS_STD(ostream)& os)
1035                         {
1036 mike          1.125         Buffer tmp;
1037 kumpf         1.55          appendInstanceElement(tmp, instance);
1038                             os << tmp.getData() << PEGASUS_STD(endl);
1039                         }
1040                         
1041                         //------------------------------------------------------------------------------
1042                         //
1043 kumpf         1.56      // appendObjectElement()
1044                         //
1045                         // May refer to a CLASS or an INSTANCE
1046                         //
1047                         //------------------------------------------------------------------------------
1048                         
1049                         void XmlWriter::appendObjectElement(
1050 mike          1.125         Buffer& out,
1051 karl          1.169.4.2     const CIMConstObject& object,
1052                             Boolean includeQualifiers,
1053                             Boolean includeClassOrigin,
1054                             const CIMPropertyList& propertyList)
1055 kumpf         1.56      {
1056 kumpf         1.73          if (object.isClass())
1057 kumpf         1.56          {
1058                                 CIMConstClass c(object);
1059                                 appendClassElement(out, c);
1060                             }
1061 kumpf         1.73          else if (object.isInstance())
1062 kumpf         1.56          {
1063 kumpf         1.73              CIMConstInstance i(object);
1064 karl          1.169.4.2         appendInstanceElement(
1065                                     out,
1066                                     i,
1067                                     includeQualifiers,
1068                                     includeClassOrigin,
1069                                     propertyList);
1070 kumpf         1.56          }
1071 kumpf         1.73          // else PEGASUS_ASSERT(0);
1072 kumpf         1.56      }
1073                         
1074                         //------------------------------------------------------------------------------
1075                         //
1076                         // appendPropertyElement()
1077                         //
1078                         //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
1079                         //     <!ATTLIST PROPERTY
1080                         //              %CIMName;
1081                         //              %CIMType;           #REQUIRED
1082                         //              %ClassOrigin;
1083                         //              %Propagated;>
1084                         //
1085                         //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
1086                         //     <!ATTLIST PROPERTY.ARRAY
1087                         //              %CIMName;
1088                         //              %CIMType;           #REQUIRED
1089                         //              %ArraySize;
1090                         //              %ClassOrigin;
1091                         //              %Propagated;>
1092                         //
1093 kumpf         1.56      //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
1094                         //     <!ATTLIST PROPERTY.REFERENCE
1095                         //              %CIMName;
1096                         //              %ReferenceClass;
1097                         //              %ClassOrigin;
1098                         //              %Propagated;>
1099                         //
1100                         //------------------------------------------------------------------------------
1101                         
1102                         void XmlWriter::appendPropertyElement(
1103 mike          1.125         Buffer& out,
1104 karl          1.169.4.2     const CIMConstProperty& property,
1105                             Boolean includeQualifiers,
1106                             Boolean includeClassOrigin)
1107 kumpf         1.56      {
1108 marek         1.152         CheckRep(property._rep);
1109 kumpf         1.156         const CIMPropertyRep* rep = property._rep;
1110                         
1111                             if (rep->getValue().isArray())
1112                             {
1113                                 out << STRLIT("<PROPERTY.ARRAY NAME=\"")
1114                                     << rep->getName()
1115                                     << STRLIT("\" ");
1116                         
1117                                 if (rep->getValue().getType() == CIMTYPE_OBJECT)
1118                                 {
1119                                     // If the property array type is CIMObject, then
1120                                     //     encode the property in CIM-XML as a string array with the
1121                                     //     EmbeddedObject attribute (there is not currently a CIM-XML
1122                                     //     "object" datatype)
1123                         
1124                                     Array<CIMObject> a;
1125                                     rep->getValue().get(a);
1126                                     out << STRLIT(" TYPE=\"string\"");
1127                                     // If the Embedded Object is an instance, always add the
1128                                     // EmbeddedObject attribute.
1129                                     if (a.size() > 0 && a[0].isInstance())
1130 kumpf         1.156                 {
1131 kumpf         1.167                     out << STRLIT(" EmbeddedObject=\"object\""
1132 thilo.boehm   1.162                                   " EMBEDDEDOBJECT=\"object\"");
1133 kumpf         1.156                 }
1134                         #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
1135                                     else
1136                         #endif
1137                                     {
1138                                         // Else the Embedded Object is a class, always add the
1139                                         // EmbeddedObject qualifier.  Note that if the macro
1140                                         // PEGASUS_SNIA_INTEROP_COMPATIBILITY is defined, then
1141                                         // the EmbeddedObject qualifier will always be added,
1142                                         // whether it's a class or an instance.
1143 thilo.boehm   1.159                     if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT) ==
1144 kumpf         1.156                             PEG_NOT_FOUND)
1145                                         {
1146                                             // Note that addQualifiers() cannot be called on a const
1147                                             // CIMQualifierRep.  In this case we really do want to add
1148                                             // the EmbeddedObject qualifier, so we cast away the
1149                                             // constness.
1150                                             CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
1151                                             tmpRep->addQualifier(
1152 kumpf         1.167                             CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
1153 thilo.boehm   1.159                                          true));
1154 kumpf         1.156                     }
1155                                     }
1156                                 }
1157                                 else if (rep->getValue().getType() == CIMTYPE_INSTANCE)
1158                                 {
1159                                     // If the property array type is CIMInstance, then
1160                                     //   encode the property in CIM-XML as a string array with the
1161                                     //   EmbeddedObject attribute (there is not currently a CIM-XML
1162                                     //   "instance" datatype)
1163                         
1164                                     Array<CIMInstance> a;
1165                                     rep->getValue().get(a);
1166                                     out << STRLIT(" TYPE=\"string\"");
1167                         
1168                                     // add the EmbeddedObject attribute
1169                                     if (a.size() > 0)
1170                                     {
1171 kumpf         1.167                     out << STRLIT(" EmbeddedObject=\"instance\""
1172 thilo.boehm   1.162                                   " EMBEDDEDOBJECT=\"instance\"");
1173 kumpf         1.156     
1174                                         // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY is
1175                                         // defined, then the EmbeddedInstance qualifier will be added
1176                         # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
1177 karl          1.169.4.5                 if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE)
1178                                                 == PEG_NOT_FOUND)
1179 kumpf         1.156                     {
1180                                             // Note that addQualifiers() cannot be called on a const
1181                                             // CIMQualifierRep.  In this case we really do want to add
1182                                             // the EmbeddedInstance qualifier, so we cast away the
1183                                             // constness.
1184                         
1185                                             // For now, we assume that all the embedded instances in
1186                                             // the array are of the same type
1187                                             CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
1188                                             tmpRep->addQualifier(CIMQualifier(
1189 thilo.boehm   1.159                             PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
1190 kumpf         1.156                             a[0].getClassName().getString()));
1191                                         }
1192                         # endif
1193                                     }
1194                                 }
1195                                 else
1196                                 {
1197 thilo.boehm   1.162                 out.append(' ');
1198 thilo.boehm   1.169                 out << xmlWriterTypeStrings(rep->getValue().getType());
1199 kumpf         1.156             }
1200                         
1201                                 if (rep->getArraySize())
1202                                 {
1203                                     char buffer[32];
1204 kumpf         1.158                 sprintf(buffer, "%u", rep->getArraySize());
1205 kumpf         1.156                 out << STRLIT(" ARRAYSIZE=\"") << buffer;
1206                                     out.append('"');
1207                                 }
1208                         
1209 karl          1.169.4.2         if(includeClassOrigin && !rep->getClassOrigin().isNull())
1210 kumpf         1.156             {
1211                                     out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
1212                                     out.append('"');
1213                                 }
1214                         
1215                                 if (rep->getPropagated())
1216                                 {
1217                                     out << STRLIT(" PROPAGATED=\"true\"");
1218                                 }
1219                         
1220                                 out << STRLIT(">\n");
1221 karl          1.169.4.2         if(includeQualifiers)
1222                                 {
1223                                     for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1224                                         XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1225                                 }
1226 kumpf         1.156     
1227                                 XmlWriter::appendValueElement(out, rep->getValue());
1228                         
1229                                 out << STRLIT("</PROPERTY.ARRAY>\n");
1230                             }
1231                             else if (rep->getValue().getType() == CIMTYPE_REFERENCE)
1232                             {
1233 kumpf         1.167             out << STRLIT("<PROPERTY.REFERENCE"
1234 thilo.boehm   1.162                           " NAME=\"") << rep->getName() << STRLIT("\" ");
1235 kumpf         1.156     
1236                                 if (!rep->getReferenceClassName().isNull())
1237                                 {
1238                                     out << STRLIT(" REFERENCECLASS=\"") << rep->getReferenceClassName();
1239                                     out.append('"');
1240                                 }
1241 karl          1.169.4.2         if(includeClassOrigin && !rep->getClassOrigin().isNull())
1242 kumpf         1.156             {
1243                                     out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
1244                                     out.append('"');
1245                                 }
1246                         
1247                                 if (rep->getPropagated())
1248                                 {
1249                                     out << STRLIT(" PROPAGATED=\"true\"");
1250                                 }
1251                         
1252                                 out << STRLIT(">\n");
1253 karl          1.169.4.2         if(includeQualifiers)
1254 karl          1.169.4.5         {
1255 karl          1.169.4.2             for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1256                                         XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1257                                 }
1258 kumpf         1.156     
1259                                 XmlWriter::appendValueElement(out, rep->getValue());
1260                         
1261                                 out << STRLIT("</PROPERTY.REFERENCE>\n");
1262                             }
1263                             else
1264                             {
1265                                 out << STRLIT("<PROPERTY NAME=\"") << rep->getName() << STRLIT("\" ");
1266 karl          1.169.4.2         if(includeClassOrigin && !rep->getClassOrigin().isNull())
1267 kumpf         1.156             {
1268                                     out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
1269                                     out.append('"');
1270                                 }
1271                         
1272                                 if (rep->getPropagated())
1273                                 {
1274                                     out << STRLIT(" PROPAGATED=\"true\"");
1275                                 }
1276                         
1277                                 if (rep->getValue().getType() == CIMTYPE_OBJECT)
1278                                 {
1279                                     // If the property type is CIMObject, then
1280                                     //   encode the property in CIM-XML as a string with the
1281                                     //   EmbeddedObject attribute (there is not currently a CIM-XML
1282                                     //   "object" datatype)
1283                         
1284                                     CIMObject a;
1285                                     rep->getValue().get(a);
1286                                     out << STRLIT(" TYPE=\"string\"");
1287                         
1288 kumpf         1.156                 // If the Embedded Object is an instance, always add the
1289                                     // EmbeddedObject attribute.
1290                                     if (a.isInstance())
1291                                     {
1292 kumpf         1.167                     out << STRLIT(" EmbeddedObject=\"object\""
1293 thilo.boehm   1.162                                   " EMBEDDEDOBJECT=\"object\"");
1294 kumpf         1.156                 }
1295                                     // Else the Embedded Object is a class, always add the
1296                                     // EmbeddedObject qualifier.
1297                         #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
1298                                     else
1299                         #endif
1300                                     {
1301                                         // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY
1302                                         // is defined, then the EmbeddedObject qualifier will always
1303                                         // be added, whether it's a class or an instance.
1304 thilo.boehm   1.159                     if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT) ==
1305 kumpf         1.156                             PEG_NOT_FOUND)
1306                                         {
1307                                             // Note that addQualifiers() cannot be called on a const
1308                                             // CIMQualifierRep.  In this case we really do want to add
1309                                             // the EmbeddedObject qualifier, so we cast away the
1310                                             // constness.
1311                                             CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
1312                                             tmpRep->addQualifier(
1313 kumpf         1.167                             CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
1314 thilo.boehm   1.159                                          true));
1315 kumpf         1.156                     }
1316                                     }
1317                                 }
1318                                 else if (rep->getValue().getType() == CIMTYPE_INSTANCE)
1319                                 {
1320                                     CIMInstance a;
1321                                     rep->getValue().get(a);
1322 kumpf         1.167                 out << STRLIT(" TYPE=\"string\""
1323                                                   " EmbeddedObject=\"instance\""
1324 thilo.boehm   1.162                               " EMBEDDEDOBJECT=\"instance\"");
1325 kumpf         1.156     
1326                         # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
1327 kumpf         1.167                 if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
1328 thilo.boehm   1.159                     == PEG_NOT_FOUND)
1329 kumpf         1.156                 {
1330                                         // Note that addQualifiers() cannot be called on a const
1331                                         // CIMQualifierRep.  In this case we really do want to add
1332                                         // the EmbeddedInstance qualifier, so we cast away the
1333                                         // constness.
1334                                         CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
1335                                         tmpRep->addQualifier(CIMQualifier(
1336 thilo.boehm   1.159                         PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
1337 kumpf         1.156                         a.getClassName().getString()));
1338                                     }
1339                         # endif
1340                                 }
1341                                 else
1342                                 {
1343 thilo.boehm   1.162                 out.append(' ');
1344 thilo.boehm   1.169                 out << xmlWriterTypeStrings(rep->getValue().getType());
1345 kumpf         1.156             }
1346                         
1347                                 out << STRLIT(">\n");
1348 karl          1.169.4.2         if(includeQualifiers)
1349                                 {
1350                                     for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1351                                         XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1352                                 }
1353 kumpf         1.156     
1354                                 XmlWriter::appendValueElement(out, rep->getValue());
1355                         
1356                                 out << STRLIT("</PROPERTY>\n");
1357                             }
1358 kumpf         1.56      }
1359                         
1360                         void XmlWriter::printPropertyElement(
1361                             const CIMConstProperty& property,
1362                             PEGASUS_STD(ostream)& os)
1363                         {
1364 mike          1.125         Buffer tmp;
1365 kumpf         1.56          appendPropertyElement(tmp, property);
1366                             os << tmp.getData() << PEGASUS_STD(endl);
1367                         }
1368                         
1369                         //------------------------------------------------------------------------------
1370                         //
1371                         // appendMethodElement()
1372                         //
1373                         //     <!ELEMENT METHOD (QUALIFIER*,
1374                         //         (PARAMETER|PARAMETER.REFERENCE|PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
1375                         //     <!ATTLIST METHOD
1376                         //              %CIMName;
1377                         //              %CIMType;          #IMPLIED
1378                         //              %ClassOrigin;
1379                         //              %Propagated;>
1380                         //
1381                         //------------------------------------------------------------------------------
1382                         
1383                         void XmlWriter::appendMethodElement(
1384 mike          1.125         Buffer& out,
1385 kumpf         1.56          const CIMConstMethod& method)
1386                         {
1387 marek         1.152         CheckRep(method._rep);
1388 kumpf         1.156         const CIMMethodRep* rep = method._rep;
1389                         
1390                             out << STRLIT("<METHOD NAME=\"") << rep->getName();
1391 thilo.boehm   1.162         out << STRLIT("\" ");
1392 kumpf         1.156     
1393 thilo.boehm   1.169         out << xmlWriterTypeStrings(rep->getType());
1394 kumpf         1.156     
1395                             if (!rep->getClassOrigin().isNull())
1396                             {
1397                                 out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
1398                                 out.append('"');
1399                             }
1400                         
1401                             if (rep->getPropagated())
1402                             {
1403                                 out << STRLIT(" PROPAGATED=\"true\"");
1404                             }
1405                         
1406                             out << STRLIT(">\n");
1407                         
1408                             for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1409                                 XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1410                         
1411                             for (Uint32 i = 0, n = rep->getParameterCount(); i < n; i++)
1412                                 XmlWriter::appendParameterElement(out, rep->getParameter(i));
1413                         
1414                             out << STRLIT("</METHOD>\n");
1415 kumpf         1.56      }
1416                         
1417                         void XmlWriter::printMethodElement(
1418                             const CIMConstMethod& method,
1419                             PEGASUS_STD(ostream)& os)
1420                         {
1421 mike          1.125         Buffer tmp;
1422 kumpf         1.56          appendMethodElement(tmp, method);
1423                             os << tmp.getData() << PEGASUS_STD(endl);
1424                         }
1425                         
1426                         //------------------------------------------------------------------------------
1427                         //
1428                         // appendParameterElement()
1429                         //
1430                         //     <!ELEMENT PARAMETER (QUALIFIER*)>
1431                         //     <!ATTLIST PARAMETER
1432                         //              %CIMName;
1433                         //              %CIMType;      #REQUIRED>
1434                         //
1435                         //     <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
1436                         //     <!ATTLIST PARAMETER.REFERENCE
1437                         //              %CIMName;
1438                         //              %ReferenceClass;>
1439                         //
1440                         //     <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
1441                         //     <!ATTLIST PARAMETER.ARRAY
1442                         //              %CIMName;
1443 kumpf         1.56      //              %CIMType;           #REQUIRED
1444                         //              %ArraySize;>
1445                         //
1446                         //     <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
1447                         //     <!ATTLIST PARAMETER.REFARRAY
1448                         //              %CIMName;
1449                         //              %ReferenceClass;
1450                         //              %ArraySize;>
1451                         //
1452                         //------------------------------------------------------------------------------
1453                         
1454                         void XmlWriter::appendParameterElement(
1455 mike          1.125         Buffer& out,
1456 kumpf         1.56          const CIMConstParameter& parameter)
1457                         {
1458 marek         1.152         CheckRep(parameter._rep);
1459 kumpf         1.156         const CIMParameterRep* rep = parameter._rep;
1460                         
1461                             if (rep->isArray())
1462                             {
1463                                 if (rep->getType() == CIMTYPE_REFERENCE)
1464                                 {
1465                                     out << STRLIT("<PARAMETER.REFARRAY NAME=\"") << rep->getName();
1466                                     out.append('"');
1467                         
1468                                     if (!rep->getReferenceClassName().isNull())
1469                                     {
1470                                         out << STRLIT(" REFERENCECLASS=\"");
1471                                         out << rep->getReferenceClassName().getString();
1472                                         out.append('"');
1473                                     }
1474                         
1475                                     if (rep->getArraySize())
1476                                     {
1477                                         char buffer[32];
1478 kumpf         1.158                     int n = sprintf(buffer, "%u", rep->getArraySize());
1479 kumpf         1.156                     out << STRLIT(" ARRAYSIZE=\"");
1480                                         out.append(buffer, n);
1481                                         out.append('"');
1482                                     }
1483                         
1484                                     out << STRLIT(">\n");
1485                         
1486                                     for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1487                                         XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1488                         
1489                                     out << STRLIT("</PARAMETER.REFARRAY>\n");
1490                                 }
1491                                 else
1492                                 {
1493 kumpf         1.167                 out << STRLIT("<PARAMETER.ARRAY"
1494 thilo.boehm   1.162                               " NAME=\"") << rep->getName();
1495 thilo.boehm   1.169                 out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getType());
1496 kumpf         1.167     
1497 kumpf         1.156                 if (rep->getArraySize())
1498                                     {
1499                                         char buffer[32];
1500 kumpf         1.158                     sprintf(buffer, "%u", rep->getArraySize());
1501 kumpf         1.156                     out << STRLIT(" ARRAYSIZE=\"") << buffer;
1502                                         out.append('"');
1503                                     }
1504                         
1505                                     out << STRLIT(">\n");
1506                         
1507                                     for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1508                                         XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1509                         
1510                                     out << STRLIT("</PARAMETER.ARRAY>\n");
1511                                 }
1512                             }
1513                             else if (rep->getType() == CIMTYPE_REFERENCE)
1514                             {
1515 kumpf         1.167             out << STRLIT("<PARAMETER.REFERENCE"
1516 thilo.boehm   1.162                           " NAME=\"") << rep->getName();
1517 kumpf         1.156             out.append('"');
1518                         
1519                                 if (!rep->getReferenceClassName().isNull())
1520                                 {
1521                                     out << STRLIT(" REFERENCECLASS=\"");
1522                                     out << rep->getReferenceClassName().getString();
1523                                     out.append('"');
1524                                 }
1525                                 out << STRLIT(">\n");
1526                         
1527                                 for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1528                                     XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1529                         
1530                                 out << STRLIT("</PARAMETER.REFERENCE>\n");
1531                             }
1532                             else
1533                             {
1534 kumpf         1.167             out << STRLIT("<PARAMETER"
1535 thilo.boehm   1.162                           " NAME=\"") << rep->getName();
1536 thilo.boehm   1.169             out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getType());
1537 thilo.boehm   1.162     
1538                                 out << STRLIT(">\n");
1539 kumpf         1.156     
1540                                 for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
1541                                     XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
1542                         
1543                                 out << STRLIT("</PARAMETER>\n");
1544                             }
1545 kumpf         1.56      }
1546                         
1547                         void XmlWriter::printParameterElement(
1548                             const CIMConstParameter& parameter,
1549                             PEGASUS_STD(ostream)& os)
1550                         {
1551 mike          1.125         Buffer tmp;
1552 kumpf         1.56          appendParameterElement(tmp, parameter);
1553                             os << tmp.getData() << PEGASUS_STD(endl);
1554                         }
1555                         
1556                         //------------------------------------------------------------------------------
1557                         //
1558                         // appendParamValueElement()
1559                         //
1560                         //     <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
1561                         //     <!ATTLIST PARAMVALUE
1562 kumpf         1.156     //         %CIMName;
1563                         //         %EmbeddedObject; #IMPLIED
1564                         //         %ParamType;>
1565 kumpf         1.56      //
1566                         //------------------------------------------------------------------------------
1567                         
1568                         void XmlWriter::appendParamValueElement(
1569 mike          1.125         Buffer& out,
1570 kumpf         1.56          const CIMParamValue& paramValue)
1571                         {
1572 marek         1.152         CheckRep(paramValue._rep);
1573 kumpf         1.156         const CIMParamValueRep* rep = paramValue._rep;
1574                         
1575                             out << STRLIT("<PARAMVALUE NAME=\"") << rep->getParameterName();
1576                             out.append('"');
1577                         
1578                             CIMType type = rep->getValue().getType();
1579                         
1580                             if (rep->isTyped())
1581                             {
1582                                 XmlWriter::appendParamTypeAndEmbeddedObjAttrib(out, type);
1583                             }
1584                         
1585                             out << STRLIT(">\n");
1586                             XmlWriter::appendValueElement(out, rep->getValue());
1587                         
1588                             out << STRLIT("</PARAMVALUE>\n");
1589 kumpf         1.56      }
1590                         
1591                         void XmlWriter::printParamValueElement(
1592                             const CIMParamValue& paramValue,
1593                             PEGASUS_STD(ostream)& os)
1594                         {
1595 mike          1.125         Buffer tmp;
1596 kumpf         1.56          appendParamValueElement(tmp, paramValue);
1597                             os << tmp.getData() << PEGASUS_STD(endl);
1598                         }
1599                         
1600                         //------------------------------------------------------------------------------
1601                         //
1602                         // appendQualifierElement()
1603                         //
1604                         //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
1605                         //     <!ATTLIST QUALIFIER
1606                         //              %CIMName;
1607                         //              %CIMType;               #REQUIRED
1608                         //              %Propagated;
1609                         //              %QualifierFlavor;>
1610                         //
1611                         //------------------------------------------------------------------------------
1612                         
1613                         void XmlWriter::appendQualifierElement(
1614 mike          1.125         Buffer& out,
1615 kumpf         1.56          const CIMConstQualifier& qualifier)
1616                         {
1617 marek         1.152         CheckRep(qualifier._rep);
1618 kumpf         1.156         const CIMQualifierRep* rep = qualifier._rep;
1619                         
1620                             out << STRLIT("<QUALIFIER NAME=\"") << rep->getName();
1621 thilo.boehm   1.169         out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getValue().getType());
1622 kumpf         1.156     
1623                             if (rep->getPropagated())
1624                             {
1625                                 out << STRLIT(" PROPAGATED=\"true\"");
1626                             }
1627                         
1628                             XmlWriter::appendQualifierFlavorEntity(out, rep->getFlavor());
1629                         
1630                             out << STRLIT(">\n");
1631                         
1632                             XmlWriter::appendValueElement(out, rep->getValue());
1633                         
1634                             out << STRLIT("</QUALIFIER>\n");
1635 kumpf         1.56      }
1636                         
1637                         void XmlWriter::printQualifierElement(
1638                             const CIMConstQualifier& qualifier,
1639                             PEGASUS_STD(ostream)& os)
1640                         {
1641 mike          1.125         Buffer tmp;
1642 kumpf         1.56          appendQualifierElement(tmp, qualifier);
1643                             os << tmp.getData() << PEGASUS_STD(endl);
1644                         }
1645                         
1646                         //------------------------------------------------------------------------------
1647                         //
1648                         // appendQualifierDeclElement()
1649                         //
1650                         //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
1651                         //     <!ATTLIST QUALIFIER.DECLARATION
1652                         //              %CIMName;
1653                         //              %CIMType;                       #REQUIRED
1654                         //              ISARRAY        (true|false)     #IMPLIED
1655                         //              %ArraySize;
1656                         //              %QualifierFlavor;>
1657                         //
1658                         //------------------------------------------------------------------------------
1659                         
1660                         void XmlWriter::appendQualifierDeclElement(
1661 mike          1.125         Buffer& out,
1662 kumpf         1.56          const CIMConstQualifierDecl& qualifierDecl)
1663                         {
1664 marek         1.152         CheckRep(qualifierDecl._rep);
1665 kumpf         1.156         const CIMQualifierDeclRep* rep = qualifierDecl._rep;
1666                         
1667                             out << STRLIT("<QUALIFIER.DECLARATION NAME=\"") << rep->getName();
1668 thilo.boehm   1.169         out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getValue().getType());
1669 kumpf         1.156     
1670                             if (rep->getValue().isArray())
1671                             {
1672                                 out << STRLIT(" ISARRAY=\"true\"");
1673                         
1674                                 if (rep->getArraySize())
1675                                 {
1676                                     char buffer[64];
1677 kumpf         1.158                 int n = sprintf(buffer, " ARRAYSIZE=\"%u\"", rep->getArraySize());
1678 kumpf         1.156                 out.append(buffer, n);
1679                                 }
1680                             }
1681                         
1682                             XmlWriter::appendQualifierFlavorEntity(out, rep->getFlavor());
1683                         
1684                             out << STRLIT(">\n");
1685                         
1686                             XmlWriter::appendScopeElement(out, rep->getScope());
1687                             XmlWriter::appendValueElement(out, rep->getValue());
1688                         
1689                             out << STRLIT("</QUALIFIER.DECLARATION>\n");
1690 kumpf         1.56      }
1691                         
1692                         void XmlWriter::printQualifierDeclElement(
1693                             const CIMConstQualifierDecl& qualifierDecl,
1694                             PEGASUS_STD(ostream)& os)
1695                         {
1696 mike          1.125         Buffer tmp;
1697 kumpf         1.56          appendQualifierDeclElement(tmp, qualifierDecl);
1698                             os << tmp.getData() << PEGASUS_STD(endl);
1699                         }
1700                         
1701                         //------------------------------------------------------------------------------
1702                         //
1703 kumpf         1.57      // appendQualifierFlavorEntity()
1704                         //
1705                         //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
1706                         //                                 TOSUBCLASS   (true|false)   'true'
1707                         //                                 TOINSTANCE   (true|false)   'false'
1708                         //                                 TRANSLATABLE (true|false)   'false'">
1709                         //
1710 kumpf         1.168     //     DEPRECATION NOTE:  The attribute TOINSTANCE is DEPRECATED and MAY be
1711                         //     removed from the QualifierFlavor entity in a future version of this
1712                         //     document.  Use of this qualifier is discouraged.
1713                         //
1714 kumpf         1.57      //------------------------------------------------------------------------------
1715                         
1716                         void XmlWriter::appendQualifierFlavorEntity(
1717 mike          1.125         Buffer& out,
1718 kumpf         1.70          const CIMFlavor & flavor)
1719 kumpf         1.57      {
1720 kumpf         1.70          if (!(flavor.hasFlavor (CIMFlavor::OVERRIDABLE)))
1721 mike          1.126             out << STRLIT(" OVERRIDABLE=\"false\"");
1722 kumpf         1.57      
1723 kumpf         1.70          if (!(flavor.hasFlavor (CIMFlavor::TOSUBCLASS)))
1724 mike          1.126             out << STRLIT(" TOSUBCLASS=\"false\"");
1725 kumpf         1.57      
1726 kumpf         1.168         //if (flavor.hasFlavor (CIMFlavor::TOINSTANCE))
1727                             //    out << STRLIT(" TOINSTANCE=\"true\"");
1728 kumpf         1.57      
1729 kumpf         1.70          if (flavor.hasFlavor (CIMFlavor::TRANSLATABLE))
1730 mike          1.126             out << STRLIT(" TRANSLATABLE=\"true\"");
1731 kumpf         1.57      }
1732                         
1733                         //------------------------------------------------------------------------------
1734                         //
1735 kumpf         1.58      // appendScopeElement()
1736                         //
1737                         //     <!ELEMENT SCOPE EMPTY>
1738                         //     <!ATTLIST SCOPE
1739                         //              CLASS        (true|false)      'false'
1740                         //              ASSOCIATION  (true|false)      'false'
1741                         //              REFERENCE    (true|false)      'false'
1742                         //              PROPERTY     (true|false)      'false'
1743                         //              METHOD       (true|false)      'false'
1744                         //              PARAMETER    (true|false)      'false'
1745                         //              INDICATION   (true|false)      'false'>
1746                         //
1747                         //------------------------------------------------------------------------------
1748                         
1749                         void XmlWriter::appendScopeElement(
1750 mike          1.125         Buffer& out,
1751 kumpf         1.69          const CIMScope & scope)
1752 kumpf         1.58      {
1753 kumpf         1.69          if (!(scope.equal (CIMScope ())))
1754 kumpf         1.58          {
1755 mike          1.126             out << STRLIT("<SCOPE");
1756 kumpf         1.58      
1757 kumpf         1.69              if (scope.hasScope (CIMScope::CLASS))
1758 mike          1.126                 out << STRLIT(" CLASS=\"true\"");
1759 kumpf         1.58      
1760 kumpf         1.69              if (scope.hasScope (CIMScope::ASSOCIATION))
1761 mike          1.126                 out << STRLIT(" ASSOCIATION=\"true\"");
1762 kumpf         1.58      
1763 kumpf         1.69              if (scope.hasScope (CIMScope::REFERENCE))
1764 mike          1.126                 out << STRLIT(" REFERENCE=\"true\"");
1765 kumpf         1.58      
1766 kumpf         1.69              if (scope.hasScope (CIMScope::PROPERTY))
1767 mike          1.126                 out << STRLIT(" PROPERTY=\"true\"");
1768 kumpf         1.58      
1769 kumpf         1.69              if (scope.hasScope (CIMScope::METHOD))
1770 mike          1.126                 out << STRLIT(" METHOD=\"true\"");
1771 kumpf         1.58      
1772 kumpf         1.69              if (scope.hasScope (CIMScope::PARAMETER))
1773 mike          1.126                 out << STRLIT(" PARAMETER=\"true\"");
1774 kumpf         1.58      
1775 kumpf         1.69              if (scope.hasScope (CIMScope::INDICATION))
1776 mike          1.126                 out << STRLIT(" INDICATION=\"true\"");
1777 kumpf         1.58      
1778 mike          1.126             out << STRLIT("/>");
1779 kumpf         1.58          }
1780                         }
1781                         
1782 david.dillard 1.121     // l10n - added content language and accept language support to
1783 chuck         1.89      // the header methods below
1784                         
1785 kumpf         1.58      //------------------------------------------------------------------------------
1786                         //
1787 kumpf         1.27      // appendMethodCallHeader()
1788 mike          1.23      //
1789 kumpf         1.31      //     Build HTTP method call request header.
1790 mike          1.23      //
1791                         //------------------------------------------------------------------------------
1792                         
1793 kumpf         1.27      void XmlWriter::appendMethodCallHeader(
1794 mike          1.125         Buffer& out,
1795 mike          1.23          const char* host,
1796 kumpf         1.80          const CIMName& cimMethod,
1797 mike          1.23          const String& cimObject,
1798 mike          1.24          const String& authenticationHeader,
1799 kumpf         1.82          HttpMethod httpMethod,
1800 kumpf         1.133         const AcceptLanguageList& acceptLanguages,
1801                             const ContentLanguageList& contentLanguages,
1802 mike          1.164         Uint32 contentLength,
1803                             bool binaryRequest,
1804                             bool binaryResponse)
1805 mike          1.23      {
1806 karl          1.169.4.7     char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)),'\0'};
1807 mike          1.23      
1808 karl          1.81          // ATTN: KS 20020926 - Temporary change to issue only POST. This may
1809                             // be changed in the DMTF CIM Operations standard in the future.
1810                             // If we kept M-Post we would have to retry with Post. Does not
1811                             // do that in client today. Permanent change is to retry until spec
1812                             // updated. This change is temp to finish tests or until the retry
1813                             // installed.  Required because of change to wbemservices cimom
1814 kumpf         1.82          if (httpMethod == HTTP_METHOD_M_POST)
1815                             {
1816 mike          1.126             out << STRLIT("M-POST /cimom HTTP/1.1\r\n");
1817 kumpf         1.82          }
1818                             else
1819                             {
1820 mike          1.126             out << STRLIT("POST /cimom HTTP/1.1\r\n");
1821 kumpf         1.82          }
1822 mike          1.164         out << STRLIT("HOST: ") << host << STRLIT("\r\n");
1823                         
1824                             if (binaryRequest)
1825                             {
1826                                 // Tell the server that the payload is encoded in the OpenPegasus
1827                                 // binary protocol.
1828                                 out << STRLIT("Content-Type: application/x-openpegasus\r\n");
1829                             }
1830                             else
1831                             {
1832 karl          1.169.4.2         out << STRLIT("Content-Type: application/xml; charset=utf-8\r\n");
1833 mike          1.164         }
1834                         
1835                             if (binaryResponse)
1836                             {
1837                                 // Tell the server that this client accepts the OpenPegasus binary
1838                                 // protocol.
1839                                 out << STRLIT("Accept: application/x-openpegasus\r\n");
1840                             }
1841                         
1842 kumpf         1.157         OUTPUT_CONTENTLENGTH(out, contentLength);
1843 chuck         1.89          if (acceptLanguages.size() > 0)
1844                             {
1845 kumpf         1.146             out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
1846 chuck         1.89          }
1847                             if (contentLanguages.size() > 0)
1848                             {
1849 kumpf         1.146             out << STRLIT("Content-Language: ") << contentLanguages <<
1850                                     STRLIT("\r\n");
1851 david.dillard 1.121         }
1852 brian.campbell 1.107     
1853 brian.campbell 1.113     #ifdef PEGASUS_DEBUG
1854 kumpf          1.146         // backdoor environment variable to turn OFF client requesting transfer
1855                              // encoding. The default is on. to turn off, set this variable to zero.
1856                              // This should be removed when stable. This should only be turned off in
1857                              // a debugging/testing environment.
1858 brian.campbell 1.113     
1859 karl           1.169.4.8     static const char *clientTransferEncodingOff =
1860                                  getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
1861 karl           1.142     
1862 karl           1.169.4.8     if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
1863 a.dunfey       1.110     #endif
1864 brian.campbell 1.113     
1865 mike           1.164         if (!binaryResponse)
1866                              {
1867                                  // The binary protocol does not allow chunking.
1868                                  out << STRLIT("TE: chunked, trailers\r\n");
1869                              }
1870 brian.campbell 1.107     
1871 kumpf          1.82          if (httpMethod == HTTP_METHOD_M_POST)
1872                              {
1873 mike           1.126             out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
1874                                  out << nn << STRLIT("\r\n");
1875                                  out << nn << STRLIT("-CIMOperation: MethodCall\r\n");
1876                                  out << nn << STRLIT("-CIMMethod: ")
1877                                      << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
1878 kumpf          1.167             out << nn << STRLIT("-CIMObject: ")
1879 kumpf          1.157                 << encodeURICharacters(cimObject) << STRLIT("\r\n");
1880 kumpf          1.82          }
1881 david.dillard  1.121         else
1882 kumpf          1.82          {
1883 mike           1.126             out << STRLIT("CIMOperation: MethodCall\r\n");
1884 kumpf          1.146             out << STRLIT("CIMMethod: ")
1885 kumpf          1.157                 << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
1886 david.dillard  1.130             out << STRLIT("CIMObject: ") << encodeURICharacters(cimObject)
1887 kumpf          1.146                 << STRLIT("\r\n");
1888 kumpf          1.82          }
1889                          
1890 mike           1.24          if (authenticationHeader.size())
1891                              {
1892 mike           1.126             out << authenticationHeader << STRLIT("\r\n");
1893 mike           1.24          }
1894 brian.campbell 1.107     
1895 mike           1.126         out << STRLIT("\r\n");
1896 mike           1.23      }
1897                          
1898 chuck          1.89      
1899 kumpf          1.27      void XmlWriter::appendMethodResponseHeader(
1900 mike           1.125          Buffer& out,
1901 w.white        1.108          HttpMethod httpMethod,
1902 kumpf          1.133          const ContentLanguageList& contentLanguages,
1903 w.white        1.108          Uint32 contentLength,
1904 mike           1.164          Uint64 serverResponseTime,
1905                               bool binaryResponse)
1906 brian.campbell 1.113     {
1907 mike           1.164         // Optimize the typical case for binary messages, circumventing the
1908                              // more expensive logic below.
1909 kumpf          1.167         if (binaryResponse &&
1910 mike           1.164             contentLength == 0 &&
1911                                  httpMethod != HTTP_METHOD_M_POST &&
1912                                  contentLanguages.size() == 0)
1913                              {
1914                                  static const char HEADERS[] =
1915                                      "HTTP/1.1 200 OK\r\n"
1916                                      "Content-Type: application/x-openpegasus\r\n"
1917                                      "content-length: 0000000000\r\n"
1918                                      "CIMOperation: MethodResponse\r\n"
1919                                      "\r\n";
1920                          
1921                                  // The HTTP processor fills in the content-length value later.
1922                                  // It searches for a field matching "content-length" (so the first
1923                                  // character must be lower case).
1924                                  out.append(HEADERS, sizeof(HEADERS) - 1);
1925                                  return;
1926                              }
1927                          
1928 mike           1.126          out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
1929 kumpf          1.141     
1930                          #ifndef PEGASUS_DISABLE_PERFINST
1931                               if (StatisticalData::current()->copyGSD)
1932                               {
1933                                   out << STRLIT("WBEMServerResponseTime: ") <<
1934                                       CIMValue(serverResponseTime).toString() << STRLIT("\r\n");
1935                               }
1936                          #endif
1937                          
1938 mike           1.164          if (binaryResponse)
1939                               {
1940                                  // According to MIME RFC, the "x-" prefix should be used for all
1941                                  // non-registered values.
1942                                   out << STRLIT("Content-Type: application/x-openpegasus\r\n");
1943                               }
1944                               else
1945                               {
1946 karl           1.169.4.2          out << STRLIT("Content-Type: application/xml; charset=utf-8\r\n");
1947 mike           1.164          }
1948                          
1949 kumpf          1.157          OUTPUT_CONTENTLENGTH(out, contentLength);
1950 w.white        1.108     
1951                               if (contentLanguages.size() > 0)
1952                               {
1953 kumpf          1.146              out << STRLIT("Content-Language: ") << contentLanguages <<
1954                                       STRLIT("\r\n");
1955 w.white        1.108          }
1956                               if (httpMethod == HTTP_METHOD_M_POST)
1957                               {
1958 karl           1.169.4.7          char nn[] = {char('0'+(rand() % 10)),char('0' + (rand() % 10)),'\0'};
1959 mike           1.164     
1960 kumpf          1.167              out << STRLIT("Ext:\r\n"
1961                                                 "Cache-Control: no-cache\r\n"
1962 thilo.boehm    1.162                            "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
1963 mike           1.126              out << nn << STRLIT("\r\n");
1964                                   out << nn << STRLIT("-CIMOperation: MethodResponse\r\n\r\n");
1965 w.white        1.108          }
1966                               else
1967                               {
1968 mike           1.126              out << STRLIT("CIMOperation: MethodResponse\r\n\r\n");
1969 w.white        1.108          }
1970 brian.campbell 1.113     }
1971 w.white        1.108     
1972                          
1973 mike           1.23      //------------------------------------------------------------------------------
1974                          //
1975 kumpf          1.40      // appendHttpErrorResponseHeader()
1976                          //
1977                          //     Build HTTP error response header.
1978                          //
1979                          //     Returns error response message in the following format:
1980                          //
1981 kumpf          1.41      //        HTTP/1.1 400 Bad Request       (using specified status code)
1982                          //        CIMError: <error type>         (if specified by caller)
1983                          //        PGErrorDetail: <error text>    (if specified by caller)
1984 kumpf          1.40      //
1985                          //------------------------------------------------------------------------------
1986                          
1987                          void XmlWriter::appendHttpErrorResponseHeader(
1988 mike           1.125         Buffer& out,
1989 kumpf          1.40          const String& status,
1990                              const String& cimError,
1991 kumpf          1.41          const String& errorDetail)
1992 kumpf          1.40      {
1993 mike           1.126         out << STRLIT("HTTP/1.1 ") << status << STRLIT("\r\n");
1994 kumpf          1.40          if (cimError != String::EMPTY)
1995                              {
1996 mike           1.126             out << STRLIT("CIMError: ") << cimError << STRLIT("\r\n");
1997 kumpf          1.40          }
1998 kumpf          1.41          if (errorDetail != String::EMPTY)
1999 kumpf          1.40          {
2000 mike           1.126             out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
2001                                      << encodeURICharacters(errorDetail) << STRLIT("\r\n");
2002 kumpf          1.40          }
2003 mike           1.126         out << STRLIT("\r\n");
2004 kumpf          1.40      }
2005                          
2006                          //------------------------------------------------------------------------------
2007                          //
2008 kumpf          1.27      // appendUnauthorizedResponseHeader()
2009                          //
2010                          //     Build HTTP authentication response header for unauthorized requests.
2011                          //
2012                          //     Returns unauthorized message in the following format:
2013                          //
2014                          //        HTTP/1.1 401 Unauthorized
2015 karl           1.169.4.6 //        PGErrorDetail: <error text>    (if specified by caller)
2016 s.kodali       1.161     //        WWW-Authenticate: Basic realm="HostName"
2017 kumpf          1.27      //        <HTML><HEAD>
2018                          //        <TITLE>401 Unauthorized</TITLE>
2019                          //        </HEAD><BODY BGCOLOR="#99cc99">
2020                          //        <H2>TEST401 Unauthorized</H2>
2021                          //        <HR>
2022                          //        </BODY></HTML>
2023                          //
2024                          //------------------------------------------------------------------------------
2025                          
2026                          void XmlWriter::appendUnauthorizedResponseHeader(
2027 mike           1.125         Buffer& out,
2028 karl           1.169.4.6     const String& errorDetail,
2029 kumpf          1.27          const String& content)
2030                          {
2031 mike           1.126         out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n");
2032 karl           1.169.4.6     if (errorDetail.size() > 0)
2033                              {
2034                                  out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
2035                                      << encodeURICharacters(errorDetail) << STRLIT("\r\n");
2036                              }
2037                          
2038 kumpf          1.157         OUTPUT_CONTENTLENGTH(out, 0);
2039 thilo.boehm    1.162         out << content << STRLIT("\r\n\r\n");
2040 kumpf          1.27      
2041                          //ATTN: We may need to include the following line, so that the browsers
2042                          //      can display the error message.
2043                          //    out << "<HTML><HEAD>\r\n";
2044                          //    out << "<TITLE>" << "401 Unauthorized" <<  "</TITLE>\r\n";
2045                          //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
2046                          //    out << "<H2>TEST" << "401 Unauthorized" << "</H2>\r\n";
2047                          //    out << "<HR>\r\n";
2048                          //    out << "</BODY></HTML>\r\n";
2049                          }
2050                          
2051 gerarda        1.90      #ifdef PEGASUS_KERBEROS_AUTHENTICATION
2052                          //------------------------------------------------------------------------------
2053                          //
2054                          // appendOKResponseHeader()
2055                          //
2056                          //     Build HTTP authentication response header for unauthorized requests.
2057                          //
2058                          //     Returns OK message in the following format:
2059                          //
2060                          //        HTTP/1.1 200 OK
2061 gerarda        1.101     //        Content-Length: 0
2062 gerarda        1.90      //        WWW-Authenticate: Negotiate "token"
2063                          //        <HTML><HEAD>
2064                          //        <TITLE>200 OK</TITLE>
2065                          //        </HEAD><BODY BGCOLOR="#99cc99">
2066                          //        <H2>TEST200 OK</H2>
2067                          //        <HR>
2068                          //        </BODY></HTML>
2069                          //
2070                          //------------------------------------------------------------------------------
2071                          
2072                          void XmlWriter::appendOKResponseHeader(
2073 mike           1.125         Buffer& out,
2074 gerarda        1.90          const String& content)
2075                          {
2076 mike           1.126         out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
2077 gerarda        1.101         // Content-Length header needs to be added because 200 OK record
2078                              // is usually intended to have content.  But, for Kerberos this
2079                              // may not always be the case so we need to indicate that there
2080                              // is no content
2081 kumpf          1.157         OUTPUT_CONTENTLENGTH(out, 0);
2082 thilo.boehm    1.162         out << content << STRLIT("\r\n\r\n");
2083 gerarda        1.90      
2084                          //ATTN: We may need to include the following line, so that the browsers
2085                          //      can display the error message.
2086                          //    out << "<HTML><HEAD>\r\n";
2087                          //    out << "<TITLE>" << "200 OK" <<  "</TITLE>\r\n";
2088                          //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
2089                          //    out << "<H2>TEST" << "200 OK" << "</H2>\r\n";
2090                          //    out << "<HR>\r\n";
2091                          //    out << "</BODY></HTML>\r\n";
2092                          }
2093                          #endif
2094                          
2095 kumpf          1.27      //------------------------------------------------------------------------------
2096                          //
2097 kumpf          1.29      // _appendMessageElementBegin()
2098                          // _appendMessageElementEnd()
2099 mike           1.23      //
2100                          //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
2101                          //     <!ATTLIST MESSAGE
2102                          //         ID CDATA #REQUIRED
2103                          //         PROTOCOLVERSION CDATA #REQUIRED>
2104                          //
2105                          //------------------------------------------------------------------------------
2106                          
2107 kumpf          1.29      void XmlWriter::_appendMessageElementBegin(
2108 mike           1.125         Buffer& out,
2109 kumpf          1.27          const String& messageId)
2110 mike           1.23      {
2111 kumpf          1.167         out << STRLIT("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
2112                                            "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n"
2113 thilo.boehm    1.162                       "<MESSAGE ID=\"") << messageId;
2114 mike           1.126         out << STRLIT("\" PROTOCOLVERSION=\"1.0\">\n");
2115 kumpf          1.27      }
2116                          
2117 kumpf          1.29      void XmlWriter::_appendMessageElementEnd(
2118 mike           1.125         Buffer& out)
2119 kumpf          1.27      {
2120 thilo.boehm    1.162         out << STRLIT("</MESSAGE>\n</CIM>\n");
2121 mike           1.23      }
2122                          
2123                          //------------------------------------------------------------------------------
2124                          //
2125 kumpf          1.29      // _appendSimpleReqElementBegin()
2126                          // _appendSimpleReqElementEnd()
2127 mike           1.23      //
2128                          //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
2129                          //
2130                          //------------------------------------------------------------------------------
2131                          
2132 kumpf          1.29      void XmlWriter::_appendSimpleReqElementBegin(
2133 mike           1.125         Buffer& out)
2134 kumpf          1.27      {
2135 mike           1.126         out << STRLIT("<SIMPLEREQ>\n");
2136 kumpf          1.27      }
2137                          
2138 kumpf          1.29      void XmlWriter::_appendSimpleReqElementEnd(
2139 mike           1.125         Buffer& out)
2140 mike           1.23      {
2141 mike           1.126         out << STRLIT("</SIMPLEREQ>\n");
2142 mike           1.23      }
2143                          
2144                          //------------------------------------------------------------------------------
2145                          //
2146 kumpf          1.29      // _appendMethodCallElementBegin()
2147                          // _appendMethodCallElementEnd()
2148 mike           1.23      //
2149 kumpf          1.27      //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)>
2150                          //     <!ATTLIST METHODCALL %CIMName;>
2151 mike           1.23      //
2152                          //------------------------------------------------------------------------------
2153                          
2154 kumpf          1.29      void XmlWriter::_appendMethodCallElementBegin(
2155 mike           1.125         Buffer& out,
2156 kumpf          1.80          const CIMName& name)
2157 kumpf          1.27      {
2158 mike           1.126         out << STRLIT("<METHODCALL NAME=\"") << name << STRLIT("\">\n");
2159 kumpf          1.27      }
2160                          
2161 kumpf          1.29      void XmlWriter::_appendMethodCallElementEnd(
2162 mike           1.125         Buffer& out)
2163 mike           1.23      {
2164 mike           1.126         out << STRLIT("</METHODCALL>\n");
2165 mike           1.23      }
2166                          
2167                          //------------------------------------------------------------------------------
2168                          //
2169 kumpf          1.29      // _appendIMethodCallElementBegin()
2170                          // _appendIMethodCallElementEnd()
2171 mike           1.23      //
2172                          //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
2173                          //     <!ATTLIST IMETHODCALL %CIMName;>
2174                          //
2175                          //------------------------------------------------------------------------------
2176                          
2177 kumpf          1.29      void XmlWriter::_appendIMethodCallElementBegin(
2178 mike           1.125         Buffer& out,
2179 kumpf          1.80          const CIMName& name)
2180 mike           1.23      {
2181 mike           1.126         out << STRLIT("<IMETHODCALL NAME=\"") << name << STRLIT("\">\n");
2182 kumpf          1.27      }
2183                          
2184 kumpf          1.29      void XmlWriter::_appendIMethodCallElementEnd(
2185 mike           1.125         Buffer& out)
2186 kumpf          1.27      {
2187 mike           1.126         out << STRLIT("</IMETHODCALL>\n");
2188 mike           1.23      }
2189                          
2190                          //------------------------------------------------------------------------------
2191                          //
2192 kumpf          1.29      // _appendIParamValueElementBegin()
2193                          // _appendIParamValueElementEnd()
2194 mike           1.23      //
2195 kumpf          1.27      //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
2196                          //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
2197                          //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
2198                          //     <!ATTLIST IPARAMVALUE %CIMName;>
2199 mike           1.23      //
2200                          //------------------------------------------------------------------------------
2201                          
2202 kumpf          1.29      void XmlWriter::_appendIParamValueElementBegin(
2203 mike           1.125         Buffer& out,
2204 kumpf          1.27          const char* name)
2205                          {
2206 mike           1.126         out << STRLIT("<IPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
2207 kumpf          1.27      }
2208                          
2209 kumpf          1.29      void XmlWriter::_appendIParamValueElementEnd(
2210 mike           1.125         Buffer& out)
2211 mike           1.23      {
2212 mike           1.126         out << STRLIT("</IPARAMVALUE>\n");
2213 mike           1.23      }
2214                          
2215 karl           1.169.4.3 //EXP_PULL_BEGIN
2216 mike           1.23      //------------------------------------------------------------------------------
2217                          //
2218 karl           1.169.4.1 // _appendParamValueElementBegin()
2219                          // _appendParamValueElementEnd()
2220                          //
2221                          //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
2222                          //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
2223                          //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
2224                          //     <!ATTLIST IPARAMVALUE %CIMName;>
2225                          //
2226                          //------------------------------------------------------------------------------
2227                          
2228                          void XmlWriter::_appendParamValueElementBegin(
2229                              Buffer& out,
2230                              const char* name)
2231                          {
2232                              out << STRLIT("<PARAMVALUE NAME=\"") << name << STRLIT("\">\n");
2233                          }
2234                          
2235                          void XmlWriter::_appendParamValueElementEnd(
2236                              Buffer& out)
2237                          {
2238                              out << STRLIT("</PARAMVALUE>\n");
2239 karl           1.169.4.1 }
2240 karl           1.169.4.3 //EXP_PULL_END
2241 karl           1.169.4.4 
2242 karl           1.169.4.1 //------------------------------------------------------------------------------
2243                          //
2244 kumpf          1.29      // _appendSimpleRspElementBegin()
2245                          // _appendSimpleRspElementEnd()
2246 mike           1.23      //
2247 kumpf          1.27      //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
2248 mike           1.23      //
2249                          //------------------------------------------------------------------------------
2250                          
2251 kumpf          1.29      void XmlWriter::_appendSimpleRspElementBegin(
2252 mike           1.125         Buffer& out)
2253 kumpf          1.27      {
2254 mike           1.126         out << STRLIT("<SIMPLERSP>\n");
2255 kumpf          1.27      }
2256                          
2257 kumpf          1.29      void XmlWriter::_appendSimpleRspElementEnd(
2258 mike           1.125         Buffer& out)
2259 mike           1.23      {
2260 mike           1.126         out << STRLIT("</SIMPLERSP>\n");
2261 mike           1.23      }
2262                          
2263                          //------------------------------------------------------------------------------
2264                          //
2265 kumpf          1.29      // _appendMethodResponseElementBegin()
2266                          // _appendMethodResponseElementEnd()
2267 mike           1.23      //
2268 kumpf          1.27      //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>
2269                          //     <!ATTLIST METHODRESPONSE %CIMName;>
2270 mike           1.23      //
2271                          //------------------------------------------------------------------------------
2272                          
2273 kumpf          1.29      void XmlWriter::_appendMethodResponseElementBegin(
2274 mike           1.125         Buffer& out,
2275 kumpf          1.80          const CIMName& name)
2276 kumpf          1.27      {
2277 mike           1.126         out << STRLIT("<METHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
2278 kumpf          1.27      }
2279                          
2280 kumpf          1.29      void XmlWriter::_appendMethodResponseElementEnd(
2281 mike           1.125         Buffer& out)
2282 mike           1.23      {
2283 mike           1.126         out << STRLIT("</METHODRESPONSE>\n");
2284 kumpf          1.27      }
2285                          
2286                          //------------------------------------------------------------------------------
2287                          //
2288 kumpf          1.29      // _appendIMethodResponseElementBegin()
2289                          // _appendIMethodResponseElementEnd()
2290 kumpf          1.27      //
2291                          //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
2292                          //     <!ATTLIST IMETHODRESPONSE %CIMName;>
2293                          //
2294                          //------------------------------------------------------------------------------
2295                          
2296 kumpf          1.29      void XmlWriter::_appendIMethodResponseElementBegin(
2297 mike           1.125         Buffer& out,
2298 kumpf          1.80          const CIMName& name)
2299 kumpf          1.27      {
2300 mike           1.126         out << STRLIT("<IMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
2301 kumpf          1.27      }
2302                          
2303 kumpf          1.29      void XmlWriter::_appendIMethodResponseElementEnd(
2304 mike           1.125         Buffer& out)
2305 kumpf          1.27      {
2306 mike           1.126         out << STRLIT("</IMETHODRESPONSE>\n");
2307 mike           1.23      }
2308                          
2309                          //------------------------------------------------------------------------------
2310                          //
2311 kumpf          1.29      // _appendErrorElement()
2312 mike           1.23      //
2313                          //------------------------------------------------------------------------------
2314                          
2315 kumpf          1.29      void XmlWriter::_appendErrorElement(
2316 mike           1.125         Buffer& out,
2317 kumpf          1.42          const CIMException& cimException)
2318 mike           1.23      {
2319 thilo.boehm    1.163         Tracer::traceCIMException(TRC_XML, Tracer::LEVEL2, cimException);
2320 kumpf          1.44      
2321 thilo.boehm    1.162         out << STRLIT("<ERROR CODE=\"") << Uint32(cimException.getCode());
2322 karl           1.145         out.append('"');
2323 karl           1.142     
2324 kumpf          1.71          String description = TraceableCIMException(cimException).getDescription();
2325 karl           1.145     
2326 kumpf          1.51          if (description != String::EMPTY)
2327 kumpf          1.42          {
2328 mike           1.126             out << STRLIT(" DESCRIPTION=\"");
2329 kumpf          1.51              appendSpecial(out, description);
2330 kumpf          1.146             out.append('"');
2331 kumpf          1.42          }
2332 karl           1.142     
2333 karl           1.145         if (cimException.getErrorCount())
2334 karl           1.142         {
2335 karl           1.145             out << STRLIT(">");
2336                          
2337                                  for (Uint32 i = 0, n = cimException.getErrorCount(); i < n; i++)
2338                                      appendInstanceElement(out, cimException.getError(i));
2339                          
2340                                  out << STRLIT("</ERROR>");
2341 karl           1.142         }
2342 karl           1.145         else
2343                                  out << STRLIT("/>");
2344 mike           1.23      }
2345                          
2346 kumpf          1.157     //----------------------------------------------------------------------
2347                          //
2348                          // appendParamTypeAndEmbeddedObjAttrib
2349                          // Appends the Param type and EmbeddedObject Info to the buffer
2350                          //     %EmbeddedObject; #IMPLIED
2351                          //     %ParamType;>
2352                          //
2353 karl           1.154     //---------------------------------------------------------------------
2354 kumpf          1.157     
2355 karl           1.154     void XmlWriter::appendParamTypeAndEmbeddedObjAttrib(
2356 mike           1.125         Buffer& out,
2357 karl           1.154         const CIMType& type)
2358 kumpf          1.27      {
2359                          
2360 david.dillard  1.121         // If the property type is CIMObject, then
2361 karl           1.154         //   encode the property in CIM-XML as a string with the EmbeddedObject
2362                              //   attribute (there is not currently a CIM-XML "object"
2363                              //   datatype).
2364                              //   Because of an error in Pegasus we were earlier outputting
2365                              //   upper case "EMBEDDEDOBJECT" as the attribute name. The
2366                              //   spec calls for mixed case "EmbeddedObject. Fixed in
2367                              //   bug 7131 to output EmbeddedObject  attribute in upper
2368                              //   case and mixed case. Receiver will ignore one or the
2369                              //   other.
2370                              //else
2371                              //      output the real type
2372 dave.sudlik    1.117         if (type == CIMTYPE_OBJECT)
2373                              {
2374 karl           1.154     
2375 kumpf          1.167             out << STRLIT(" PARAMTYPE=\"string\""
2376                                                " EmbeddedObject=\"object\""
2377 thilo.boehm    1.162                           " EMBEDDEDOBJECT=\"object\"");
2378 dave.sudlik    1.117         }
2379 a.dunfey       1.137         else if (type == CIMTYPE_INSTANCE)
2380                              {
2381 thilo.boehm    1.162             out << STRLIT(" PARAMTYPE=\"string\""
2382 kumpf          1.167                           " EmbeddedObject=\"instance\""
2383 thilo.boehm    1.162                           " EMBEDDEDOBJECT=\"instance\"");
2384 a.dunfey       1.137         }
2385 dave.sudlik    1.117         else
2386                              {
2387 thilo.boehm    1.169             out << STRLIT(" PARAM") << xmlWriterTypeStrings(type);
2388 dave.sudlik    1.117         }
2389 karl           1.154     }
2390                          
2391                          //------------------------------------------------------------------------------
2392                          //
2393                          // appendReturnValueElement()
2394                          //
2395                          // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
2396                          // <!ATTLIST RETURNVALUE
2397                          //     %EmbeddedObject; #IMPLIED
2398                          //     %ParamType;>
2399                          //
2400                          //------------------------------------------------------------------------------
2401                          
2402                          void XmlWriter::appendReturnValueElement(
2403                              Buffer& out,
2404                              const CIMValue& value)
2405                          {
2406                              out << STRLIT("<RETURNVALUE");
2407                          
2408                              CIMType type = value.getType();
2409                          
2410 karl           1.154         appendParamTypeAndEmbeddedObjAttrib(out, type);
2411 kumpf          1.27      
2412 mike           1.126         out << STRLIT(">\n");
2413 karl           1.37      
2414 kumpf          1.54          // Add value.
2415                              appendValueElement(out, value);
2416 mike           1.126         out << STRLIT("</RETURNVALUE>\n");
2417 kumpf          1.27      }
2418                          
2419                          //------------------------------------------------------------------------------
2420                          //
2421 kumpf          1.29      // _appendIReturnValueElementBegin()
2422                          // _appendIReturnValueElementEnd()
2423 kumpf          1.27      //
2424                          //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|
2425                          //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|
2426                          //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|
2427                          //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>
2428                          //
2429                          //------------------------------------------------------------------------------
2430                          
2431 kumpf          1.29      void XmlWriter::_appendIReturnValueElementBegin(
2432 mike           1.125         Buffer& out)
2433 kumpf          1.27      {
2434 mike           1.126         out << STRLIT("<IRETURNVALUE>\n");
2435 kumpf          1.27      }
2436                          
2437 kumpf          1.29      void XmlWriter::_appendIReturnValueElementEnd(
2438 mike           1.125         Buffer& out)
2439 mike           1.23      {
2440 mike           1.126         out << STRLIT("</IRETURNVALUE>\n");
2441 mike           1.23      }
2442                          
2443 karl           1.169.4.1 //EXP_PULL_BEGIN
2444                          void XmlWriter::_appendIReturnValueElementWithNameBegin(
2445                              Buffer& out,
2446                              const char* name)
2447                          {
2448                              out << STRLIT("<IRETURNVALUE NAME=\"") << name << STRLIT("\">\n");
2449                          }
2450                          //EXP_PULL_END
2451                          
2452 mike           1.23      //------------------------------------------------------------------------------
2453                          //
2454 kumpf          1.27      // appendBooleanIParameter()
2455 mike           1.23      //
2456                          //------------------------------------------------------------------------------
2457                          
2458 kumpf          1.27      void XmlWriter::appendBooleanIParameter(
2459 mike           1.125         Buffer& out,
2460 mike           1.23          const char* name,
2461 kumpf          1.27          Boolean flag)
2462 mike           1.23      {
2463 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2464 mike           1.126         out << STRLIT("<VALUE>");
2465 kumpf          1.54          append(out, flag);
2466 mike           1.126         out << STRLIT("</VALUE>\n");
2467 kumpf          1.29          _appendIParamValueElementEnd(out);
2468 mike           1.23      }
2469                          
2470 karl           1.169.4.1 //EXP_PULL_BEGIN
2471                          void XmlWriter::appendBooleanParameter(
2472                              Buffer& out,
2473                              const char* name,
2474                              Boolean flag)
2475                          {
2476                              _appendParamValueElementBegin(out, name);
2477                              out << STRLIT("<VALUE>");
2478                              append(out, flag);
2479                              out << STRLIT("</VALUE>\n");
2480                              _appendParamValueElementEnd(out);
2481                          }
2482                          
2483                          void XmlWriter::appendBooleanIReturnValue(
2484                              Buffer& out,
2485                              const char* name,
2486                              Boolean flag)
2487                          {
2488                              _appendIReturnValueElementWithNameBegin(out, name);
2489                              out << STRLIT("<VALUE>");
2490                              append(out, flag);
2491 karl           1.169.4.1     out << STRLIT("</VALUE>\n");
2492                              _appendIReturnValueElementEnd(out);
2493                          }
2494 karl           1.169.4.5 void XmlWriter::appendUint32IParameter(
2495                              Buffer& out,
2496                              const char* name,
2497                              Uint32 val)
2498                          {
2499                              _appendIParamValueElementBegin(out, name);
2500                              out << STRLIT("<VALUE>");
2501                              append(out, val);
2502                              out << STRLIT("</VALUE>\n");
2503                              _appendIParamValueElementEnd(out);
2504                          }
2505 karl           1.169.4.1 
2506                          // Can be used to generate either parameters with value,
2507                          // parameters with NULL (i.e. no value element) or
2508                          // no parameters output at all.
2509 karl           1.169.4.5 void XmlWriter::appendUint32ArgIParameter(
2510 karl           1.169.4.1     Buffer& out,
2511                              const char* name,
2512                              const Uint32Arg& val,
2513                              const Boolean required)
2514                          {
2515                              if (!required && val.isNull())
2516                              {
2517                                  return;
2518                              }
2519                          
2520                              _appendIParamValueElementBegin(out, name);
2521                              if (!val.isNull())
2522                              {
2523                                  out << STRLIT("<VALUE>");
2524                                  append(out, val.getValue());
2525                                  out << STRLIT("</VALUE>\n");
2526                              }
2527                              _appendIParamValueElementEnd(out);
2528                          }
2529                          
2530                          /* Output return value from Uint64Arg object as
2531 karl           1.169.4.1    Value inside IRETURNVALUE
2532                             If the state of the object is NULL output
2533                             the parameter without value.  Else
2534                             output the value
2535                          */
2536                          void XmlWriter::appendUint64ReturnValue(
2537                              Buffer& out,
2538                              const char* name,
2539                              const Uint64Arg& val)
2540                          {
2541                              _appendIReturnValueElementBegin(out);
2542                              out << STRLIT("<VALUE>");
2543                              if (!val.isNull())
2544                              {
2545                                  append(out, val.getValue());
2546                              }
2547                              out << STRLIT("</VALUE>\n");
2548                              _appendIReturnValueElementEnd(out);
2549                          }
2550                          //EXP_PULL_END
2551                          
2552 mike           1.23      //------------------------------------------------------------------------------
2553                          //
2554 kumpf          1.27      // appendStringIParameter()
2555 mike           1.23      //
2556                          //------------------------------------------------------------------------------
2557                          
2558 kumpf          1.27      void XmlWriter::appendStringIParameter(
2559 mike           1.125         Buffer& out,
2560 mike           1.23          const char* name,
2561 kumpf          1.27          const String& str)
2562 mike           1.23      {
2563 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2564 mike           1.126         out << STRLIT("<VALUE>");
2565 kumpf          1.27          appendSpecial(out, str);
2566 mike           1.126         out << STRLIT("</VALUE>\n");
2567 kumpf          1.29          _appendIParamValueElementEnd(out);
2568 mike           1.23      }
2569                          
2570 karl           1.169.4.3 // EXP_PULL_BEGIN
2571 karl           1.169.4.1 //------------------------------------------------------------------------------
2572                          //
2573                          // appendStringIParameterIfNotEmpty()
2574                          //
2575                          //------------------------------------------------------------------------------
2576                          
2577                          void XmlWriter::appendStringIParameterIfNotEmpty(
2578                              Buffer& out,
2579                              const char* name,
2580                              const String& str)
2581                          {
2582                              if (str != String::EMPTY)
2583                              {
2584                                  appendStringIParameter(out,name,str);
2585                              }
2586 karl           1.169.4.5 }
2587 karl           1.169.4.1 
2588                          //------------------------------------------------------------------------------
2589                          //
2590                          // appendStringParameter()
2591                          //
2592                          //------------------------------------------------------------------------------
2593                          
2594                          void XmlWriter::appendStringParameter(
2595                              Buffer& out,
2596                              const char* name,
2597                              const String& str)
2598                          {
2599                              _appendParamValueElementBegin(out, name);
2600                              out << STRLIT("<VALUE>");
2601                              appendSpecial(out, str);
2602                              out << STRLIT("</VALUE>\n");
2603                              _appendParamValueElementEnd(out);
2604                          }
2605                          
2606                          //------------------------------------------------------------------------------
2607                          //
2608 karl           1.169.4.1 // appendStringIReturnValue()
2609                          //
2610                          //------------------------------------------------------------------------------
2611                          
2612                          void XmlWriter::appendStringIReturnValue(
2613                              Buffer& out,
2614                              const char* name,
2615                              const String& str)
2616                          {
2617                              _appendIReturnValueElementWithNameBegin(out, name);
2618                              out << STRLIT("<VALUE>");
2619                              appendSpecial(out, str);
2620                              out << STRLIT("</VALUE>\n");
2621                              _appendIReturnValueElementEnd(out);
2622                          }
2623                          //EXP_PULL_END
2624 mike           1.23      //------------------------------------------------------------------------------
2625                          //
2626 kumpf          1.27      // appendClassNameIParameter()
2627 mike           1.23      //
2628                          //------------------------------------------------------------------------------
2629                          
2630 kumpf          1.27      void XmlWriter::appendClassNameIParameter(
2631 mike           1.125         Buffer& out,
2632 kumpf          1.27          const char* name,
2633 kumpf          1.80          const CIMName& className)
2634 mike           1.23      {
2635 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2636 kumpf          1.83      
2637                              //
2638 david.dillard  1.121         //  A NULL (unassigned) value for a parameter is specified by an
2639 kumpf          1.83          //  <IPARAMVALUE> element with no subelement
2640                              //
2641                              if (!className.isNull ())
2642                              {
2643                                  appendClassNameElement(out, className);
2644                              }
2645                          
2646 kumpf          1.29          _appendIParamValueElementEnd(out);
2647 mike           1.23      }
2648                          
2649                          //------------------------------------------------------------------------------
2650                          //
2651 kumpf          1.27      // appendInstanceNameIParameter()
2652 mike           1.23      //
2653                          //------------------------------------------------------------------------------
2654                          
2655 kumpf          1.27      void XmlWriter::appendInstanceNameIParameter(
2656 mike           1.125         Buffer& out,
2657 kumpf          1.27          const char* name,
2658 kumpf          1.59          const CIMObjectPath& instanceName)
2659 mike           1.23      {
2660 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2661                              appendInstanceNameElement(out, instanceName);
2662                              _appendIParamValueElementEnd(out);
2663 kumpf          1.27      }
2664                          
2665                          //------------------------------------------------------------------------------
2666                          //
2667                          // appendClassIParameter()
2668                          //
2669                          //------------------------------------------------------------------------------
2670                          
2671                          void XmlWriter::appendClassIParameter(
2672 mike           1.125         Buffer& out,
2673 kumpf          1.27          const char* name,
2674                              const CIMConstClass& cimClass)
2675                          {
2676 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2677 kumpf          1.55          appendClassElement(out, cimClass);
2678 kumpf          1.29          _appendIParamValueElementEnd(out);
2679 mike           1.23      }
2680                          
2681                          //------------------------------------------------------------------------------
2682                          //
2683 kumpf          1.27      // appendInstanceIParameter()
2684 mike           1.23      //
2685                          //------------------------------------------------------------------------------
2686                          
2687 kumpf          1.27      void XmlWriter::appendInstanceIParameter(
2688 mike           1.125         Buffer& out,
2689 kumpf          1.27          const char* name,
2690 mike           1.23          const CIMConstInstance& instance)
2691                          {
2692 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2693 kumpf          1.55          appendInstanceElement(out, instance);
2694 kumpf          1.29          _appendIParamValueElementEnd(out);
2695 mike           1.23      }
2696                          
2697 mike           1.24      //------------------------------------------------------------------------------
2698                          //
2699 kumpf          1.27      // appendNamedInstanceIParameter()
2700 mike           1.24      //
2701                          //------------------------------------------------------------------------------
2702                          
2703 kumpf          1.27      void XmlWriter::appendNamedInstanceIParameter(
2704 mike           1.125         Buffer& out,
2705 kumpf          1.27          const char* name,
2706 kumpf          1.61          const CIMInstance& namedInstance)
2707 mike           1.24      {
2708 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2709 kumpf          1.56          appendValueNamedInstanceElement(out, namedInstance);
2710 kumpf          1.29          _appendIParamValueElementEnd(out);
2711 mike           1.24      }
2712                          
2713 mike           1.23      //----------------------------------------------------------
2714                          //
2715 kumpf          1.27      //  appendPropertyNameIParameter()
2716 david.dillard  1.121     //
2717 mike           1.23      //     </IPARAMVALUE>
2718                          //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>
2719                          //
2720                          //     USE: Create parameter for getProperty operation
2721 brian.campbell 1.113     //==========================================================
2722 kumpf          1.27      void XmlWriter::appendPropertyNameIParameter(
2723 mike           1.125         Buffer& out,
2724 kumpf          1.80          const CIMName& propertyName)
2725 mike           1.23      {
2726 kumpf          1.29          _appendIParamValueElementBegin(out, "PropertyName");
2727 mike           1.126         out << STRLIT("<VALUE>") << propertyName << STRLIT("</VALUE>\n");
2728 kumpf          1.29          _appendIParamValueElementEnd(out);
2729 kumpf          1.27      }
2730 mike           1.23      
2731                          //------------------------------------------------------------------------------
2732                          //
2733 kumpf          1.27      // appendPropertyValueIParameter()
2734 mike           1.24      //
2735                          //------------------------------------------------------------------------------
2736                          
2737 kumpf          1.27      void XmlWriter::appendPropertyValueIParameter(
2738 mike           1.125         Buffer& out,
2739 kumpf          1.27          const char* name,
2740 mike           1.24          const CIMValue& value)
2741                          {
2742 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2743 kumpf          1.54          appendValueElement(out, value);
2744 kumpf          1.29          _appendIParamValueElementEnd(out);
2745 mike           1.24      }
2746                          
2747                          //------------------------------------------------------------------------------
2748                          //
2749 kumpf          1.27      // appendPropertyListIParameter()
2750 mike           1.24      //
2751                          //------------------------------------------------------------------------------
2752                          
2753 kumpf          1.27      void XmlWriter::appendPropertyListIParameter(
2754 mike           1.125         Buffer& out,
2755 mike           1.24          const CIMPropertyList& propertyList)
2756                          {
2757 kumpf          1.29          _appendIParamValueElementBegin(out, "PropertyList");
2758 mike           1.24      
2759 kumpf          1.83          //
2760 david.dillard  1.121         //  A NULL (unassigned) value for a parameter is specified by an
2761 kumpf          1.83          //  <IPARAMVALUE> element with no subelement
2762                              //
2763                              if (!propertyList.isNull ())
2764 mike           1.24          {
2765 mike           1.126             out << STRLIT("<VALUE.ARRAY>\n");
2766 kumpf          1.83              for (Uint32 i = 0; i < propertyList.size(); i++)
2767                                  {
2768 mike           1.126                 out << STRLIT("<VALUE>") << propertyList[i] << STRLIT("</VALUE>\n");
2769 kumpf          1.83              }
2770 mike           1.126             out << STRLIT("</VALUE.ARRAY>\n");
2771 mike           1.24          }
2772 kumpf          1.27      
2773 kumpf          1.29          _appendIParamValueElementEnd(out);
2774 mike           1.24      }
2775                          
2776                          //------------------------------------------------------------------------------
2777                          //
2778 kumpf          1.27      // appendQualifierDeclarationIParameter()
2779 mike           1.23      //
2780                          //------------------------------------------------------------------------------
2781                          
2782 kumpf          1.27      void XmlWriter::appendQualifierDeclarationIParameter(
2783 mike           1.125         Buffer& out,
2784 kumpf          1.27          const char* name,
2785 mike           1.23          const CIMConstQualifierDecl& qualifierDecl)
2786                          {
2787 kumpf          1.29          _appendIParamValueElementBegin(out, name);
2788 kumpf          1.56          appendQualifierDeclElement(out, qualifierDecl);
2789 kumpf          1.29          _appendIParamValueElementEnd(out);
2790 kumpf          1.40      }
2791                          
2792                          //------------------------------------------------------------------------------
2793                          //
2794                          // XmlWriter::formatHttpErrorRspMessage()
2795                          //
2796                          //------------------------------------------------------------------------------
2797                          
2798 mike           1.125     Buffer XmlWriter::formatHttpErrorRspMessage(
2799 kumpf          1.40          const String& status,
2800                              const String& cimError,
2801 kumpf          1.41          const String& errorDetail)
2802 kumpf          1.40      {
2803 mike           1.125         Buffer out;
2804 kumpf          1.40      
2805 kumpf          1.41          appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
2806 kumpf          1.40      
2807 kumpf          1.41          return out;
2808 mike           1.23      }
2809                          
2810 chuck          1.89      // l10n - add content language support to the format methods below
2811                          
2812 mike           1.23      //------------------------------------------------------------------------------
2813                          //
2814 kumpf          1.27      // XmlWriter::formatSimpleMethodReqMessage()
2815 mike           1.23      //
2816                          //------------------------------------------------------------------------------
2817                          
2818 kumpf          1.27      // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
2819 mike           1.125     Buffer XmlWriter::formatSimpleMethodReqMessage(
2820 kumpf          1.27          const char* host,
2821 kumpf          1.80          const CIMNamespaceName& nameSpace,
2822 kumpf          1.59          const CIMObjectPath& path,
2823 kumpf          1.80          const CIMName& methodName,
2824 kumpf          1.30          const Array<CIMParamValue>& parameters,
2825 kumpf          1.27          const String& messageId,
2826 kumpf          1.82          HttpMethod httpMethod,
2827 chuck          1.89          const String& authenticationHeader,
2828 kumpf          1.133         const AcceptLanguageList& httpAcceptLanguages,
2829 mike           1.164         const ContentLanguageList& httpContentLanguages,
2830                              bool binaryResponse)
2831 kumpf          1.27      {
2832 mike           1.125         Buffer out;
2833                              Buffer tmp;
2834 kumpf          1.59          CIMObjectPath localObjectPath = path;
2835 kumpf          1.80          localObjectPath.setNameSpace(nameSpace.getString());
2836 kumpf          1.77          localObjectPath.setHost(String::EMPTY);
2837 kumpf          1.27      
2838 kumpf          1.29          _appendMessageElementBegin(out, messageId);
2839                              _appendSimpleReqElementBegin(out);
2840                              _appendMethodCallElementBegin(out, methodName);
2841 kumpf          1.38          appendLocalObjectPathElement(out, localObjectPath);
2842 kumpf          1.30          for (Uint32 i=0; i < parameters.size(); i++)
2843 kumpf          1.29          {
2844 kumpf          1.56              appendParamValueElement(out, parameters[i]);
2845 kumpf          1.29          }
2846                              _appendMethodCallElementEnd(out);
2847                              _appendSimpleReqElementEnd(out);
2848                              _appendMessageElementEnd(out);
2849 kumpf          1.27      
2850                              appendMethodCallHeader(
2851 kumpf          1.146             tmp,
2852                                  host,
2853                                  methodName,
2854                                  localObjectPath.toString(),
2855 kumpf          1.27              authenticationHeader,
2856 kumpf          1.82              httpMethod,
2857 chuck          1.89              httpAcceptLanguages,
2858                                  httpContentLanguages,
2859 mike           1.164             out.size(),
2860                                  false,
2861                                  binaryResponse);
2862 kumpf          1.27          tmp << out;
2863                          
2864                              return tmp;
2865                          }
2866                          
2867 mike           1.125     Buffer XmlWriter::formatSimpleMethodRspMessage(
2868 w.white        1.108         const CIMName& methodName,
2869                              const String& messageId,
2870                              HttpMethod httpMethod,
2871 kumpf          1.133         const ContentLanguageList& httpContentLanguages,
2872 karl           1.169.4.1     const Buffer& bodyParams,
2873 mike           1.125         const Buffer& body,
2874 kumpf          1.146         Uint64 serverResponseTime,
2875                              Boolean isFirst,
2876                              Boolean isLast)
2877                          {
2878                              Buffer out;
2879                          
2880                              if (isFirst == true)
2881                              {
2882                                  // NOTE: temporarily put zero for content length. the http code
2883                                  // will later decide to fill in the length or remove it altogether
2884                                  appendMethodResponseHeader(
2885                                      out, httpMethod, httpContentLanguages, 0, serverResponseTime);
2886                                  _appendMessageElementBegin(out, messageId);
2887                                  _appendSimpleRspElementBegin(out);
2888                                  _appendMethodResponseElementBegin(out, methodName);
2889                              }
2890                          
2891                              if (body.size() != 0)
2892                              {
2893                                  out << body;
2894                              }
2895 kumpf          1.146     
2896                              if (isLast == true)
2897                              {
2898                                  _appendMethodResponseElementEnd(out);
2899                                  _appendSimpleRspElementEnd(out);
2900                                  _appendMessageElementEnd(out);
2901                              }
2902 david.dillard  1.121     
2903 kumpf          1.146         return out;
2904 w.white        1.108     }
2905                          
2906                          
2907 mike           1.23      //------------------------------------------------------------------------------
2908                          //
2909 kumpf          1.28      // XmlWriter::formatSimpleMethodErrorRspMessage()
2910                          //
2911                          //------------------------------------------------------------------------------
2912                          
2913 mike           1.125     Buffer XmlWriter::formatSimpleMethodErrorRspMessage(
2914 kumpf          1.80          const CIMName& methodName,
2915 kumpf          1.28          const String& messageId,
2916 kumpf          1.82          HttpMethod httpMethod,
2917 kumpf          1.42          const CIMException& cimException)
2918 kumpf          1.28      {
2919 mike           1.125         Buffer out;
2920                              Buffer tmp;
2921 kumpf          1.28      
2922 kumpf          1.29          _appendMessageElementBegin(out, messageId);
2923                              _appendSimpleRspElementBegin(out);
2924 kumpf          1.80          _appendMethodResponseElementBegin(out, methodName);
2925 kumpf          1.42          _appendErrorElement(out, cimException);
2926 kumpf          1.29          _appendMethodResponseElementEnd(out);
2927                              _appendSimpleRspElementEnd(out);
2928                              _appendMessageElementEnd(out);
2929 kumpf          1.28      
2930 kumpf          1.146         appendMethodResponseHeader(
2931                                  tmp,
2932                                  httpMethod,
2933                                  cimException.getContentLanguages(),
2934 mike           1.164             out.size(),
2935                                  false);
2936 kumpf          1.28          tmp << out;
2937                          
2938                              return tmp;
2939                          }
2940                          
2941                          //------------------------------------------------------------------------------
2942                          //
2943 kumpf          1.27      // XmlWriter::formatSimpleIMethodReqMessage()
2944 mike           1.23      //
2945                          //------------------------------------------------------------------------------
2946                          
2947 mike           1.125     Buffer XmlWriter::formatSimpleIMethodReqMessage(
2948 kumpf          1.27          const char* host,
2949 kumpf          1.80          const CIMNamespaceName& nameSpace,
2950                              const CIMName& iMethodName,
2951 kumpf          1.27          const String& messageId,
2952 kumpf          1.82          HttpMethod httpMethod,
2953 kumpf          1.27          const String& authenticationHeader,
2954 kumpf          1.133         const AcceptLanguageList& httpAcceptLanguages,
2955                              const ContentLanguageList& httpContentLanguages,
2956 mike           1.164         const Buffer& body,
2957                              bool binaryResponse)
2958 mike           1.23      {
2959 mike           1.125         Buffer out;
2960                              Buffer tmp;
2961 kumpf          1.27      
2962 kumpf          1.29          _appendMessageElementBegin(out, messageId);
2963                              _appendSimpleReqElementBegin(out);
2964                              _appendIMethodCallElementBegin(out, iMethodName);
2965 kumpf          1.80          appendLocalNameSpacePathElement(out, nameSpace.getString());
2966 kumpf          1.27          out << body;
2967 kumpf          1.29          _appendIMethodCallElementEnd(out);
2968                              _appendSimpleReqElementEnd(out);
2969                              _appendMessageElementEnd(out);
2970 kumpf          1.27      
2971                              appendMethodCallHeader(
2972 kumpf          1.146             tmp,
2973                                  host,
2974                                  iMethodName,
2975                                  nameSpace.getString(),
2976 kumpf          1.27              authenticationHeader,
2977 kumpf          1.82              httpMethod,
2978 chuck          1.89              httpAcceptLanguages,
2979                                  httpContentLanguages,
2980 kumpf          1.167             out.size(),
2981 mike           1.164             false,
2982                                  binaryResponse);
2983 kumpf          1.27          tmp << out;
2984 mike           1.23      
2985 kumpf          1.27          return tmp;
2986 mike           1.23      }
2987                          
2988                          //------------------------------------------------------------------------------
2989                          //
2990 kumpf          1.27      // XmlWriter::formatSimpleIMethodRspMessage()
2991 mike           1.23      //
2992                          //------------------------------------------------------------------------------
2993                          
2994 karl           1.169.4.1 /*
2995 karl           1.169.4.4     Formats a IMethod Response Message.  This function formats
2996 karl           1.169.4.1     messages for chunking based on the isFirst and isLast parameters.
2997                              If isFirst is set, it outputs headers and ResponseElement begin.
2998                              It always sends the body.  If isLast is set,  it sends the rtnParams
2999                              and the ResponseElement end followed by any parameter in the rtnParams.
3000                              KS_PULL_TBD_TODO - Determine what we want to do with chunking. Since this
3001                              This whole thing is based on the concept of each message sending a  single
3002                              chunk and we will want in the future to modify so we can chose easily
3003                              whether we want to chunk or not and send the chunks.
3004                          */
3005 mike           1.125     Buffer XmlWriter::formatSimpleIMethodRspMessage(
3006 kumpf          1.80          const CIMName& iMethodName,
3007 kumpf          1.27          const String& messageId,
3008 kumpf          1.82          HttpMethod httpMethod,
3009 kumpf          1.133         const ContentLanguageList& httpContentLanguages,
3010 karl           1.169.4.1     const Buffer& rtnParams,
3011 mike           1.125         const Buffer& body,
3012 david.dillard  1.130         Uint64 serverResponseTime,
3013 david.dillard  1.121         Boolean isFirst,
3014                              Boolean isLast)
3015 mike           1.23      {
3016 mike           1.125         Buffer out;
3017 mike           1.23      
3018 kumpf          1.146         if (isFirst == true)
3019                              {
3020                                  // NOTE: temporarily put zero for content length. the http code
3021                                  // will later decide to fill in the length or remove it altogether
3022                                  appendMethodResponseHeader(
3023                                      out, httpMethod, httpContentLanguages, 0, serverResponseTime);
3024                                  _appendMessageElementBegin(out, messageId);
3025                                  _appendSimpleRspElementBegin(out);
3026                                  _appendIMethodResponseElementBegin(out, iMethodName);
3027                          
3028                                  // output the start of the return tag. Test if there is response data
3029                                  // by:
3030                                  // 1. there is data on the first chunk OR
3031                                  // 2. there is no data on the first chunk but isLast is false implying
3032                                  //    there is more non-empty data to come. If all subsequent chunks
3033                                  //    are empty, then this generates and empty response.
3034                                  if (body.size() != 0 || isLast == false)
3035                                      _appendIReturnValueElementBegin(out);
3036                              }
3037 w.white        1.108     
3038                              if (body.size() != 0)
3039                              {
3040 kumpf          1.146             out << body;
3041 w.white        1.108         }
3042                          
3043 kumpf          1.146         if (isLast == true)
3044                              {
3045                                  if (body.size() != 0 || isFirst == false)
3046                                      _appendIReturnValueElementEnd(out);
3047 karl           1.169.4.4 
3048 karl           1.169.4.9         // EXP_PULL_BEGIN
3049 karl           1.169.4.4         // Insert any return parameters.
3050 karl           1.169.4.1         if (rtnParams.size() != 0)
3051                                  {
3052                                      out << rtnParams;
3053                                  }
3054 karl           1.169.4.9         // EXP_PULL_END
3055 karl           1.169.4.4 
3056 kumpf          1.146             _appendIMethodResponseElementEnd(out);
3057                                  _appendSimpleRspElementEnd(out);
3058                                  _appendMessageElementEnd(out);
3059                              }
3060 w.white        1.108     
3061                              return out;
3062                          }
3063                          
3064                          
3065 kumpf          1.28      //------------------------------------------------------------------------------
3066                          //
3067                          // XmlWriter::formatSimpleIMethodErrorRspMessage()
3068                          //
3069                          //------------------------------------------------------------------------------
3070                          
3071 mike           1.125     Buffer XmlWriter::formatSimpleIMethodErrorRspMessage(
3072 kumpf          1.80          const CIMName& iMethodName,
3073 kumpf          1.28          const String& messageId,
3074 kumpf          1.82          HttpMethod httpMethod,
3075 kumpf          1.42          const CIMException& cimException)
3076 kumpf          1.28      {
3077 mike           1.125         Buffer out;
3078                              Buffer tmp;
3079 kumpf          1.28      
3080 kumpf          1.29          _appendMessageElementBegin(out, messageId);
3081                              _appendSimpleRspElementBegin(out);
3082 kumpf          1.80          _appendIMethodResponseElementBegin(out, iMethodName);
3083 kumpf          1.42          _appendErrorElement(out, cimException);
3084 kumpf          1.29          _appendIMethodResponseElementEnd(out);
3085                              _appendSimpleRspElementEnd(out);
3086                              _appendMessageElementEnd(out);
3087 kumpf          1.28      
3088 chuck          1.89          appendMethodResponseHeader(tmp,
3089 kumpf          1.146             httpMethod,
3090                                  cimException.getContentLanguages(),
3091 mike           1.164             out.size(), false);
3092 kumpf          1.28          tmp << out;
3093                          
3094                              return tmp;
3095                          }
3096                          
3097 kumpf          1.27      //******************************************************************************
3098                          //
3099                          // Export Messages (used for indications)
3100                          //
3101                          //******************************************************************************
3102 mike           1.23      
3103 kumpf          1.27      //------------------------------------------------------------------------------
3104                          //
3105                          // appendEMethodRequestHeader()
3106                          //
3107                          //     Build HTTP request header for export operation.
3108                          //
3109                          //------------------------------------------------------------------------------
3110 mike           1.23      
3111 kumpf          1.27      void XmlWriter::appendEMethodRequestHeader(
3112 mike           1.125         Buffer& out,
3113 kumpf          1.50          const char* requestUri,
3114 kumpf          1.27          const char* host,
3115 kumpf          1.80          const CIMName& cimMethod,
3116 kumpf          1.82          HttpMethod httpMethod,
3117 kumpf          1.27          const String& authenticationHeader,
3118 kumpf          1.133         const AcceptLanguageList& acceptLanguages,
3119                              const ContentLanguageList& contentLanguages,
3120 kumpf          1.27          Uint32 contentLength)
3121                          {
3122 karl           1.169.4.7     char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)), '\0' };
3123 mike           1.23      
3124 kumpf          1.82          if (httpMethod == HTTP_METHOD_M_POST)
3125                              {
3126 mike           1.126           out << STRLIT("M-POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
3127 kumpf          1.82          }
3128                              else
3129                              {
3130 mike           1.126           out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
3131 kumpf          1.82          }
3132 kumpf          1.167         out << STRLIT("HOST: ") << host << STRLIT("\r\n"
3133 karl           1.169.4.2                   "Content-Type: application/xml; charset=utf-8\r\n");
3134 kumpf          1.157         OUTPUT_CONTENTLENGTH(out, contentLength);
3135 brian.campbell 1.107     
3136 chuck          1.89          if (acceptLanguages.size() > 0)
3137                              {
3138 kumpf          1.146             out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
3139 chuck          1.89          }
3140                              if (contentLanguages.size() > 0)
3141                              {
3142 kumpf          1.146             out << STRLIT("Content-Language: ") << contentLanguages <<
3143                                      STRLIT("\r\n");
3144 david.dillard  1.121         }
3145 brian.campbell 1.107     
3146 brian.campbell 1.113     #ifdef PEGASUS_DEBUG
3147 kumpf          1.146         // backdoor environment variable to turn OFF client requesting transfer
3148                              // encoding. The default is on. to turn off, set this variable to zero.
3149                              // This should be removed when stable. This should only be turned off in
3150                              // a debugging/testing environment.
3151                          
3152                              static const char *clientTransferEncodingOff =
3153                                  getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
3154                              if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
3155 a.dunfey       1.110     #endif
3156 kumpf          1.146         out << STRLIT("TE: chunked, trailers\r\n");
3157 brian.campbell 1.107     
3158 kumpf          1.82          if (httpMethod == HTTP_METHOD_M_POST)
3159                              {
3160 kumpf          1.146             out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
3161 mike           1.126             out << nn << STRLIT("\r\n");
3162                                  out << nn << STRLIT("-CIMExport: MethodRequest\r\n");
3163 kumpf          1.146             out << nn << STRLIT("-CIMExportMethod: ") << cimMethod <<
3164                                      STRLIT("\r\n");
3165 kumpf          1.82          }
3166                              else
3167                              {
3168 kumpf          1.167             out << STRLIT("CIMExport: MethodRequest\r\n"
3169 thilo.boehm    1.162                           "CIMExportMethod: ") << cimMethod << STRLIT("\r\n");
3170 kumpf          1.82          }
3171                          
3172 kumpf          1.27          if (authenticationHeader.size())
3173                              {
3174 mike           1.126             out << authenticationHeader << STRLIT("\r\n");
3175 kumpf          1.27          }
3176 brian.campbell 1.107     
3177 mike           1.126         out << STRLIT("\r\n");
3178 kumpf          1.27      }
3179 mike           1.23      
3180 kumpf          1.27      //------------------------------------------------------------------------------
3181                          //
3182                          // appendEMethodResponseHeader()
3183                          //
3184                          //     Build HTTP response header for export operation.
3185                          //
3186                          //------------------------------------------------------------------------------
3187 mike           1.23      
3188 kumpf          1.27      void XmlWriter::appendEMethodResponseHeader(
3189 mike           1.125         Buffer& out,
3190 kumpf          1.82          HttpMethod httpMethod,
3191 kumpf          1.133         const ContentLanguageList& contentLanguages,
3192 kumpf          1.27          Uint32 contentLength)
3193                          {
3194 karl           1.169.4.7     char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)), '\0' };
3195 mike           1.23      
3196 kumpf          1.167         out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n"
3197 karl           1.169.4.2                   "Content-Type: application/xml; charset=utf-8\r\n");
3198 kumpf          1.157         OUTPUT_CONTENTLENGTH(out, contentLength);
3199 brian.campbell 1.107     
3200 chuck          1.89          if (contentLanguages.size() > 0)
3201                              {
3202 kumpf          1.146             out << STRLIT("Content-Language: ") << contentLanguages <<
3203                                      STRLIT("\r\n");
3204 david.dillard  1.121         }
3205 kumpf          1.82          if (httpMethod == HTTP_METHOD_M_POST)
3206                              {
3207 kumpf          1.167             out << STRLIT("Ext:\r\n"
3208                                                "Cache-Control: no-cache\r\n"
3209 thilo.boehm    1.162                           "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
3210 mike           1.126             out << nn << STRLIT("\r\n");
3211                                  out << nn << STRLIT("-CIMExport: MethodResponse\r\n\r\n");
3212 kumpf          1.82          }
3213                              else
3214                              {
3215 mike           1.126             out << STRLIT("CIMExport: MethodResponse\r\n\r\n");
3216 kumpf          1.82          }
3217 mike           1.23      }
3218                          
3219                          //------------------------------------------------------------------------------
3220                          //
3221 kumpf          1.29      // _appendSimpleExportReqElementBegin()
3222                          // _appendSimpleExportReqElementEnd()
3223 kumpf          1.27      //
3224                          //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)>
3225 mike           1.23      //
3226                          //------------------------------------------------------------------------------
3227                          
3228 kumpf          1.29      void XmlWriter::_appendSimpleExportReqElementBegin(
3229 mike           1.125         Buffer& out)
3230 mike           1.23      {
3231 mike           1.126         out << STRLIT("<SIMPLEEXPREQ>\n");
3232 kumpf          1.27      }
3233 mike           1.23      
3234 kumpf          1.29      void XmlWriter::_appendSimpleExportReqElementEnd(
3235 mike           1.125         Buffer& out)
3236 kumpf          1.27      {
3237 mike           1.126         out << STRLIT("</SIMPLEEXPREQ>\n");
3238 mike           1.23      }
3239                          
3240                          //------------------------------------------------------------------------------
3241                          //
3242 kumpf          1.29      // _appendEMethodCallElementBegin()
3243                          // _appendEMethodCallElementEnd()
3244 kumpf          1.27      //
3245                          //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)>
3246                          //     <!ATTLIST EXPMETHODCALL %CIMName;>
3247 mike           1.23      //
3248                          //------------------------------------------------------------------------------
3249                          
3250 kumpf          1.29      void XmlWriter::_appendEMethodCallElementBegin(
3251 mike           1.125         Buffer& out,
3252 kumpf          1.80          const CIMName& name)
3253 mike           1.23      {
3254 mike           1.126         out << STRLIT("<EXPMETHODCALL NAME=\"") << name << STRLIT("\">\n");
3255 mike           1.24      }
3256                          
3257 kumpf          1.29      void XmlWriter::_appendEMethodCallElementEnd(
3258 mike           1.125         Buffer& out)
3259 mike           1.24      {
3260 mike           1.126         out << STRLIT("</EXPMETHODCALL>\n");
3261 mike           1.24      }
3262                          
3263                          //------------------------------------------------------------------------------
3264                          //
3265 kumpf          1.85      // _appendEParamValueElementBegin()
3266                          // _appendEParamValueElementEnd()
3267                          //
3268 david.dillard  1.121     //     <!ELEMENT EXPPARAMVALUE (INSTANCE)>
3269                          //     <!ATTLIST EXPPARAMVALUE
3270 kumpf          1.85      //         %CIMName;>
3271                          //
3272                          //------------------------------------------------------------------------------
3273                          
3274                          void XmlWriter::_appendEParamValueElementBegin(
3275 mike           1.125         Buffer& out,
3276 kumpf          1.85          const char* name)
3277                          {
3278 mike           1.126         out << STRLIT("<EXPPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
3279 kumpf          1.85      }
3280                          
3281                          void XmlWriter::_appendEParamValueElementEnd(
3282 mike           1.125         Buffer& out)
3283 kumpf          1.85      {
3284 mike           1.126         out << STRLIT("</EXPPARAMVALUE>\n");
3285 kumpf          1.85      }
3286                          
3287                          //------------------------------------------------------------------------------
3288                          //
3289                          // appendInstanceEParameter()
3290                          //
3291                          //------------------------------------------------------------------------------
3292                          
3293                          void XmlWriter::appendInstanceEParameter(
3294 mike           1.125         Buffer& out,
3295 kumpf          1.85          const char* name,
3296                              const CIMInstance& instance)
3297                          {
3298                              _appendEParamValueElementBegin(out, name);
3299                              appendInstanceElement(out, instance);
3300                              _appendEParamValueElementEnd(out);
3301                          }
3302                          
3303                          //------------------------------------------------------------------------------
3304                          //
3305 kumpf          1.29      // _appendSimpleExportRspElementBegin()
3306                          // _appendSimpleExportRspElementEnd()
3307 mike           1.24      //
3308 kumpf          1.27      //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)>
3309 mike           1.24      //
3310                          //------------------------------------------------------------------------------
3311                          
3312 kumpf          1.29      void XmlWriter::_appendSimpleExportRspElementBegin(
3313 mike           1.125         Buffer& out)
3314 kumpf          1.27      {
3315 mike           1.126         out << STRLIT("<SIMPLEEXPRSP>\n");
3316 kumpf          1.27      }
3317                          
3318 kumpf          1.29      void XmlWriter::_appendSimpleExportRspElementEnd(
3319 mike           1.125         Buffer& out)
3320 mike           1.24      {
3321 mike           1.126         out << STRLIT("</SIMPLEEXPRSP>\n");
3322 mike           1.24      }
3323                          
3324                          //------------------------------------------------------------------------------
3325                          //
3326 kumpf          1.29      // _appendEMethodResponseElementBegin()
3327                          // _appendEMethodResponseElementEnd()
3328 mike           1.24      //
3329                          //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>
3330                          //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>
3331                          //
3332                          //------------------------------------------------------------------------------
3333                          
3334 kumpf          1.29      void XmlWriter::_appendEMethodResponseElementBegin(
3335 mike           1.125         Buffer& out,
3336 kumpf          1.80          const CIMName& name)
3337 mike           1.24      {
3338 mike           1.126         out << STRLIT("<EXPMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
3339 kumpf          1.27      }
3340                          
3341 kumpf          1.29      void XmlWriter::_appendEMethodResponseElementEnd(
3342 mike           1.125         Buffer& out)
3343 kumpf          1.27      {
3344 mike           1.126         out << STRLIT("</EXPMETHODRESPONSE>\n");
3345 mike           1.24      }
3346                          
3347                          //------------------------------------------------------------------------------
3348                          //
3349 kumpf          1.27      // XmlWriter::formatSimpleEMethodReqMessage()
3350 mike           1.24      //
3351                          //------------------------------------------------------------------------------
3352                          
3353 mike           1.125     Buffer XmlWriter::formatSimpleEMethodReqMessage(
3354 kumpf          1.50          const char* requestUri,
3355 kumpf          1.27          const char* host,
3356 kumpf          1.80          const CIMName& eMethodName,
3357 kumpf          1.27          const String& messageId,
3358 kumpf          1.82          HttpMethod httpMethod,
3359 kumpf          1.27          const String& authenticationHeader,
3360 kumpf          1.133         const AcceptLanguageList& httpAcceptLanguages,
3361                              const ContentLanguageList& httpContentLanguages,
3362 mike           1.125         const Buffer& body)
3363 mike           1.24      {
3364 mike           1.125         Buffer out;
3365                              Buffer tmp;
3366 kumpf          1.27      
3367 kumpf          1.29          _appendMessageElementBegin(out, messageId);
3368                              _appendSimpleExportReqElementBegin(out);
3369                              _appendEMethodCallElementBegin(out, eMethodName);
3370 kumpf          1.27          out << body;
3371 kumpf          1.29          _appendEMethodCallElementEnd(out);
3372                              _appendSimpleExportReqElementEnd(out);
3373                              _appendMessageElementEnd(out);
3374 kumpf          1.27      
3375                              appendEMethodRequestHeader(
3376                                  tmp,
3377 kumpf          1.50              requestUri,
3378 kumpf          1.27              host,
3379                                  eMethodName,
3380 kumpf          1.82              httpMethod,
3381 kumpf          1.27              authenticationHeader,
3382 chuck          1.89              httpAcceptLanguages,
3383                                  httpContentLanguages,
3384 kumpf          1.148             out.size());
3385 kumpf          1.27          tmp << out;
3386 mike           1.24      
3387 kumpf          1.50          return tmp;
3388 mike           1.24      }
3389                          
3390                          //------------------------------------------------------------------------------
3391                          //
3392 kumpf          1.27      // XmlWriter::formatSimpleEMethodRspMessage()
3393 mike           1.24      //
3394                          //------------------------------------------------------------------------------
3395                          
3396 mike           1.125     Buffer XmlWriter::formatSimpleEMethodRspMessage(
3397 kumpf          1.80          const CIMName& eMethodName,
3398 mike           1.24          const String& messageId,
3399 kumpf          1.82          HttpMethod httpMethod,
3400 kumpf          1.133         const ContentLanguageList& httpContentLanguages,
3401 mike           1.125         const Buffer& body)
3402 mike           1.24      {
3403 mike           1.125         Buffer out;
3404                              Buffer tmp;
3405 kumpf          1.27      
3406 kumpf          1.29          _appendMessageElementBegin(out, messageId);
3407                              _appendSimpleExportRspElementBegin(out);
3408                              _appendEMethodResponseElementBegin(out, eMethodName);
3409 kumpf          1.27          out << body;
3410 kumpf          1.29          _appendEMethodResponseElementEnd(out);
3411                              _appendSimpleExportRspElementEnd(out);
3412                              _appendMessageElementEnd(out);
3413 kumpf          1.28      
3414 david.dillard  1.121         appendEMethodResponseHeader(tmp,
3415 kumpf          1.146             httpMethod,
3416                                  httpContentLanguages,
3417 kumpf          1.148             out.size());
3418 kumpf          1.28          tmp << out;
3419                          
3420                              return tmp;
3421                          }
3422                          
3423                          //------------------------------------------------------------------------------
3424                          //
3425                          // XmlWriter::formatSimpleEMethodErrorRspMessage()
3426                          //
3427                          //------------------------------------------------------------------------------
3428                          
3429 mike           1.125     Buffer XmlWriter::formatSimpleEMethodErrorRspMessage(
3430 kumpf          1.80          const CIMName& eMethodName,
3431 kumpf          1.28          const String& messageId,
3432 kumpf          1.82          HttpMethod httpMethod,
3433 kumpf          1.42          const CIMException& cimException)
3434 kumpf          1.28      {
3435 mike           1.125         Buffer out;
3436                              Buffer tmp;
3437 kumpf          1.28      
3438 kumpf          1.29          _appendMessageElementBegin(out, messageId);
3439                              _appendSimpleExportRspElementBegin(out);
3440 kumpf          1.80          _appendEMethodResponseElementBegin(out, eMethodName);
3441 kumpf          1.42          _appendErrorElement(out, cimException);
3442 kumpf          1.29          _appendEMethodResponseElementEnd(out);
3443                              _appendSimpleExportRspElementEnd(out);
3444                              _appendMessageElementEnd(out);
3445 kumpf          1.27      
3446 kumpf          1.146         appendEMethodResponseHeader(
3447                                  tmp,
3448                                  httpMethod,
3449                                  cimException.getContentLanguages(),
3450 kumpf          1.148             out.size());
3451 kumpf          1.27          tmp << out;
3452                          
3453                              return tmp;
3454 mike           1.24      }
3455                          
3456                          //------------------------------------------------------------------------------
3457                          //
3458 kumpf          1.27      // XmlWriter::getNextMessageId()
3459 mike           1.24      //
3460                          //------------------------------------------------------------------------------
3461                          
3462 mike           1.139     static IDFactory _messageIDFactory(1000);
3463                          
3464 kumpf          1.27      String XmlWriter::getNextMessageId()
3465 mike           1.24      {
3466 marek          1.151         char scratchBuffer[22];
3467                              Uint32 n;
3468 kumpf          1.167         const char * startP = Uint32ToString(scratchBuffer,
3469 marek          1.151                                              _messageIDFactory.getID(),
3470                                                                   n);
3471                              return String(startP, n);
3472 kumpf          1.68      }
3473                          
3474                          //------------------------------------------------------------------------------
3475                          //
3476                          // XmlWriter::keyBindingTypeToString
3477                          //
3478                          //------------------------------------------------------------------------------
3479 thilo.boehm    1.162     const StrLit XmlWriter::keyBindingTypeToString (CIMKeyBinding::Type type)
3480 kumpf          1.68      {
3481                              switch (type)
3482                              {
3483 kumpf          1.79              case CIMKeyBinding::BOOLEAN:
3484 thilo.boehm    1.162                 return STRLIT("boolean");
3485 kumpf          1.68      
3486 kumpf          1.79              case CIMKeyBinding::STRING:
3487 thilo.boehm    1.162                 return STRLIT("string");
3488 kumpf          1.68      
3489 kumpf          1.79              case CIMKeyBinding::NUMERIC:
3490 thilo.boehm    1.162                 return STRLIT("numeric");
3491 kumpf          1.68      
3492 kumpf          1.79              case CIMKeyBinding::REFERENCE:
3493 kumpf          1.68              default:
3494 karl           1.169.4.5             PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);)
3495 kumpf          1.68          }
3496                          
3497 thilo.boehm    1.162         return STRLIT("unknown");
3498 mike           1.23      }
3499                          
3500                          PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2