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

Diff for /pegasus/src/Pegasus/Common/XmlWriter.cpp between version 1.10 and 1.169.4.1

version 1.10, 2001/04/13 18:20:51 version 1.169.4.1, 2011/01/15 21:26:53
Line 1 
Line 1 
 //BEGIN_LICENSE  //%LICENSE////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000 The Open Group, BMC Software, Tivoli Systems, IBM  // Licensed to The Open Group (TOG) under one or more contributor license
   // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   // this work for additional information regarding copyright ownership.
   // Each contributor licenses this file to you under the OpenPegasus Open
   // Source License; you may not use this file except in compliance with the
   // License.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a // Permission is hereby granted, free of charge, to any person obtaining a
 // copy of this software and associated documentation files (the "Software"), // copy of this software and associated documentation files (the "Software"),
Line 9 
Line 14 
 // and/or sell copies of the Software, and to permit persons to whom the // and/or sell copies of the Software, and to permit persons to whom the
 // Software is furnished to do so, subject to the following conditions: // Software is furnished to do so, subject to the following conditions:
 // //
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  // The above copyright notice and this permission notice shall be included
 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  // in all copies or substantial portions of the Software.
 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL  
 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  
 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER  
 // DEALINGS IN THE SOFTWARE.  
 // //
 //END_LICENSE  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 //BEGIN_HISTORY  // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
   // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // //
 // Author:  //////////////////////////////////////////////////////////////////////////
 // //
 // $Log$  //%/////////////////////////////////////////////////////////////////////////////
 // Revision 1.10  2001/04/13 18:20:51  mike  
 // Ported so Solaris.  #include <Pegasus/Common/Config.h>
 // Fixed memory leaks.  #include <cstdlib>
   #include <cstdio>
   #include "Constants.h"
   #include "CIMClass.h"
   #include "CIMClassRep.h"
   #include "CIMInstance.h"
   #include "CIMInstanceRep.h"
   #include "CIMProperty.h"
   #include "CIMPropertyRep.h"
   #include "CIMMethod.h"
   #include "CIMMethodRep.h"
   #include "CIMParameter.h"
   #include "CIMParameterRep.h"
   #include "CIMParamValue.h"
   #include "CIMParamValueRep.h"
   #include "CIMQualifier.h"
   #include "CIMQualifierRep.h"
   #include "CIMQualifierDecl.h"
   #include "CIMQualifierDeclRep.h"
   #include "CIMValue.h"
   #include "XmlWriter.h"
   #include "Tracer.h"
   #include <Pegasus/Common/StatisticalData.h>
   #include "CommonUTF.h"
   #include "Buffer.h"
   #include "StrLit.h"
   #include "IDFactory.h"
   #include "StringConversion.h"
   
   PEGASUS_NAMESPACE_BEGIN
   
   //------------------------------------------------------------------------------
   //
   // appendLocalNameSpacePathElement()
 // //
 // Revision 1.9  2001/04/08 01:13:22  mike  //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
 // Changed "ConstCIM" to "CIMConst"  //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalNameSpacePathElement(
       Buffer& out,
       const CIMNamespaceName& nameSpace)
   {
       out << STRLIT("<LOCALNAMESPACEPATH>\n");
   
       char* nameSpaceCopy = strdup(nameSpace.getString().getCString());
   
   #if !defined(PEGASUS_COMPILER_MSVC) && !defined(PEGASUS_OS_ZOS)
       char *last;
       for (const char* p = strtok_r(nameSpaceCopy, "/", &last); p;
            p = strtok_r(NULL, "/", &last))
   #else
       for (const char* p = strtok(nameSpaceCopy, "/"); p; p = strtok(NULL, "/"))
   #endif
       {
           out << STRLIT("<NAMESPACE NAME=\"") << p << STRLIT("\"/>\n");
       }
       free(nameSpaceCopy);
   
       out << STRLIT("</LOCALNAMESPACEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
 // //
 // Revision 1.7  2001/02/20 07:25:57  mike  // appendNameSpacePathElement()
 // Added basic create-instance in repository and in client.  
 // //
 // Revision 1.6  2001/02/19 01:47:17  mike  //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
 // Renamed names of the form CIMConst to CIMConst.  
 // //
 // Revision 1.5  2001/02/18 03:56:01  mike  //------------------------------------------------------------------------------
 // Changed more class names (e.g., ConstClassDecl -> CIMConstClass)  
   void XmlWriter::appendNameSpacePathElement(
       Buffer& out,
       const String& host,
       const CIMNamespaceName& nameSpace)
   {
       out << STRLIT("<NAMESPACEPATH>\n"
                     "<HOST>") << host << STRLIT("</HOST>\n");
       appendLocalNameSpacePathElement(out, nameSpace);
       out << STRLIT("</NAMESPACEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
 // //
 // Revision 1.4  2001/02/16 02:06:07  mike  // appendClassNameElement()
 // Renamed many classes and headers.  
 // //
 // Revision 1.3  2001/01/31 08:20:51  mike  //     <!ELEMENT CLASSNAME EMPTY>
 // Added dispatcher framework.  //     <!ATTLIST CLASSNAME
 // Added enumerateInstanceNames.  //              %CIMName;>
 // //
 // Revision 1.2  2001/01/29 02:23:44  mike  //------------------------------------------------------------------------------
 // Added support for GetInstance operation  
   void XmlWriter::appendClassNameElement(
       Buffer& out,
       const CIMName& className)
   {
       out << STRLIT("<CLASSNAME NAME=\"") << className << STRLIT("\"/>\n");
   }
   
   //------------------------------------------------------------------------------
 // //
 // Revision 1.1.1.1  2001/01/14 19:53:36  mike  // appendInstanceNameElement()
 // Pegasus import  
 // //
   //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
   //    <!ATTLIST INSTANCENAME
   //              %ClassName;>
 // //
 //END_HISTORY  //------------------------------------------------------------------------------
  
 #include <cstdlib>  void XmlWriter::appendInstanceNameElement(
 #include <cstdio>      Buffer& out,
 #include "CIMClass.h"      const CIMObjectPath& instanceName)
 #include "CIMInstance.h"  {
 #include "CIMQualifierDecl.h"      out << STRLIT("<INSTANCENAME CLASSNAME=\"");
 #include "XmlWriter.h"      out << instanceName.getClassName() << STRLIT("\">\n");
 #include "XmlParser.h"  
  
 PEGASUS_NAMESPACE_BEGIN      const Array<CIMKeyBinding>& keyBindings = instanceName.getKeyBindings();
       for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
       {
           out << STRLIT("<KEYBINDING NAME=\"");
           out << keyBindings[i].getName() << STRLIT("\">\n");
   
           if (keyBindings[i].getType() == CIMKeyBinding::REFERENCE)
           {
               CIMObjectPath ref = keyBindings[i].getValue();
               appendValueReferenceElement(out, ref, true);
           }
           else
           {
               out << STRLIT("<KEYVALUE VALUETYPE=\"");
               out << keyBindingTypeToString(keyBindings[i].getType());
               out << STRLIT("\">");
   
               // fixed the special character problem - Markus
   
               appendSpecial(out, keyBindings[i].getValue());
               out << STRLIT("</KEYVALUE>\n");
           }
           out << STRLIT("</KEYBINDING>\n");
       }
       out << STRLIT("</INSTANCENAME>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassPathElement()
   //
   //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassPathElement(
       Buffer& out,
       const CIMObjectPath& classPath)
   {
       out << STRLIT("<CLASSPATH>\n");
       appendNameSpacePathElement(out,
                                  classPath.getHost(),
                                  classPath.getNameSpace());
       appendClassNameElement(out, classPath.getClassName());
       out << STRLIT("</CLASSPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstancePathElement()
   //
   //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstancePathElement(
       Buffer& out,
       const CIMObjectPath& instancePath)
   {
       out << STRLIT("<INSTANCEPATH>\n");
       appendNameSpacePathElement(out,
                                  instancePath.getHost(),
                                  instancePath.getNameSpace());
       appendInstanceNameElement(out, instancePath);
       out << STRLIT("</INSTANCEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalClassPathElement()
   //
   //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalClassPathElement(
       Buffer& out,
       const CIMObjectPath& classPath)
   {
       out << STRLIT("<LOCALCLASSPATH>\n");
       appendLocalNameSpacePathElement(out, classPath.getNameSpace());
       appendClassNameElement(out, classPath.getClassName());
       out << STRLIT("</LOCALCLASSPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalInstancePathElement()
   //
   //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalInstancePathElement(
       Buffer& out,
       const CIMObjectPath& instancePath)
   {
       out << STRLIT("<LOCALINSTANCEPATH>\n");
       appendLocalNameSpacePathElement(out, instancePath.getNameSpace());
       appendInstanceNameElement(out, instancePath);
       out << STRLIT("</LOCALINSTANCEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalObjectPathElement()
   //
   //     If the reference refers to an instance, write a LOCALINSTANCEPATH;
   //     otherwise write a LOCALCLASSPATH.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalObjectPathElement(
       Buffer& out,
       const CIMObjectPath& objectPath)
   {
       //
       //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class has no
       //  key bindings
       //
       if (objectPath.getKeyBindings ().size () != 0)
       {
           appendLocalInstancePathElement(out, objectPath);
       }
       else
       {
           appendLocalClassPathElement(out, objectPath);
       }
   }
   
   //------------------------------------------------------------------------------
   //
   // Helper functions for appendValueElement()
   //
   //------------------------------------------------------------------------------
   
   inline void _xmlWritter_appendValue(Buffer& out, Boolean x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint8 x)
   {
       XmlWriter::append(out, Uint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint8 x)
   {
       XmlWriter::append(out, Sint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint16 x)
   {
       XmlWriter::append(out, Uint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint16 x)
   {
       XmlWriter::append(out, Sint32(x));
   }
  
 inline void AppendChar(Array<Sint8>& out, Char16 c)  inline void _xmlWritter_appendValue(Buffer& out, Uint32 x)
 { {
     out.append(Sint8(c));      XmlWriter::append(out, x);
 } }
  
 inline void AppendSpecialChar(Array<Sint8>& out, Char16 c)  inline void _xmlWritter_appendValue(Buffer& out, Sint32 x)
 { {
     // ATTN-B: Only UTF-8 handled for now.      XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint64 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint64 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Real32 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Real64 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const Char16& x)
   {
       XmlWriter::appendSpecial(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const String& x)
   {
       XmlWriter::appendSpecial(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const CIMDateTime& x)
   {
       // It is not necessary to use XmlWriter::appendSpecial(), because
       // CIMDateTime values do not contain special characters.
       out << x.toString();
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const CIMObjectPath& x)
   {
       XmlWriter::appendValueReferenceElement(out, x, true);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const CIMObject& x)
   {
       String myStr = x.toString();
       _xmlWritter_appendValue(out, myStr);
   }
   
   void _xmlWritter_appendValueArray(
       Buffer& out, const CIMObjectPath* p, Uint32 size)
   {
       out << STRLIT("<VALUE.REFARRAY>\n");
       while (size--)
       {
           _xmlWritter_appendValue(out, *p++);
       }
       out << STRLIT("</VALUE.REFARRAY>\n");
   }
   
   template<class T>
   void _xmlWritter_appendValueArray(Buffer& out, const T* p, Uint32 size)
   {
       out << STRLIT("<VALUE.ARRAY>\n");
   
       while (size--)
       {
           out << STRLIT("<VALUE>");
           _xmlWritter_appendValue(out, *p++);
           out << STRLIT("</VALUE>\n");
       }
   
       out << STRLIT("</VALUE.ARRAY>\n");
   }
  
     switch (c)  //------------------------------------------------------------------------------
   //
   // appendValueElement()
   //
   //    <!ELEMENT VALUE (#PCDATA)>
   //    <!ELEMENT VALUE.ARRAY (VALUE*)>
   //    <!ELEMENT VALUE.REFERENCE
   //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueElement(
       Buffer& out,
       const CIMValue& value)
   {
       if (value.isNull())
       {
           return;
       }
       if (value.isArray())
       {
           switch (value.getType())
     {     {
         case '&':              case CIMTYPE_BOOLEAN:
             out.append("&amp;", 5);              {
                   Array<Boolean> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '<':              case CIMTYPE_UINT8:
             out.append("&lt;", 4);              {
                   Array<Uint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '>':              case CIMTYPE_SINT8:
             out.append("&gt;", 4);              {
                   Array<Sint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '"':              case CIMTYPE_UINT16:
             out.append("&quot;", 6);              {
                   Array<Uint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '\'':              case CIMTYPE_SINT16:
             out.append("&apos;", 6);              {
                   Array<Sint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         default:              case CIMTYPE_UINT32:
             out.append(Sint8(c));              {
                   Array<Uint32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT32:
               {
                   Array<Sint32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
     }     }
   
               case CIMTYPE_UINT64:
               {
                   Array<Uint64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Char16 x)              case CIMTYPE_SINT64:
 { {
     AppendChar(out, x);                  Array<Sint64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Uint32 x)              case CIMTYPE_REAL32:
 { {
     char buffer[32];                  Array<Real32> a;
     sprintf(buffer, "%d", x);                  value.get(a);
     append(out, buffer);                  _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const char* str)              case CIMTYPE_REAL64:
 { {
     while (*str)                  Array<Real64> a;
         AppendChar(out, *str++);                  value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)              case CIMTYPE_CHAR16:
 { {
     AppendSpecialChar(out, x);                  Array<Char16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, char x)              case CIMTYPE_STRING:
 { {
     AppendSpecialChar(out, Char16(x));                  const String* data;
                   Uint32 size;
                   value._get(data, size);
                   _xmlWritter_appendValueArray(out, data, size);
                   break;
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)              case CIMTYPE_DATETIME:
 { {
     while (*str)                  Array<CIMDateTime> a;
         AppendSpecialChar(out, *str++);                  value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)              case CIMTYPE_REFERENCE:
 { {
     const Char16* tmp = str.getData();                  Array<CIMObjectPath> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
  
     while (*tmp)              case CIMTYPE_OBJECT:
         AppendSpecialChar(out, *tmp++);              {
                   Array<CIMObject> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
               case CIMTYPE_INSTANCE:
               {
                   Array<CIMInstance> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
               default:
                   PEGASUS_ASSERT(false);
           }
       }
       else if (value.getType() == CIMTYPE_REFERENCE)
       {
           // Has to be separate because it uses VALUE.REFERENCE tag
           CIMObjectPath v;
           value.get(v);
           _xmlWritter_appendValue(out, v);
 } }
       else
       {
           out << STRLIT("<VALUE>");
  
 void XmlWriter::append(Array<Sint8>& out, const String& str)          switch (value.getType())
 { {
     const Char16* tmp = str.getData();              case CIMTYPE_BOOLEAN:
               {
                   Boolean v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
  
     while (*tmp)              case CIMTYPE_UINT8:
         AppendChar(out, *tmp++);              {
                   Uint8 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const Indentor& x)              case CIMTYPE_SINT8:
 { {
     for (Uint32 i = 0; i < 4 * x.getLevel(); i++)                  Sint8 v;
         out.append(' ');                  value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
 } }
  
 void XmlWriter::appendLocalNameSpaceElement(              case CIMTYPE_UINT16:
     Array<Sint8>& out,  
     const String& nameSpace)  
 { {
     out << "<LOCALNAMESPACEPATH>\n";                  Uint16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
  
     char* tmp = nameSpace.allocateCString();              case CIMTYPE_SINT16:
               {
                   Sint16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
  
     for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))              case CIMTYPE_UINT32:
     {     {
         out << "<NAMESPACE NAME=\"" << p << "\"/>\n";                  Uint32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
     }     }
  
     delete [] tmp;              case CIMTYPE_SINT32:
               {
                   Sint32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
  
     out << "</LOCALNAMESPACEPATH>\n";              case CIMTYPE_UINT64:
               {
                   Uint64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
 } }
  
 static inline void AppendSpecialChar(std::ostream& os, char c)              case CIMTYPE_SINT64:
 { {
     switch (c)                  Sint64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_REAL32:
     {     {
         case '&':                  Real32 v;
             os << "&amp;";                  value.get(v);
                   _xmlWritter_appendValue(out, v);
             break;             break;
               }
  
         case '<':              case CIMTYPE_REAL64:
             os << "&lt;";              {
                   Real64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
             break;             break;
               }
  
         case '>':              case CIMTYPE_CHAR16:
             os << "&gt;";              {
                   Char16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
             break;             break;
               }
  
         case '"':              case CIMTYPE_STRING:
             os << "&quot;";              {
                   String v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
             break;             break;
               }
  
         case '\'':              case CIMTYPE_DATETIME:
             os << "&apos;";              {
                   CIMDateTime v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
             break;             break;
               }
  
               case CIMTYPE_OBJECT:
               {
                   CIMObject v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
               case CIMTYPE_INSTANCE:
               {
                   CIMInstance v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
         default:         default:
             os << c;                  PEGASUS_ASSERT(false);
           }
   
           out << STRLIT("</VALUE>\n");
     }     }
 } }
  
 static inline void AppendSpecial(std::ostream& os, const char* str)  void XmlWriter::printValueElement(
       const CIMValue& value,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendValueElement(tmp, value);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueObjectWithPathElement()
   //
   //     <!ELEMENT VALUE.OBJECTWITHPATH
   //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueObjectWithPathElement(
       Buffer& out,
       const CIMObject& objectWithPath)
   {
       out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
   
       appendValueReferenceElement(out, objectWithPath.getPath (), false);
       appendObjectElement(out, objectWithPath);
   
       out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueReferenceElement()
   //
   //    <!ELEMENT VALUE.REFERENCE
   //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueReferenceElement(
       Buffer& out,
       const CIMObjectPath& reference,
       Boolean putValueWrapper)
   {
       if (putValueWrapper)
           out << STRLIT("<VALUE.REFERENCE>\n");
   
       // See if it is a class or instance reference (instance references have
       // key-bindings; class references do not).
       //
       //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class has no
       //  key bindings
       //
   
       const Array<CIMKeyBinding>& kbs = reference.getKeyBindings();
   
       if (kbs.size())
       {
           if (reference.getHost().size())
           {
               appendInstancePathElement(out, reference);
           }
           else if (!reference.getNameSpace().isNull())
           {
               appendLocalInstancePathElement(out, reference);
           }
           else
           {
               appendInstanceNameElement(out, reference);
           }
       }
       else
       {
           if (reference.getHost().size())
           {
               appendClassPathElement(out, reference);
           }
           else if (!reference.getNameSpace().isNull())
           {
               appendLocalClassPathElement(out, reference);
           }
           else
           {
               appendClassNameElement(out, reference.getClassName());
           }
       }
   
       if (putValueWrapper)
           out << STRLIT("</VALUE.REFERENCE>\n");
   }
   
   void XmlWriter::printValueReferenceElement(
       const CIMObjectPath& reference,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendValueReferenceElement(tmp, reference, true);
       indentedPrint(os, tmp.getData());
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueNamedInstanceElement()
   //
   //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueNamedInstanceElement(
       Buffer& out,
       const CIMInstance& namedInstance)
   {
       out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
   
       appendInstanceNameElement(out, namedInstance.getPath ());
       appendInstanceElement(out, namedInstance);
   
       out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
   }
   
   //EXP_PULL
   //------------------------------------------------------------------------------
   //
   // appendValueInstanceWithPathElement()
   //
   //     <!ELEMENT VALUE.INSTANCEWITHPATH (INSTANCEPATH,INSTANCE)>
   //
   //------------------------------------------------------------------------------
   // EXP_PULL_TBD checkout the INSTANCEPATH vs NAMEDINSTANCE
   void XmlWriter::appendValueInstanceWithPathElement(
       Buffer& out,
       const CIMInstance& namedInstance)
   {
       out << STRLIT("<VALUE.INSTANCEWITHPATH>\n");
   
       appendInstancePathElement(out, namedInstance.getPath ());
       appendInstanceElement(out, namedInstance);
   
       out << STRLIT("</VALUE.INSTANCEWITHPATH>\n");
   }
   //EXP_PULL_END
   //------------------------------------------------------------------------------
   //
   // appendClassElement()
   //
   //     <!ELEMENT CLASS
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
   //     <!ATTLIST CLASS
   //         %CIMName;
   //         %SuperClass;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassElement(
       Buffer& out,
       const CIMConstClass& cimClass)
   {
       CheckRep(cimClass._rep);
       const CIMClassRep* rep = cimClass._rep;
   
       // Class opening element:
   
       out << STRLIT("<CLASS NAME=\"")
           << rep->getClassName()
           << STRLIT("\" ");
   
       if (!rep->getSuperClassName().isNull())
       {
           out << STRLIT(" SUPERCLASS=\"")
               << rep->getSuperClassName()
               << STRLIT("\" ");
       }
   
       out << STRLIT(">\n");
   
       // Append Class Qualifiers:
   
       for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
           XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
       // Append Property definitions:
   
       for (Uint32 i = 0, n = rep->getPropertyCount(); i < n; i++)
           XmlWriter::appendPropertyElement(out, rep->getProperty(i));
   
       // Append Method definitions:
   
       for (Uint32 i = 0, n = rep->getMethodCount(); i < n; i++)
           XmlWriter::appendMethodElement(out, rep->getMethod(i));
   
       // Class closing element:
   
       out << STRLIT("</CLASS>\n");
   }
   
   void XmlWriter::printClassElement(
       const CIMConstClass& cimclass,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendClassElement(tmp, cimclass);
       indentedPrint(os, tmp.getData(), 4);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceElement()
   //
   //     <!ELEMENT INSTANCE
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
   //     <!ATTLIST INSTANCE
   //         %ClassName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceElement(
       Buffer& out,
       const CIMConstInstance& instance)
   {
       CheckRep(instance._rep);
       const CIMInstanceRep* rep = instance._rep;
   
       // Class opening element:
   
       out << STRLIT("<INSTANCE CLASSNAME=\"")
           << rep->getClassName()
           << STRLIT("\" >\n");
   
       // Append Instance Qualifiers:
   
       for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
           XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
       // Append Properties:
   
       for (Uint32 i = 0, n = rep->getPropertyCount(); i < n; i++)
           XmlWriter::appendPropertyElement(out, rep->getProperty(i));
   
       // Instance closing element:
   
       out << STRLIT("</INSTANCE>\n");
   }
   
   void XmlWriter::printInstanceElement(
       const CIMConstInstance& instance,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendInstanceElement(tmp, instance);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendObjectElement()
   //
   // May refer to a CLASS or an INSTANCE
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendObjectElement(
       Buffer& out,
       const CIMConstObject& object)
   {
       if (object.isClass())
       {
           CIMConstClass c(object);
           appendClassElement(out, c);
       }
       else if (object.isInstance())
       {
           CIMConstInstance i(object);
           appendInstanceElement(out, i);
       }
       // else PEGASUS_ASSERT(0);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendPropertyElement()
   //
   //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
   //     <!ATTLIST PROPERTY
   //              %CIMName;
   //              %CIMType;           #REQUIRED
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
   //     <!ATTLIST PROPERTY.ARRAY
   //              %CIMName;
   //              %CIMType;           #REQUIRED
   //              %ArraySize;
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
   //     <!ATTLIST PROPERTY.REFERENCE
   //              %CIMName;
   //              %ReferenceClass;
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendPropertyElement(
       Buffer& out,
       const CIMConstProperty& property)
   {
       CheckRep(property._rep);
       const CIMPropertyRep* rep = property._rep;
   
       if (rep->getValue().isArray())
       {
           out << STRLIT("<PROPERTY.ARRAY NAME=\"")
               << rep->getName()
               << STRLIT("\" ");
   
           if (rep->getValue().getType() == CIMTYPE_OBJECT)
           {
               // If the property array type is CIMObject, then
               //     encode the property in CIM-XML as a string array with the
               //     EmbeddedObject attribute (there is not currently a CIM-XML
               //     "object" datatype)
   
               Array<CIMObject> a;
               rep->getValue().get(a);
               out << STRLIT(" TYPE=\"string\"");
               // If the Embedded Object is an instance, always add the
               // EmbeddedObject attribute.
               if (a.size() > 0 && a[0].isInstance())
               {
                   out << STRLIT(" EmbeddedObject=\"object\""
                                 " EMBEDDEDOBJECT=\"object\"");
               }
   #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
               else
   #endif
               {
                   // Else the Embedded Object is a class, always add the
                   // EmbeddedObject qualifier.  Note that if the macro
                   // PEGASUS_SNIA_INTEROP_COMPATIBILITY is defined, then
                   // the EmbeddedObject qualifier will always be added,
                   // whether it's a class or an instance.
                   if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT) ==
                           PEG_NOT_FOUND)
                   {
                       // Note that addQualifiers() cannot be called on a const
                       // CIMQualifierRep.  In this case we really do want to add
                       // the EmbeddedObject qualifier, so we cast away the
                       // constness.
                       CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
                       tmpRep->addQualifier(
                           CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
                                        true));
                   }
               }
           }
           else if (rep->getValue().getType() == CIMTYPE_INSTANCE)
           {
               // If the property array type is CIMInstance, then
               //   encode the property in CIM-XML as a string array with the
               //   EmbeddedObject attribute (there is not currently a CIM-XML
               //   "instance" datatype)
   
               Array<CIMInstance> a;
               rep->getValue().get(a);
               out << STRLIT(" TYPE=\"string\"");
   
               // add the EmbeddedObject attribute
               if (a.size() > 0)
               {
                   out << STRLIT(" EmbeddedObject=\"instance\""
                                 " EMBEDDEDOBJECT=\"instance\"");
   
                   // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY is
                   // defined, then the EmbeddedInstance qualifier will be added
   # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
                   if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE ==
                           PEG_NOT_FOUND)
                   {
                       // Note that addQualifiers() cannot be called on a const
                       // CIMQualifierRep.  In this case we really do want to add
                       // the EmbeddedInstance qualifier, so we cast away the
                       // constness.
   
                       // For now, we assume that all the embedded instances in
                       // the array are of the same type
                       CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
                       tmpRep->addQualifier(CIMQualifier(
                           PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
                           a[0].getClassName().getString()));
                   }
   # endif
               }
           }
           else
           {
               out.append(' ');
               out << xmlWriterTypeStrings(rep->getValue().getType());
           }
   
           if (rep->getArraySize())
           {
               char buffer[32];
               sprintf(buffer, "%u", rep->getArraySize());
               out << STRLIT(" ARRAYSIZE=\"") << buffer;
               out.append('"');
           }
   
           if (!rep->getClassOrigin().isNull())
           {
               out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
               out.append('"');
           }
   
           if (rep->getPropagated())
           {
               out << STRLIT(" PROPAGATED=\"true\"");
           }
   
           out << STRLIT(">\n");
   
           for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
               XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
           XmlWriter::appendValueElement(out, rep->getValue());
   
           out << STRLIT("</PROPERTY.ARRAY>\n");
       }
       else if (rep->getValue().getType() == CIMTYPE_REFERENCE)
       {
           out << STRLIT("<PROPERTY.REFERENCE"
                         " NAME=\"") << rep->getName() << STRLIT("\" ");
   
           if (!rep->getReferenceClassName().isNull())
           {
               out << STRLIT(" REFERENCECLASS=\"") << rep->getReferenceClassName();
               out.append('"');
           }
   
           if (!rep->getClassOrigin().isNull())
           {
               out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
               out.append('"');
           }
   
           if (rep->getPropagated())
           {
               out << STRLIT(" PROPAGATED=\"true\"");
           }
   
           out << STRLIT(">\n");
   
           for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
               XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
           XmlWriter::appendValueElement(out, rep->getValue());
   
           out << STRLIT("</PROPERTY.REFERENCE>\n");
       }
       else
       {
           out << STRLIT("<PROPERTY NAME=\"") << rep->getName() << STRLIT("\" ");
   
           if (!rep->getClassOrigin().isNull())
           {
               out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
               out.append('"');
           }
   
           if (rep->getPropagated())
           {
               out << STRLIT(" PROPAGATED=\"true\"");
           }
   
           if (rep->getValue().getType() == CIMTYPE_OBJECT)
           {
               // If the property type is CIMObject, then
               //   encode the property in CIM-XML as a string with the
               //   EmbeddedObject attribute (there is not currently a CIM-XML
               //   "object" datatype)
   
               CIMObject a;
               rep->getValue().get(a);
               out << STRLIT(" TYPE=\"string\"");
   
               // If the Embedded Object is an instance, always add the
               // EmbeddedObject attribute.
               if (a.isInstance())
               {
                   out << STRLIT(" EmbeddedObject=\"object\""
                                 " EMBEDDEDOBJECT=\"object\"");
               }
               // Else the Embedded Object is a class, always add the
               // EmbeddedObject qualifier.
   #ifndef PEGASUS_SNIA_INTEROP_COMPATIBILITY
               else
   #endif
               {
                   // Note that if the macro PEGASUS_SNIA_INTEROP_COMPATIBILITY
                   // is defined, then the EmbeddedObject qualifier will always
                   // be added, whether it's a class or an instance.
                   if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT) ==
                           PEG_NOT_FOUND)
                   {
                       // Note that addQualifiers() cannot be called on a const
                       // CIMQualifierRep.  In this case we really do want to add
                       // the EmbeddedObject qualifier, so we cast away the
                       // constness.
                       CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
                       tmpRep->addQualifier(
                           CIMQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT,
                                        true));
                   }
               }
           }
           else if (rep->getValue().getType() == CIMTYPE_INSTANCE)
           {
               CIMInstance a;
               rep->getValue().get(a);
               out << STRLIT(" TYPE=\"string\""
                             " EmbeddedObject=\"instance\""
                             " EMBEDDEDOBJECT=\"instance\"");
   
   # ifdef PEGASUS_SNIA_INTEROP_COMPATIBILITY
               if (rep->findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT)
                   == PEG_NOT_FOUND)
               {
                   // Note that addQualifiers() cannot be called on a const
                   // CIMQualifierRep.  In this case we really do want to add
                   // the EmbeddedInstance qualifier, so we cast away the
                   // constness.
                   CIMPropertyRep* tmpRep = const_cast<CIMPropertyRep*>(rep);
                   tmpRep->addQualifier(CIMQualifier(
                       PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE,
                       a.getClassName().getString()));
               }
   # endif
           }
           else
           {
               out.append(' ');
               out << xmlWriterTypeStrings(rep->getValue().getType());
           }
   
           out << STRLIT(">\n");
   
           for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
               XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
           XmlWriter::appendValueElement(out, rep->getValue());
   
           out << STRLIT("</PROPERTY>\n");
       }
   }
   
   void XmlWriter::printPropertyElement(
       const CIMConstProperty& property,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendPropertyElement(tmp, property);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendMethodElement()
   //
   //     <!ELEMENT METHOD (QUALIFIER*,
   //         (PARAMETER|PARAMETER.REFERENCE|PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
   //     <!ATTLIST METHOD
   //              %CIMName;
   //              %CIMType;          #IMPLIED
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendMethodElement(
       Buffer& out,
       const CIMConstMethod& method)
   {
       CheckRep(method._rep);
       const CIMMethodRep* rep = method._rep;
   
       out << STRLIT("<METHOD NAME=\"") << rep->getName();
       out << STRLIT("\" ");
   
       out << xmlWriterTypeStrings(rep->getType());
   
       if (!rep->getClassOrigin().isNull())
       {
           out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
           out.append('"');
       }
   
       if (rep->getPropagated())
       {
           out << STRLIT(" PROPAGATED=\"true\"");
       }
   
       out << STRLIT(">\n");
   
       for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
           XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
       for (Uint32 i = 0, n = rep->getParameterCount(); i < n; i++)
           XmlWriter::appendParameterElement(out, rep->getParameter(i));
   
       out << STRLIT("</METHOD>\n");
   }
   
   void XmlWriter::printMethodElement(
       const CIMConstMethod& method,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendMethodElement(tmp, method);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendParameterElement()
   //
   //     <!ELEMENT PARAMETER (QUALIFIER*)>
   //     <!ATTLIST PARAMETER
   //              %CIMName;
   //              %CIMType;      #REQUIRED>
   //
   //     <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
   //     <!ATTLIST PARAMETER.REFERENCE
   //              %CIMName;
   //              %ReferenceClass;>
   //
   //     <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
   //     <!ATTLIST PARAMETER.ARRAY
   //              %CIMName;
   //              %CIMType;           #REQUIRED
   //              %ArraySize;>
   //
   //     <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
   //     <!ATTLIST PARAMETER.REFARRAY
   //              %CIMName;
   //              %ReferenceClass;
   //              %ArraySize;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendParameterElement(
       Buffer& out,
       const CIMConstParameter& parameter)
   {
       CheckRep(parameter._rep);
       const CIMParameterRep* rep = parameter._rep;
   
       if (rep->isArray())
       {
           if (rep->getType() == CIMTYPE_REFERENCE)
           {
               out << STRLIT("<PARAMETER.REFARRAY NAME=\"") << rep->getName();
               out.append('"');
   
               if (!rep->getReferenceClassName().isNull())
               {
                   out << STRLIT(" REFERENCECLASS=\"");
                   out << rep->getReferenceClassName().getString();
                   out.append('"');
               }
   
               if (rep->getArraySize())
               {
                   char buffer[32];
                   int n = sprintf(buffer, "%u", rep->getArraySize());
                   out << STRLIT(" ARRAYSIZE=\"");
                   out.append(buffer, n);
                   out.append('"');
               }
   
               out << STRLIT(">\n");
   
               for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
                   XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
               out << STRLIT("</PARAMETER.REFARRAY>\n");
           }
           else
           {
               out << STRLIT("<PARAMETER.ARRAY"
                             " NAME=\"") << rep->getName();
               out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getType());
   
               if (rep->getArraySize())
               {
                   char buffer[32];
                   sprintf(buffer, "%u", rep->getArraySize());
                   out << STRLIT(" ARRAYSIZE=\"") << buffer;
                   out.append('"');
               }
   
               out << STRLIT(">\n");
   
               for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
                   XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
               out << STRLIT("</PARAMETER.ARRAY>\n");
           }
       }
       else if (rep->getType() == CIMTYPE_REFERENCE)
       {
           out << STRLIT("<PARAMETER.REFERENCE"
                         " NAME=\"") << rep->getName();
           out.append('"');
   
           if (!rep->getReferenceClassName().isNull())
           {
               out << STRLIT(" REFERENCECLASS=\"");
               out << rep->getReferenceClassName().getString();
               out.append('"');
           }
           out << STRLIT(">\n");
   
           for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
               XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
           out << STRLIT("</PARAMETER.REFERENCE>\n");
       }
       else
       {
           out << STRLIT("<PARAMETER"
                         " NAME=\"") << rep->getName();
           out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getType());
   
           out << STRLIT(">\n");
   
           for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
               XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
           out << STRLIT("</PARAMETER>\n");
       }
   }
   
   void XmlWriter::printParameterElement(
       const CIMConstParameter& parameter,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendParameterElement(tmp, parameter);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendParamValueElement()
   //
   //     <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
   //     <!ATTLIST PARAMVALUE
   //         %CIMName;
   //         %EmbeddedObject; #IMPLIED
   //         %ParamType;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendParamValueElement(
       Buffer& out,
       const CIMParamValue& paramValue)
   {
       CheckRep(paramValue._rep);
       const CIMParamValueRep* rep = paramValue._rep;
   
       out << STRLIT("<PARAMVALUE NAME=\"") << rep->getParameterName();
       out.append('"');
   
       CIMType type = rep->getValue().getType();
   
       if (rep->isTyped())
       {
           XmlWriter::appendParamTypeAndEmbeddedObjAttrib(out, type);
       }
   
       out << STRLIT(">\n");
       XmlWriter::appendValueElement(out, rep->getValue());
   
       out << STRLIT("</PARAMVALUE>\n");
   }
   
   void XmlWriter::printParamValueElement(
       const CIMParamValue& paramValue,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendParamValueElement(tmp, paramValue);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierElement()
   //
   //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
   //     <!ATTLIST QUALIFIER
   //              %CIMName;
   //              %CIMType;               #REQUIRED
   //              %Propagated;
   //              %QualifierFlavor;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierElement(
       Buffer& out,
       const CIMConstQualifier& qualifier)
   {
       CheckRep(qualifier._rep);
       const CIMQualifierRep* rep = qualifier._rep;
   
       out << STRLIT("<QUALIFIER NAME=\"") << rep->getName();
       out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getValue().getType());
   
       if (rep->getPropagated())
       {
           out << STRLIT(" PROPAGATED=\"true\"");
       }
   
       XmlWriter::appendQualifierFlavorEntity(out, rep->getFlavor());
   
       out << STRLIT(">\n");
   
       XmlWriter::appendValueElement(out, rep->getValue());
   
       out << STRLIT("</QUALIFIER>\n");
   }
   
   void XmlWriter::printQualifierElement(
       const CIMConstQualifier& qualifier,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendQualifierElement(tmp, qualifier);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierDeclElement()
   //
   //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
   //     <!ATTLIST QUALIFIER.DECLARATION
   //              %CIMName;
   //              %CIMType;                       #REQUIRED
   //              ISARRAY        (true|false)     #IMPLIED
   //              %ArraySize;
   //              %QualifierFlavor;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierDeclElement(
       Buffer& out,
       const CIMConstQualifierDecl& qualifierDecl)
   {
       CheckRep(qualifierDecl._rep);
       const CIMQualifierDeclRep* rep = qualifierDecl._rep;
   
       out << STRLIT("<QUALIFIER.DECLARATION NAME=\"") << rep->getName();
       out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getValue().getType());
   
       if (rep->getValue().isArray())
       {
           out << STRLIT(" ISARRAY=\"true\"");
   
           if (rep->getArraySize())
           {
               char buffer[64];
               int n = sprintf(buffer, " ARRAYSIZE=\"%u\"", rep->getArraySize());
               out.append(buffer, n);
           }
       }
   
       XmlWriter::appendQualifierFlavorEntity(out, rep->getFlavor());
   
       out << STRLIT(">\n");
   
       XmlWriter::appendScopeElement(out, rep->getScope());
       XmlWriter::appendValueElement(out, rep->getValue());
   
       out << STRLIT("</QUALIFIER.DECLARATION>\n");
   }
   
   void XmlWriter::printQualifierDeclElement(
       const CIMConstQualifierDecl& qualifierDecl,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendQualifierDeclElement(tmp, qualifierDecl);
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierFlavorEntity()
   //
   //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
   //                                 TOSUBCLASS   (true|false)   'true'
   //                                 TOINSTANCE   (true|false)   'false'
   //                                 TRANSLATABLE (true|false)   'false'">
   //
   //     DEPRECATION NOTE:  The attribute TOINSTANCE is DEPRECATED and MAY be
   //     removed from the QualifierFlavor entity in a future version of this
   //     document.  Use of this qualifier is discouraged.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierFlavorEntity(
       Buffer& out,
       const CIMFlavor & flavor)
   {
       if (!(flavor.hasFlavor (CIMFlavor::OVERRIDABLE)))
           out << STRLIT(" OVERRIDABLE=\"false\"");
   
       if (!(flavor.hasFlavor (CIMFlavor::TOSUBCLASS)))
           out << STRLIT(" TOSUBCLASS=\"false\"");
   
       //if (flavor.hasFlavor (CIMFlavor::TOINSTANCE))
       //    out << STRLIT(" TOINSTANCE=\"true\"");
   
       if (flavor.hasFlavor (CIMFlavor::TRANSLATABLE))
           out << STRLIT(" TRANSLATABLE=\"true\"");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendScopeElement()
   //
   //     <!ELEMENT SCOPE EMPTY>
   //     <!ATTLIST SCOPE
   //              CLASS        (true|false)      'false'
   //              ASSOCIATION  (true|false)      'false'
   //              REFERENCE    (true|false)      'false'
   //              PROPERTY     (true|false)      'false'
   //              METHOD       (true|false)      'false'
   //              PARAMETER    (true|false)      'false'
   //              INDICATION   (true|false)      'false'>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendScopeElement(
       Buffer& out,
       const CIMScope & scope)
   {
       if (!(scope.equal (CIMScope ())))
       {
           out << STRLIT("<SCOPE");
   
           if (scope.hasScope (CIMScope::CLASS))
               out << STRLIT(" CLASS=\"true\"");
   
           if (scope.hasScope (CIMScope::ASSOCIATION))
               out << STRLIT(" ASSOCIATION=\"true\"");
   
           if (scope.hasScope (CIMScope::REFERENCE))
               out << STRLIT(" REFERENCE=\"true\"");
   
           if (scope.hasScope (CIMScope::PROPERTY))
               out << STRLIT(" PROPERTY=\"true\"");
   
           if (scope.hasScope (CIMScope::METHOD))
               out << STRLIT(" METHOD=\"true\"");
   
           if (scope.hasScope (CIMScope::PARAMETER))
               out << STRLIT(" PARAMETER=\"true\"");
   
           if (scope.hasScope (CIMScope::INDICATION))
               out << STRLIT(" INDICATION=\"true\"");
   
           out << STRLIT("/>");
       }
   }
   
   // l10n - added content language and accept language support to
   // the header methods below
   
   //------------------------------------------------------------------------------
   //
   // appendMethodCallHeader()
   //
   //     Build HTTP method call request header.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendMethodCallHeader(
       Buffer& out,
       const char* host,
       const CIMName& cimMethod,
       const String& cimObject,
       const String& authenticationHeader,
       HttpMethod httpMethod,
       const AcceptLanguageList& acceptLanguages,
       const ContentLanguageList& contentLanguages,
       Uint32 contentLength,
       bool binaryRequest,
       bool binaryResponse)
   {
       char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
       // ATTN: KS 20020926 - Temporary change to issue only POST. This may
       // be changed in the DMTF CIM Operations standard in the future.
       // If we kept M-Post we would have to retry with Post. Does not
       // do that in client today. Permanent change is to retry until spec
       // updated. This change is temp to finish tests or until the retry
       // installed.  Required because of change to wbemservices cimom
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("M-POST /cimom HTTP/1.1\r\n");
       }
       else
       {
           out << STRLIT("POST /cimom HTTP/1.1\r\n");
       }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n");
   
       if (binaryRequest)
       {
           // Tell the server that the payload is encoded in the OpenPegasus
           // binary protocol.
           out << STRLIT("Content-Type: application/x-openpegasus\r\n");
       }
       else
       {
           out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
       }
   
       if (binaryResponse)
       {
           // Tell the server that this client accepts the OpenPegasus binary
           // protocol.
           out << STRLIT("Accept: application/x-openpegasus\r\n");
       }
   
       OUTPUT_CONTENTLENGTH(out, contentLength);
       if (acceptLanguages.size() > 0)
       {
           out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
       }
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages <<
               STRLIT("\r\n");
       }
   
   #ifdef PEGASUS_DEBUG
       // backdoor environment variable to turn OFF client requesting transfer
       // encoding. The default is on. to turn off, set this variable to zero.
       // This should be removed when stable. This should only be turned off in
       // a debugging/testing environment.
   
       static const char *clientTransferEncodingOff =
           getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
   
       // EXP_PULL_TEMP DELETE
       // KS_TODO - Remove this. Temp to insure no chunking during testing
       //  if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
   #endif
   
       // EXP_PULL TEMP DELETE out << STRLIT("TE: chunked, trailers\r\n");
   
       if (!binaryResponse)
       {
           // The binary protocol does not allow chunking.
           out << STRLIT("TE: chunked, trailers\r\n");
       }
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMOperation: MethodCall\r\n");
           out << nn << STRLIT("-CIMMethod: ")
               << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << nn << STRLIT("-CIMObject: ")
               << encodeURICharacters(cimObject) << STRLIT("\r\n");
       }
       else
       {
           out << STRLIT("CIMOperation: MethodCall\r\n");
           out << STRLIT("CIMMethod: ")
               << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << STRLIT("CIMObject: ") << encodeURICharacters(cimObject)
               << STRLIT("\r\n");
       }
   
       if (authenticationHeader.size())
       {
           out << authenticationHeader << STRLIT("\r\n");
       }
   
       out << STRLIT("\r\n");
   }
   
   
   void XmlWriter::appendMethodResponseHeader(
        Buffer& out,
        HttpMethod httpMethod,
        const ContentLanguageList& contentLanguages,
        Uint32 contentLength,
        Uint64 serverResponseTime,
        bool binaryResponse)
   {
       // Optimize the typical case for binary messages, circumventing the
       // more expensive logic below.
       if (binaryResponse &&
           contentLength == 0 &&
           httpMethod != HTTP_METHOD_M_POST &&
           contentLanguages.size() == 0)
       {
           static const char HEADERS[] =
               "HTTP/1.1 200 OK\r\n"
               "Content-Type: application/x-openpegasus\r\n"
               "content-length: 0000000000\r\n"
               "CIMOperation: MethodResponse\r\n"
               "\r\n";
   
           // The HTTP processor fills in the content-length value later.
           // It searches for a field matching "content-length" (so the first
           // character must be lower case).
           out.append(HEADERS, sizeof(HEADERS) - 1);
           return;
       }
   
        out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
   
   #ifndef PEGASUS_DISABLE_PERFINST
        if (StatisticalData::current()->copyGSD)
        {
            out << STRLIT("WBEMServerResponseTime: ") <<
                CIMValue(serverResponseTime).toString() << STRLIT("\r\n");
        }
   #endif
   
        if (binaryResponse)
        {
           // According to MIME RFC, the "x-" prefix should be used for all
           // non-registered values.
            out << STRLIT("Content-Type: application/x-openpegasus\r\n");
        }
        else
        {
            out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
        }
   
        OUTPUT_CONTENTLENGTH(out, contentLength);
   
        if (contentLanguages.size() > 0)
        {
            out << STRLIT("Content-Language: ") << contentLanguages <<
                STRLIT("\r\n");
        }
        if (httpMethod == HTTP_METHOD_M_POST)
        {
            char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
            out << STRLIT("Ext:\r\n"
                          "Cache-Control: no-cache\r\n"
                          "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
            out << nn << STRLIT("\r\n");
            out << nn << STRLIT("-CIMOperation: MethodResponse\r\n\r\n");
        }
        else
        {
            out << STRLIT("CIMOperation: MethodResponse\r\n\r\n");
        }
   }
   
   
   //------------------------------------------------------------------------------
   //
   // appendHttpErrorResponseHeader()
   //
   //     Build HTTP error response header.
   //
   //     Returns error response message in the following format:
   //
   //        HTTP/1.1 400 Bad Request       (using specified status code)
   //        CIMError: <error type>         (if specified by caller)
   //        PGErrorDetail: <error text>    (if specified by caller)
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendHttpErrorResponseHeader(
       Buffer& out,
       const String& status,
       const String& cimError,
       const String& errorDetail)
   {
       out << STRLIT("HTTP/1.1 ") << status << STRLIT("\r\n");
       if (cimError != String::EMPTY)
       {
           out << STRLIT("CIMError: ") << cimError << STRLIT("\r\n");
       }
       if (errorDetail != String::EMPTY)
       {
           out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
               << encodeURICharacters(errorDetail) << STRLIT("\r\n");
       }
       out << STRLIT("\r\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendUnauthorizedResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
   //
   //     Returns unauthorized message in the following format:
   //
   //        HTTP/1.1 401 Unauthorized
   //        WWW-Authenticate: Basic realm="HostName"
   //        <HTML><HEAD>
   //        <TITLE>401 Unauthorized</TITLE>
   //        </HEAD><BODY BGCOLOR="#99cc99">
   //        <H2>TEST401 Unauthorized</H2>
   //        <HR>
   //        </BODY></HTML>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendUnauthorizedResponseHeader(
       Buffer& out,
       const String& content)
   {
       out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n");
       OUTPUT_CONTENTLENGTH(out, 0);
       out << content << STRLIT("\r\n\r\n");
   
   //ATTN: We may need to include the following line, so that the browsers
   //      can display the error message.
   //    out << "<HTML><HEAD>\r\n";
   //    out << "<TITLE>" << "401 Unauthorized" <<  "</TITLE>\r\n";
   //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
   //    out << "<H2>TEST" << "401 Unauthorized" << "</H2>\r\n";
   //    out << "<HR>\r\n";
   //    out << "</BODY></HTML>\r\n";
   }
   
   #ifdef PEGASUS_KERBEROS_AUTHENTICATION
   //------------------------------------------------------------------------------
   //
   // appendOKResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
   //
   //     Returns OK message in the following format:
   //
   //        HTTP/1.1 200 OK
   //        Content-Length: 0
   //        WWW-Authenticate: Negotiate "token"
   //        <HTML><HEAD>
   //        <TITLE>200 OK</TITLE>
   //        </HEAD><BODY BGCOLOR="#99cc99">
   //        <H2>TEST200 OK</H2>
   //        <HR>
   //        </BODY></HTML>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendOKResponseHeader(
       Buffer& out,
       const String& content)
   {
       out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
       // Content-Length header needs to be added because 200 OK record
       // is usually intended to have content.  But, for Kerberos this
       // may not always be the case so we need to indicate that there
       // is no content
       OUTPUT_CONTENTLENGTH(out, 0);
       out << content << STRLIT("\r\n\r\n");
   
   //ATTN: We may need to include the following line, so that the browsers
   //      can display the error message.
   //    out << "<HTML><HEAD>\r\n";
   //    out << "<TITLE>" << "200 OK" <<  "</TITLE>\r\n";
   //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
   //    out << "<H2>TEST" << "200 OK" << "</H2>\r\n";
   //    out << "<HR>\r\n";
   //    out << "</BODY></HTML>\r\n";
   }
   #endif
   
   //------------------------------------------------------------------------------
   //
   // _appendMessageElementBegin()
   // _appendMessageElementEnd()
   //
   //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
   //     <!ATTLIST MESSAGE
   //         ID CDATA #REQUIRED
   //         PROTOCOLVERSION CDATA #REQUIRED>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendMessageElementBegin(
       Buffer& out,
       const String& messageId)
   {
       out << STRLIT("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
                     "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n"
                     "<MESSAGE ID=\"") << messageId;
       out << STRLIT("\" PROTOCOLVERSION=\"1.0\">\n");
   }
   
   void XmlWriter::_appendMessageElementEnd(
       Buffer& out)
   {
       out << STRLIT("</MESSAGE>\n</CIM>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendSimpleReqElementBegin()
   // _appendSimpleReqElementEnd()
   //
   //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendSimpleReqElementBegin(
       Buffer& out)
   {
       out << STRLIT("<SIMPLEREQ>\n");
   }
   
   void XmlWriter::_appendSimpleReqElementEnd(
       Buffer& out)
   {
       out << STRLIT("</SIMPLEREQ>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendMethodCallElementBegin()
   // _appendMethodCallElementEnd()
   //
   //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)>
   //     <!ATTLIST METHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendMethodCallElementBegin(
       Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<METHODCALL NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendMethodCallElementEnd(
       Buffer& out)
   {
       out << STRLIT("</METHODCALL>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIMethodCallElementBegin()
   // _appendIMethodCallElementEnd()
   //
   //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
   //     <!ATTLIST IMETHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIMethodCallElementBegin(
       Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<IMETHODCALL NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendIMethodCallElementEnd(
       Buffer& out)
   {
       out << STRLIT("</IMETHODCALL>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIParamValueElementBegin()
   // _appendIParamValueElementEnd()
   //
   //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
   //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
   //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
   //     <!ATTLIST IPARAMVALUE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIParamValueElementBegin(
       Buffer& out,
       const char* name)
   {
       out << STRLIT("<IPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendIParamValueElementEnd(
       Buffer& out)
   {
       out << STRLIT("</IPARAMVALUE>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendParamValueElementBegin()
   // _appendParamValueElementEnd()
   //
   //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
   //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
   //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
   //     <!ATTLIST IPARAMVALUE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendParamValueElementBegin(
       Buffer& out,
       const char* name)
   {
       out << STRLIT("<PARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendParamValueElementEnd(
       Buffer& out)
   {
       out << STRLIT("</PARAMVALUE>\n");
   }
   //------------------------------------------------------------------------------
   //
   // _appendSimpleRspElementBegin()
   // _appendSimpleRspElementEnd()
   //
   //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendSimpleRspElementBegin(
       Buffer& out)
   {
       out << STRLIT("<SIMPLERSP>\n");
   }
   
   void XmlWriter::_appendSimpleRspElementEnd(
       Buffer& out)
   {
       out << STRLIT("</SIMPLERSP>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendMethodResponseElementBegin()
   // _appendMethodResponseElementEnd()
   //
   //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST METHODRESPONSE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendMethodResponseElementBegin(
       Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<METHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendMethodResponseElementEnd(
       Buffer& out)
   {
       out << STRLIT("</METHODRESPONSE>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIMethodResponseElementBegin()
   // _appendIMethodResponseElementEnd()
   //
   //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST IMETHODRESPONSE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIMethodResponseElementBegin(
       Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<IMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendIMethodResponseElementEnd(
       Buffer& out)
   {
       out << STRLIT("</IMETHODRESPONSE>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendErrorElement()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendErrorElement(
       Buffer& out,
       const CIMException& cimException)
   {
       Tracer::traceCIMException(TRC_XML, Tracer::LEVEL2, cimException);
   
       out << STRLIT("<ERROR CODE=\"") << Uint32(cimException.getCode());
       out.append('"');
   
       String description = TraceableCIMException(cimException).getDescription();
   
       if (description != String::EMPTY)
       {
           out << STRLIT(" DESCRIPTION=\"");
           appendSpecial(out, description);
           out.append('"');
       }
   
       if (cimException.getErrorCount())
       {
           out << STRLIT(">");
   
           for (Uint32 i = 0, n = cimException.getErrorCount(); i < n; i++)
               appendInstanceElement(out, cimException.getError(i));
   
           out << STRLIT("</ERROR>");
       }
       else
           out << STRLIT("/>");
   }
   
   //----------------------------------------------------------------------
   //
   // appendParamTypeAndEmbeddedObjAttrib
   // Appends the Param type and EmbeddedObject Info to the buffer
   //     %EmbeddedObject; #IMPLIED
   //     %ParamType;>
   //
   //---------------------------------------------------------------------
   
   void XmlWriter::appendParamTypeAndEmbeddedObjAttrib(
       Buffer& out,
       const CIMType& type)
   {
   
       // If the property type is CIMObject, then
       //   encode the property in CIM-XML as a string with the EmbeddedObject
       //   attribute (there is not currently a CIM-XML "object"
       //   datatype).
       //   Because of an error in Pegasus we were earlier outputting
       //   upper case "EMBEDDEDOBJECT" as the attribute name. The
       //   spec calls for mixed case "EmbeddedObject. Fixed in
       //   bug 7131 to output EmbeddedObject  attribute in upper
       //   case and mixed case. Receiver will ignore one or the
       //   other.
       //else
       //      output the real type
       if (type == CIMTYPE_OBJECT)
       {
   
           out << STRLIT(" PARAMTYPE=\"string\""
                         " EmbeddedObject=\"object\""
                         " EMBEDDEDOBJECT=\"object\"");
       }
       else if (type == CIMTYPE_INSTANCE)
       {
           out << STRLIT(" PARAMTYPE=\"string\""
                         " EmbeddedObject=\"instance\""
                         " EMBEDDEDOBJECT=\"instance\"");
       }
       else
       {
           out << STRLIT(" PARAM") << xmlWriterTypeStrings(type);
       }
   }
   
   //------------------------------------------------------------------------------
   //
   // appendReturnValueElement()
   //
   // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
   // <!ATTLIST RETURNVALUE
   //     %EmbeddedObject; #IMPLIED
   //     %ParamType;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendReturnValueElement(
       Buffer& out,
       const CIMValue& value)
   {
       out << STRLIT("<RETURNVALUE");
   
       CIMType type = value.getType();
   
       appendParamTypeAndEmbeddedObjAttrib(out, type);
   
       out << STRLIT(">\n");
   
       // Add value.
       appendValueElement(out, value);
       out << STRLIT("</RETURNVALUE>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIReturnValueElementBegin()
   // _appendIReturnValueElementEnd()
   //
   //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|
   //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|
   //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|
   //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIReturnValueElementBegin(
       Buffer& out)
   {
       out << STRLIT("<IRETURNVALUE>\n");
   }
   
   void XmlWriter::_appendIReturnValueElementEnd(
       Buffer& out)
   {
       out << STRLIT("</IRETURNVALUE>\n");
   }
   
   //EXP_PULL_BEGIN
   void XmlWriter::_appendIReturnValueElementWithNameBegin(
       Buffer& out,
       const char* name)
   {
       out << STRLIT("<IRETURNVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   //EXP_PULL_END
   
   //------------------------------------------------------------------------------
   //
   // appendBooleanIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendBooleanIParameter(
       Buffer& out,
       const char* name,
       Boolean flag)
   {
       _appendIParamValueElementBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
   }
   
   //EXP_PULL_BEGIN
   void XmlWriter::appendBooleanParameter(
       Buffer& out,
       const char* name,
       Boolean flag)
   {
       _appendParamValueElementBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendParamValueElementEnd(out);
   }
   
   void XmlWriter::appendBooleanIReturnValue(
       Buffer& out,
       const char* name,
       Boolean flag)
   {
       _appendIReturnValueElementWithNameBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendIReturnValueElementEnd(out);
   }
   
   // Can be used to generate either parameters with value,
   // parameters with NULL (i.e. no value element) or
   // no parameters output at all.
   void XmlWriter::appendUint32IParameter(
       Buffer& out,
       const char* name,
       const Uint32Arg& val,
       const Boolean required)
   {
       if (!required && val.isNull())
       {
           return;
       }
   
       _appendIParamValueElementBegin(out, name);
       if (!val.isNull())
       {
           out << STRLIT("<VALUE>");
           append(out, val.getValue());
           out << STRLIT("</VALUE>\n");
       }
       _appendIParamValueElementEnd(out);
   }
   
   /* Output return value from Uint64Arg object as
      Value inside IRETURNVALUE
      If the state of the object is NULL output
      the parameter without value.  Else
      output the value
   */
   void XmlWriter::appendUint64ReturnValue(
       Buffer& out,
       const char* name,
       const Uint64Arg& val)
   {
       _appendIReturnValueElementBegin(out);
       out << STRLIT("<VALUE>");
       if (!val.isNull())
       {
           append(out, val.getValue());
       }
       out << STRLIT("</VALUE>\n");
       _appendIReturnValueElementEnd(out);
   }
   //EXP_PULL_END
   
   //------------------------------------------------------------------------------
   //
   // appendStringIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendStringIParameter(
       Buffer& out,
       const char* name,
       const String& str)
 { {
     while (*str)      _appendIParamValueElementBegin(out, name);
         AppendSpecialChar(os, *str++);      out << STRLIT("<VALUE>");
       appendSpecial(out, str);
       out << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
 } }
  
   // EXP_PULL
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatGetHeader()  // appendStringIParameterIfNotEmpty()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatGetHeader(  void XmlWriter::appendStringIParameterIfNotEmpty(
     const char* documentPath)      Buffer& out,
       const char* name,
       const String& str)
   {
       if (str != String::EMPTY)
 { {
     Array<Sint8> out;          appendStringIParameter(out,name,str);
     return out << "GET " << documentPath << "HTTP/1.0\r\n\r\n";      }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMPostHeader()  // appendStringParameter()
 //  
 //     Build HTTP request header.  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMPostHeader(  void XmlWriter::appendStringParameter(
     const char* host,      Buffer& out,
     const char* cimOperation,      const char* name,
     const char* cimMethod,      const String& str)
     const String& cimObject,  
     const Array<Sint8>& content)  
 { {
     Array<Sint8> out;      _appendParamValueElementBegin(out, name);
     out.reserve(1024);      out << STRLIT("<VALUE>");
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      appendSpecial(out, str);
       out << STRLIT("</VALUE>\n");
     out << "M-POST /cimom HTTP/1.1\r\n";      _appendParamValueElementEnd(out);
     out << "HOST: " << host << "\r\n";  
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << content.getSize() << "\r\n";  
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMOperation: " << cimOperation << "\r\n";  
     out << nn << "-CIMMethod: " << cimMethod << "\r\n";  
     out << nn << "-CIMObject: " << cimObject << "\r\n\r\n";  
     out << content;  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseHeader()  // appendStringIReturnValue()
 //  
 //     Build HTTP response header.  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodResponseHeader(  void XmlWriter::appendStringIReturnValue(
     const Array<Sint8>& content)      Buffer& out,
       const char* name,
       const String& str)
 { {
     Array<Sint8> out;      _appendIReturnValueElementWithNameBegin(out, name);
     out.reserve(1024);      out << STRLIT("<VALUE>");
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      appendSpecial(out, str);
       out << STRLIT("</VALUE>\n");
     out << "HTTP/1.1 200 OK\r\n";      _appendIReturnValueElementEnd(out);
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << content.getSize() << "\r\n";  
     out << "Ext:\r\n";  
     out << "Cache-Control: no-cache\r\n";  
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMOperation: MethodResponse\r\n\r\n";  
     out << content;  
     return out;  
 } }
   //EXP_PULL_END
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMessageElement()  // appendClassNameIParameter()
 //  
 //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>  
 //     <!ATTLIST MESSAGE  
 //         ID CDATA #REQUIRED  
 //         PROTOCOLVERSION CDATA #REQUIRED>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMessageElement(  void XmlWriter::appendClassNameIParameter(
     Uint32 messageId,      Buffer& out,
     const Array<Sint8>& body)      const char* name,
 {      const CIMName& className)
     Array<Sint8> out;  {
     out.reserve(1024);      _appendIParamValueElementBegin(out, name);
   
     out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";      //
     out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";      //  A NULL (unassigned) value for a parameter is specified by an
     out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";      //  <IPARAMVALUE> element with no subelement
     out << body;      //
     out << "</MESSAGE>\n";      if (!className.isNull ())
     out << "</CIM>\n";      {
     return out;          appendClassNameElement(out, className);
       }
   
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleReqElement()  // appendInstanceNameIParameter()
 //  
 //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleReqElement(  void XmlWriter::appendInstanceNameIParameter(
     const Array<Sint8>& body)      Buffer& out,
       const char* name,
       const CIMObjectPath& instanceName)
 { {
     Array<Sint8> out;      _appendIParamValueElementBegin(out, name);
     return out << "<SIMPLEREQ>\n" << body << "</SIMPLEREQ>\n";      appendInstanceNameElement(out, instanceName);
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------  void XmlWriter::appendObjectNameIParameter(
       Buffer& out,
       const char* name,
       const CIMObjectPath& objectName)
   {
 // //
 // formatSimpleRspElement()      //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class also
       //  has no key bindings
 // //
 //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>      if (objectName.getKeyBindings ().size () == 0)
       {
           XmlWriter::appendClassNameIParameter(
               out, name, objectName.getClassName());
       }
       else
       {
           XmlWriter::appendInstanceNameIParameter(
               out, name, objectName);
       }
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleRspElement(  void XmlWriter::appendClassIParameter(
     const Array<Sint8>& body)      Buffer& out,
       const char* name,
       const CIMConstClass& cimClass)
 { {
     Array<Sint8> out;      _appendIParamValueElementBegin(out, name);
     return out << "<SIMPLERSP>\n" << body << "</SIMPLERSP>\n";      appendClassElement(out, cimClass);
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodCallElement()  // appendInstanceIParameter()
 //  
 //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>  
 //     <!ATTLIST IMETHODCALL %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIMethodCallElement(  void XmlWriter::appendInstanceIParameter(
       Buffer& out,
     const char* name,     const char* name,
     const String& nameSpace,      const CIMConstInstance& instance)
     const Array<Sint8>& iParamValues)  
 { {
     Array<Sint8> out;      _appendIParamValueElementBegin(out, name);
     out << "<IMETHODCALL NAME=\"" << name << "\">\n";      appendInstanceElement(out, instance);
     XmlWriter::appendLocalNameSpaceElement(out, nameSpace);      _appendIParamValueElementEnd(out);
     out << iParamValues;  
     out << "</IMETHODCALL>\n";  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodResponseElement()  // appendNamedInstanceIParameter()
 //  
 //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>  
 //     <!ATTLIST IMETHODRESPONSE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIMethodResponseElement(  void XmlWriter::appendNamedInstanceIParameter(
       Buffer& out,
     const char* name,     const char* name,
     const Array<Sint8>& body)      const CIMInstance& namedInstance)
 { {
     Array<Sint8> out;      _appendIParamValueElementBegin(out, name);
     out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";      appendValueNamedInstanceElement(out, namedInstance);
     out << body;      _appendIParamValueElementEnd(out);
     out << "</IMETHODRESPONSE>\n";  
     return out;  
 } }
  
 //------------------------------------------------------------------------------  //----------------------------------------------------------
 // //
 // formatIReturnValueElement()  //  appendPropertyNameIParameter()
 // //
 //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|  //     </IPARAMVALUE>
 //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|  //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>
 //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|  
 //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>  
 // //
 //------------------------------------------------------------------------------  //     USE: Create parameter for getProperty operation
   //==========================================================
 Array<Sint8> XmlWriter::formatIReturnValueElement(  void XmlWriter::appendPropertyNameIParameter(
     const Array<Sint8>& body)      Buffer& out,
       const CIMName& propertyName)
 { {
     Array<Sint8> out;      _appendIParamValueElementBegin(out, "PropertyName");
     return out << "<IRETURNVALUE>\n" << body << "</IRETURNVALUE>\n";      out << STRLIT("<VALUE>") << propertyName << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIParamValueElement()  // appendPropertyValueIParameter()
 //  
 //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE  
 //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION  
 //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
 //     <!ATTLIST IPARAMVALUE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::formatIParamValueElement(  void XmlWriter::appendPropertyValueIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const Array<Sint8>& body)      const CIMValue& value)
 { {
     out << "<IPARAMVALUE NAME=\"" << name << "\">\n";      _appendIParamValueElementBegin(out, name);
     out << body;      appendValueElement(out, value);
     out << "</IPARAMVALUE>\n";      _appendIParamValueElementEnd(out);
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatErrorElement()  // appendPropertyListIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatErrorElement(  void XmlWriter::appendPropertyListIParameter(
     CIMException::Code code,      Buffer& out,
     const char* description)      const CIMPropertyList& propertyList)
 { {
     Array<Sint8> out;      _appendIParamValueElementBegin(out, "PropertyList");
     out << "<ERROR";  
     out << " CODE=\"" << Uint32(code) << "\"";      //
     out << " DESCRIPTION=\"";      //  A NULL (unassigned) value for a parameter is specified by an
     appendSpecial(out, description);      //  <IPARAMVALUE> element with no subelement
     out << "\"/>";      //
     return out;      if (!propertyList.isNull ())
       {
           out << STRLIT("<VALUE.ARRAY>\n");
           for (Uint32 i = 0; i < propertyList.size(); i++)
           {
               out << STRLIT("<VALUE>") << propertyList[i] << STRLIT("</VALUE>\n");
           }
           out << STRLIT("</VALUE.ARRAY>\n");
       }
   
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendBooleanParameter()  // appendQualifierDeclarationIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendBooleanParameter(  void XmlWriter::appendQualifierDeclarationIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     Boolean flag)      const CIMConstQualifierDecl& qualifierDecl)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     tmp << "<VALUE>" << (flag ? "TRUE" : "FALSE") << "</VALUE>\n";      appendQualifierDeclElement(out, qualifierDecl);
     return formatIParamValueElement(out, name, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassNameParameter()  // XmlWriter::formatHttpErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendClassNameParameter(  Buffer XmlWriter::formatHttpErrorRspMessage(
     Array<Sint8>& out,      const String& status,
     const char* name,      const String& cimError,
     const String& className)      const String& errorDetail)
 { {
     Array<Sint8> tmp;      Buffer out;
     appendClassNameElement(tmp, className);  
     return formatIParamValueElement(out, name, tmp);      appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
   
       return out;
 } }
  
   // l10n - add content language support to the format methods below
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendQualifierNameParameter()  // XmlWriter::formatSimpleMethodReqMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendQualifierNameParameter(  // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
     Array<Sint8>& out,  Buffer XmlWriter::formatSimpleMethodReqMessage(
     const char* name,      const char* host,
     const String& qualifierName)      const CIMNamespaceName& nameSpace,
       const CIMObjectPath& path,
       const CIMName& methodName,
       const Array<CIMParamValue>& parameters,
       const String& messageId,
       HttpMethod httpMethod,
       const String& authenticationHeader,
       const AcceptLanguageList& httpAcceptLanguages,
       const ContentLanguageList& httpContentLanguages,
       bool binaryResponse)
   {
       Buffer out;
       Buffer tmp;
       CIMObjectPath localObjectPath = path;
       localObjectPath.setNameSpace(nameSpace.getString());
       localObjectPath.setHost(String::EMPTY);
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleReqElementBegin(out);
       _appendMethodCallElementBegin(out, methodName);
       appendLocalObjectPathElement(out, localObjectPath);
       for (Uint32 i=0; i < parameters.size(); i++)
       {
           appendParamValueElement(out, parameters[i]);
       }
       _appendMethodCallElementEnd(out);
       _appendSimpleReqElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodCallHeader(
           tmp,
           host,
           methodName,
           localObjectPath.toString(),
           authenticationHeader,
           httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size(),
           false,
           binaryResponse);
       tmp << out;
   
       return tmp;
   }
   
   Buffer XmlWriter::formatSimpleMethodRspMessage(
       const CIMName& methodName,
       const String& messageId,
       HttpMethod httpMethod,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& bodyParams,
       const Buffer& body,
       Uint64 serverResponseTime,
       Boolean isFirst,
       Boolean isLast)
   {
       Buffer out;
   
       if (isFirst == true)
       {
           // NOTE: temporarily put zero for content length. the http code
           // will later decide to fill in the length or remove it altogether
           appendMethodResponseHeader(
               out, httpMethod, httpContentLanguages, 0, serverResponseTime);
           _appendMessageElementBegin(out, messageId);
           _appendSimpleRspElementBegin(out);
           _appendMethodResponseElementBegin(out, methodName);
       }
   
       if (body.size() != 0)
 { {
     // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE          out << body;
     //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION      }
     //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
     //      if (isLast == true)
     // ATTN: notice that there is really no way to pass a qualifier name      {
     // as an IPARAMVALUE element according to the spec (look above). So we          _appendMethodResponseElementEnd(out);
     // just pass it as a class name. An answer must be obtained later.          _appendSimpleRspElementEnd(out);
           _appendMessageElementEnd(out);
       }
  
     Array<Sint8> tmp;      return out;
     appendClassNameElement(tmp, qualifierName);  
     return formatIParamValueElement(out, name, tmp);  
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassParameter()  // XmlWriter::formatSimpleMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendClassParameter(  Buffer XmlWriter::formatSimpleMethodErrorRspMessage(
     Array<Sint8>& out,      const CIMName& methodName,
     const char* parameterName,      const String& messageId,
     const CIMConstClass& cimClass)      HttpMethod httpMethod,
       const CIMException& cimException)
 { {
     Array<Sint8> tmp;      Buffer out;
     cimClass.toXml(tmp);      Buffer tmp;
     return formatIParamValueElement(out, parameterName, tmp);  
       _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendMethodResponseElementBegin(out, methodName);
       _appendErrorElement(out, cimException);
       _appendMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(
           tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size(),
           false);
       tmp << out;
   
       return tmp;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendInstanceNameParameter()  // XmlWriter::formatSimpleIMethodReqMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendInstanceNameParameter(  Buffer XmlWriter::formatSimpleIMethodReqMessage(
     Array<Sint8>& out,      const char* host,
     const char* parameterName,      const CIMNamespaceName& nameSpace,
     const CIMReference& instanceName)      const CIMName& iMethodName,
       const String& messageId,
       HttpMethod httpMethod,
       const String& authenticationHeader,
       const AcceptLanguageList& httpAcceptLanguages,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& body,
       bool binaryResponse)
   {
       Buffer out;
       Buffer tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleReqElementBegin(out);
       _appendIMethodCallElementBegin(out, iMethodName);
       appendLocalNameSpacePathElement(out, nameSpace.getString());
       out << body;
       _appendIMethodCallElementEnd(out);
       _appendSimpleReqElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodCallHeader(
           tmp,
           host,
           iMethodName,
           nameSpace.getString(),
           authenticationHeader,
           httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size(),
           false,
           binaryResponse);
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleIMethodRspMessage()
   //
   //------------------------------------------------------------------------------
   
   /*
       Formats a IMethod Response Message.  Note that this function formats
       messages for chunking based on the isFirst and isLast parameters.
       If isFirst is set, it outputs headers and ResponseElement begin.
       It always sends the body.  If isLast is set,  it sends the rtnParams
       and the ResponseElement end followed by any parameter in the rtnParams.
       KS_PULL_TBD_TODO - Determine what we want to do with chunking. Since this
       This whole thing is based on the concept of each message sending a  single
       chunk and we will want in the future to modify so we can chose easily
       whether we want to chunk or not and send the chunks.
   */
   Buffer XmlWriter::formatSimpleIMethodRspMessage(
       const CIMName& iMethodName,
       const String& messageId,
       HttpMethod httpMethod,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& rtnParams,
       const Buffer& body,
       Uint64 serverResponseTime,
       Boolean isFirst,
       Boolean isLast)
   {
       Buffer out;
   
       if (isFirst == true)
       {
           // NOTE: temporarily put zero for content length. the http code
           // will later decide to fill in the length or remove it altogether
           appendMethodResponseHeader(
               out, httpMethod, httpContentLanguages, 0, serverResponseTime);
           _appendMessageElementBegin(out, messageId);
           _appendSimpleRspElementBegin(out);
           _appendIMethodResponseElementBegin(out, iMethodName);
   
           // output the start of the return tag. Test if there is response data
           // by:
           // 1. there is data on the first chunk OR
           // 2. there is no data on the first chunk but isLast is false implying
           //    there is more non-empty data to come. If all subsequent chunks
           //    are empty, then this generates and empty response.
           if (body.size() != 0 || isLast == false)
               _appendIReturnValueElementBegin(out);
       }
   
       if (body.size() != 0)
 { {
     Array<Sint8> tmp;          out << body;
     instanceName.instanceNameToXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //------------------------------------------------------------------------------      if (isLast == true)
       {
           if (body.size() != 0 || isFirst == false)
               _appendIReturnValueElementEnd(out);
           // EXP_PULL
           // If there are any parameters include them here.
           // Assumes that it is prebuilt with all components
 // //
 // appendInstanceParameter()          if (rtnParams.size() != 0)
           {
               out << rtnParams;
           }
 // //
 //------------------------------------------------------------------------------          // //EXP_PULL_END
           _appendIMethodResponseElementEnd(out);
           _appendSimpleRspElementEnd(out);
           _appendMessageElementEnd(out);
       }
  
 Array<Sint8>& XmlWriter::appendInstanceParameter(      return out;
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMConstInstance& instance)  
 {  
     Array<Sint8> tmp;  
     instance.toXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassParameter()  // XmlWriter::formatSimpleIMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendQualifierDeclarationParameter(  Buffer XmlWriter::formatSimpleIMethodErrorRspMessage(
     Array<Sint8>& out,      const CIMName& iMethodName,
     const char* parameterName,      const String& messageId,
     const CIMConstQualifierDecl& qualifierDecl)      HttpMethod httpMethod,
       const CIMException& cimException)
 { {
     Array<Sint8> tmp;      Buffer out;
     qualifierDecl.toXml(tmp);      Buffer tmp;
     return formatIParamValueElement(out, parameterName, tmp);  
       _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendIMethodResponseElementBegin(out, iMethodName);
       _appendErrorElement(out, cimException);
       _appendIMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size(), false);
       tmp << out;
   
       return tmp;
 } }
  
   //******************************************************************************
   //
   // Export Messages (used for indications)
   //
   //******************************************************************************
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassNameElement()  // appendEMethodRequestHeader()
   //
   //     Build HTTP request header for export operation.
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendClassNameElement(  void XmlWriter::appendEMethodRequestHeader(
     Array<Sint8>& out,      Buffer& out,
     const String& className)      const char* requestUri,
       const char* host,
       const CIMName& cimMethod,
       HttpMethod httpMethod,
       const String& authenticationHeader,
       const AcceptLanguageList& acceptLanguages,
       const ContentLanguageList& contentLanguages,
       Uint32 contentLength)
   {
       char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
         out << STRLIT("M-POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
       }
       else
       {
         out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
       }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n"
                     "Content-Type: application/xml; charset=\"utf-8\"\r\n");
       OUTPUT_CONTENTLENGTH(out, contentLength);
   
       if (acceptLanguages.size() > 0)
       {
           out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
       }
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages <<
               STRLIT("\r\n");
       }
   
   #ifdef PEGASUS_DEBUG
       // backdoor environment variable to turn OFF client requesting transfer
       // encoding. The default is on. to turn off, set this variable to zero.
       // This should be removed when stable. This should only be turned off in
       // a debugging/testing environment.
   
       static const char *clientTransferEncodingOff =
           getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
       if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
   #endif
       out << STRLIT("TE: chunked, trailers\r\n");
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodRequest\r\n");
           out << nn << STRLIT("-CIMExportMethod: ") << cimMethod <<
               STRLIT("\r\n");
       }
       else
       {
           out << STRLIT("CIMExport: MethodRequest\r\n"
                         "CIMExportMethod: ") << cimMethod << STRLIT("\r\n");
       }
   
       if (authenticationHeader.size())
 { {
     return out << "<CLASSNAME NAME=\"" << className << "\"/>\n";          out << authenticationHeader << STRLIT("\r\n");
       }
   
       out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendInstanceNameElement()  // appendEMethodResponseHeader()
   //
   //     Build HTTP response header for export operation.
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendInstanceNameElement(  void XmlWriter::appendEMethodResponseHeader(
     Array<Sint8>& out,      Buffer& out,
     const CIMReference& instanceName)      HttpMethod httpMethod,
       const ContentLanguageList& contentLanguages,
       Uint32 contentLength)
 { {
     instanceName.instanceNameToXml(out);      char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
     return out;  
       out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n"
                     "Content-Type: application/xml; charset=\"utf-8\"\r\n");
       OUTPUT_CONTENTLENGTH(out, contentLength);
   
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages <<
               STRLIT("\r\n");
       }
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Ext:\r\n"
                         "Cache-Control: no-cache\r\n"
                         "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodResponse\r\n\r\n");
       }
       else
       {
           out << STRLIT("CIMExport: MethodResponse\r\n\r\n");
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _printAttributes()  // _appendSimpleExportReqElementBegin()
   // _appendSimpleExportReqElementEnd()
   //
   //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 static void _printAttributes(  void XmlWriter::_appendSimpleExportReqElementBegin(
     std::ostream& os,      Buffer& out)
     const XmlAttribute* attributes,  
     Uint32 attributeCount)  
 { {
     for (Uint32 i = 0; i < attributeCount; i++)      out << STRLIT("<SIMPLEEXPREQ>\n");
   }
   
   void XmlWriter::_appendSimpleExportReqElementEnd(
       Buffer& out)
     {     {
         os << attributes[i].name << "=";      out << STRLIT("</SIMPLEEXPREQ>\n");
   }
  
         os << '"';  //------------------------------------------------------------------------------
         AppendSpecial(os, attributes[i].value);  //
         os << '"';  // _appendEMethodCallElementBegin()
   // _appendEMethodCallElementEnd()
   //
   //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)>
   //     <!ATTLIST EXPMETHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
  
         if (i + 1 != attributeCount)  void XmlWriter::_appendEMethodCallElementBegin(
             os << ' ';      Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<EXPMETHODCALL NAME=\"") << name << STRLIT("\">\n");
     }     }
   
   void XmlWriter::_appendEMethodCallElementEnd(
       Buffer& out)
   {
       out << STRLIT("</EXPMETHODCALL>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _indent()  // _appendEParamValueElementBegin()
   // _appendEParamValueElementEnd()
   //
   //     <!ELEMENT EXPPARAMVALUE (INSTANCE)>
   //     <!ATTLIST EXPPARAMVALUE
   //         %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 static void _indent(std::ostream& os, Uint32 level, Uint32 indentChars)  void XmlWriter::_appendEParamValueElementBegin(
       Buffer& out,
       const char* name)
 { {
     Uint32 n = level * indentChars;      out << STRLIT("<EXPPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
  
     for (Uint32 i = 0; i < n; i++)  void XmlWriter::_appendEParamValueElementEnd(
         os << ' ';      Buffer& out)
   {
       out << STRLIT("</EXPPARAMVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // indentedPrint()  // appendInstanceEParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::indentedPrint(  void XmlWriter::appendInstanceEParameter(
     std::ostream& os,      Buffer& out,
     const char* text,      const char* name,
     Uint32 indentChars)      const CIMInstance& instance)
 { {
     char* tmp = strcpy(new char[strlen(text) + 1], text);      _appendEParamValueElementBegin(out, name);
       appendInstanceElement(out, instance);
       _appendEParamValueElementEnd(out);
   }
  
     XmlParser parser(tmp);  //------------------------------------------------------------------------------
     XmlEntry entry;  //
     Stack<const char*> stack;  // _appendSimpleExportRspElementBegin()
   // _appendSimpleExportRspElementEnd()
   //
   //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)>
   //
   //------------------------------------------------------------------------------
  
     while (parser.next(entry))  void XmlWriter::_appendSimpleExportRspElementBegin(
     {      Buffer& out)
         switch (entry.type)  
         {  
             case XmlEntry::XML_DECLARATION:  
             {             {
                 _indent(os, stack.getSize(), indentChars);      out << STRLIT("<SIMPLEEXPRSP>\n");
   
                 os << "<?" << entry.text << " ";  
                 _printAttributes(os, entry.attributes, entry.attributeCount);  
                 os << "?>";  
                 break;  
             }             }
  
             case XmlEntry::START_TAG:  void XmlWriter::_appendSimpleExportRspElementEnd(
       Buffer& out)
             {             {
                 _indent(os, stack.getSize(), indentChars);      out << STRLIT("</SIMPLEEXPRSP>\n");
   }
                 os << "<" << entry.text;  
  
                 if (entry.attributeCount)  //------------------------------------------------------------------------------
                     os << ' ';  //
   // _appendEMethodResponseElementBegin()
   // _appendEMethodResponseElementEnd()
   //
   //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>
   //
   //------------------------------------------------------------------------------
  
                 _printAttributes(os, entry.attributes, entry.attributeCount);  void XmlWriter::_appendEMethodResponseElementBegin(
                 os << ">";      Buffer& out,
                 stack.push(entry.text);      const CIMName& name)
                 break;  {
       out << STRLIT("<EXPMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
             }             }
  
             case XmlEntry::EMPTY_TAG:  void XmlWriter::_appendEMethodResponseElementEnd(
       Buffer& out)
             {             {
                 _indent(os, stack.getSize(), indentChars);      out << STRLIT("</EXPMETHODRESPONSE>\n");
   
                 os << "<" << entry.text << " ";  
                 _printAttributes(os, entry.attributes, entry.attributeCount);  
                 os << "/>";  
                 break;  
             }             }
  
             case XmlEntry::END_TAG:  //------------------------------------------------------------------------------
             {  //
                 if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)  // XmlWriter::formatSimpleEMethodReqMessage()
                     stack.pop();  //
   //------------------------------------------------------------------------------
  
                 _indent(os, stack.getSize(), indentChars);  Buffer XmlWriter::formatSimpleEMethodReqMessage(
       const char* requestUri,
       const char* host,
       const CIMName& eMethodName,
       const String& messageId,
       HttpMethod httpMethod,
       const String& authenticationHeader,
       const AcceptLanguageList& httpAcceptLanguages,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& body)
   {
       Buffer out;
       Buffer tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleExportReqElementBegin(out);
       _appendEMethodCallElementBegin(out, eMethodName);
       out << body;
       _appendEMethodCallElementEnd(out);
       _appendSimpleExportReqElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendEMethodRequestHeader(
           tmp,
           requestUri,
           host,
           eMethodName,
           httpMethod,
           authenticationHeader,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size());
       tmp << out;
  
                 os << "</" << entry.text << ">";      return tmp;
                 break;  
             }             }
  
             case XmlEntry::COMMENT:  //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleEMethodRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Buffer XmlWriter::formatSimpleEMethodRspMessage(
       const CIMName& eMethodName,
       const String& messageId,
       HttpMethod httpMethod,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& body)
             {             {
       Buffer out;
       Buffer tmp;
  
                 _indent(os, stack.getSize(), indentChars);      _appendMessageElementBegin(out, messageId);
                 os << "<!--";      _appendSimpleExportRspElementBegin(out);
                 AppendSpecial(os, entry.text);      _appendEMethodResponseElementBegin(out, eMethodName);
                 os << "-->";      out << body;
                 break;      _appendEMethodResponseElementEnd(out);
             }      _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
  
             case XmlEntry::CONTENT:      appendEMethodResponseHeader(tmp,
             {          httpMethod,
                 _indent(os, stack.getSize(), indentChars);          httpContentLanguages,
                 AppendSpecial(os, entry.text);          out.size());
                 break;      tmp << out;
             }  
  
             case XmlEntry::CDATA:      return tmp;
             {  
                 _indent(os, stack.getSize(), indentChars);  
                 os << "<![CDATA[...]]>";  
                 break;  
             }             }
  
             case XmlEntry::DOCTYPE:  //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleEMethodErrorRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Buffer XmlWriter::formatSimpleEMethodErrorRspMessage(
       const CIMName& eMethodName,
       const String& messageId,
       HttpMethod httpMethod,
       const CIMException& cimException)
             {             {
                 _indent(os, stack.getSize(), indentChars);      Buffer out;
                 os << "<!DOCTYPE...>";      Buffer tmp;
                 break;  
             }  
         }  
  
         os << std::endl;      _appendMessageElementBegin(out, messageId);
     }      _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
       _appendErrorElement(out, cimException);
       _appendEMethodResponseElementEnd(out);
       _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
  
     delete [] tmp;      appendEMethodResponseHeader(
           tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size());
       tmp << out;
   
       return tmp;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 736 
Line 3371 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Uint32 XmlWriter::getNextMessageId()  static IDFactory _messageIDFactory(1000);
 {  
     // ATTN: make thread-safe:  
     static Uint32 messageId = 1000;  
   
     messageId++;  
   
     if (messageId < 1000)  
         messageId = 1001;  
  
     return messageId;  String XmlWriter::getNextMessageId()
   {
       char scratchBuffer[22];
       Uint32 n;
       const char * startP = Uint32ToString(scratchBuffer,
                                            _messageIDFactory.getID(),
                                            n);
       return String(startP, n);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleReqMessage()  // XmlWriter::keyBindingTypeToString
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
   const StrLit XmlWriter::keyBindingTypeToString (CIMKeyBinding::Type type)
 Array<Sint8> XmlWriter::formatSimpleReqMessage(  
     const char* host,  
     const String& nameSpace,  
     const char* iMethodName,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMPostHeader(      switch (type)
         host,      {
         "MethodCall",          case CIMKeyBinding::BOOLEAN:
         iMethodName,              return STRLIT("boolean");
         nameSpace,  
         XmlWriter::formatMessageElement(          case CIMKeyBinding::STRING:
             XmlWriter::getNextMessageId(),              return STRLIT("string");
             XmlWriter::formatSimpleReqElement(  
                 XmlWriter::formatIMethodCallElement(          case CIMKeyBinding::NUMERIC:
                     iMethodName,              return STRLIT("numeric");
                     nameSpace,  
                     body))));          case CIMKeyBinding::REFERENCE:
           default:
               PEGASUS_ASSERT(false);
 } }
  
 Array<Sint8> XmlWriter::formatSimpleRspMessage(      return STRLIT("unknown");
     const char* iMethodName,  
     const Array<Sint8>& body)  
 {  
     return XmlWriter::formatMethodResponseHeader(  
         XmlWriter::formatMessageElement(  
             XmlWriter::getNextMessageId(),  
             XmlWriter::formatSimpleRspElement(  
                 XmlWriter::formatIMethodResponseElement(  
                     iMethodName,  
                     XmlWriter::formatIReturnValueElement(body)))));  
 } }
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.10  
changed lines
  Added in v.1.169.4.1

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2