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

   1 mike  1.23 //%/////////////////////////////////////////////////////////////////////////////
   2            //
   3 mike  1.24 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,
   4            // The Open Group, Tivoli Systems
   5 mike  1.23 //
   6            // Permission is hereby granted, free of charge, to any person obtaining a copy
   7            // of this software and associated documentation files (the "Software"), to 
   8            // deal in the Software without restriction, including without limitation the 
   9            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
  10            // sell copies of the Software, and to permit persons to whom the Software is
  11            // furnished to do so, subject to the following conditions:
  12            // 
  13            // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN 
  14            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  15            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  16            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
  17            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
  18            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
  19            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21            //
  22            //==============================================================================
  23            //
  24            // Author: Mike Brasher (mbrasher@bmc.com)
  25            //
  26 mike  1.24 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
  27            //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
  28            //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
  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 kumpf 1.28 #include "Destroyer.h"
  37 mike  1.23 #include "CIMClass.h"
  38 kumpf 1.55 #include "CIMClassRep.h"
  39 mike  1.23 #include "CIMInstance.h"
  40 kumpf 1.55 #include "CIMInstanceRep.h"
  41 kumpf 1.56 #include "CIMProperty.h"
  42            #include "CIMPropertyRep.h"
  43            #include "CIMMethod.h"
  44            #include "CIMMethodRep.h"
  45            #include "CIMParameter.h"
  46            #include "CIMParameterRep.h"
  47            #include "CIMParamValue.h"
  48            #include "CIMParamValueRep.h"
  49            #include "CIMQualifier.h"
  50            #include "CIMQualifierRep.h"
  51            #include "CIMQualifierDecl.h"
  52            #include "CIMQualifierDeclRep.h"
  53 kumpf 1.54 #include "CIMValue.h"
  54 mike  1.23 #include "XmlWriter.h"
  55            #include "XmlParser.h"
  56 kumpf 1.44 #include "Tracer.h"
  57 sage  1.49 #include <Pegasus/Common/StatisticalData.h>
  58 mike  1.23 
  59            PEGASUS_NAMESPACE_BEGIN
  60            
  61 kumpf 1.27 Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)
  62            {
  63                XmlWriter::append(out, x);
  64                return out;
  65            }
  66            
  67            Array<Sint8>& operator<<(Array<Sint8>& out, char x)
  68            {
  69                XmlWriter::append(out, x);
  70                return out;
  71            }
  72            
  73            Array<Sint8>& operator<<(Array<Sint8>& out, Char16 x)
  74            {
  75                XmlWriter::append(out, x);
  76                return out;
  77            }
  78            
  79            Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)
  80            {
  81                XmlWriter::append(out, x);
  82 kumpf 1.27     return out;
  83            }
  84            
  85            Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)
  86            {
  87                XmlWriter::append(out, x);
  88                return out;
  89            }
  90            
  91            Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)
  92            {
  93                out.appendArray(x);
  94                return out;
  95            }
  96            
  97            Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)
  98            {
  99                XmlWriter::append(out, x);
 100                return out;
 101            }
 102            
 103 kumpf 1.27 inline void _appendChar(Array<Sint8>& out, Char16 c)
 104 mike  1.23 {
 105                out.append(Sint8(c));
 106            }
 107            
 108 kumpf 1.27 inline void _appendSpecialChar(Array<Sint8>& out, Char16 c)
 109 mike  1.23 {
 110                // ATTN-B: Only UTF-8 handled for now.
 111            
 112                switch (c)
 113                {
 114            	case '&':
 115            	    out.append("&amp;", 5);
 116            	    break;
 117            
 118            	case '<':
 119            	    out.append("&lt;", 4);
 120            	    break;
 121            
 122            	case '>':
 123            	    out.append("&gt;", 4);
 124            	    break;
 125            
 126            	case '"':
 127            	    out.append("&quot;", 6);
 128            	    break;
 129            
 130 mike  1.23 	case '\'':
 131            	    out.append("&apos;", 6);
 132            	    break;
 133            
 134            	default:
 135            	    out.append(Sint8(c));
 136                }
 137            }
 138            
 139 kumpf 1.27 static inline void _appendSpecialChar(PEGASUS_STD(ostream)& os, char c)
 140            {
 141                switch (c)
 142                {
 143            	case '&':
 144            	    os << "&amp;";
 145            	    break;
 146            
 147            	case '<':
 148            	    os << "&lt;";
 149            	    break;
 150            
 151            	case '>':
 152            	    os << "&gt;";
 153            	    break;
 154            
 155            	case '"':
 156            	    os << "&quot;";
 157            	    break;
 158            
 159            	case '\'':
 160 kumpf 1.27 	    os << "&apos;";
 161            	    break;
 162            
 163            	default:
 164            	    os << c;
 165                }
 166            }
 167            
 168            static inline void _appendSpecial(PEGASUS_STD(ostream)& os, const char* str)
 169            {
 170                while (*str)
 171            	_appendSpecialChar(os, *str++);
 172            }
 173            
 174 mike  1.23 void XmlWriter::append(Array<Sint8>& out, Char16 x)
 175            {
 176 kumpf 1.27     _appendChar(out, x);
 177 mike  1.23 }
 178            
 179 kumpf 1.54 void XmlWriter::append(Array<Sint8>& out, Boolean x)
 180            {
 181                append(out, (x ? "TRUE" : "FALSE"));
 182            }
 183            
 184 mike  1.23 void XmlWriter::append(Array<Sint8>& out, Uint32 x)
 185            {
 186                char buffer[32];
 187 kumpf 1.54     sprintf(buffer, "%u", x);
 188                append(out, buffer);
 189            }
 190            
 191            void XmlWriter::append(Array<Sint8>& out, Sint32 x)
 192            {
 193                char buffer[32];
 194 mike  1.23     sprintf(buffer, "%d", x);
 195                append(out, buffer);
 196            }
 197            
 198 kumpf 1.54 void XmlWriter::append(Array<Sint8>& out, Uint64 x)
 199            {
 200                char buffer[32];  // Should need 21 chars max
 201                // I know I shouldn't put platform flags here, but the other way is too hard
 202            #if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
 203                sprintf(buffer, "%I64u", x);
 204            #else
 205                sprintf(buffer, "%llu", x);
 206            #endif
 207                append(out, buffer);
 208            }
 209            
 210            void XmlWriter::append(Array<Sint8>& out, Sint64 x)
 211            {
 212                char buffer[32];  // Should need 21 chars max
 213                // I know I shouldn't put platform flags here, but the other way is too hard
 214            #if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
 215                sprintf(buffer, "%I64d", x);
 216            #else
 217                sprintf(buffer, "%lld", x);
 218            #endif
 219 kumpf 1.54     append(out, buffer);
 220            }
 221            
 222            void XmlWriter::append(Array<Sint8>& out, Real64 x)
 223            {
 224                char buffer[128];
 225                // %e gives '[-]m.dddddde+/-xx', which seems compatible with CIM/XML spec
 226                sprintf(buffer, "%e", x);
 227                append(out, buffer);
 228            }
 229            
 230 mike  1.23 void XmlWriter::append(Array<Sint8>& out, const char* str)
 231            {
 232                while (*str)
 233 kumpf 1.27 	_appendChar(out, *str++);
 234            }
 235            
 236            void XmlWriter::append(Array<Sint8>& out, const String& str)
 237            {
 238                const Char16* tmp = str.getData();
 239            
 240                while (*tmp)
 241            	_appendChar(out, *tmp++);
 242            }
 243            
 244            void XmlWriter::append(Array<Sint8>& out, const Indentor& x)
 245            {
 246                for (Uint32 i = 0; i < 4 * x.getLevel(); i++)
 247            	out.append(' ');
 248 mike  1.23 }
 249            
 250            void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)
 251            {
 252 kumpf 1.27     _appendSpecialChar(out, x);
 253 mike  1.23 }
 254            
 255            void XmlWriter::appendSpecial(Array<Sint8>& out, char x)
 256            {
 257 kumpf 1.27     _appendSpecialChar(out, Char16(x));
 258 mike  1.23 }
 259            
 260            void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)
 261            {
 262                while (*str)
 263 kumpf 1.27 	_appendSpecialChar(out, *str++);
 264 mike  1.23 }
 265            
 266            void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)
 267            {
 268                const Char16* tmp = str.getData();
 269            
 270                while (*tmp)
 271 kumpf 1.27 	_appendSpecialChar(out, *tmp++);
 272 mike  1.23 }
 273            
 274 kumpf 1.29 //------------------------------------------------------------------------------
 275            //
 276            // appendLocalNameSpacePathElement()
 277            //
 278            //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
 279            //
 280            //------------------------------------------------------------------------------
 281            
 282            void XmlWriter::appendLocalNameSpacePathElement(
 283                Array<Sint8>& out,
 284 mike  1.23     const String& nameSpace)
 285            {
 286                out << "<LOCALNAMESPACEPATH>\n";
 287            
 288                char* tmp = nameSpace.allocateCString();
 289            
 290                for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))
 291                {
 292            	out << "<NAMESPACE NAME=\"" << p << "\"/>\n";
 293                }
 294            
 295                delete [] tmp;
 296            
 297                out << "</LOCALNAMESPACEPATH>\n";
 298            }
 299            
 300            //------------------------------------------------------------------------------
 301            //
 302 kumpf 1.29 // appendNameSpacePathElement()
 303            //
 304            //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
 305            //
 306            //------------------------------------------------------------------------------
 307            
 308            void XmlWriter::appendNameSpacePathElement(
 309                Array<Sint8>& out,
 310                const String& host,
 311                const String& nameSpace)
 312            {
 313                out << "<NAMESPACEPATH>\n";
 314                out << "<HOST>" << host << "</HOST>\n";
 315                appendLocalNameSpacePathElement(out, nameSpace);
 316                out << "</NAMESPACEPATH>\n";
 317            }
 318            
 319            //------------------------------------------------------------------------------
 320            //
 321            // appendClassNameElement()
 322            //
 323 kumpf 1.29 //     <!ELEMENT CLASSNAME EMPTY>
 324            //     <!ATTLIST CLASSNAME
 325            //              %CIMName;>
 326            //
 327            //------------------------------------------------------------------------------
 328            
 329            void XmlWriter::appendClassNameElement(
 330                Array<Sint8>& out,
 331                const String& className)
 332            {
 333                out << "<CLASSNAME NAME=\"" << className << "\"/>\n";
 334            }
 335            
 336            //------------------------------------------------------------------------------
 337            //
 338            // appendInstanceNameElement()
 339            //
 340            //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
 341            //    <!ATTLIST INSTANCENAME
 342            //              %ClassName;>
 343            //
 344 kumpf 1.29 //------------------------------------------------------------------------------
 345            
 346            void XmlWriter::appendInstanceNameElement(
 347                Array<Sint8>& out,
 348 kumpf 1.59     const CIMObjectPath& instanceName)
 349 kumpf 1.29 {
 350                out << "<INSTANCENAME CLASSNAME=\"" << instanceName.getClassName() << "\">\n";
 351            
 352                Array<KeyBinding> keyBindings = instanceName.getKeyBindings();
 353                for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
 354                {
 355                    out << "<KEYBINDING NAME=\"" << keyBindings[i].getName() << "\">\n";
 356            
 357                    if (keyBindings[i].getType() == KeyBinding::REFERENCE)
 358                    {
 359 kumpf 1.59             CIMObjectPath ref = keyBindings[i].getValue();
 360 kumpf 1.56             appendValueReferenceElement(out, ref, true);
 361 kumpf 1.29         }
 362                    else {
 363                        out << "<KEYVALUE VALUETYPE=\"";
 364                        out << KeyBinding::typeToString(keyBindings[i].getType());
 365                        out << "\">";
 366            
 367                        // fixed the special character problem - Markus
 368            
 369                        appendSpecial(out, keyBindings[i].getValue());
 370                        out << "</KEYVALUE>\n";
 371                    }
 372                    out << "</KEYBINDING>\n";
 373                }
 374                out << "</INSTANCENAME>\n";
 375            }
 376            
 377            //------------------------------------------------------------------------------
 378            //
 379            // appendClassPathElement()
 380            //
 381            //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 382 kumpf 1.29 //
 383            //------------------------------------------------------------------------------
 384            
 385            void XmlWriter::appendClassPathElement(
 386                Array<Sint8>& out, 
 387 kumpf 1.59     const CIMObjectPath& classPath)
 388 kumpf 1.29 {
 389                out << "<CLASSPATH>\n";
 390                appendNameSpacePathElement(out,
 391                                           classPath.getHost(),
 392                                           classPath.getNameSpace());
 393                appendClassNameElement(out, classPath.getClassName());
 394                out << "</CLASSPATH>\n";
 395            }
 396            
 397            //------------------------------------------------------------------------------
 398            //
 399            // appendInstancePathElement()
 400            //
 401            //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 402            //
 403            //------------------------------------------------------------------------------
 404            
 405            void XmlWriter::appendInstancePathElement(
 406                Array<Sint8>& out, 
 407 kumpf 1.59     const CIMObjectPath& instancePath)
 408 kumpf 1.29 {
 409                out << "<INSTANCEPATH>\n";
 410                appendNameSpacePathElement(out,
 411                                           instancePath.getHost(),
 412                                           instancePath.getNameSpace());
 413                appendInstanceNameElement(out, instancePath);
 414                out << "</INSTANCEPATH>\n";
 415            }
 416            
 417            //------------------------------------------------------------------------------
 418            //
 419            // appendLocalClassPathElement()
 420            //
 421            //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 422            //
 423            //------------------------------------------------------------------------------
 424            
 425            void XmlWriter::appendLocalClassPathElement(
 426                Array<Sint8>& out, 
 427 kumpf 1.59     const CIMObjectPath& classPath)
 428 kumpf 1.29 {
 429                out << "<LOCALCLASSPATH>\n";
 430                appendLocalNameSpacePathElement(out, classPath.getNameSpace());
 431                appendClassNameElement(out, classPath.getClassName());
 432                out << "</LOCALCLASSPATH>\n";
 433            }
 434            
 435            //------------------------------------------------------------------------------
 436            //
 437            // appendLocalInstancePathElement()
 438            //
 439            //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 440            //
 441            //------------------------------------------------------------------------------
 442            
 443            void XmlWriter::appendLocalInstancePathElement(
 444                Array<Sint8>& out, 
 445 kumpf 1.59     const CIMObjectPath& instancePath)
 446 kumpf 1.29 {
 447                out << "<LOCALINSTANCEPATH>\n";
 448                appendLocalNameSpacePathElement(out, instancePath.getNameSpace());
 449                appendInstanceNameElement(out, instancePath);
 450                out << "</LOCALINSTANCEPATH>\n";
 451            }
 452            
 453            //------------------------------------------------------------------------------
 454            //
 455 kumpf 1.30 // appendLocalObjectPathElement()
 456            //
 457 kumpf 1.31 //     If the reference refers to an instance, write a LOCALINSTANCEPATH;
 458            //     otherwise write a LOCALCLASSPATH.
 459 kumpf 1.30 //
 460            //------------------------------------------------------------------------------
 461            
 462            void XmlWriter::appendLocalObjectPathElement(
 463                Array<Sint8>& out, 
 464 kumpf 1.59     const CIMObjectPath& objectPath)
 465 kumpf 1.30 {
 466 kumpf 1.31     if (objectPath.isInstanceName())
 467 kumpf 1.30     {
 468                    appendLocalInstancePathElement(out, objectPath);
 469                }
 470                else
 471                {
 472                    appendLocalClassPathElement(out, objectPath);
 473                }
 474            }
 475            
 476            //------------------------------------------------------------------------------
 477            //
 478 kumpf 1.54 // Helper functions for appendValueElement()
 479            //
 480            //------------------------------------------------------------------------------
 481            
 482            inline void _appendValue(Array<Sint8>& out, Boolean x)
 483            {
 484                XmlWriter::append(out, x);
 485            }
 486            
 487            inline void _appendValue(Array<Sint8>& out, Uint8 x)
 488            {
 489                XmlWriter::append(out, Uint32(x));
 490            }
 491            
 492            inline void _appendValue(Array<Sint8>& out, Sint8 x)
 493            {
 494                XmlWriter::append(out, Sint32(x));
 495            }
 496            
 497            inline void _appendValue(Array<Sint8>& out, Uint16 x)
 498            {
 499 kumpf 1.54     XmlWriter::append(out, Uint32(x));
 500            }
 501            
 502            inline void _appendValue(Array<Sint8>& out, Sint16 x)
 503            {
 504                XmlWriter::append(out, Sint32(x));
 505            }
 506            
 507            inline void _appendValue(Array<Sint8>& out, Uint32 x)
 508            {
 509                XmlWriter::append(out, x);
 510            }
 511            
 512            inline void _appendValue(Array<Sint8>& out, Sint32 x)
 513            {
 514                XmlWriter::append(out, x);
 515            }
 516            
 517            inline void _appendValue(Array<Sint8>& out, Uint64 x)
 518            {
 519                XmlWriter::append(out, x);
 520 kumpf 1.54 }
 521            
 522            inline void _appendValue(Array<Sint8>& out, Sint64 x)
 523            {
 524                XmlWriter::append(out, x);
 525            }
 526            
 527            inline void _appendValue(Array<Sint8>& out, Real32 x)
 528            {
 529                XmlWriter::append(out, Real64(x));
 530            }
 531            
 532            inline void _appendValue(Array<Sint8>& out, Real64 x)
 533            {
 534                XmlWriter::append(out, x);
 535            }
 536            
 537            inline void _appendValue(Array<Sint8>& out, Char16 x)
 538            {
 539                XmlWriter::appendSpecial(out, x);
 540            }
 541 kumpf 1.54 
 542            inline void _appendValue(Array<Sint8>& out, const String& x)
 543            {
 544                XmlWriter::appendSpecial(out, x);
 545            }
 546            
 547            inline void _appendValue(Array<Sint8>& out, const CIMDateTime& x)
 548            {
 549                out << x.getString();  //ATTN: append() method?
 550            }
 551            
 552 kumpf 1.59 inline void _appendValue(Array<Sint8>& out, const CIMObjectPath& x)
 553 kumpf 1.54 {
 554 kumpf 1.56     XmlWriter::appendValueReferenceElement(out, x, true);
 555 kumpf 1.54 }
 556            
 557 kumpf 1.59 void _appendValueArray(Array<Sint8>& out, const CIMObjectPath* p, Uint32 size)
 558 kumpf 1.54 {
 559                out << "<VALUE.REFARRAY>\n";
 560                while (size--)
 561                {
 562                    _appendValue(out, *p++);
 563                }
 564                out << "</VALUE.REFARRAY>\n";
 565            }
 566            
 567            template<class T>
 568            void _appendValueArray(Array<Sint8>& out, const T* p, Uint32 size)
 569            {
 570                out << "<VALUE.ARRAY>\n";
 571            
 572                while (size--)
 573                {
 574                    out << "<VALUE>";
 575                    _appendValue(out, *p++);
 576                    out << "</VALUE>\n";
 577                }
 578            
 579 kumpf 1.54     out << "</VALUE.ARRAY>\n";
 580            }
 581            
 582            //------------------------------------------------------------------------------
 583            //
 584            // appendValueElement()
 585            //
 586 kumpf 1.55 //    <!ELEMENT VALUE (#PCDATA)>
 587            //    <!ELEMENT VALUE.ARRAY (VALUE*)>
 588            //    <!ELEMENT VALUE.REFERENCE
 589            //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 590            //         INSTANCENAME)>
 591            //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 592            //
 593 kumpf 1.54 //------------------------------------------------------------------------------
 594            
 595            void XmlWriter::appendValueElement(
 596 kumpf 1.56     Array<Sint8>& out,
 597 kumpf 1.54     const CIMValue& value)
 598            {
 599                if (value.isNull())
 600                {
 601                    return;
 602                }
 603                if (value.isArray())
 604                {
 605                    switch (value.getType())
 606                    {
 607                        case CIMType::BOOLEAN:
 608                        {
 609                            Array<Boolean> a;
 610                            value.get(a);
 611                            _appendValueArray(out, a.getData(), a.size());
 612                            break;
 613                        }
 614            
 615                        case CIMType::UINT8:
 616                        {
 617                            Array<Uint8> a;
 618 kumpf 1.54                 value.get(a);
 619                            _appendValueArray(out, a.getData(), a.size());
 620                            break;
 621                        }
 622            
 623                        case CIMType::SINT8:
 624                        {
 625                            Array<Sint8> a;
 626                            value.get(a);
 627                            _appendValueArray(out, a.getData(), a.size());
 628                            break;
 629                        }
 630            
 631                        case CIMType::UINT16:
 632                        {
 633                            Array<Uint16> a;
 634                            value.get(a);
 635                            _appendValueArray(out, a.getData(), a.size());
 636                            break;
 637                        }
 638            
 639 kumpf 1.54             case CIMType::SINT16:
 640                        {
 641                            Array<Sint16> a;
 642                            value.get(a);
 643                            _appendValueArray(out, a.getData(), a.size());
 644                            break;
 645                        }
 646            
 647                        case CIMType::UINT32:
 648                        {
 649                            Array<Uint32> a;
 650                            value.get(a);
 651                            _appendValueArray(out, a.getData(), a.size());
 652                            break;
 653                        }
 654            
 655                        case CIMType::SINT32:
 656                        {
 657                            Array<Sint32> a;
 658                            value.get(a);
 659                            _appendValueArray(out, a.getData(), a.size());
 660 kumpf 1.54                 break;
 661                        }
 662            
 663                        case CIMType::UINT64:
 664                        {
 665                            Array<Uint64> a;
 666                            value.get(a);
 667                            _appendValueArray(out, a.getData(), a.size());
 668                            break;
 669                        }
 670            
 671                        case CIMType::SINT64:
 672                        {
 673                            Array<Sint64> a;
 674                            value.get(a);
 675                            _appendValueArray(out, a.getData(), a.size());
 676                            break;
 677                        }
 678            
 679                        case CIMType::REAL32:
 680                        {
 681 kumpf 1.54                 Array<Real32> a;
 682                            value.get(a);
 683                            _appendValueArray(out, a.getData(), a.size());
 684                            break;
 685                        }
 686            
 687                        case CIMType::REAL64:
 688                        {
 689                            Array<Real64> a;
 690                            value.get(a);
 691                            _appendValueArray(out, a.getData(), a.size());
 692                            break;
 693                        }
 694            
 695                        case CIMType::CHAR16:
 696                        {
 697                            Array<Char16> a;
 698                            value.get(a);
 699                            _appendValueArray(out, a.getData(), a.size());
 700                            break;
 701                        }
 702 kumpf 1.54 
 703                        case CIMType::STRING:
 704                        {
 705                            Array<String> a;
 706                            value.get(a);
 707                            _appendValueArray(out, a.getData(), a.size());
 708                            break;
 709                        }
 710            
 711                        case CIMType::DATETIME:
 712                        {
 713                            Array<CIMDateTime> a;
 714                            value.get(a);
 715                            _appendValueArray(out, a.getData(), a.size());
 716                            break;
 717                        }
 718            
 719                        case CIMType::REFERENCE:
 720                        {
 721 kumpf 1.59                 Array<CIMObjectPath> a;
 722 kumpf 1.54                 value.get(a);
 723                            _appendValueArray(out, a.getData(), a.size());
 724                            break;
 725                        }
 726            
 727                        default:
 728                            throw CIMValueInvalidType();
 729                    }
 730                }
 731                else if (value.getType() == CIMType::REFERENCE)
 732                {
 733                    // Has to be separate because it uses VALUE.REFERENCE tag
 734 kumpf 1.59         CIMObjectPath v;
 735 kumpf 1.54         value.get(v);
 736                    _appendValue(out, v);
 737                }
 738                else
 739                {
 740                    out << "<VALUE>";
 741            
 742                    switch (value.getType())
 743                    {
 744                        case CIMType::BOOLEAN:
 745                        {
 746                            Boolean v;
 747                            value.get(v);
 748                            _appendValue(out, v);
 749                            break;
 750                        }
 751            
 752                        case CIMType::UINT8:
 753                        {
 754                            Uint8 v;
 755                            value.get(v);
 756 kumpf 1.54                 _appendValue(out, v);
 757                            break;
 758                        }
 759            
 760                        case CIMType::SINT8:
 761                        {
 762                            Sint8 v;
 763                            value.get(v);
 764                            _appendValue(out, v);
 765                            break;
 766                        }
 767            
 768                        case CIMType::UINT16:
 769                        {
 770                            Uint16 v;
 771                            value.get(v);
 772                            _appendValue(out, v);
 773                            break;
 774                        }
 775            
 776                        case CIMType::SINT16:
 777 kumpf 1.54             {
 778                            Sint16 v;
 779                            value.get(v);
 780                            _appendValue(out, v);
 781                            break;
 782                        }
 783            
 784                        case CIMType::UINT32:
 785                        {
 786                            Uint32 v;
 787                            value.get(v);
 788                            _appendValue(out, v);
 789                            break;
 790                        }
 791            
 792                        case CIMType::SINT32:
 793                        {
 794                            Sint32 v;
 795                            value.get(v);
 796                            _appendValue(out, v);
 797                            break;
 798 kumpf 1.54             }
 799            
 800                        case CIMType::UINT64:
 801                        {
 802                            Uint64 v;
 803                            value.get(v);
 804                            _appendValue(out, v);
 805                            break;
 806                        }
 807            
 808                        case CIMType::SINT64:
 809                        {
 810                            Sint64 v;
 811                            value.get(v);
 812                            _appendValue(out, v);
 813                            break;
 814                        }
 815            
 816                        case CIMType::REAL32:
 817                        {
 818                            Real32 v;
 819 kumpf 1.54                 value.get(v);
 820                            _appendValue(out, v);
 821                            break;
 822                        }
 823            
 824                        case CIMType::REAL64:
 825                        {
 826                            Real64 v;
 827                            value.get(v);
 828                            _appendValue(out, v);
 829                            break;
 830                        }
 831            
 832                        case CIMType::CHAR16:
 833                        {
 834                            Char16 v;
 835                            value.get(v);
 836                            _appendValue(out, v);
 837                            break;
 838                        }
 839            
 840 kumpf 1.54             case CIMType::STRING:
 841                        {
 842                            String v;
 843                            value.get(v);
 844                            _appendValue(out, v);
 845                            break;
 846                        }
 847            
 848                        case CIMType::DATETIME:
 849                        {
 850                            CIMDateTime v;
 851                            value.get(v);
 852                            _appendValue(out, v);
 853                            break;
 854                        }
 855            
 856                        default:
 857                            throw CIMValueInvalidType();
 858                    }
 859            
 860                    out << "</VALUE>\n";
 861 kumpf 1.54     }
 862            }
 863            
 864            void XmlWriter::printValueElement(
 865                const CIMValue& value,
 866                PEGASUS_STD(ostream)& os)
 867            {
 868                Array<Sint8> tmp;
 869                appendValueElement(tmp, value);
 870                tmp.append('\0');
 871                os << tmp.getData() << PEGASUS_STD(endl);
 872            }
 873            
 874            //------------------------------------------------------------------------------
 875            //
 876 kumpf 1.56 // appendValueObjectWithPathElement()
 877            //
 878            //     <!ELEMENT VALUE.OBJECTWITHPATH
 879            //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
 880            //
 881            //------------------------------------------------------------------------------
 882            
 883            void XmlWriter::appendValueObjectWithPathElement(
 884                Array<Sint8>& out,
 885                const CIMObjectWithPath& objectWithPath)
 886            {
 887                out << "<VALUE.OBJECTWITHPATH>\n";
 888            
 889                appendValueReferenceElement(out, objectWithPath.getReference(), false);
 890                appendObjectElement(out, objectWithPath.getObject());
 891            
 892                out << "</VALUE.OBJECTWITHPATH>\n";
 893            }
 894            
 895            //------------------------------------------------------------------------------
 896            //
 897 kumpf 1.56 // appendValueReferenceElement()
 898            //
 899            //    <!ELEMENT VALUE.REFERENCE
 900            //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
 901            //         INSTANCENAME)>
 902            //
 903            //------------------------------------------------------------------------------
 904            
 905            void XmlWriter::appendValueReferenceElement(
 906                Array<Sint8>& out,
 907 kumpf 1.59     const CIMObjectPath& reference,
 908 kumpf 1.56     Boolean putValueWrapper)
 909            {
 910                if (putValueWrapper)
 911                    out << "<VALUE.REFERENCE>\n";
 912            
 913                // See if it is a class or instance reference (instance references have
 914                // key-bindings; class references do not).
 915            
 916 sage  1.60     //KeyBindingArray kbs = reference.getKeyBindingArray();
 917                KeyBindingArray kbs = reference.getKeyBindings();
 918            
 919 kumpf 1.56     if (kbs.size())
 920                {
 921                    if (reference.getHost().size())
 922                    {
 923                        appendInstancePathElement(out, reference);
 924                    }
 925                    else if (reference.getNameSpace().size())
 926                    {
 927                        appendLocalInstancePathElement(out, reference);
 928                    }
 929                    else
 930                    {
 931                        appendInstanceNameElement(out, reference);
 932                    }
 933                }
 934                else
 935                {
 936                    if (reference.getHost().size())
 937                    {
 938                        appendClassPathElement(out, reference);
 939                    }
 940 kumpf 1.56         else if (reference.getNameSpace().size())
 941                    {
 942                        appendLocalClassPathElement(out, reference);
 943                    }
 944                    else
 945                    {
 946                        appendClassNameElement(out, reference.getClassName());
 947                    }
 948                }
 949            
 950                if (putValueWrapper)
 951                    out << "</VALUE.REFERENCE>\n";
 952            }
 953            
 954            void XmlWriter::printValueReferenceElement(
 955 kumpf 1.59     const CIMObjectPath& reference,
 956 kumpf 1.56     PEGASUS_STD(ostream)& os)
 957            {
 958                Array<Sint8> tmp;
 959                appendValueReferenceElement(tmp, reference, true);
 960                tmp.append('\0');
 961                indentedPrint(os, tmp.getData());
 962            }
 963            
 964            //------------------------------------------------------------------------------
 965            //
 966            // appendValueNamedInstanceElement()
 967            //
 968            //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
 969            //
 970            //------------------------------------------------------------------------------
 971            
 972            void XmlWriter::appendValueNamedInstanceElement(
 973                Array<Sint8>& out,
 974                const CIMNamedInstance& namedInstance)
 975            {
 976                out << "<VALUE.NAMEDINSTANCE>\n";
 977 kumpf 1.56 
 978                appendInstanceNameElement(out, namedInstance.getInstanceName());
 979                appendInstanceElement(out, namedInstance.getInstance());
 980            
 981                out << "</VALUE.NAMEDINSTANCE>\n";
 982            }
 983            
 984            //------------------------------------------------------------------------------
 985            //
 986 kumpf 1.55 // appendClassElement()
 987            //
 988            //     <!ELEMENT CLASS
 989            //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
 990 kumpf 1.56 //     <!ATTLIST CLASS
 991 kumpf 1.55 //         %CIMName;
 992            //         %SuperClass;>
 993            //
 994            //------------------------------------------------------------------------------
 995            
 996            void XmlWriter::appendClassElement(
 997 kumpf 1.56     Array<Sint8>& out,
 998 kumpf 1.55     const CIMConstClass& cimclass)
 999            {
1000                cimclass._checkRep();
1001                cimclass._rep->toXml(out);
1002            }
1003            
1004            void XmlWriter::printClassElement(
1005                const CIMConstClass& cimclass,
1006                PEGASUS_STD(ostream)& os)
1007            {
1008                Array<Sint8> tmp;
1009                appendClassElement(tmp, cimclass);
1010                tmp.append('\0');
1011                indentedPrint(os, tmp.getData(), 4);
1012            }
1013            
1014            //------------------------------------------------------------------------------
1015            //
1016            // appendInstanceElement()
1017            //
1018            //     <!ELEMENT INSTANCE
1019 kumpf 1.55 //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
1020            //     <!ATTLIST INSTANCE
1021            //         %ClassName;>
1022            //
1023            //------------------------------------------------------------------------------
1024            
1025            void XmlWriter::appendInstanceElement(
1026 kumpf 1.56     Array<Sint8>& out,
1027 kumpf 1.55     const CIMConstInstance& instance)
1028            {
1029                instance._checkRep();
1030                instance._rep->toXml(out);
1031            }
1032            
1033            void XmlWriter::printInstanceElement(
1034                const CIMConstInstance& instance,
1035                PEGASUS_STD(ostream)& os)
1036            {
1037                Array<Sint8> tmp;
1038                appendInstanceElement(tmp, instance);
1039                tmp.append('\0');
1040                os << tmp.getData() << PEGASUS_STD(endl);
1041            }
1042            
1043            //------------------------------------------------------------------------------
1044            //
1045 kumpf 1.56 // appendObjectElement()
1046            //
1047            // May refer to a CLASS or an INSTANCE
1048            //
1049            //------------------------------------------------------------------------------
1050            
1051            void XmlWriter::appendObjectElement(
1052                Array<Sint8>& out,
1053                const CIMConstObject& object)
1054            {
1055                // ATTN-RK-P3-20020515: This could use some work
1056                try
1057                {
1058                    CIMConstClass c(object);
1059                    appendClassElement(out, c);
1060                }
1061                catch (DynamicCastFailed)
1062                {
1063                    try
1064                    {
1065                        CIMConstInstance i(object);
1066 kumpf 1.56             appendInstanceElement(out, i);
1067                    }
1068                    catch (DynamicCastFailed)
1069                    {
1070                        PEGASUS_ASSERT(0);
1071                    }
1072                }
1073            }
1074            
1075            //------------------------------------------------------------------------------
1076            //
1077            // appendPropertyElement()
1078            //
1079            //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
1080            //     <!ATTLIST PROPERTY
1081            //              %CIMName;
1082            //              %CIMType;           #REQUIRED
1083            //              %ClassOrigin;
1084            //              %Propagated;>
1085            //
1086            //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
1087 kumpf 1.56 //     <!ATTLIST PROPERTY.ARRAY
1088            //              %CIMName;
1089            //              %CIMType;           #REQUIRED
1090            //              %ArraySize;
1091            //              %ClassOrigin;
1092            //              %Propagated;>
1093            //
1094            //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
1095            //     <!ATTLIST PROPERTY.REFERENCE
1096            //              %CIMName;
1097            //              %ReferenceClass;
1098            //              %ClassOrigin;
1099            //              %Propagated;>
1100            //
1101            //------------------------------------------------------------------------------
1102            
1103            void XmlWriter::appendPropertyElement(
1104                Array<Sint8>& out,
1105                const CIMConstProperty& property)
1106            {
1107                property._checkRep();
1108 kumpf 1.56     property._rep->toXml(out);
1109            }
1110            
1111            void XmlWriter::printPropertyElement(
1112                const CIMConstProperty& property,
1113                PEGASUS_STD(ostream)& os)
1114            {
1115                Array<Sint8> tmp;
1116                appendPropertyElement(tmp, property);
1117                tmp.append('\0');
1118                os << tmp.getData() << PEGASUS_STD(endl);
1119            }
1120            
1121            //------------------------------------------------------------------------------
1122            //
1123            // appendMethodElement()
1124            //
1125            //     <!ELEMENT METHOD (QUALIFIER*,
1126            //         (PARAMETER|PARAMETER.REFERENCE|PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
1127            //     <!ATTLIST METHOD
1128            //              %CIMName;
1129 kumpf 1.56 //              %CIMType;          #IMPLIED
1130            //              %ClassOrigin;
1131            //              %Propagated;>
1132            //
1133            //------------------------------------------------------------------------------
1134            
1135            void XmlWriter::appendMethodElement(
1136                Array<Sint8>& out,
1137                const CIMConstMethod& method)
1138            {
1139                method._checkRep();
1140                method._rep->toXml(out);
1141            }
1142            
1143            void XmlWriter::printMethodElement(
1144                const CIMConstMethod& method,
1145                PEGASUS_STD(ostream)& os)
1146            {
1147                Array<Sint8> tmp;
1148                appendMethodElement(tmp, method);
1149                tmp.append('\0');
1150 kumpf 1.56     os << tmp.getData() << PEGASUS_STD(endl);
1151            }
1152            
1153            //------------------------------------------------------------------------------
1154            //
1155            // appendParameterElement()
1156            //
1157            //     <!ELEMENT PARAMETER (QUALIFIER*)>
1158            //     <!ATTLIST PARAMETER
1159            //              %CIMName;
1160            //              %CIMType;      #REQUIRED>
1161            //
1162            //     <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
1163            //     <!ATTLIST PARAMETER.REFERENCE
1164            //              %CIMName;
1165            //              %ReferenceClass;>
1166            //
1167            //     <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
1168            //     <!ATTLIST PARAMETER.ARRAY
1169            //              %CIMName;
1170            //              %CIMType;           #REQUIRED
1171 kumpf 1.56 //              %ArraySize;>
1172            //
1173            //     <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
1174            //     <!ATTLIST PARAMETER.REFARRAY
1175            //              %CIMName;
1176            //              %ReferenceClass;
1177            //              %ArraySize;>
1178            //
1179            //------------------------------------------------------------------------------
1180            
1181            void XmlWriter::appendParameterElement(
1182                Array<Sint8>& out,
1183                const CIMConstParameter& parameter)
1184            {
1185                parameter._checkRep();
1186                parameter._rep->toXml(out);
1187            }
1188            
1189            void XmlWriter::printParameterElement(
1190                const CIMConstParameter& parameter,
1191                PEGASUS_STD(ostream)& os)
1192 kumpf 1.56 {
1193                Array<Sint8> tmp;
1194                appendParameterElement(tmp, parameter);
1195                tmp.append('\0');
1196                os << tmp.getData() << PEGASUS_STD(endl);
1197            }
1198            
1199            //------------------------------------------------------------------------------
1200            //
1201            // appendParamValueElement()
1202            //
1203            //     <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
1204            //     <!ATTLIST PARAMVALUE
1205            //              %CIMName;>
1206            //
1207            //------------------------------------------------------------------------------
1208            
1209            void XmlWriter::appendParamValueElement(
1210                Array<Sint8>& out,
1211                const CIMParamValue& paramValue)
1212            {
1213 kumpf 1.56     paramValue._checkRep();
1214                paramValue._rep->toXml(out);
1215            }
1216            
1217            void XmlWriter::printParamValueElement(
1218                const CIMParamValue& paramValue,
1219                PEGASUS_STD(ostream)& os)
1220            {
1221                Array<Sint8> tmp;
1222                appendParamValueElement(tmp, paramValue);
1223                tmp.append('\0');
1224                os << tmp.getData() << PEGASUS_STD(endl);
1225            }
1226            
1227            //------------------------------------------------------------------------------
1228            //
1229            // appendQualifierElement()
1230            //
1231            //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
1232            //     <!ATTLIST QUALIFIER
1233            //              %CIMName;
1234 kumpf 1.56 //              %CIMType;               #REQUIRED
1235            //              %Propagated;
1236            //              %QualifierFlavor;>
1237            //
1238            //------------------------------------------------------------------------------
1239            
1240            void XmlWriter::appendQualifierElement(
1241                Array<Sint8>& out,
1242                const CIMConstQualifier& qualifier)
1243            {
1244                qualifier._checkRep();
1245                qualifier._rep->toXml(out);
1246            }
1247            
1248            void XmlWriter::printQualifierElement(
1249                const CIMConstQualifier& qualifier,
1250                PEGASUS_STD(ostream)& os)
1251            {
1252                Array<Sint8> tmp;
1253                appendQualifierElement(tmp, qualifier);
1254                tmp.append('\0');
1255 kumpf 1.56     os << tmp.getData() << PEGASUS_STD(endl);
1256            }
1257            
1258            //------------------------------------------------------------------------------
1259            //
1260            // appendQualifierDeclElement()
1261            //
1262            //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
1263            //     <!ATTLIST QUALIFIER.DECLARATION
1264            //              %CIMName;
1265            //              %CIMType;                       #REQUIRED
1266            //              ISARRAY        (true|false)     #IMPLIED
1267            //              %ArraySize;
1268            //              %QualifierFlavor;>
1269            //
1270            //------------------------------------------------------------------------------
1271            
1272            void XmlWriter::appendQualifierDeclElement(
1273                Array<Sint8>& out,
1274                const CIMConstQualifierDecl& qualifierDecl)
1275            {
1276 kumpf 1.56     qualifierDecl._checkRep();
1277                qualifierDecl._rep->toXml(out);
1278            }
1279            
1280            void XmlWriter::printQualifierDeclElement(
1281                const CIMConstQualifierDecl& qualifierDecl,
1282                PEGASUS_STD(ostream)& os)
1283            {
1284                Array<Sint8> tmp;
1285                appendQualifierDeclElement(tmp, qualifierDecl);
1286                tmp.append('\0');
1287                os << tmp.getData() << PEGASUS_STD(endl);
1288            }
1289            
1290            //------------------------------------------------------------------------------
1291            //
1292 kumpf 1.57 // appendQualifierFlavorEntity()
1293            //
1294            //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
1295            //                                 TOSUBCLASS   (true|false)   'true'
1296            //                                 TOINSTANCE   (true|false)   'false'
1297            //                                 TRANSLATABLE (true|false)   'false'">
1298            //
1299            //------------------------------------------------------------------------------
1300            
1301            void XmlWriter::appendQualifierFlavorEntity(
1302                Array<Sint8>& out,
1303                Uint32 flavor)
1304            {
1305                if (!(flavor & CIMFlavor::OVERRIDABLE))
1306                    out << " OVERRIDABLE=\"false\"";
1307            
1308                if (!(flavor & CIMFlavor::TOSUBCLASS))
1309                    out << " TOSUBCLASS=\"false\"";
1310            
1311                if (flavor & CIMFlavor::TOINSTANCE)
1312                    out << " TOINSTANCE=\"true\"";
1313 kumpf 1.57 
1314                if (flavor & CIMFlavor::TRANSLATABLE)
1315                    out << " TRANSLATABLE=\"true\"";
1316            }
1317            
1318            //------------------------------------------------------------------------------
1319            //
1320 kumpf 1.58 // appendScopeElement()
1321            //
1322            //     <!ELEMENT SCOPE EMPTY>
1323            //     <!ATTLIST SCOPE
1324            //              CLASS        (true|false)      'false'
1325            //              ASSOCIATION  (true|false)      'false'
1326            //              REFERENCE    (true|false)      'false'
1327            //              PROPERTY     (true|false)      'false'
1328            //              METHOD       (true|false)      'false'
1329            //              PARAMETER    (true|false)      'false'
1330            //              INDICATION   (true|false)      'false'>
1331            //
1332            //------------------------------------------------------------------------------
1333            
1334            void XmlWriter::appendScopeElement(
1335                Array<Sint8>& out,
1336                Uint32 scope)
1337            {
1338                if (scope)
1339                {
1340                    out << "<SCOPE";
1341 kumpf 1.58 
1342                    if (scope & CIMScope::CLASS)
1343                        out << " CLASS=\"true\"";
1344            
1345                    if (scope & CIMScope::ASSOCIATION)
1346                        out << " ASSOCIATION=\"true\"";
1347            
1348                    if (scope & CIMScope::REFERENCE)
1349                        out << " REFERENCE=\"true\"";
1350            
1351                    if (scope & CIMScope::PROPERTY)
1352                        out << " PROPERTY=\"true\"";
1353            
1354                    if (scope & CIMScope::METHOD)
1355                        out << " METHOD=\"true\"";
1356            
1357                    if (scope & CIMScope::PARAMETER)
1358                        out << " PARAMETER=\"true\"";
1359            
1360                    if (scope & CIMScope::INDICATION)
1361                        out << " INDICATION=\"true\"";
1362 kumpf 1.58 
1363                    out << "/>";
1364                }
1365            }
1366            
1367            //------------------------------------------------------------------------------
1368            //
1369 kumpf 1.27 // appendMethodCallHeader()
1370 mike  1.23 //
1371 kumpf 1.31 //     Build HTTP method call request header.
1372 mike  1.23 //
1373            //------------------------------------------------------------------------------
1374            
1375 kumpf 1.27 void XmlWriter::appendMethodCallHeader(
1376                Array<Sint8>& out,
1377 mike  1.23     const char* host,
1378                const char* cimMethod,
1379                const String& cimObject,
1380 mike  1.24     const String& authenticationHeader,
1381 kumpf 1.27     Uint32 contentLength)
1382 mike  1.23 {
1383                char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
1384            
1385                out << "M-POST /cimom HTTP/1.1\r\n";
1386                out << "HOST: " << host << "\r\n";
1387 kumpf 1.47     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";
1388 kumpf 1.27     out << "Content-Length: " << contentLength << "\r\n";
1389 mike  1.23     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
1390                out << nn <<"\r\n";
1391 kumpf 1.27     out << nn << "-CIMOperation: MethodCall\r\n";
1392 mike  1.23     out << nn << "-CIMMethod: " << cimMethod << "\r\n";
1393 mike  1.24     out << nn << "-CIMObject: " << cimObject << "\r\n";
1394                if (authenticationHeader.size())
1395                {
1396                    out << authenticationHeader << "\r\n";
1397                }
1398                out << "\r\n";
1399 mike  1.23 }
1400            
1401            //------------------------------------------------------------------------------
1402            //
1403 kumpf 1.27 // appendMethodResponseHeader()
1404 mike  1.23 //
1405            //     Build HTTP response header.
1406            //
1407            //------------------------------------------------------------------------------
1408            
1409 kumpf 1.27 void XmlWriter::appendMethodResponseHeader(
1410                Array<Sint8>& out,
1411                Uint32 contentLength)
1412 mike  1.23 {
1413                char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
1414            
1415 kumpf 1.48     out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n";
1416 sage  1.49     STAT_SERVERTIME
1417 kumpf 1.47     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";
1418 kumpf 1.27     out << "Content-Length: " << contentLength << "\r\n";
1419 mike  1.23     out << "Ext:\r\n";
1420                out << "Cache-Control: no-cache\r\n";
1421                out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
1422                out << nn <<"\r\n";
1423                out << nn << "-CIMOperation: MethodResponse\r\n\r\n";
1424            }
1425            
1426            //------------------------------------------------------------------------------
1427            //
1428 kumpf 1.40 // appendHttpErrorResponseHeader()
1429            //
1430            //     Build HTTP error response header.
1431            //
1432            //     Returns error response message in the following format:
1433            //
1434 kumpf 1.41 //        HTTP/1.1 400 Bad Request       (using specified status code)
1435            //        CIMError: <error type>         (if specified by caller)
1436            //        PGErrorDetail: <error text>    (if specified by caller)
1437 kumpf 1.40 //
1438            //------------------------------------------------------------------------------
1439            
1440            void XmlWriter::appendHttpErrorResponseHeader(
1441                Array<Sint8>& out,
1442                const String& status,
1443                const String& cimError,
1444 kumpf 1.41     const String& errorDetail)
1445 kumpf 1.40 {
1446                out << "HTTP/1.1 " << status << "\r\n";
1447                if (cimError != String::EMPTY)
1448                {
1449                    out << "CIMError: " << cimError << "\r\n";
1450                }
1451 kumpf 1.41     if (errorDetail != String::EMPTY)
1452 kumpf 1.40     {
1453 kumpf 1.41         // ATTN-RK-P3-20020404: It is critical that this text not contain '\n'
1454                    // ATTN-RK-P3-20020404: Need to encode this value properly.  (See
1455                    // CIM/HTTP Specification section 3.3.2
1456 kumpf 1.46         out << PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": " << errorDetail << "\r\n";
1457 kumpf 1.40     }
1458                out << "\r\n";
1459            }
1460            
1461            //------------------------------------------------------------------------------
1462            //
1463 kumpf 1.27 // appendUnauthorizedResponseHeader()
1464            //
1465            //     Build HTTP authentication response header for unauthorized requests.
1466            //
1467            //     Returns unauthorized message in the following format:
1468            //
1469            //        HTTP/1.1 401 Unauthorized
1470            //        WWW-Authenticate: Basic "hostname:80"
1471            //        <HTML><HEAD>
1472            //        <TITLE>401 Unauthorized</TITLE>
1473            //        </HEAD><BODY BGCOLOR="#99cc99">
1474            //        <H2>TEST401 Unauthorized</H2>
1475            //        <HR>
1476            //        </BODY></HTML>
1477            //
1478            //------------------------------------------------------------------------------
1479            
1480            void XmlWriter::appendUnauthorizedResponseHeader(
1481                Array<Sint8>& out,
1482                const String& content)
1483            {
1484 kumpf 1.40     out << "HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n";
1485 kumpf 1.27     out << content << "\r\n";
1486                out << "\r\n";
1487            
1488            //ATTN: We may need to include the following line, so that the browsers
1489            //      can display the error message.
1490            //    out << "<HTML><HEAD>\r\n";
1491            //    out << "<TITLE>" << "401 Unauthorized" <<  "</TITLE>\r\n";
1492            //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
1493            //    out << "<H2>TEST" << "401 Unauthorized" << "</H2>\r\n";
1494            //    out << "<HR>\r\n";
1495            //    out << "</BODY></HTML>\r\n";
1496            }
1497            
1498            //------------------------------------------------------------------------------
1499            //
1500 kumpf 1.29 // _appendMessageElementBegin()
1501            // _appendMessageElementEnd()
1502 mike  1.23 //
1503            //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
1504            //     <!ATTLIST MESSAGE
1505            //         ID CDATA #REQUIRED
1506            //         PROTOCOLVERSION CDATA #REQUIRED>
1507            //
1508            //------------------------------------------------------------------------------
1509            
1510 kumpf 1.29 void XmlWriter::_appendMessageElementBegin(
1511 kumpf 1.27     Array<Sint8>& out,
1512                const String& messageId)
1513 mike  1.23 {
1514                out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
1515                out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";
1516                out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";
1517 kumpf 1.27 }
1518            
1519 kumpf 1.29 void XmlWriter::_appendMessageElementEnd(
1520 kumpf 1.27     Array<Sint8>& out)
1521            {
1522 mike  1.23     out << "</MESSAGE>\n";
1523                out << "</CIM>\n";
1524            }
1525            
1526            //------------------------------------------------------------------------------
1527            //
1528 kumpf 1.29 // _appendSimpleReqElementBegin()
1529            // _appendSimpleReqElementEnd()
1530 mike  1.23 //
1531            //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
1532            //
1533            //------------------------------------------------------------------------------
1534            
1535 kumpf 1.29 void XmlWriter::_appendSimpleReqElementBegin(
1536 kumpf 1.27     Array<Sint8>& out)
1537            {
1538                out << "<SIMPLEREQ>\n";
1539            }
1540            
1541 kumpf 1.29 void XmlWriter::_appendSimpleReqElementEnd(
1542 kumpf 1.27     Array<Sint8>& out)
1543 mike  1.23 {
1544 kumpf 1.27     out << "</SIMPLEREQ>\n";
1545 mike  1.23 }
1546            
1547            //------------------------------------------------------------------------------
1548            //
1549 kumpf 1.29 // _appendMethodCallElementBegin()
1550            // _appendMethodCallElementEnd()
1551 mike  1.23 //
1552 kumpf 1.27 //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)>
1553            //     <!ATTLIST METHODCALL %CIMName;>
1554 mike  1.23 //
1555            //------------------------------------------------------------------------------
1556            
1557 kumpf 1.29 void XmlWriter::_appendMethodCallElementBegin(
1558 kumpf 1.27     Array<Sint8>& out,
1559                const char* name)
1560            {
1561                out << "<METHODCALL NAME=\"" << name << "\">\n";
1562            }
1563            
1564 kumpf 1.29 void XmlWriter::_appendMethodCallElementEnd(
1565 kumpf 1.27     Array<Sint8>& out)
1566 mike  1.23 {
1567 kumpf 1.27     out << "</METHODCALL>\n";
1568 mike  1.23 }
1569            
1570            //------------------------------------------------------------------------------
1571            //
1572 kumpf 1.29 // _appendIMethodCallElementBegin()
1573            // _appendIMethodCallElementEnd()
1574 mike  1.23 //
1575            //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
1576            //     <!ATTLIST IMETHODCALL %CIMName;>
1577            //
1578            //------------------------------------------------------------------------------
1579            
1580 kumpf 1.29 void XmlWriter::_appendIMethodCallElementBegin(
1581 kumpf 1.27     Array<Sint8>& out,
1582                const char* name)
1583 mike  1.23 {
1584                out << "<IMETHODCALL NAME=\"" << name << "\">\n";
1585 kumpf 1.27 }
1586            
1587 kumpf 1.29 void XmlWriter::_appendIMethodCallElementEnd(
1588 kumpf 1.27     Array<Sint8>& out)
1589            {
1590 mike  1.23     out << "</IMETHODCALL>\n";
1591            }
1592            
1593            //------------------------------------------------------------------------------
1594            //
1595 kumpf 1.29 // _appendIParamValueElementBegin()
1596            // _appendIParamValueElementEnd()
1597 mike  1.23 //
1598 kumpf 1.27 //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
1599            //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
1600            //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
1601            //     <!ATTLIST IPARAMVALUE %CIMName;>
1602 mike  1.23 //
1603            //------------------------------------------------------------------------------
1604            
1605 kumpf 1.29 void XmlWriter::_appendIParamValueElementBegin(
1606 kumpf 1.27     Array<Sint8>& out,
1607                const char* name)
1608            {
1609                out << "<IPARAMVALUE NAME=\"" << name << "\">\n";
1610            }
1611            
1612 kumpf 1.29 void XmlWriter::_appendIParamValueElementEnd(
1613 kumpf 1.27     Array<Sint8>& out)
1614 mike  1.23 {
1615 kumpf 1.27     out << "</IPARAMVALUE>\n";
1616 mike  1.23 }
1617            
1618            //------------------------------------------------------------------------------
1619            //
1620 kumpf 1.29 // _appendSimpleRspElementBegin()
1621            // _appendSimpleRspElementEnd()
1622 mike  1.23 //
1623 kumpf 1.27 //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
1624 mike  1.23 //
1625            //------------------------------------------------------------------------------
1626            
1627 kumpf 1.29 void XmlWriter::_appendSimpleRspElementBegin(
1628 kumpf 1.27     Array<Sint8>& out)
1629            {
1630                out << "<SIMPLERSP>\n";
1631            }
1632            
1633 kumpf 1.29 void XmlWriter::_appendSimpleRspElementEnd(
1634 kumpf 1.27     Array<Sint8>& out)
1635 mike  1.23 {
1636 kumpf 1.27     out << "</SIMPLERSP>\n";
1637 mike  1.23 }
1638            
1639            //------------------------------------------------------------------------------
1640            //
1641 kumpf 1.29 // _appendMethodResponseElementBegin()
1642            // _appendMethodResponseElementEnd()
1643 mike  1.23 //
1644 kumpf 1.27 //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>
1645            //     <!ATTLIST METHODRESPONSE %CIMName;>
1646 mike  1.23 //
1647            //------------------------------------------------------------------------------
1648            
1649 kumpf 1.29 void XmlWriter::_appendMethodResponseElementBegin(
1650 mike  1.23     Array<Sint8>& out,
1651 kumpf 1.27     const char* name)
1652            {
1653                out << "<METHODRESPONSE NAME=\"" << name << "\">\n";
1654            }
1655            
1656 kumpf 1.29 void XmlWriter::_appendMethodResponseElementEnd(
1657 kumpf 1.27     Array<Sint8>& out)
1658 mike  1.23 {
1659 kumpf 1.27     out << "</METHODRESPONSE>\n";
1660            }
1661            
1662            //------------------------------------------------------------------------------
1663            //
1664 kumpf 1.29 // _appendIMethodResponseElementBegin()
1665            // _appendIMethodResponseElementEnd()
1666 kumpf 1.27 //
1667            //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
1668            //     <!ATTLIST IMETHODRESPONSE %CIMName;>
1669            //
1670            //------------------------------------------------------------------------------
1671            
1672 kumpf 1.29 void XmlWriter::_appendIMethodResponseElementBegin(
1673 kumpf 1.27     Array<Sint8>& out,
1674                const char* name)
1675            {
1676                out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";
1677            }
1678            
1679 kumpf 1.29 void XmlWriter::_appendIMethodResponseElementEnd(
1680 kumpf 1.27     Array<Sint8>& out)
1681            {
1682                out << "</IMETHODRESPONSE>\n";
1683 mike  1.23 }
1684            
1685            //------------------------------------------------------------------------------
1686            //
1687 kumpf 1.29 // _appendErrorElement()
1688 mike  1.23 //
1689            //------------------------------------------------------------------------------
1690            
1691 kumpf 1.29 void XmlWriter::_appendErrorElement(
1692 kumpf 1.27     Array<Sint8>& out,
1693 kumpf 1.42     const CIMException& cimException)
1694 mike  1.23 {
1695 kumpf 1.44     PEG_TRACE_STRING(TRC_XML_WRITER, Tracer::LEVEL2,
1696 kumpf 1.51                      cimException.getTraceDescription());
1697 kumpf 1.44 
1698 mike  1.23     out << "<ERROR";
1699 kumpf 1.42     out << " CODE=\"" << Uint32(cimException.getCode()) << "\"";
1700 kumpf 1.51     String description = cimException.getDescription();
1701                if (description != String::EMPTY)
1702 kumpf 1.42     {
1703                    out << " DESCRIPTION=\"";
1704 kumpf 1.51         appendSpecial(out, description);
1705 kumpf 1.42         out << "\"";
1706                }
1707                out << "/>";
1708 mike  1.23 }
1709            
1710            //------------------------------------------------------------------------------
1711            //
1712 kumpf 1.27 // appendReturnValueElement()
1713            //
1714            // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
1715            // <!ATTLIST RETURNVALUE
1716            //     %ParamType;>
1717 mike  1.23 //
1718            //------------------------------------------------------------------------------
1719            
1720 kumpf 1.27 void XmlWriter::appendReturnValueElement(
1721 mike  1.23     Array<Sint8>& out,
1722 kumpf 1.27     const CIMValue& value)
1723            {
1724                out << "<RETURNVALUE";
1725            
1726                CIMType type = value.getType();
1727                if (type != CIMType::NONE)
1728                {
1729 kumpf 1.53         out << " PARAMTYPE=\"" << type.toString() << "\"";
1730 kumpf 1.27     }
1731            
1732                out << ">\n";
1733 karl  1.37 
1734 kumpf 1.54     // Add value.
1735                appendValueElement(out, value);
1736 kumpf 1.27     out << "</RETURNVALUE>\n";
1737            }
1738            
1739            //------------------------------------------------------------------------------
1740            //
1741 kumpf 1.29 // _appendIReturnValueElementBegin()
1742            // _appendIReturnValueElementEnd()
1743 kumpf 1.27 //
1744            //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|
1745            //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|
1746            //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|
1747            //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>
1748            //
1749            //------------------------------------------------------------------------------
1750            
1751 kumpf 1.29 void XmlWriter::_appendIReturnValueElementBegin(
1752 kumpf 1.27     Array<Sint8>& out)
1753            {
1754                out << "<IRETURNVALUE>\n";
1755            }
1756            
1757 kumpf 1.29 void XmlWriter::_appendIReturnValueElementEnd(
1758 kumpf 1.27     Array<Sint8>& out)
1759 mike  1.23 {
1760 kumpf 1.27     out << "</IRETURNVALUE>\n";
1761 mike  1.23 }
1762            
1763            //------------------------------------------------------------------------------
1764            //
1765 kumpf 1.27 // appendBooleanIParameter()
1766 mike  1.23 //
1767            //------------------------------------------------------------------------------
1768            
1769 kumpf 1.27 void XmlWriter::appendBooleanIParameter(
1770 mike  1.23     Array<Sint8>& out,
1771                const char* name,
1772 kumpf 1.27     Boolean flag)
1773 mike  1.23 {
1774 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1775 kumpf 1.54     out << "<VALUE>";
1776                append(out, flag);
1777                out << "</VALUE>\n";
1778 kumpf 1.29     _appendIParamValueElementEnd(out);
1779 mike  1.23 }
1780            
1781            //------------------------------------------------------------------------------
1782            //
1783 kumpf 1.27 // appendStringIParameter()
1784 mike  1.23 //
1785            //------------------------------------------------------------------------------
1786            
1787 kumpf 1.27 void XmlWriter::appendStringIParameter(
1788 mike  1.23     Array<Sint8>& out,
1789                const char* name,
1790 kumpf 1.27     const String& str)
1791 mike  1.23 {
1792 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1793 kumpf 1.27     out << "<VALUE>";
1794                appendSpecial(out, str);
1795                out << "</VALUE>\n";
1796 kumpf 1.29     _appendIParamValueElementEnd(out);
1797 mike  1.23 }
1798            
1799            //------------------------------------------------------------------------------
1800            //
1801 kumpf 1.27 // appendQualifierNameIParameter()
1802 mike  1.23 //
1803            //------------------------------------------------------------------------------
1804            
1805 kumpf 1.27 void XmlWriter::appendQualifierNameIParameter(
1806 mike  1.23     Array<Sint8>& out,
1807                const char* name,
1808                const String& qualifierName)
1809            {
1810                // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
1811                //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
1812                //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
1813                //
1814                // ATTN: notice that there is really no way to pass a qualifier name
1815                // as an IPARAMVALUE element according to the spec (look above). So we
1816                // just pass it as a class name. An answer must be obtained later.
1817                
1818 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1819 kumpf 1.27     appendClassNameElement(out, qualifierName);
1820 kumpf 1.29     _appendIParamValueElementEnd(out);
1821 mike  1.23 }
1822            
1823            //------------------------------------------------------------------------------
1824            //
1825 kumpf 1.27 // appendClassNameIParameter()
1826 mike  1.23 //
1827            //------------------------------------------------------------------------------
1828            
1829 kumpf 1.27 void XmlWriter::appendClassNameIParameter(
1830 mike  1.23     Array<Sint8>& out,
1831 kumpf 1.27     const char* name,
1832                const String& className)
1833 mike  1.23 {
1834 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1835 kumpf 1.27     appendClassNameElement(out, className);
1836 kumpf 1.29     _appendIParamValueElementEnd(out);
1837 mike  1.23 }
1838            
1839            //------------------------------------------------------------------------------
1840            //
1841 kumpf 1.27 // appendInstanceNameIParameter()
1842 mike  1.23 //
1843            //------------------------------------------------------------------------------
1844            
1845 kumpf 1.27 void XmlWriter::appendInstanceNameIParameter(
1846 mike  1.23     Array<Sint8>& out,
1847 kumpf 1.27     const char* name,
1848 kumpf 1.59     const CIMObjectPath& instanceName)
1849 mike  1.23 {
1850 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1851                appendInstanceNameElement(out, instanceName);
1852                _appendIParamValueElementEnd(out);
1853 kumpf 1.27 }
1854            
1855            void XmlWriter::appendObjectNameIParameter(
1856                Array<Sint8>& out,
1857                const char* name,
1858 kumpf 1.59     const CIMObjectPath& objectName)
1859 kumpf 1.27 {
1860                if (objectName.isClassName())
1861                {
1862            	XmlWriter::appendClassNameIParameter(
1863            	    out, name, objectName.getClassName());
1864                }
1865                else
1866                {
1867            	XmlWriter::appendInstanceNameIParameter(
1868            	    out, name, objectName);
1869                }
1870            }
1871            
1872            //------------------------------------------------------------------------------
1873            //
1874            // appendClassIParameter()
1875            //
1876            //------------------------------------------------------------------------------
1877            
1878            void XmlWriter::appendClassIParameter(
1879                Array<Sint8>& out,
1880 kumpf 1.27     const char* name,
1881                const CIMConstClass& cimClass)
1882            {
1883 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1884 kumpf 1.55     appendClassElement(out, cimClass);
1885 kumpf 1.29     _appendIParamValueElementEnd(out);
1886 mike  1.23 }
1887            
1888            //------------------------------------------------------------------------------
1889            //
1890 kumpf 1.27 // appendInstanceIParameter()
1891 mike  1.23 //
1892            //------------------------------------------------------------------------------
1893            
1894 kumpf 1.27 void XmlWriter::appendInstanceIParameter(
1895 mike  1.23     Array<Sint8>& out,
1896 kumpf 1.27     const char* name,
1897 mike  1.23     const CIMConstInstance& instance)
1898            {
1899 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1900 kumpf 1.55     appendInstanceElement(out, instance);
1901 kumpf 1.29     _appendIParamValueElementEnd(out);
1902 mike  1.23 }
1903            
1904 mike  1.24 //------------------------------------------------------------------------------
1905            //
1906 kumpf 1.27 // appendNamedInstanceIParameter()
1907 mike  1.24 //
1908            //------------------------------------------------------------------------------
1909            
1910 kumpf 1.27 void XmlWriter::appendNamedInstanceIParameter(
1911 mike  1.24     Array<Sint8>& out,
1912 kumpf 1.27     const char* name,
1913 mike  1.24     const CIMNamedInstance& namedInstance)
1914            {
1915 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1916 kumpf 1.56     appendValueNamedInstanceElement(out, namedInstance);
1917 kumpf 1.29     _appendIParamValueElementEnd(out);
1918 mike  1.24 }
1919            
1920 mike  1.23 //----------------------------------------------------------
1921            //
1922 kumpf 1.27 //  appendPropertyNameIParameter()
1923 mike  1.23 //   	
1924            //     </IPARAMVALUE>
1925            //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>
1926            //
1927            //     USE: Create parameter for getProperty operation
1928            //==========================================================
1929 kumpf 1.27 void XmlWriter::appendPropertyNameIParameter(
1930 mike  1.23     Array<Sint8>& out,
1931                const String& propertyName)
1932            {
1933 kumpf 1.29     _appendIParamValueElementBegin(out, "PropertyName");
1934 kumpf 1.27     out << "<VALUE>" << propertyName << "</VALUE>\n"; 
1935 kumpf 1.29     _appendIParamValueElementEnd(out);
1936 kumpf 1.27 }
1937 mike  1.23 
1938            //------------------------------------------------------------------------------
1939            //
1940 kumpf 1.27 // appendPropertyValueIParameter()
1941 mike  1.24 //
1942            //------------------------------------------------------------------------------
1943            
1944 kumpf 1.27 void XmlWriter::appendPropertyValueIParameter(
1945 mike  1.24     Array<Sint8>& out,
1946 kumpf 1.27     const char* name,
1947 mike  1.24     const CIMValue& value)
1948            {
1949 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1950 kumpf 1.54     appendValueElement(out, value);
1951 kumpf 1.29     _appendIParamValueElementEnd(out);
1952 mike  1.24 }
1953            
1954            //------------------------------------------------------------------------------
1955            //
1956 kumpf 1.27 // appendPropertyListIParameter()
1957 mike  1.24 //
1958            //------------------------------------------------------------------------------
1959            
1960 kumpf 1.27 void XmlWriter::appendPropertyListIParameter(
1961 mike  1.24     Array<Sint8>& out,
1962                const CIMPropertyList& propertyList)
1963            {
1964 karl  1.37     // ATTN: P3 KS 4 Mar 2002 - As check shouldn't we check for null property list
1965 kumpf 1.29     _appendIParamValueElementBegin(out, "PropertyList");
1966 mike  1.24 
1967 kumpf 1.27     out << "<VALUE.ARRAY>\n";
1968 mike  1.24     for (Uint32 i = 0; i < propertyList.getNumProperties(); i++)
1969                {
1970 kumpf 1.27         out << "<VALUE>" << propertyList.getPropertyName(i) << "</VALUE>\n"; 
1971 mike  1.24     }
1972 kumpf 1.27     out << "</VALUE.ARRAY>\n";
1973            
1974 kumpf 1.29     _appendIParamValueElementEnd(out);
1975 mike  1.24 }
1976            
1977            //------------------------------------------------------------------------------
1978            //
1979 kumpf 1.27 // appendQualifierDeclarationIParameter()
1980 mike  1.23 //
1981            //------------------------------------------------------------------------------
1982            
1983 kumpf 1.27 void XmlWriter::appendQualifierDeclarationIParameter(
1984 mike  1.23     Array<Sint8>& out,
1985 kumpf 1.27     const char* name,
1986 mike  1.23     const CIMConstQualifierDecl& qualifierDecl)
1987            {
1988 kumpf 1.29     _appendIParamValueElementBegin(out, name);
1989 kumpf 1.56     appendQualifierDeclElement(out, qualifierDecl);
1990 kumpf 1.29     _appendIParamValueElementEnd(out);
1991 kumpf 1.40 }
1992            
1993            //------------------------------------------------------------------------------
1994            //
1995            // XmlWriter::formatHttpErrorRspMessage()
1996            //
1997            //------------------------------------------------------------------------------
1998            
1999            Array<Sint8> XmlWriter::formatHttpErrorRspMessage(
2000                const String& status,
2001                const String& cimError,
2002 kumpf 1.41     const String& errorDetail)
2003 kumpf 1.40 {
2004                Array<Sint8> out;
2005            
2006 kumpf 1.41     appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
2007 kumpf 1.40 
2008 kumpf 1.41     return out;
2009 mike  1.23 }
2010            
2011            //------------------------------------------------------------------------------
2012            //
2013 kumpf 1.27 // XmlWriter::formatSimpleMethodReqMessage()
2014 mike  1.23 //
2015            //------------------------------------------------------------------------------
2016            
2017 kumpf 1.27 // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
2018            Array<Sint8> XmlWriter::formatSimpleMethodReqMessage(
2019                const char* host,
2020 kumpf 1.38     const String& nameSpace,
2021 kumpf 1.59     const CIMObjectPath& path,
2022 kumpf 1.27     const char* methodName,
2023 kumpf 1.30     const Array<CIMParamValue>& parameters,
2024 kumpf 1.27     const String& messageId,
2025 kumpf 1.30     const String& authenticationHeader)
2026 kumpf 1.27 {
2027                Array<Sint8> out;
2028                Array<Sint8> tmp;
2029 kumpf 1.59     CIMObjectPath localObjectPath = path;
2030 kumpf 1.38     localObjectPath.setNameSpace(nameSpace);
2031 kumpf 1.27 
2032 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2033                _appendSimpleReqElementBegin(out);
2034                _appendMethodCallElementBegin(out, methodName);
2035 kumpf 1.38     appendLocalObjectPathElement(out, localObjectPath);
2036 kumpf 1.30     for (Uint32 i=0; i < parameters.size(); i++)
2037 kumpf 1.29     {
2038 kumpf 1.56         appendParamValueElement(out, parameters[i]);
2039 kumpf 1.29     }
2040                _appendMethodCallElementEnd(out);
2041                _appendSimpleReqElementEnd(out);
2042                _appendMessageElementEnd(out);
2043 kumpf 1.27 
2044                appendMethodCallHeader(
2045            	tmp,
2046            	host,
2047            	methodName,
2048 kumpf 1.39 	localObjectPath.toString(false),
2049 kumpf 1.27         authenticationHeader,
2050            	out.size());
2051                tmp << out;
2052            
2053                return tmp;
2054            }
2055            
2056            Array<Sint8> XmlWriter::formatSimpleMethodRspMessage(
2057                const char* methodName,
2058                const String& messageId,
2059                const Array<Sint8>& body)
2060 mike  1.23 {
2061 kumpf 1.27     Array<Sint8> out;
2062                Array<Sint8> tmp;
2063            
2064 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2065                _appendSimpleRspElementBegin(out);
2066                _appendMethodResponseElementBegin(out, methodName);
2067 kumpf 1.27     out << body;
2068 kumpf 1.29     _appendMethodResponseElementEnd(out);
2069                _appendSimpleRspElementEnd(out);
2070                _appendMessageElementEnd(out);
2071 mike  1.23 
2072 kumpf 1.27     appendMethodResponseHeader(tmp, out.size());
2073                tmp << out;
2074 mike  1.23 
2075 kumpf 1.27     return tmp;
2076 mike  1.23 }
2077            
2078            //------------------------------------------------------------------------------
2079            //
2080 kumpf 1.28 // XmlWriter::formatSimpleMethodErrorRspMessage()
2081            //
2082            //------------------------------------------------------------------------------
2083            
2084            Array<Sint8> XmlWriter::formatSimpleMethodErrorRspMessage(
2085                const String& methodName,
2086                const String& messageId,
2087 kumpf 1.42     const CIMException& cimException)
2088 kumpf 1.28 {
2089                ArrayDestroyer<char> tmp1(methodName.allocateCString());
2090                Array<Sint8> out;
2091                Array<Sint8> tmp;
2092            
2093 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2094                _appendSimpleRspElementBegin(out);
2095                _appendMethodResponseElementBegin(out, tmp1.getPointer());
2096 kumpf 1.42     _appendErrorElement(out, cimException);
2097 kumpf 1.29     _appendMethodResponseElementEnd(out);
2098                _appendSimpleRspElementEnd(out);
2099                _appendMessageElementEnd(out);
2100 kumpf 1.28 
2101                appendMethodResponseHeader(tmp, out.size());
2102                tmp << out;
2103            
2104                return tmp;
2105            }
2106            
2107            //------------------------------------------------------------------------------
2108            //
2109 kumpf 1.27 // XmlWriter::formatSimpleIMethodReqMessage()
2110 mike  1.23 //
2111            //------------------------------------------------------------------------------
2112            
2113 kumpf 1.27 Array<Sint8> XmlWriter::formatSimpleIMethodReqMessage(
2114                const char* host,
2115                const String& nameSpace,
2116                const char* iMethodName,
2117                const String& messageId,
2118                const String& authenticationHeader,
2119                const Array<Sint8>& body)
2120 mike  1.23 {
2121 kumpf 1.27     Array<Sint8> out;
2122                Array<Sint8> tmp;
2123            
2124 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2125                _appendSimpleReqElementBegin(out);
2126                _appendIMethodCallElementBegin(out, iMethodName);
2127                appendLocalNameSpacePathElement(out, nameSpace);
2128 kumpf 1.27     out << body;
2129 kumpf 1.29     _appendIMethodCallElementEnd(out);
2130                _appendSimpleReqElementEnd(out);
2131                _appendMessageElementEnd(out);
2132 kumpf 1.27 
2133                appendMethodCallHeader(
2134            	tmp,
2135            	host,
2136            	iMethodName,
2137            	nameSpace,
2138                    authenticationHeader,
2139            	out.size());
2140                tmp << out;
2141 mike  1.23 
2142 kumpf 1.27     return tmp;
2143 mike  1.23 }
2144            
2145            //------------------------------------------------------------------------------
2146            //
2147 kumpf 1.27 // XmlWriter::formatSimpleIMethodRspMessage()
2148 mike  1.23 //
2149            //------------------------------------------------------------------------------
2150            
2151 kumpf 1.27 Array<Sint8> XmlWriter::formatSimpleIMethodRspMessage(
2152                const char* iMethodName,
2153                const String& messageId,
2154                const Array<Sint8>& body)
2155 mike  1.23 {
2156 kumpf 1.27     Array<Sint8> out;
2157                Array<Sint8> tmp;
2158 mike  1.23 
2159 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2160                _appendSimpleRspElementBegin(out);
2161                _appendIMethodResponseElementBegin(out, iMethodName);
2162 kumpf 1.45     if (body.size() != 0)
2163                {
2164                    _appendIReturnValueElementBegin(out);
2165                    out << body;
2166                    _appendIReturnValueElementEnd(out);
2167                }
2168 kumpf 1.29     _appendIMethodResponseElementEnd(out);
2169                _appendSimpleRspElementEnd(out);
2170                _appendMessageElementEnd(out);
2171 mike  1.23 
2172 kumpf 1.27     appendMethodResponseHeader(tmp, out.size());
2173                tmp << out;
2174 mike  1.23 
2175 kumpf 1.27     return tmp;
2176            }
2177 mike  1.23 
2178 kumpf 1.28 //------------------------------------------------------------------------------
2179            //
2180            // XmlWriter::formatSimpleIMethodErrorRspMessage()
2181            //
2182            //------------------------------------------------------------------------------
2183            
2184            Array<Sint8> XmlWriter::formatSimpleIMethodErrorRspMessage(
2185                const String& iMethodName,
2186                const String& messageId,
2187 kumpf 1.42     const CIMException& cimException)
2188 kumpf 1.28 {
2189                ArrayDestroyer<char> tmp1(iMethodName.allocateCString());
2190                Array<Sint8> out;
2191                Array<Sint8> tmp;
2192            
2193 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2194                _appendSimpleRspElementBegin(out);
2195                _appendIMethodResponseElementBegin(out, tmp1.getPointer());
2196 kumpf 1.42     _appendErrorElement(out, cimException);
2197 kumpf 1.29     _appendIMethodResponseElementEnd(out);
2198                _appendSimpleRspElementEnd(out);
2199                _appendMessageElementEnd(out);
2200 kumpf 1.28 
2201                appendMethodResponseHeader(tmp, out.size());
2202                tmp << out;
2203            
2204                return tmp;
2205            }
2206            
2207 kumpf 1.27 //******************************************************************************
2208            //
2209            // Export Messages (used for indications)
2210            //
2211            //******************************************************************************
2212 mike  1.23 
2213 kumpf 1.27 //------------------------------------------------------------------------------
2214            //
2215            // appendEMethodRequestHeader()
2216            //
2217            //     Build HTTP request header for export operation.
2218            //
2219            //------------------------------------------------------------------------------
2220 mike  1.23 
2221 kumpf 1.27 void XmlWriter::appendEMethodRequestHeader(
2222                Array<Sint8>& out,
2223 kumpf 1.50     const char* requestUri,
2224 kumpf 1.27     const char* host,
2225                const char* cimMethod,
2226                const String& authenticationHeader,
2227                Uint32 contentLength)
2228            {
2229                char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
2230 mike  1.23 
2231 kumpf 1.50     out << "M-POST " << requestUri << " HTTP/1.1\r\n";
2232 kumpf 1.27     out << "HOST: " << host << "\r\n";
2233 kumpf 1.47     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";
2234 kumpf 1.27     out << "Content-Length: " << contentLength << "\r\n";
2235                out << "Man: http://www.hp.com; ns=";
2236                out << nn <<"\r\n";
2237 kumpf 1.32     out << nn << "-CIMExport: MethodRequest\r\n";
2238 kumpf 1.27     out << nn << "-CIMExportMethod: " << cimMethod << "\r\n";
2239                if (authenticationHeader.size())
2240                {
2241                    out << authenticationHeader << "\r\n";
2242                }
2243                out << "\r\n";
2244            }
2245 mike  1.23 
2246 kumpf 1.27 //------------------------------------------------------------------------------
2247            //
2248            // appendEMethodResponseHeader()
2249            //
2250            //     Build HTTP response header for export operation.
2251            //
2252            //------------------------------------------------------------------------------
2253 mike  1.23 
2254 kumpf 1.27 void XmlWriter::appendEMethodResponseHeader(
2255                Array<Sint8>& out,
2256                Uint32 contentLength)
2257            {
2258                char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
2259 mike  1.23 
2260 kumpf 1.48     out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n";
2261 kumpf 1.47     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";
2262 kumpf 1.27     out << "Content-Length: " << contentLength << "\r\n";
2263                out << "Ext:\r\n";
2264                out << "Cache-Control: no-cache\r\n";
2265 kumpf 1.47     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
2266 kumpf 1.27     out << nn <<"\r\n";
2267                out << nn << "-CIMExport: MethodResponse\r\n\r\n";
2268 mike  1.23 }
2269            
2270            //------------------------------------------------------------------------------
2271            //
2272 kumpf 1.29 // _appendSimpleExportReqElementBegin()
2273            // _appendSimpleExportReqElementEnd()
2274 kumpf 1.27 //
2275            //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)>
2276 mike  1.23 //
2277            //------------------------------------------------------------------------------
2278            
2279 kumpf 1.29 void XmlWriter::_appendSimpleExportReqElementBegin(
2280 kumpf 1.27     Array<Sint8>& out)
2281 mike  1.23 {
2282 kumpf 1.27     out << "<SIMPLEEXPREQ>\n";
2283            }
2284 mike  1.23 
2285 kumpf 1.29 void XmlWriter::_appendSimpleExportReqElementEnd(
2286 kumpf 1.27     Array<Sint8>& out)
2287            {
2288                out << "</SIMPLEEXPREQ>\n";
2289 mike  1.23 }
2290            
2291            //------------------------------------------------------------------------------
2292            //
2293 kumpf 1.29 // _appendEMethodCallElementBegin()
2294            // _appendEMethodCallElementEnd()
2295 kumpf 1.27 //
2296            //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)>
2297            //     <!ATTLIST EXPMETHODCALL %CIMName;>
2298 mike  1.23 //
2299            //------------------------------------------------------------------------------
2300            
2301 kumpf 1.29 void XmlWriter::_appendEMethodCallElementBegin(
2302 mike  1.23     Array<Sint8>& out,
2303 kumpf 1.27     const char* name)
2304 mike  1.23 {
2305 kumpf 1.27     out << "<EXPMETHODCALL NAME=\"" << name << "\">\n";
2306 mike  1.24 }
2307            
2308 kumpf 1.29 void XmlWriter::_appendEMethodCallElementEnd(
2309 kumpf 1.27     Array<Sint8>& out)
2310 mike  1.24 {
2311                out << "</EXPMETHODCALL>\n";
2312            }
2313            
2314            //------------------------------------------------------------------------------
2315            //
2316 kumpf 1.29 // _appendSimpleExportRspElementBegin()
2317            // _appendSimpleExportRspElementEnd()
2318 mike  1.24 //
2319 kumpf 1.27 //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)>
2320 mike  1.24 //
2321            //------------------------------------------------------------------------------
2322            
2323 kumpf 1.29 void XmlWriter::_appendSimpleExportRspElementBegin(
2324 kumpf 1.27     Array<Sint8>& out)
2325            {
2326                out << "<SIMPLEEXPRSP>\n";
2327            }
2328            
2329 kumpf 1.29 void XmlWriter::_appendSimpleExportRspElementEnd(
2330 kumpf 1.27     Array<Sint8>& out)
2331 mike  1.24 {
2332 kumpf 1.27     out << "</SIMPLEEXPRSP>\n";
2333 mike  1.24 }
2334            
2335            //------------------------------------------------------------------------------
2336            //
2337 kumpf 1.29 // _appendEMethodResponseElementBegin()
2338            // _appendEMethodResponseElementEnd()
2339 mike  1.24 //
2340            //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>
2341            //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>
2342            //
2343            //------------------------------------------------------------------------------
2344            
2345 kumpf 1.29 void XmlWriter::_appendEMethodResponseElementBegin(
2346 kumpf 1.27     Array<Sint8>& out,
2347                const char* name)
2348 mike  1.24 {
2349                out << "<EXPMETHODRESPONSE NAME=\"" << name << "\">\n";
2350 kumpf 1.27 }
2351            
2352 kumpf 1.29 void XmlWriter::_appendEMethodResponseElementEnd(
2353 kumpf 1.27     Array<Sint8>& out)
2354            {
2355 mike  1.24     out << "</EXPMETHODRESPONSE>\n";
2356            }
2357            
2358            //------------------------------------------------------------------------------
2359            //
2360 kumpf 1.27 // XmlWriter::formatSimpleEMethodReqMessage()
2361 mike  1.24 //
2362            //------------------------------------------------------------------------------
2363            
2364 kumpf 1.27 Array<Sint8> XmlWriter::formatSimpleEMethodReqMessage(
2365 kumpf 1.50     const char* requestUri,
2366 kumpf 1.27     const char* host,
2367                const char* eMethodName,
2368                const String& messageId,
2369                const String& authenticationHeader,
2370                const Array<Sint8>& body)
2371 mike  1.24 {
2372                Array<Sint8> out;
2373 kumpf 1.27     Array<Sint8> tmp;
2374            
2375 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2376                _appendSimpleExportReqElementBegin(out);
2377                _appendEMethodCallElementBegin(out, eMethodName);
2378 kumpf 1.27     out << body;
2379 kumpf 1.29     _appendEMethodCallElementEnd(out);
2380                _appendSimpleExportReqElementEnd(out);
2381                _appendMessageElementEnd(out);
2382 kumpf 1.27 
2383                appendEMethodRequestHeader(
2384                    tmp,
2385 kumpf 1.50         requestUri,
2386 kumpf 1.27         host,
2387                    eMethodName,
2388                    authenticationHeader,
2389            	out.size());
2390                tmp << out;
2391 mike  1.24 
2392 kumpf 1.50     return tmp;
2393 mike  1.24 }
2394            
2395            //------------------------------------------------------------------------------
2396            //
2397 kumpf 1.27 // XmlWriter::formatSimpleEMethodRspMessage()
2398 mike  1.24 //
2399            //------------------------------------------------------------------------------
2400            
2401 kumpf 1.27 Array<Sint8> XmlWriter::formatSimpleEMethodRspMessage(
2402                const char* eMethodName,
2403 mike  1.24     const String& messageId,
2404                const Array<Sint8>& body)
2405            {
2406 kumpf 1.27     Array<Sint8> out;
2407                Array<Sint8> tmp;
2408            
2409 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2410                _appendSimpleExportRspElementBegin(out);
2411                _appendEMethodResponseElementBegin(out, eMethodName);
2412 kumpf 1.27     out << body;
2413 kumpf 1.29     _appendEMethodResponseElementEnd(out);
2414                _appendSimpleExportRspElementEnd(out);
2415                _appendMessageElementEnd(out);
2416 kumpf 1.28 
2417                appendEMethodResponseHeader(tmp, out.size());
2418                tmp << out;
2419            
2420                return tmp;
2421            }
2422            
2423            //------------------------------------------------------------------------------
2424            //
2425            // XmlWriter::formatSimpleEMethodErrorRspMessage()
2426            //
2427            //------------------------------------------------------------------------------
2428            
2429            Array<Sint8> XmlWriter::formatSimpleEMethodErrorRspMessage(
2430                const String& eMethodName,
2431                const String& messageId,
2432 kumpf 1.42     const CIMException& cimException)
2433 kumpf 1.28 {
2434                ArrayDestroyer<char> tmp1(eMethodName.allocateCString());
2435                Array<Sint8> out;
2436                Array<Sint8> tmp;
2437            
2438 kumpf 1.29     _appendMessageElementBegin(out, messageId);
2439                _appendSimpleExportRspElementBegin(out);
2440                _appendEMethodResponseElementBegin(out, tmp1.getPointer());
2441 kumpf 1.42     _appendErrorElement(out, cimException);
2442 kumpf 1.29     _appendEMethodResponseElementEnd(out);
2443                _appendSimpleExportRspElementEnd(out);
2444                _appendMessageElementEnd(out);
2445 kumpf 1.27 
2446                appendEMethodResponseHeader(tmp, out.size());
2447                tmp << out;
2448            
2449                return tmp;
2450 mike  1.24 }
2451            
2452            //------------------------------------------------------------------------------
2453            //
2454 kumpf 1.27 // _printAttributes()
2455 mike  1.24 //
2456            //------------------------------------------------------------------------------
2457            
2458 kumpf 1.27 static void _printAttributes(
2459                PEGASUS_STD(ostream)& os,
2460                const XmlAttribute* attributes,
2461                Uint32 attributeCount)
2462 mike  1.24 {
2463 kumpf 1.27     for (Uint32 i = 0; i < attributeCount; i++)
2464                {
2465            	os << attributes[i].name << "=";
2466            
2467            	os << '"';
2468            	_appendSpecial(os, attributes[i].value);
2469            	os << '"';
2470 mike  1.24 
2471 kumpf 1.27 	if (i + 1 != attributeCount)
2472            	    os << ' ';
2473                }
2474 mike  1.24 }
2475            
2476            //------------------------------------------------------------------------------
2477            //
2478 kumpf 1.27 // _indent()
2479 mike  1.24 //
2480            //------------------------------------------------------------------------------
2481            
2482 kumpf 1.27 static void _indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)
2483 mike  1.24 {
2484 kumpf 1.27     Uint32 n = level * indentChars;
2485            
2486                for (Uint32 i = 0; i < n; i++)
2487            	os << ' ';
2488 mike  1.24 }
2489            
2490            //------------------------------------------------------------------------------
2491            //
2492 kumpf 1.27 // indentedPrint()
2493 mike  1.24 //
2494            //------------------------------------------------------------------------------
2495            
2496 kumpf 1.27 void XmlWriter::indentedPrint(
2497                PEGASUS_STD(ostream)& os, 
2498                const char* text, 
2499                Uint32 indentChars)
2500 mike  1.24 {
2501 kumpf 1.27     char* tmp = strcpy(new char[strlen(text) + 1], text);
2502            
2503                XmlParser parser(tmp);
2504                XmlEntry entry;
2505                Stack<const char*> stack;
2506 kumpf 1.26 
2507 kumpf 1.27     while (parser.next(entry))
2508 kumpf 1.26     {
2509 kumpf 1.27 	switch (entry.type)
2510            	{
2511            	    case XmlEntry::XML_DECLARATION:
2512            	    {
2513            		_indent(os, stack.size(), indentChars);
2514            
2515            		os << "<?" << entry.text << " ";
2516            		_printAttributes(os, entry.attributes, entry.attributeCount);
2517            		os << "?>";
2518            		break;
2519            	    }
2520            
2521            	    case XmlEntry::START_TAG:
2522            	    {
2523            		_indent(os, stack.size(), indentChars);
2524            
2525            		os << "<" << entry.text;
2526            
2527            		if (entry.attributeCount)
2528            		    os << ' ';
2529            
2530 kumpf 1.27 		_printAttributes(os, entry.attributes, entry.attributeCount);
2531            		os << ">";
2532            		stack.push(entry.text);
2533            		break;
2534            	    }
2535            
2536            	    case XmlEntry::EMPTY_TAG:
2537            	    {
2538            		_indent(os, stack.size(), indentChars);
2539            
2540            		os << "<" << entry.text << " ";
2541            		_printAttributes(os, entry.attributes, entry.attributeCount);
2542            		os << "/>";
2543            		break;
2544            	    }
2545            
2546            	    case XmlEntry::END_TAG:
2547            	    {
2548            		if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)
2549            		    stack.pop();
2550            
2551 kumpf 1.27 		_indent(os, stack.size(), indentChars);
2552            
2553            		os << "</" << entry.text << ">";
2554            		break;
2555            	    }
2556            
2557            	    case XmlEntry::COMMENT:
2558            	    {
2559            
2560            		_indent(os, stack.size(), indentChars);
2561            		os << "<!--";
2562            		_appendSpecial(os, entry.text);
2563            		os << "-->";
2564            		break;
2565            	    }
2566            
2567            	    case XmlEntry::CONTENT:
2568            	    {
2569            		_indent(os, stack.size(), indentChars);
2570            		_appendSpecial(os, entry.text);
2571            		break;
2572 kumpf 1.27 	    }
2573            
2574            	    case XmlEntry::CDATA:
2575            	    {
2576            		_indent(os, stack.size(), indentChars);
2577            		os << "<![CDATA[...]]>";
2578            		break;
2579            	    }
2580            
2581            	    case XmlEntry::DOCTYPE:
2582            	    {
2583            		_indent(os, stack.size(), indentChars);
2584            		os << "<!DOCTYPE...>";
2585            		break;
2586            	    }
2587            	}
2588            
2589            	os << PEGASUS_STD(endl);
2590 kumpf 1.26     }
2591            
2592 kumpf 1.27     delete [] tmp;
2593 mike  1.24 }
2594            
2595            //------------------------------------------------------------------------------
2596            //
2597 kumpf 1.27 // XmlWriter::getNextMessageId()
2598 mike  1.24 //
2599            //------------------------------------------------------------------------------
2600            
2601 kumpf 1.27 String XmlWriter::getNextMessageId()
2602 mike  1.24 {
2603 kumpf 1.27     // ATTN: make thread-safe:
2604                static Uint32 messageId = 1000;
2605 mike  1.24 
2606 kumpf 1.27     messageId++;
2607 mike  1.24 
2608 kumpf 1.27     if (messageId < 1000)
2609            	messageId = 1001;
2610 mike  1.23 
2611 kumpf 1.27     char buffer[16];
2612                sprintf(buffer, "%d", messageId);
2613                return buffer;
2614 mike  1.23 }
2615            
2616            PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2