(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.23.2.6 and 1.166

version 1.23.2.6, 2001/11/20 06:11:35 version 1.166, 2008/12/02 09:00:55
Line 1 
Line 1 
   //%LICENSE////////////////////////////////////////////////////////////////
   //
   // 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
   // copy of this software and associated documentation files (the "Software"),
   // to deal in the Software without restriction, including without limitation
   // the rights to use, copy, modify, merge, publish, distribute, sublicense,
   // 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:
   //
   // The above copyright notice and this permission notice shall be included
   // in all copies or substantial portions of the Software.
   //
   // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   // 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.
   //
   //////////////////////////////////////////////////////////////////////////
   //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
   
   #include <Pegasus/Common/Config.h>
   #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
   
   static StrLit _XmlWriterTypeStrings[] =
   {
       STRLIT("TYPE=\"boolean\""),   STRLIT("TYPE=\"uint8\""),
       STRLIT("TYPE=\"sint8\""),     STRLIT("TYPE=\"uint16\""),
       STRLIT("TYPE=\"sint16\""),    STRLIT("TYPE=\"uint32\""),
       STRLIT("TYPE=\"sint32\""),    STRLIT("TYPE=\"uint64\""),
       STRLIT("TYPE=\"sint64\""),    STRLIT("TYPE=\"real32\""),
       STRLIT("TYPE=\"real64\""),    STRLIT("TYPE=\"char16\""),
       STRLIT("TYPE=\"string\""),    STRLIT("TYPE=\"datetime\""),
       STRLIT("TYPE=\"reference\""), STRLIT("TYPE=\"object\""),
       STRLIT("TYPE=\"instance\"")
   };
   
   //------------------------------------------------------------------------------
   //
   // appendLocalNameSpacePathElement()
   //
   //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
   //
   //------------------------------------------------------------------------------
   
   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");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendNameSpacePathElement()
   //
   //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
   //
   //------------------------------------------------------------------------------
   
   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");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassNameElement()
   //
   //     <!ELEMENT CLASSNAME EMPTY>
   //     <!ATTLIST CLASSNAME
   //              %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassNameElement(
       Buffer& out,
       const CIMName& className)
   {
       out << STRLIT("<CLASSNAME NAME=\"") << className << STRLIT("\"/>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceNameElement()
   //
   //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
   //    <!ATTLIST INSTANCENAME
   //              %ClassName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceNameElement(
       Buffer& out,
       const CIMObjectPath& instanceName)
   {
       out << STRLIT("<INSTANCENAME CLASSNAME=\"");
       out << instanceName.getClassName() << STRLIT("\">\n");
   
       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 _xmlWritter_appendValue(Buffer& out, Uint32 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint32 x)
   {
       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");
   }
   
   //------------------------------------------------------------------------------
   //
   // 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 CIMTYPE_BOOLEAN:
               {
                   Array<Boolean> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT8:
               {
                   Array<Uint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT8:
               {
                   Array<Sint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT16:
               {
                   Array<Uint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT16:
               {
                   Array<Sint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT32:
               {
                   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;
               }
   
               case CIMTYPE_SINT64:
               {
                   Array<Sint64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_REAL32:
               {
                   Array<Real32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_REAL64:
               {
                   Array<Real64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_CHAR16:
               {
                   Array<Char16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_STRING:
               {
                   const String* data;
                   Uint32 size;
                   value._get(data, size);
                   _xmlWritter_appendValueArray(out, data, size);
                   break;
               }
   
               case CIMTYPE_DATETIME:
               {
                   Array<CIMDateTime> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_REFERENCE:
               {
                   Array<CIMObjectPath> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_OBJECT:
               {
                   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>");
   
           switch (value.getType())
           {
               case CIMTYPE_BOOLEAN:
               {
                   Boolean v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT8:
               {
                   Uint8 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT8:
               {
                   Sint8 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT16:
               {
                   Uint16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT16:
               {
                   Sint16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT32:
               {
                   Uint32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT32:
               {
                   Sint32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT64:
               {
                   Uint64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT64:
               {
                   Sint64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_REAL32:
               {
                   Real32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_REAL64:
               {
                   Real64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_CHAR16:
               {
                   Char16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_STRING:
               {
                   String v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_DATETIME:
               {
                   CIMDateTime v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   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:
                   PEGASUS_ASSERT(false);
           }
   
           out << STRLIT("</VALUE>\n");
       }
   }
   
   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");
   }
   
   //------------------------------------------------------------------------------
   //
   // 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);
   }
   
   //------------------------------------------------------------------------------
 // //
 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,  // appendQualifierDeclElement()
 // The Open Group, Tivoli Systems  
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy  //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
 // of this software and associated documentation files (the "Software"), to  //     <!ATTLIST QUALIFIER.DECLARATION
 // deal in the Software without restriction, including without limitation the  //              %CIMName;
 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or  //              %CIMType;                       #REQUIRED
 // sell copies of the Software, and to permit persons to whom the Software is  //              ISARRAY        (true|false)     #IMPLIED
 // furnished to do so, subject to the following conditions:  //              %ArraySize;
 //  //              %QualifierFlavor;>
 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN  
 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED  
 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 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.  
 // //
 //==============================================================================  //------------------------------------------------------------------------------
   
   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);
   }
   
   //------------------------------------------------------------------------------
 // //
 // Author: Mike Brasher (mbrasher@bmc.com)  // appendQualifierFlavorEntity()
 // //
 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)  //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
   //                                 TOSUBCLASS   (true|false)   'true'
   //                                 TOINSTANCE   (true|false)   'false'
   //                                 TRANSLATABLE (true|false)   'false'">
 // //
 //%/////////////////////////////////////////////////////////////////////////////  //------------------------------------------------------------------------------
  
 #include <cstdlib>  void XmlWriter::appendQualifierFlavorEntity(
 #include <cstdio>      Buffer& out,
 #include "CIMClass.h"      const CIMFlavor & flavor)
 #include "CIMInstance.h"  {
 #include "CIMQualifierDecl.h"      if (!(flavor.hasFlavor (CIMFlavor::OVERRIDABLE)))
 #include "XmlWriter.h"          out << STRLIT(" OVERRIDABLE=\"false\"");
 #include "XmlParser.h"  
  
 PEGASUS_NAMESPACE_BEGIN      if (!(flavor.hasFlavor (CIMFlavor::TOSUBCLASS)))
           out << STRLIT(" TOSUBCLASS=\"false\"");
  
 inline void AppendChar(Array<Sint8>& out, Char16 c)      if (flavor.hasFlavor (CIMFlavor::TOINSTANCE))
 {          out << STRLIT(" TOINSTANCE=\"true\"");
     out.append(Sint8(c));  
       if (flavor.hasFlavor (CIMFlavor::TRANSLATABLE))
           out << STRLIT(" TRANSLATABLE=\"true\"");
 } }
  
 inline void AppendSpecialChar(Array<Sint8>& out, Char16 c)  //------------------------------------------------------------------------------
 {  //
     // ATTN-B: Only UTF-8 handled for now.  // 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'>
   //
   //------------------------------------------------------------------------------
  
     switch (c)  void XmlWriter::appendScopeElement(
       Buffer& out,
       const CIMScope & scope)
     {     {
         case '&':      if (!(scope.equal (CIMScope ())))
             out.append("&amp;", 5);      {
             break;          out << STRLIT("<SCOPE");
  
         case '<':          if (scope.hasScope (CIMScope::CLASS))
             out.append("&lt;", 4);              out << STRLIT(" CLASS=\"true\"");
             break;  
  
         case '>':          if (scope.hasScope (CIMScope::ASSOCIATION))
             out.append("&gt;", 4);              out << STRLIT(" ASSOCIATION=\"true\"");
             break;  
  
         case '"':          if (scope.hasScope (CIMScope::REFERENCE))
             out.append("&quot;", 6);              out << STRLIT(" REFERENCE=\"true\"");
             break;  
  
         case '\'':          if (scope.hasScope (CIMScope::PROPERTY))
             out.append("&apos;", 6);              out << STRLIT(" PROPERTY=\"true\"");
             break;  
  
         default:          if (scope.hasScope (CIMScope::METHOD))
             out.append(Sint8(c));              out << STRLIT(" METHOD=\"true\"");
   
           if (scope.hasScope (CIMScope::PARAMETER))
               out << STRLIT(" PARAMETER=\"true\"");
   
           if (scope.hasScope (CIMScope::INDICATION))
               out << STRLIT(" INDICATION=\"true\"");
   
           out << STRLIT("/>");
     }     }
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Char16 x)  // 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)
 { {
     AppendChar(out, x);      char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
 }  
  
 void XmlWriter::append(Array<Sint8>& out, Uint32 x)      // 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)
 { {
     char buffer[32];          out << STRLIT("M-POST /cimom HTTP/1.1\r\n");
     sprintf(buffer, "%d", x);  
     append(out, buffer);  
 } }
       else
 void XmlWriter::append(Array<Sint8>& out, const char* str)  
 { {
     while (*str)          out << STRLIT("POST /cimom HTTP/1.1\r\n");
         AppendChar(out, *str++);  
 } }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n");
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)      if (binaryRequest)
 { {
     AppendSpecialChar(out, x);          // Tell the server that the payload is encoded in the OpenPegasus
           // binary protocol.
           out << STRLIT("Content-Type: application/x-openpegasus\r\n");
 } }
       else
 void XmlWriter::appendSpecial(Array<Sint8>& out, char x)  
 { {
     AppendSpecialChar(out, Char16(x));          out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)      if (binaryResponse)
 { {
     while (*str)          // Tell the server that this client accepts the OpenPegasus binary
         AppendSpecialChar(out, *str++);          // protocol.
           out << STRLIT("Accept: application/x-openpegasus\r\n");
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)      OUTPUT_CONTENTLENGTH(out, contentLength);
       if (acceptLanguages.size() > 0)
 { {
     const Char16* tmp = str.getData();          out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
   
     while (*tmp)  
         AppendSpecialChar(out, *tmp++);  
 } }
       if (contentLanguages.size() > 0)
 void XmlWriter::append(Array<Sint8>& out, const String& str)  
 { {
     const Char16* tmp = str.getData();          out << STRLIT("Content-Language: ") << contentLanguages <<
               STRLIT("\r\n");
     while (*tmp)  
         AppendChar(out, *tmp++);  
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const Indentor& x)  #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
   
       if (!binaryResponse)
 { {
     for (Uint32 i = 0; i < 4 * x.getLevel(); i++)          // The binary protocol does not allow chunking.
         out.append(' ');          out << STRLIT("TE: chunked, trailers\r\n");
 } }
  
 void XmlWriter::appendLocalNameSpaceElement(      if (httpMethod == HTTP_METHOD_M_POST)
     Array<Sint8>& out,  
     const String& nameSpace)  
 { {
     out << "<LOCALNAMESPACEPATH>\n";          out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
     char* tmp = nameSpace.allocateCString();          out << nn << STRLIT("-CIMOperation: MethodCall\r\n");
           out << nn << STRLIT("-CIMMethod: ")
     for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))              << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << nn << STRLIT("-CIMObject: ")
               << encodeURICharacters(cimObject) << STRLIT("\r\n");
       }
       else
     {     {
         out << "<NAMESPACE NAME=\"" << p << "\"/>\n";          out << STRLIT("CIMOperation: MethodCall\r\n");
           out << STRLIT("CIMMethod: ")
               << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << STRLIT("CIMObject: ") << encodeURICharacters(cimObject)
               << STRLIT("\r\n");
     }     }
  
     delete [] tmp;      if (authenticationHeader.size())
       {
           out << authenticationHeader << STRLIT("\r\n");
       }
  
     out << "</LOCALNAMESPACEPATH>\n";      out << STRLIT("\r\n");
 } }
  
 static inline void AppendSpecialChar(PEGASUS_STD(ostream)& os, char c)  
   void XmlWriter::appendMethodResponseHeader(
        Buffer& out,
        HttpMethod httpMethod,
        const ContentLanguageList& contentLanguages,
        Uint32 contentLength,
        Uint64 serverResponseTime,
        bool binaryResponse)
 { {
     switch (c)      // 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)
     {     {
         case '&':          static const char HEADERS[] =
             os << "&amp;";              "HTTP/1.1 200 OK\r\n"
             break;              "Content-Type: application/x-openpegasus\r\n"
               "content-length: 0000000000\r\n"
               "CIMOperation: MethodResponse\r\n"
               "\r\n";
  
         case '<':          // The HTTP processor fills in the content-length value later.
             os << "&lt;";          // It searches for a field matching "content-length" (so the first
             break;          // character must be lower case).
           out.append(HEADERS, sizeof(HEADERS) - 1);
         case '>':          return;
             os << "&gt;";      }
             break;  
  
         case '"':       out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
             os << "&quot;";  
             break;  
  
         case '\'':  #ifndef PEGASUS_DISABLE_PERFINST
             os << "&apos;";       if (StatisticalData::current()->copyGSD)
             break;       {
            out << STRLIT("WBEMServerResponseTime: ") <<
                CIMValue(serverResponseTime).toString() << STRLIT("\r\n");
        }
   #endif
  
         default:       if (binaryResponse)
             os << c;       {
           // 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' };
  
 static inline void AppendSpecial(PEGASUS_STD(ostream)& os, const char* str)           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
 { {
     while (*str)           out << STRLIT("CIMOperation: MethodResponse\r\n\r\n");
         AppendSpecialChar(os, *str++);  
 } }
   }
   
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatGetHeader()  // 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)
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatGetHeader(  void XmlWriter::appendHttpErrorResponseHeader(
     const char* documentPath)      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)
 { {
     Array<Sint8> out;          out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
     return out << "GET " << documentPath << "HTTP/1.0\r\n\r\n";              << encodeURICharacters(errorDetail) << STRLIT("\r\n");
       }
       out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMPostHeader()  // appendUnauthorizedResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
 // //
 //     Build HTTP request header.  //     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>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMPostHeader(  void XmlWriter::appendUnauthorizedResponseHeader(
     const char* host,      Buffer& out,
     const char* cimOperation,      const String& content)
     const char* cimMethod,  
     const String& cimObject,  
     const Array<Sint8>& content)  
 { {
     Array<Sint8> out;      out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n");
     out.reserve(1024);      OUTPUT_CONTENTLENGTH(out, 0);
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      out << content << STRLIT("\r\n\r\n");
  
     out << "M-POST /cimom HTTP/1.1\r\n";  //ATTN: We may need to include the following line, so that the browsers
     out << "HOST: " << host << "\r\n";  //      can display the error message.
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  //    out << "<HTML><HEAD>\r\n";
     out << "Content-Length: " << content.size() << "\r\n";  //    out << "<TITLE>" << "401 Unauthorized" <<  "</TITLE>\r\n";
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
     out << nn <<"\r\n";  //    out << "<H2>TEST" << "401 Unauthorized" << "</H2>\r\n";
     out << nn << "-CIMOperation: " << cimOperation << "\r\n";  //    out << "<HR>\r\n";
     out << nn << "-CIMMethod: " << cimMethod << "\r\n";  //    out << "</BODY></HTML>\r\n";
     out << nn << "-CIMObject: " << cimObject << "\r\n\r\n";  
     out << content;  
     return out;  
 } }
  
   #ifdef PEGASUS_KERBEROS_AUTHENTICATION
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseHeader()  // appendOKResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
 // //
 //     Build HTTP response header.  //     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>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodResponseHeader(  void XmlWriter::appendOKResponseHeader(
     const Array<Sint8>& content)      Buffer& out,
       const String& content)
 { {
     Array<Sint8> out;      out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
     out.reserve(1024);      // Content-Length header needs to be added because 200 OK record
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      // 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");
  
     out << "HTTP/1.1 200 OK\r\n";  //ATTN: We may need to include the following line, so that the browsers
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  //      can display the error message.
     out << "Content-Length: " << content.size() << "\r\n";  //    out << "<HTML><HEAD>\r\n";
     out << "Ext:\r\n";  //    out << "<TITLE>" << "200 OK" <<  "</TITLE>\r\n";
     out << "Cache-Control: no-cache\r\n";  //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  //    out << "<H2>TEST" << "200 OK" << "</H2>\r\n";
     out << nn <<"\r\n";  //    out << "<HR>\r\n";
     out << nn << "-CIMOperation: MethodResponse\r\n\r\n";  //    out << "</BODY></HTML>\r\n";
     out << content;  
     return out;  
 } }
   #endif
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMessageElement()  // _appendMessageElementBegin()
   // _appendMessageElementEnd()
 // //
 //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)> //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
 //     <!ATTLIST MESSAGE //     <!ATTLIST MESSAGE
Line 265 
Line 1990 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMessageElement(  void XmlWriter::_appendMessageElementBegin(
     const String& messageId,      Buffer& out,
     const Array<Sint8>& body)      const String& messageId)
 { {
     Array<Sint8> out;      out << STRLIT("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
     out.reserve(1024);                    "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n"
                     "<MESSAGE ID=\"") << messageId;
       out << STRLIT("\" PROTOCOLVERSION=\"1.0\">\n");
   }
  
     out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";  void XmlWriter::_appendMessageElementEnd(
     out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";      Buffer& out)
     out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";  {
     out << body;      out << STRLIT("</MESSAGE>\n</CIM>\n");
     out << "</MESSAGE>\n";  
     out << "</CIM>\n";  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleReqElement()  // _appendSimpleReqElementBegin()
   // _appendSimpleReqElementEnd()
 // //
 //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)> //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleReqElement(  void XmlWriter::_appendSimpleReqElementBegin(
     const Array<Sint8>& body)      Buffer& out)
 { {
     Array<Sint8> out;      out << STRLIT("<SIMPLEREQ>\n");
     return out << "<SIMPLEREQ>\n" << body << "</SIMPLEREQ>\n";  }
   
   void XmlWriter::_appendSimpleReqElementEnd(
       Buffer& out)
   {
       out << STRLIT("</SIMPLEREQ>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleRspElement()  // _appendMethodCallElementBegin()
   // _appendMethodCallElementEnd()
 // //
 //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>  //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)>
   //     <!ATTLIST METHODCALL %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleRspElement(  void XmlWriter::_appendMethodCallElementBegin(
     const Array<Sint8>& body)      Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<METHODCALL NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendMethodCallElementEnd(
       Buffer& out)
 { {
     Array<Sint8> out;      out << STRLIT("</METHODCALL>\n");
     return out << "<SIMPLERSP>\n" << body << "</SIMPLERSP>\n";  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodCallElement()  // _appendIMethodCallElementBegin()
   // _appendIMethodCallElementEnd()
 // //
 //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)> //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
 //     <!ATTLIST IMETHODCALL %CIMName;> //     <!ATTLIST IMETHODCALL %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIMethodCallElement(  void XmlWriter::_appendIMethodCallElementBegin(
     const char* name,      Buffer& out,
     const String& nameSpace,      const CIMName& name)
     const Array<Sint8>& iParamValues)  
 { {
     Array<Sint8> out;      out << STRLIT("<IMETHODCALL NAME=\"") << name << STRLIT("\">\n");
     out << "<IMETHODCALL NAME=\"" << name << "\">\n";  }
     XmlWriter::appendLocalNameSpaceElement(out, nameSpace);  
     out << iParamValues;  void XmlWriter::_appendIMethodCallElementEnd(
     out << "</IMETHODCALL>\n";      Buffer& out)
     return out;  {
       out << STRLIT("</IMETHODCALL>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodResponseElement()  // _appendIParamValueElementBegin()
   // _appendIParamValueElementEnd()
 // //
 //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>  //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
 //     <!ATTLIST IMETHODRESPONSE %CIMName;>  //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
   //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
   //     <!ATTLIST IPARAMVALUE %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIMethodResponseElement(  void XmlWriter::_appendIParamValueElementBegin(
     const char* name,      Buffer& out,
     const Array<Sint8>& body)      const char* name)
 { {
     Array<Sint8> out;      out << STRLIT("<IPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
     out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";  }
     out << body;  
     out << "</IMETHODRESPONSE>\n";  void XmlWriter::_appendIParamValueElementEnd(
     return out;      Buffer& out)
   {
       out << STRLIT("</IPARAMVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIReturnValueElement()  // _appendSimpleRspElementBegin()
   // _appendSimpleRspElementEnd()
 // //
 //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|  //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
 //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|  //
 //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|  //------------------------------------------------------------------------------
 //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>  
   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;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIReturnValueElement(  void XmlWriter::_appendMethodResponseElementBegin(
     const Array<Sint8>& body)      Buffer& out,
       const CIMName& name)
 { {
     Array<Sint8> out;      out << STRLIT("<METHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
     return out << "<IRETURNVALUE>\n" << body << "</IRETURNVALUE>\n";  }
   
   void XmlWriter::_appendMethodResponseElementEnd(
       Buffer& out)
   {
       out << STRLIT("</METHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIParamValueElement()  // _appendIMethodResponseElementBegin()
   // _appendIMethodResponseElementEnd()
 // //
 //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE  //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
 //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION  //     <!ATTLIST IMETHODRESPONSE %CIMName;>
 //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
 //     <!ATTLIST IPARAMVALUE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::formatIParamValueElement(  void XmlWriter::_appendIMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name,      const CIMName& name)
     const Array<Sint8>& body)  
 { {
     out << "<IPARAMVALUE NAME=\"" << name << "\">\n";      out << STRLIT("<IMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
     out << body;  }
     out << "</IPARAMVALUE>\n";  
     return out;  void XmlWriter::_appendIMethodResponseElementEnd(
       Buffer& out)
   {
       out << STRLIT("</IMETHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatErrorElement()  // _appendErrorElement()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatErrorElement(  void XmlWriter::_appendErrorElement(
     CIMStatusCode code,      Buffer& out,
     const char* description)      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)
 { {
     Array<Sint8> out;          out << STRLIT(" DESCRIPTION=\"");
     out << "<ERROR";  
     out << " CODE=\"" << Uint32(code) << "\"";  
     out << " DESCRIPTION=\"";  
     appendSpecial(out, description);     appendSpecial(out, description);
     out << "\"/>";          out.append('"');
     return out;      }
   
       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");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendBooleanParameter()  // appendBooleanIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendBooleanParameter(  void XmlWriter::appendBooleanIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     Boolean flag)     Boolean flag)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     tmp << "<VALUE>" << (flag ? "TRUE" : "FALSE") << "</VALUE>\n";      out << STRLIT("<VALUE>");
     return formatIParamValueElement(out, name, tmp);      append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 434 
Line 2323 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendStringIParameter(  void XmlWriter::appendStringIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& str)     const String& str)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     tmp << "<VALUE>";      out << STRLIT("<VALUE>");
     appendSpecial(tmp, str);      appendSpecial(out, str);
     tmp << "</VALUE>\n";      out << STRLIT("</VALUE>\n");
     return formatIParamValueElement(out, name, tmp);      _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassNameIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassNameIParameter(
       Buffer& out,
       const char* name,
       const CIMName& className)
   {
       _appendIParamValueElementBegin(out, name);
   
       //
       //  A NULL (unassigned) value for a parameter is specified by an
       //  <IPARAMVALUE> element with no subelement
       //
       if (!className.isNull ())
       {
           appendClassNameElement(out, className);
       }
   
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassNameParameter()  // appendInstanceNameIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendClassNameParameter(  void XmlWriter::appendInstanceNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& className)      const CIMObjectPath& instanceName)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     appendClassNameElement(tmp, className);      appendInstanceNameElement(out, instanceName);
     return formatIParamValueElement(out, name, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------  void XmlWriter::appendObjectNameIParameter(
 //      Buffer& out,
 // appendQualifierNameParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendQualifierNameParameter(  
     Array<Sint8>& out,  
     const char* name,     const char* name,
     const String& qualifierName)      const CIMObjectPath& objectName)
 { {
     // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE  
     //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION  
     //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
     //     //
     // ATTN: notice that there is really no way to pass a qualifier name      //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
     // as an IPARAMVALUE element according to the spec (look above). So we      //  distinguish instanceNames from classNames in every case
     // just pass it as a class name. An answer must be obtained later.      //  The instanceName of a singleton instance of a keyless class also
       //  has no key bindings
     Array<Sint8> tmp;      //
     appendClassNameElement(tmp, qualifierName);      if (objectName.getKeyBindings ().size () == 0)
     return formatIParamValueElement(out, name, tmp);      {
           XmlWriter::appendClassNameIParameter(
               out, name, objectName.getClassName());
       }
       else
       {
           XmlWriter::appendInstanceNameIParameter(
               out, name, objectName);
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassParameter()  // appendClassIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendClassParameter(  void XmlWriter::appendClassIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* parameterName,      const char* name,
     const CIMConstClass& cimClass)     const CIMConstClass& cimClass)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     cimClass.toXml(tmp);      appendClassElement(out, cimClass);
     return formatIParamValueElement(out, parameterName, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendInstanceNameParameter()  // appendInstanceIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendInstanceNameParameter(  void XmlWriter::appendInstanceIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* parameterName,      const char* name,
     const CIMReference& instanceName)      const CIMConstInstance& instance)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     instanceName.instanceNameToXml(tmp);      appendInstanceElement(out, instance);
     return formatIParamValueElement(out, parameterName, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendInstanceParameter()  // appendNamedInstanceIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendInstanceParameter(  void XmlWriter::appendNamedInstanceIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* parameterName,      const char* name,
     const CIMConstInstance& instance)      const CIMInstance& namedInstance)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     instance.toXml(tmp);      appendValueNamedInstanceElement(out, namedInstance);
     return formatIParamValueElement(out, parameterName, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //---------------------------------------------------------- //----------------------------------------------------------
 // //
 //  appendPropertyNameParameter()  //  appendPropertyNameIParameter()
 // //
 //     </IPARAMVALUE> //     </IPARAMVALUE>
 //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE> //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>
 // //
 //     USE: Create parameter for getProperty operation //     USE: Create parameter for getProperty operation
 //========================================================== //==========================================================
 Array<Sint8>& XmlWriter::appendPropertyNameParameter(  void XmlWriter::appendPropertyNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const String& propertyName)      const CIMName& propertyName)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, "PropertyName");
     tmp << "<VALUE>" << propertyName << "</VALUE>\n";      out << STRLIT("<VALUE>") << propertyName << STRLIT("</VALUE>\n");
     return formatIParamValueElement(out,"PropertyName", tmp);}      _appendIParamValueElementEnd(out);
   }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendPropertyValueParameter()  // appendPropertyValueIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendPropertyValueParameter(  void XmlWriter::appendPropertyValueIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* parameterName,      const char* name,
     const CIMValue& value)     const CIMValue& value)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     value.toXml(tmp);      appendValueElement(out, value);
     return formatIParamValueElement(out, parameterName, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendPropertyListParameter()  // appendPropertyListIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendPropertyListParameter(  void XmlWriter::appendPropertyListIParameter(
     Array<Sint8>& out,      Buffer& out,
     const Array<String>& propertyList)      const CIMPropertyList& propertyList)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, "PropertyList");
   
     tmp << "<VALUE.ARRAY>\n";  
  
       //
       //  A NULL (unassigned) value for a parameter is specified by an
       //  <IPARAMVALUE> element with no subelement
       //
       if (!propertyList.isNull ())
       {
           out << STRLIT("<VALUE.ARRAY>\n");
     for (Uint32 i = 0; i < propertyList.size(); i++)     for (Uint32 i = 0; i < propertyList.size(); i++)
     {     {
         tmp << "<VALUE>" << propertyList[i] << "</VALUE>\n";              out << STRLIT("<VALUE>") << propertyList[i] << STRLIT("</VALUE>\n");
           }
           out << STRLIT("</VALUE.ARRAY>\n");
     }     }
  
     tmp << "</VALUE.ARRAY>\n";      _appendIParamValueElementEnd(out);
     return formatIParamValueElement(out, "PropertyList", tmp);  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendQualifierDeclarationParameter()  // appendQualifierDeclarationIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendQualifierDeclarationParameter(  void XmlWriter::appendQualifierDeclarationIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* parameterName,      const char* name,
     const CIMConstQualifierDecl& qualifierDecl)     const CIMConstQualifierDecl& qualifierDecl)
 { {
     Array<Sint8> tmp;      _appendIParamValueElementBegin(out, name);
     qualifierDecl.toXml(tmp);      appendQualifierDeclElement(out, qualifierDecl);
     return formatIParamValueElement(out, parameterName, tmp);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassNameElement()  // XmlWriter::formatHttpErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendClassNameElement(  Buffer XmlWriter::formatHttpErrorRspMessage(
     Array<Sint8>& out,      const String& status,
     const String& className)      const String& cimError,
       const String& errorDetail)
 { {
     return out << "<CLASSNAME NAME=\"" << className << "\"/>\n";      Buffer out;
 }  
  
 //------------------------------------------------------------------------------      appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
 //  
 // appendInstanceNameElement()  
 //  
 //------------------------------------------------------------------------------  
  
 Array<Sint8>& XmlWriter::appendInstanceNameElement(  
     Array<Sint8>& out,  
     const CIMReference& instanceName)  
 {  
     instanceName.instanceNameToXml(out);  
     return out;     return out;
 } }
  
   // l10n - add content language support to the format methods below
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _printAttributes()  // XmlWriter::formatSimpleMethodReqMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 static void _printAttributes(  // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
     PEGASUS_STD(ostream)& os,  Buffer XmlWriter::formatSimpleMethodReqMessage(
     const XmlAttribute* attributes,      const char* host,
     Uint32 attributeCount)      const CIMNamespaceName& nameSpace,
 {      const CIMObjectPath& path,
     for (Uint32 i = 0; i < attributeCount; i++)      const CIMName& methodName,
     {      const Array<CIMParamValue>& parameters,
         os << attributes[i].name << "=";      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);
  
         os << '"';      appendMethodCallHeader(
         AppendSpecial(os, attributes[i].value);          tmp,
         os << '"';          host,
           methodName,
           localObjectPath.toString(),
           authenticationHeader,
           httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size(),
           false,
           binaryResponse);
       tmp << out;
  
         if (i + 1 != attributeCount)      return tmp;
             os << ' ';  
     }     }
   
   Buffer XmlWriter::formatSimpleMethodRspMessage(
       const CIMName& methodName,
       const String& messageId,
       HttpMethod httpMethod,
       const ContentLanguageList& httpContentLanguages,
       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)
 //      {
 // _indent()          out << body;
 //      }
 //------------------------------------------------------------------------------  
  
 static void _indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)      if (isLast == true)
 { {
     Uint32 n = level * indentChars;          _appendMethodResponseElementEnd(out);
           _appendSimpleRspElementEnd(out);
           _appendMessageElementEnd(out);
       }
  
     for (Uint32 i = 0; i < n; i++)      return out;
         os << ' ';  
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // indentedPrint()  // XmlWriter::formatSimpleMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::indentedPrint(  Buffer XmlWriter::formatSimpleMethodErrorRspMessage(
     PEGASUS_STD(ostream)& os,      const CIMName& methodName,
     const char* text,      const String& messageId,
     Uint32 indentChars)      HttpMethod httpMethod,
 {      const CIMException& cimException)
     char* tmp = strcpy(new char[strlen(text) + 1], text);  
   
     XmlParser parser(tmp);  
     XmlEntry entry;  
     Stack<const char*> stack;  
   
     while (parser.next(entry))  
     {  
         switch (entry.type)  
         {  
             case XmlEntry::XML_DECLARATION:  
             {  
                 _indent(os, stack.size(), indentChars);  
   
                 os << "<?" << entry.text << " ";  
                 _printAttributes(os, entry.attributes, entry.attributeCount);  
                 os << "?>";  
                 break;  
             }  
   
             case XmlEntry::START_TAG:  
             {             {
                 _indent(os, stack.size(), indentChars);      Buffer out;
       Buffer tmp;
                 os << "<" << entry.text;  
  
                 if (entry.attributeCount)      _appendMessageElementBegin(out, messageId);
                     os << ' ';      _appendSimpleRspElementBegin(out);
       _appendMethodResponseElementBegin(out, methodName);
       _appendErrorElement(out, cimException);
       _appendMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(
           tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size(),
           false);
       tmp << out;
  
                 _printAttributes(os, entry.attributes, entry.attributeCount);      return tmp;
                 os << ">";  
                 stack.push(entry.text);  
                 break;  
             }             }
  
             case XmlEntry::EMPTY_TAG:  //------------------------------------------------------------------------------
             {  //
                 _indent(os, stack.size(), indentChars);  // XmlWriter::formatSimpleIMethodReqMessage()
   //
                 os << "<" << entry.text << " ";  //------------------------------------------------------------------------------
                 _printAttributes(os, entry.attributes, entry.attributeCount);  
                 os << "/>";  
                 break;  
             }  
  
             case XmlEntry::END_TAG:  Buffer XmlWriter::formatSimpleIMethodReqMessage(
             {      const char* host,
                 if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)      const CIMNamespaceName& nameSpace,
                     stack.pop();      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);
  
                 _indent(os, stack.size(), indentChars);      appendMethodCallHeader(
           tmp,
           host,
           iMethodName,
           nameSpace.getString(),
           authenticationHeader,
           httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size(),
           false,
           binaryResponse);
       tmp << out;
  
                 os << "</" << entry.text << ">";      return tmp;
                 break;  
             }             }
  
             case XmlEntry::COMMENT:  //------------------------------------------------------------------------------
             {  //
   // XmlWriter::formatSimpleIMethodRspMessage()
                 _indent(os, stack.size(), indentChars);  //
                 os << "<!--";  //------------------------------------------------------------------------------
                 AppendSpecial(os, entry.text);  
                 os << "-->";  
                 break;  
             }  
  
             case XmlEntry::CONTENT:  Buffer XmlWriter::formatSimpleIMethodRspMessage(
             {      const CIMName& iMethodName,
                 _indent(os, stack.size(), indentChars);      const String& messageId,
                 AppendSpecial(os, entry.text);      HttpMethod httpMethod,
                 break;      const ContentLanguageList& httpContentLanguages,
       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);
             }             }
  
             case XmlEntry::CDATA:      if (body.size() != 0)
             {             {
                 _indent(os, stack.size(), indentChars);          out << body;
                 os << "<![CDATA[...]]>";  
                 break;  
             }             }
  
             case XmlEntry::DOCTYPE:      if (isLast == true)
             {             {
                 _indent(os, stack.size(), indentChars);          if (body.size() != 0 || isFirst == false)
                 os << "<!DOCTYPE...>";              _appendIReturnValueElementEnd(out);
                 break;          _appendIMethodResponseElementEnd(out);
             }          _appendSimpleRspElementEnd(out);
           _appendMessageElementEnd(out);
         }         }
  
         os << PEGASUS_STD(endl);      return out;
     }     }
  
     delete [] tmp;  
 }  
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::getNextMessageId()  // XmlWriter::formatSimpleIMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 String XmlWriter::getNextMessageId()  Buffer XmlWriter::formatSimpleIMethodErrorRspMessage(
       const CIMName& iMethodName,
       const String& messageId,
       HttpMethod httpMethod,
       const CIMException& cimException)
 { {
     // ATTN: make thread-safe:      Buffer out;
     static Uint32 messageId = 1000;      Buffer tmp;
  
     messageId++;      _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendIMethodResponseElementBegin(out, iMethodName);
       _appendErrorElement(out, cimException);
       _appendIMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
  
     if (messageId < 1000)      appendMethodResponseHeader(tmp,
         messageId = 1001;          httpMethod,
           cimException.getContentLanguages(),
           out.size(), false);
       tmp << out;
  
     char buffer[16];      return tmp;
     sprintf(buffer, "%d", messageId);  
     return buffer;  
 } }
  
   //******************************************************************************
   //
   // Export Messages (used for indications)
   //
   //******************************************************************************
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleIMethodReqMessage()  // appendEMethodRequestHeader()
   //
   //     Build HTTP request header for export operation.
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodReqMessage(  void XmlWriter::appendEMethodRequestHeader(
       Buffer& out,
       const char* requestUri,
     const char* host,     const char* host,
     const String& nameSpace,      const CIMName& cimMethod,
     const char* iMethodName,      HttpMethod httpMethod,
     const String& messageId,      const String& authenticationHeader,
     const Array<Sint8>& body)      const AcceptLanguageList& acceptLanguages,
       const ContentLanguageList& contentLanguages,
       Uint32 contentLength)
 { {
     return XmlWriter::formatMPostHeader(      char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
         host,  
         "MethodCall",  
         iMethodName,  
         nameSpace,  
         XmlWriter::formatMessageElement(  
             messageId,  
             XmlWriter::formatSimpleReqElement(  
                 XmlWriter::formatIMethodCallElement(  
                     iMethodName,  
                     nameSpace,  
                     body))));  
 }  
  
 Array<Sint8> XmlWriter::formatSimpleRspMessage(      if (httpMethod == HTTP_METHOD_M_POST)
     const char* iMethodName,  
     const String& messageId,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMethodResponseHeader(        out << STRLIT("M-POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
         XmlWriter::formatMessageElement(  
             messageId,  
             XmlWriter::formatSimpleRspElement(  
                 XmlWriter::formatIMethodResponseElement(  
                     iMethodName,  
                     XmlWriter::formatIReturnValueElement(body)))));  
 } }
       else
 Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)  
 { {
     XmlWriter::append(out, x);        out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
     return out;  
 } }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n"
                     "Content-Type: application/xml; charset=\"utf-8\"\r\n");
       OUTPUT_CONTENTLENGTH(out, contentLength);
  
 Array<Sint8>& operator<<(Array<Sint8>& out, char x)      if (acceptLanguages.size() > 0)
 { {
     XmlWriter::append(out, x);          out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
     return out;  
 } }
       if (contentLanguages.size() > 0)
 Array<Sint8>& operator<<(Array<Sint8>& out, Char16 x)  
 { {
     XmlWriter::append(out, x);          out << STRLIT("Content-Language: ") << contentLanguages <<
     return out;              STRLIT("\r\n");
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)  #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)
 { {
     XmlWriter::append(out, x);          out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
     return out;          out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodRequest\r\n");
           out << nn << STRLIT("-CIMExportMethod: ") << cimMethod <<
               STRLIT("\r\n");
 } }
       else
 Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)  
 { {
     XmlWriter::append(out, x);          out << STRLIT("CIMExport: MethodRequest\r\n"
     return out;                        "CIMExportMethod: ") << cimMethod << STRLIT("\r\n");
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)      if (authenticationHeader.size())
 { {
     out.appendArray(x);          out << authenticationHeader << STRLIT("\r\n");
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)      out << STRLIT("\r\n");
 {  
     XmlWriter::append(out, x);  
     return out;  
 } }
  
 Array<Sint8>& XmlWriter::appendObjectNameParameter(  //------------------------------------------------------------------------------
     Array<Sint8>& out,  //
     const char* name,  // appendEMethodResponseHeader()
     const CIMReference& objectName)  //
 {  //     Build HTTP response header for export operation.
     if (objectName.isClassName())  //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendEMethodResponseHeader(
       Buffer& out,
       HttpMethod httpMethod,
       const ContentLanguageList& contentLanguages,
       Uint32 contentLength)
     {     {
         XmlWriter::appendClassNameParameter(      char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
             out, name, objectName.getClassName());  
       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     else
     {     {
         XmlWriter::appendInstanceNameParameter(          out << STRLIT("CIMExport: MethodResponse\r\n\r\n");
             out, name, objectName);  
     }     }
   
     return out;  
 } }
  
 Array<Sint8> XmlWriter::formatEMethodCallElement(  //------------------------------------------------------------------------------
     const char* name,  //
     const Array<Sint8>& iParamValues)  // _appendSimpleExportReqElementBegin()
 {  // _appendSimpleExportReqElementEnd()
     Array<Sint8> out;  //
     out << "<EXPMETHODCALL NAME=\"" << name << "\">\n";  //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)>
     out << iParamValues;  //
     out << "</EXPMETHODCALL>\n";  //------------------------------------------------------------------------------
     return out;  
 }  
  
 Array<Sint8> XmlWriter::formatSimpleIndicationReqMessage(  void XmlWriter::_appendSimpleExportReqElementBegin(
     const char* host,      Buffer& out)
     const char* iMethodName,  
     const String& messageId,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMPostIndicationHeader(      out << STRLIT("<SIMPLEEXPREQ>\n");
         host,  
         "MethodRequest",  
         iMethodName,  
         XmlWriter::formatMessageElement(  
             messageId,  
             XmlWriter::formatSimpleExportReqElement(  
                 XmlWriter::formatEMethodCallElement(  
                     iMethodName,  
                     body))));  
 } }
  
 Array<Sint8> XmlWriter::formatMPostIndicationHeader(  void XmlWriter::_appendSimpleExportReqElementEnd(
     const char* host,      Buffer& out)
     const char* cimOperation,  
     const char* cimMethod,  
     const Array<Sint8>& content)  
 { {
     Array<Sint8> out;      out << STRLIT("</SIMPLEEXPREQ>\n");
     out.reserve(1024);  
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };  
   
     out << "M-POST /cimom HTTP/1.1\r\n";  
     out << "HOST: " << host << "\r\n";  
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << content.size() << "\r\n";  
     out << "Man: http://www.hp.com; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMExport: " << cimOperation << "\r\n";  
     out << nn << "-CIMExportMethod: " << cimMethod << "\r\n\r\n";  
     out << content;  
     return out;  
 } }
  
 Array<Sint8> XmlWriter::formatSimpleExportReqElement(  //------------------------------------------------------------------------------
     const Array<Sint8>& body)  //
   // _appendEMethodCallElementBegin()
   // _appendEMethodCallElementEnd()
   //
   //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)>
   //     <!ATTLIST EXPMETHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendEMethodCallElementBegin(
       Buffer& out,
       const CIMName& name)
 { {
     Array<Sint8> out;      out << STRLIT("<EXPMETHODCALL NAME=\"") << name << STRLIT("\">\n");
     return out << "<SIMPLEEXPREQ>\n" << body << "</SIMPLEEXPREQ>\n";  
 } }
  
 Array<Sint8> XmlWriter::formatSimpleIndicationRspMessage(  void XmlWriter::_appendEMethodCallElementEnd(
     const char* iMethodName,      Buffer& out)
     const String& messageId,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatEMethodResponseHeader(      out << STRLIT("</EXPMETHODCALL>\n");
         XmlWriter::formatMessageElement(  
             messageId,  
             XmlWriter::formatSimpleExportRspElement(  
                 XmlWriter::formatEMethodResponseElement(  
                     iMethodName,  
                     XmlWriter::formatIReturnValueElement(body)))));  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleExportRspElement()  // _appendEParamValueElementBegin()
   // _appendEParamValueElementEnd()
 // //
 //     <!ELEMENT SIMPLEEXPRSP (METHODRESPONSE|EXPMETHODRESPONSE)>  //     <!ELEMENT EXPPARAMVALUE (INSTANCE)>
   //     <!ATTLIST EXPPARAMVALUE
   //         %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleExportRspElement(  void XmlWriter::_appendEParamValueElementBegin(
     const Array<Sint8>& body)      Buffer& out,
       const char* name)
   {
       out << STRLIT("<EXPPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendEParamValueElementEnd(
       Buffer& out)
 { {
     Array<Sint8> out;      out << STRLIT("</EXPPARAMVALUE>\n");
     return out << "<SIMPLEEXPRSP>\n" << body << "</SIMPLEEXPRSP>\n";  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodResponseElement()  // appendInstanceEParameter()
 //  
 //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>  
 //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatEMethodResponseElement(  void XmlWriter::appendInstanceEParameter(
       Buffer& out,
     const char* name,     const char* name,
     const Array<Sint8>& body)      const CIMInstance& instance)
 { {
     Array<Sint8> out;      _appendEParamValueElementBegin(out, name);
     out << "<EXPMETHODRESPONSE NAME=\"" << name << "\">\n";      appendInstanceElement(out, instance);
     out << body;      _appendEParamValueElementEnd(out);
     out << "</EXPMETHODRESPONSE>\n";  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseHeader()  // _appendSimpleExportRspElementBegin()
   // _appendSimpleExportRspElementEnd()
 // //
 //     Build HTTP response header.  //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatEMethodResponseHeader(  void XmlWriter::_appendSimpleExportRspElementBegin(
     const Array<Sint8>& content)      Buffer& out)
 { {
     Array<Sint8> out;      out << STRLIT("<SIMPLEEXPRSP>\n");
     out.reserve(1024);  }
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };  
  
     out << "HTTP/1.1 200 OK\r\n";  void XmlWriter::_appendSimpleExportRspElementEnd(
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";      Buffer& out)
     out << "Content-Length: " << content.size() << "\r\n";  {
     out << "Ext:\r\n";      out << STRLIT("</SIMPLEEXPRSP>\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 << "-CIMExport: MethodResponse\r\n\r\n";  
     out << content;  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleMethodReqMessage()  // _appendEMethodResponseElementBegin()
   // _appendEMethodResponseElementEnd()
   //
   //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleMethodReqMessage(  void XmlWriter::_appendEMethodResponseElementBegin(
     const char* host,      Buffer& out,
     const String& nameSpace,      const CIMName& name)
     const char* iMethodName,  
     const String& messageId,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMPostHeader(      out << STRLIT("<EXPMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
         host,  }
         "MethodCall",  
         iMethodName,  void XmlWriter::_appendEMethodResponseElementEnd(
         nameSpace,      Buffer& out)
         XmlWriter::formatMessageElement(  {
             messageId,      out << STRLIT("</EXPMETHODRESPONSE>\n");
             XmlWriter::formatSimpleReqElement(  
                 XmlWriter::formatMethodCallElement(  
                     iMethodName,  
                     nameSpace,  
                     body))));  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodCallElement()  // XmlWriter::formatSimpleEMethodReqMessage()
 //  
 //     <!ELEMENT METHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>  
 //     <!ATTLIST METHODCALL %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodCallElement(  Buffer XmlWriter::formatSimpleEMethodReqMessage(
     const char* name,      const char* requestUri,
     const String& nameSpace,      const char* host,
     const Array<Sint8>& iParamValues)      const CIMName& eMethodName,
 {  
     Array<Sint8> out;  
     out << "<METHODCALL NAME=\"" << name << "\">\n";  
     out << iParamValues;  
     out << "</METHODCALL>\n";  
     return out;  
 }  
   
 Array<Sint8> XmlWriter::formatSimpleMethodRspMessage(  
     const char* iMethodName,  
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
 {      const String& authenticationHeader,
     /*return XmlWriter::formatMethodResponseHeader(      const AcceptLanguageList& httpAcceptLanguages,
         XmlWriter::formatMessageElement(      const ContentLanguageList& httpContentLanguages,
             messageId,      const Buffer& body)
             XmlWriter::formatSimpleRspElement(  {
                 XmlWriter::formatMethodResponseElement(      Buffer out;
                     iMethodName,      Buffer tmp;
                     XmlWriter::formatReturnValueElement(body)))));*/  
     return XmlWriter::formatMethodResponseHeader(      _appendMessageElementBegin(out, messageId);
         XmlWriter::formatMessageElement(      _appendSimpleExportReqElementBegin(out);
             messageId,      _appendEMethodCallElementBegin(out, eMethodName);
             XmlWriter::formatSimpleRspElement(      out << body;
                 XmlWriter::formatMethodResponseElement(      _appendEMethodCallElementEnd(out);
                     iMethodName,      _appendSimpleExportReqElementEnd(out);
                     body))));      _appendMessageElementEnd(out);
   
       appendEMethodRequestHeader(
           tmp,
           requestUri,
           host,
           eMethodName,
           httpMethod,
           authenticationHeader,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size());
       tmp << out;
   
       return tmp;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseElement()  // XmlWriter::formatSimpleEMethodRspMessage()
 //  
 //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>  
 //     <!ATTLIST METHODRESPONSE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodResponseElement(  Buffer XmlWriter::formatSimpleEMethodRspMessage(
     const char* name,      const CIMName& eMethodName,
     const Array<Sint8>& body)      const String& messageId,
 {      HttpMethod httpMethod,
     Array<Sint8> out;      const ContentLanguageList& httpContentLanguages,
     out << "<METHODRESPONSE NAME=\"" << name << "\">\n";      const Buffer& body)
   {
       Buffer out;
       Buffer tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
     out << body;     out << body;
     out << "</METHODRESPONSE>\n";      _appendEMethodResponseElementEnd(out);
     return out;      _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendEMethodResponseHeader(tmp,
           httpMethod,
           httpContentLanguages,
           out.size());
       tmp << out;
   
       return tmp;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendStringParameter()  // XmlWriter::formatSimpleEMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendStringParameter(  Buffer XmlWriter::formatSimpleEMethodErrorRspMessage(
     Array<Sint8>& out,      const CIMName& eMethodName,
     const char* name,      const String& messageId,
     const String& str)      HttpMethod httpMethod,
       const CIMException& cimException)
 { {
     Array<Sint8> tmp;      Buffer out;
     tmp << "<VALUE>";      Buffer tmp;
     appendSpecial(tmp, str);  
     tmp << "</VALUE>\n";      _appendMessageElementBegin(out, messageId);
     return formatParamValueElement(out, name, tmp);      _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
       _appendErrorElement(out, cimException);
       _appendEMethodResponseElementEnd(out);
       _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendEMethodResponseHeader(
           tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size());
       tmp << out;
   
       return tmp;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatParamValueElement()  // XmlWriter::getNextMessageId()
 //  
 //     <!ELEMENT PARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE  
 //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION  
 //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
 //     <!ATTLIST PARAMVALUE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::formatParamValueElement(  static IDFactory _messageIDFactory(1000);
     Array<Sint8>& out,  
     const char* name,  String XmlWriter::getNextMessageId()
     const Array<Sint8>& body)  
 { {
     out << "<PARAMVALUE NAME=\"" << name << "\">\n";      char scratchBuffer[22];
     out << body;      Uint32 n;
     out << "</PARAMVALUE>\n";      const char * startP = Uint32ToString(scratchBuffer,
     return out;                                           _messageIDFactory.getID(),
                                            n);
       return String(startP, n);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatReturnValueElement()  // XmlWriter::keyBindingTypeToString
 //  
 //      <!ELEMENT RETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|  
 //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|  
 //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|  
 //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
   const StrLit XmlWriter::keyBindingTypeToString (CIMKeyBinding::Type type)
 Array<Sint8> XmlWriter::formatReturnValueElement(  {
     const Array<Sint8>& body)      switch (type)
 { {
     Array<Sint8> out;          case CIMKeyBinding::BOOLEAN:
     return out << "<RETURNVALUE>\n" << body << "</RETURNVALUE>\n";              return STRLIT("boolean");
   
           case CIMKeyBinding::STRING:
               return STRLIT("string");
   
           case CIMKeyBinding::NUMERIC:
               return STRLIT("numeric");
   
           case CIMKeyBinding::REFERENCE:
           default:
               PEGASUS_ASSERT(false);
       }
   
       return STRLIT("unknown");
 } }
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.23.2.6  
changed lines
  Added in v.1.166

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2