(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.52 and 1.169.4.8

version 1.52, 2002/05/11 21:36:31 version 1.169.4.8, 2013/09/19 10:56:58
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%LICENSE////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,  // Licensed to The Open Group (TOG) under one or more contributor license
 // The Open Group, Tivoli Systems  // 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.
 // //
 // 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.  
 //  
 //==============================================================================  
 //  
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)  
 //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)  
 //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)  
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
Line 33 
Line 33 
 #include <cstdlib> #include <cstdlib>
 #include <cstdio> #include <cstdio>
 #include "Constants.h" #include "Constants.h"
 #include "Destroyer.h"  
 #include "CIMClass.h" #include "CIMClass.h"
   #include "CIMClassRep.h"
 #include "CIMInstance.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 "CIMQualifierDecl.h"
   #include "CIMQualifierDeclRep.h"
   #include "CIMValue.h"
 #include "XmlWriter.h" #include "XmlWriter.h"
 #include "XmlParser.h"  
 #include "Tracer.h" #include "Tracer.h"
 #include <Pegasus/Common/StatisticalData.h> #include <Pegasus/Common/StatisticalData.h>
   #include "CommonUTF.h"
   #include "Buffer.h"
   #include "StrLit.h"
   #include "IDFactory.h"
   #include "StringConversion.h"
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)  //------------------------------------------------------------------------------
   //
   // 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();
               // create an instancePath (i.e. isClassPath = false)
               appendValueReferenceElement(out, ref, false, true);
           }
           else
           {
               out << STRLIT("<KEYVALUE VALUETYPE=\"");
               out << keyBindingTypeToString(keyBindings[i].getType());
               out << STRLIT("\">");
   
               // fixed the special characters
   
               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.
   //
   //------------------------------------------------------------------------------
   
   // appendValueReferenceElement does this correctly with isClassPath flag
   // Called only but formatSimple
   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
       //  See bBUG_3302.
       //
       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);     XmlWriter::append(out, x);
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, char 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);     XmlWriter::append(out, x);
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Char16 x)  inline void _xmlWritter_appendValue(Buffer& out, Sint32 x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)  inline void _xmlWritter_appendValue(Buffer& out, Uint64 x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)  inline void _xmlWritter_appendValue(Buffer& out, Sint64 x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)  inline void _xmlWritter_appendValue(Buffer& out, Real32 x)
 { {
     out.appendArray(x);      XmlWriter::append(out, x);
     return out;  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)  inline void _xmlWritter_appendValue(Buffer& out, Real64 x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;  
 } }
  
 inline void _appendChar(Array<Sint8>& out, Char16 c)  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)
   {
       // Emit Instance Path with value wrapper
       XmlWriter::appendValueReferenceElement(out, x, false, 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:
 { {
     out.append(Sint8(c));                  Array<Uint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
 } }
  
 inline void _appendSpecialChar(Array<Sint8>& out, Char16 c)              case CIMTYPE_SINT8:
 { {
     // ATTN-B: Only UTF-8 handled for now.                  Array<Sint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
  
     switch (c)              case CIMTYPE_UINT16:
     {     {
         case '&':                  Array<Uint16> a;
             out.append("&amp;", 5);                  value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '<':              case CIMTYPE_SINT16:
             out.append("&lt;", 4);              {
                   Array<Sint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '>':              case CIMTYPE_UINT32:
             out.append("&gt;", 4);              {
                   Array<Uint32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '"':              case CIMTYPE_SINT32:
             out.append("&quot;", 6);              {
                   Array<Sint32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '\'':              case CIMTYPE_UINT64:
             out.append("&apos;", 6);              {
                   Array<Uint64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         default:              case CIMTYPE_SINT64:
             out.append(Sint8(c));              {
                   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;
 } }
  
 static inline void _appendSpecialChar(PEGASUS_STD(ostream)& os, char c)              case CIMTYPE_REAL64:
 { {
     switch (c)                  Array<Real64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_CHAR16:
     {     {
         case '&':                  Array<Char16> a;
             os << "&amp;";                  value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '<':              case CIMTYPE_STRING:
             os << "&lt;";              {
                   const String* data;
                   Uint32 size;
                   value._get(data, size);
                   _xmlWritter_appendValueArray(out, data, size);
             break;             break;
               }
  
         case '>':              case CIMTYPE_DATETIME:
             os << "&gt;";              {
                   Array<CIMDateTime> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '"':              case CIMTYPE_REFERENCE:
             os << "&quot;";              {
                   Array<CIMObjectPath> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
             break;             break;
               }
  
         case '\'':              case CIMTYPE_OBJECT:
             os << "&apos;";              {
                   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;             break;
               }
               default:
                   PEGASUS_UNREACHABLE(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_UNREACHABLE(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,
       Boolean includeQualifiers,
       Boolean includeClassOrigin,
       Boolean isClassObject,
       const CIMPropertyList& propertyList)
   {
       out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
   
       appendValueReferenceElement(out, objectWithPath.getPath (),
           isClassObject , false);
   
       appendObjectElement(
           out,
           objectWithPath,
           includeQualifiers,
           includeClassOrigin,
           propertyList);
   
       out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueReferenceElement()
   //
   //    <!ELEMENT VALUE.REFERENCE
   //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   // appends INSTANCEPATH | LOCALINSTANCEPATH | INSTANCENAME
   void XmlWriter::appendValueInstancePathElement(
       Buffer& out,
       const CIMObjectPath& reference)
   {
       if (reference.getHost().size())
       {
           appendInstancePathElement(out, reference);
       }
       else if (!reference.getNameSpace().isNull())
       {
           appendLocalInstancePathElement(out, reference);
       }
       else
       {
           appendInstanceNameElement(out, reference);
       }
   }
   
   // appends CLASSPATH | LOCALCLASSPATH | CLASSNAME
   void XmlWriter::appendValueClassPathElement(
       Buffer& out,
       const CIMObjectPath& reference)
   {
       if (reference.getHost().size())
       {
           appendClassPathElement(out, reference);
       }
       else if (!reference.getNameSpace().isNull())
       {
           appendLocalClassPathElement(out, reference);
       }
       else
       {
           appendClassNameElement(out, reference.getClassName());
       }
   }
   
   // Builds either a classPath or InstancePath based on isClassPath
   // parameter which was carried forward from, for example, the
   // request. If wrapper true, wrap output with <VALUE.REFERENCE>
   void XmlWriter::appendValueReferenceElement(
       Buffer& out,
       const CIMObjectPath& reference,
       Boolean isClassPath,
       Boolean addValueWrapper)
   {
       if (addValueWrapper)
       {
            out << STRLIT("<VALUE.REFERENCE>\n");
       }
       if (isClassPath)
       {
           appendValueClassPathElement(out,reference);
       }
       else
       {
           appendValueInstancePathElement(out,reference);
       }
   
       if (addValueWrapper)
       {
           out << STRLIT("</VALUE.REFERENCE>\n");
       }
   }
   
   void XmlWriter::printValueReferenceElement(
       const CIMObjectPath& reference,
       Boolean isClassPath,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendValueReferenceElement(tmp, reference, isClassPath, true);
       indentedPrint(os, tmp.getData());
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueNamedInstanceElement()
   //
   //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueNamedInstanceElement(
       Buffer& out,
       const CIMInstance& namedInstance,
       Boolean includeQualifiers,
       Boolean includeClassOrigin,
       const CIMPropertyList& propertyList)
   {
       out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
   
       appendInstanceNameElement(out, namedInstance.getPath ());
       appendInstanceElement(
           out,
           namedInstance,
           includeQualifiers,
           includeClassOrigin,
           propertyList);
   
       out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
   }
   
   //EXP_PULL_BEGIN
   //------------------------------------------------------------------------------
   //
   // appendValueInstanceWithPathElement()
   //
   //     <!ELEMENT VALUE.INSTANCEWITHPATH (INSTANCEPATH,INSTANCE)>
   //
   //------------------------------------------------------------------------------
   //
   void XmlWriter::appendValueInstanceWithPathElement(
       Buffer& out,
       const CIMInstance& namedInstance,
           Boolean includeQualifiers,
           Boolean includeClassOrigin,
           const CIMPropertyList& propertyList)
   {
       out << STRLIT("<VALUE.INSTANCEWITHPATH>\n");
   
       appendInstancePathElement(out, namedInstance.getPath ());
       appendInstanceElement(
           out,
           namedInstance,
           includeQualifiers,
           includeClassOrigin,
           propertyList);
   
       out << STRLIT("</VALUE.INSTANCEWITHPATH>\n");
   }
   //EXP_PULL_END
   //------------------------------------------------------------------------------
   //
   // appendClassElement()
   //
   //     <!ELEMENT CLASS
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
   //     <!ATTLIST CLASS
   //         %CIMName;
   //         %SuperClass;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassElement(
       Buffer& out,
       const CIMConstClass& cimClass)
   {
       CheckRep(cimClass._rep);
       const CIMClassRep* rep = cimClass._rep;
   
       // Class opening element:
   
       out << STRLIT("<CLASS NAME=\"")
           << rep->getClassName()
           << STRLIT("\" ");
   
       if (!rep->getSuperClassName().isNull())
       {
           out << STRLIT(" SUPERCLASS=\"")
               << rep->getSuperClassName()
               << STRLIT("\" ");
       }
   
       out << STRLIT(">\n");
   
       // Append Class Qualifiers:
   
       for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
           XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
   
       // Append Property definitions:
   
       for (Uint32 i = 0, n = rep->getPropertyCount(); i < n; i++)
           XmlWriter::appendPropertyElement(out, rep->getProperty(i));
   
       // Append Method definitions:
   
       for (Uint32 i = 0, n = rep->getMethodCount(); i < n; i++)
           XmlWriter::appendMethodElement(out, rep->getMethod(i));
   
       // Class closing element:
   
       out << STRLIT("</CLASS>\n");
   }
   
   void XmlWriter::printClassElement(
       const CIMConstClass& cimclass,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendClassElement(tmp, cimclass);
       indentedPrint(os, tmp.getData(), 4);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceElement()
   //
   //     <!ELEMENT INSTANCE
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
   //     <!ATTLIST INSTANCE
   //         %ClassName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceElement(
       Buffer& out,
       const CIMConstInstance& instance,
       Boolean includeQualifiers,
       Boolean includeClassOrigin,
       const CIMPropertyList& propertyList)
   {
       CheckRep(instance._rep);
       const CIMInstanceRep* rep = instance._rep;
   
       // Class opening element:
   
       out << STRLIT("<INSTANCE CLASSNAME=\"")
           << rep->getClassName()
           << STRLIT("\" >\n");
   
       // Append Instance Qualifiers:
       if(includeQualifiers)
       {
           for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
               XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
       }
       if(propertyList.isNull())
       {
           for (Uint32 i = 0, n = rep->getPropertyCount(); i < n; i++)
           {
               XmlWriter::appendPropertyElement(
                   out,
                   rep->getProperty(i),
                   includeQualifiers,includeClassOrigin);
           }
       }
       else
       {
           for (Uint32 i = 0, n = propertyList.size(); i < n; i++)
           {
               CIMName name = propertyList[i];
               Uint32 pos = rep->_properties.find(
                   propertyList[i],
                   propertyList.getCIMNameTag(i));
               if(pos != PEG_NOT_FOUND)
               {
                   PEG_TRACE((TRC_XML,Tracer::LEVEL4,
                       "XmlWriter::appendInstanceElement"
                           " Filtering the property name:%s for the className:%s"
                       "since it was not filtered by the provider.",
                       (const char *)name.getString().getCString(),
                       (const char *)instance.getClassName().
                           getString().getCString()));
   
                   XmlWriter::appendPropertyElement(
                       out,
                       rep->getProperty(pos),
                       includeQualifiers,includeClassOrigin);
               }
           }
   
       }
   
       // 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,
       Boolean includeQualifiers,
       Boolean includeClassOrigin,
       const CIMPropertyList& propertyList)
   {
       if (object.isClass())
       {
           CIMConstClass c(object);
           appendClassElement(out, c);
       }
       else if (object.isInstance())
       {
           CIMConstInstance i(object);
           appendInstanceElement(
               out,
               i,
               includeQualifiers,
               includeClassOrigin,
               propertyList);
       }
       // 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,
       Boolean includeQualifiers,
       Boolean includeClassOrigin)
   {
       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(includeClassOrigin && !rep->getClassOrigin().isNull())
           {
               out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
               out.append('"');
           }
   
           if (rep->getPropagated())
           {
               out << STRLIT(" PROPAGATED=\"true\"");
           }
   
           out << STRLIT(">\n");
           if(includeQualifiers)
           {
               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(includeClassOrigin && !rep->getClassOrigin().isNull())
           {
               out << STRLIT(" CLASSORIGIN=\"") << rep->getClassOrigin();
               out.append('"');
           }
   
           if (rep->getPropagated())
           {
               out << STRLIT(" PROPAGATED=\"true\"");
           }
   
           out << STRLIT(">\n");
           if(includeQualifiers)
           {
               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(includeClassOrigin && !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");
           if(includeQualifiers)
           {
               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;>
   //
   //------------------------------------------------------------------------------
  
         default:  void XmlWriter::appendParameterElement(
             os << c;      Buffer& out,
     }      const CIMConstParameter& parameter)
 }  {
       CheckRep(parameter._rep);
       const CIMParameterRep* rep = parameter._rep;
  
 static inline void _appendSpecial(PEGASUS_STD(ostream)& os, const char* str)      if (rep->isArray())
 { {
     while (*str)          if (rep->getType() == CIMTYPE_REFERENCE)
         _appendSpecialChar(os, *str++);          {
 }              out << STRLIT("<PARAMETER.REFARRAY NAME=\"") << rep->getName();
               out.append('"');
  
 void XmlWriter::append(Array<Sint8>& out, Char16 x)              if (!rep->getReferenceClassName().isNull())
 { {
     _appendChar(out, x);                  out << STRLIT(" REFERENCECLASS=\"");
                   out << rep->getReferenceClassName().getString();
                   out.append('"');
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Uint32 x)              if (rep->getArraySize())
 { {
     char buffer[32];     char buffer[32];
     sprintf(buffer, "%d", x);                  int n = sprintf(buffer, "%u", rep->getArraySize());
     append(out, buffer);                  out << STRLIT(" ARRAYSIZE=\"");
                   out.append(buffer, n);
                   out.append('"');
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const char* str)              out << STRLIT(">\n");
 {  
     while (*str)  
         _appendChar(out, *str++);  
 }  
  
 void XmlWriter::append(Array<Sint8>& out, const String& str)              for (Uint32 i = 0, n = rep->getQualifierCount(); i < n; i++)
 {                  XmlWriter::appendQualifierElement(out, rep->getQualifier(i));
     const Char16* tmp = str.getData();  
  
     while (*tmp)              out << STRLIT("</PARAMETER.REFARRAY>\n");
         _appendChar(out, *tmp++);  
 } }
           else
           {
               out << STRLIT("<PARAMETER.ARRAY"
                             " NAME=\"") << rep->getName();
               out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getType());
  
 void XmlWriter::append(Array<Sint8>& out, const Indentor& x)              if (rep->getArraySize())
 { {
     for (Uint32 i = 0; i < 4 * x.getLevel(); i++)                  char buffer[32];
         out.append(' ');                  sprintf(buffer, "%u", rep->getArraySize());
                   out << STRLIT(" ARRAYSIZE=\"") << buffer;
                   out.append('"');
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)              out << STRLIT(">\n");
 {  
     _appendSpecialChar(out, x);              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('"');
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, char x)          if (!rep->getReferenceClassName().isNull())
 { {
     _appendSpecialChar(out, Char16(x));              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));
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)          out << STRLIT("</PARAMETER.REFERENCE>\n");
       }
       else
 { {
     while (*str)          out << STRLIT("<PARAMETER"
         _appendSpecialChar(out, *str++);                        " 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::appendSpecial(Array<Sint8>& out, const String& str)  void XmlWriter::printParameterElement(
       const CIMConstParameter& parameter,
       PEGASUS_STD(ostream)& os)
 { {
     const Char16* tmp = str.getData();      Buffer tmp;
       appendParameterElement(tmp, parameter);
     while (*tmp)      os << tmp.getData() << PEGASUS_STD(endl);
         _appendSpecialChar(out, *tmp++);  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendLocalNameSpacePathElement()  // appendParamValueElement()
 // //
 //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>  //     <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
   //     <!ATTLIST PARAMVALUE
   //         %CIMName;
   //         %EmbeddedObject; #IMPLIED
   //         %ParamType;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendLocalNameSpacePathElement(  void XmlWriter::appendParamValueElement(
     Array<Sint8>& out,      Buffer& out,
     const String& nameSpace)      const CIMParamValue& paramValue)
 { {
     out << "<LOCALNAMESPACEPATH>\n";      CheckRep(paramValue._rep);
       const CIMParamValueRep* rep = paramValue._rep;
   
       out << STRLIT("<PARAMVALUE NAME=\"") << rep->getParameterName();
       out.append('"');
  
     char* tmp = nameSpace.allocateCString();      CIMType type = rep->getValue().getType();
  
     for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))      if (rep->isTyped())
     {     {
         out << "<NAMESPACE NAME=\"" << p << "\"/>\n";          XmlWriter::appendParamTypeAndEmbeddedObjAttrib(out, type);
     }     }
  
     delete [] tmp;      out << STRLIT(">\n");
       XmlWriter::appendValueElement(out, rep->getValue());
  
     out << "</LOCALNAMESPACEPATH>\n";      out << STRLIT("</PARAMVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------  void XmlWriter::printParamValueElement(
 //      const CIMParamValue& paramValue,
 // appendNameSpacePathElement()      PEGASUS_STD(ostream)& os)
 //  
 //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>  
 //  
 //------------------------------------------------------------------------------  
   
 void XmlWriter::appendNameSpacePathElement(  
     Array<Sint8>& out,  
     const String& host,  
     const String& nameSpace)  
 { {
     out << "<NAMESPACEPATH>\n";      Buffer tmp;
     out << "<HOST>" << host << "</HOST>\n";      appendParamValueElement(tmp, paramValue);
     appendLocalNameSpacePathElement(out, nameSpace);      os << tmp.getData() << PEGASUS_STD(endl);
     out << "</NAMESPACEPATH>\n";  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassNameElement()  // appendQualifierElement()
 // //
 //     <!ELEMENT CLASSNAME EMPTY>  //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
 //     <!ATTLIST CLASSNAME  //     <!ATTLIST QUALIFIER
 //              %CIMName;>  //              %CIMName;
   //              %CIMType;               #REQUIRED
   //              %Propagated;
   //              %QualifierFlavor;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassNameElement(  void XmlWriter::appendQualifierElement(
     Array<Sint8>& out,      Buffer& out,
     const String& className)      const CIMConstQualifier& qualifier)
 { {
     out << "<CLASSNAME NAME=\"" << className << "\"/>\n";      CheckRep(qualifier._rep);
 }      const CIMQualifierRep* rep = qualifier._rep;
  
 //------------------------------------------------------------------------------      out << STRLIT("<QUALIFIER NAME=\"") << rep->getName();
 //      out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getValue().getType());
 // appendInstanceNameElement()  
 //  
 //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>  
 //    <!ATTLIST INSTANCENAME  
 //              %ClassName;>  
 //  
 //------------------------------------------------------------------------------  
  
 void XmlWriter::appendInstanceNameElement(      if (rep->getPropagated())
     Array<Sint8>& out,  
     const CIMReference& instanceName)  
 { {
     out << "<INSTANCENAME CLASSNAME=\"" << instanceName.getClassName() << "\">\n";          out << STRLIT(" PROPAGATED=\"true\"");
       }
  
     Array<KeyBinding> keyBindings = instanceName.getKeyBindings();      XmlWriter::appendQualifierFlavorEntity(out, rep->getFlavor());
     for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)  
     {  
         out << "<KEYBINDING NAME=\"" << keyBindings[i].getName() << "\">\n";  
  
         if (keyBindings[i].getType() == KeyBinding::REFERENCE)      out << STRLIT(">\n");
         {  
             CIMReference ref = keyBindings[i].getValue();  
             ref.toXml(out);  
         }  
         else {  
             out << "<KEYVALUE VALUETYPE=\"";  
             out << KeyBinding::typeToString(keyBindings[i].getType());  
             out << "\">";  
  
             // fixed the special character problem - Markus      XmlWriter::appendValueElement(out, rep->getValue());
  
             appendSpecial(out, keyBindings[i].getValue());      out << STRLIT("</QUALIFIER>\n");
             out << "</KEYVALUE>\n";  
         }  
         out << "</KEYBINDING>\n";  
     }     }
     out << "</INSTANCENAME>\n";  
   void XmlWriter::printQualifierElement(
       const CIMConstQualifier& qualifier,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendQualifierElement(tmp, qualifier);
       os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassPathElement()  // appendQualifierDeclElement()
 // //
 //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>  //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
   //     <!ATTLIST QUALIFIER.DECLARATION
   //              %CIMName;
   //              %CIMType;                       #REQUIRED
   //              ISARRAY        (true|false)     #IMPLIED
   //              %ArraySize;
   //              %QualifierFlavor;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassPathElement(  void XmlWriter::appendQualifierDeclElement(
     Array<Sint8>& out,      Buffer& out,
     const CIMReference& classPath)      const CIMConstQualifierDecl& qualifierDecl)
 { {
     out << "<CLASSPATH>\n";      CheckRep(qualifierDecl._rep);
     appendNameSpacePathElement(out,      const CIMQualifierDeclRep* rep = qualifierDecl._rep;
                                classPath.getHost(),  
                                classPath.getNameSpace());  
     appendClassNameElement(out, classPath.getClassName());  
     out << "</CLASSPATH>\n";  
 }  
  
 //------------------------------------------------------------------------------      out << STRLIT("<QUALIFIER.DECLARATION NAME=\"") << rep->getName();
 //      out << STRLIT("\" ") << xmlWriterTypeStrings(rep->getValue().getType());
 // appendInstancePathElement()  
 //  
 //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>  
 //  
 //------------------------------------------------------------------------------  
  
 void XmlWriter::appendInstancePathElement(      if (rep->getValue().isArray())
     Array<Sint8>& out,  
     const CIMReference& instancePath)  
 { {
     out << "<INSTANCEPATH>\n";          out << STRLIT(" ISARRAY=\"true\"");
     appendNameSpacePathElement(out,  
                                instancePath.getHost(),          if (rep->getArraySize())
                                instancePath.getNameSpace());          {
     appendInstanceNameElement(out, instancePath);              char buffer[64];
     out << "</INSTANCEPATH>\n";              int n = sprintf(buffer, " ARRAYSIZE=\"%u\"", rep->getArraySize());
               out.append(buffer, n);
           }
 } }
  
 //------------------------------------------------------------------------------      XmlWriter::appendQualifierFlavorEntity(out, rep->getFlavor());
 //  
 // appendLocalClassPathElement()  
 //  
 //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>  
 //  
 //------------------------------------------------------------------------------  
  
 void XmlWriter::appendLocalClassPathElement(      out << STRLIT(">\n");
     Array<Sint8>& out,  
     const CIMReference& classPath)      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)
 { {
     out << "<LOCALCLASSPATH>\n";      Buffer tmp;
     appendLocalNameSpacePathElement(out, classPath.getNameSpace());      appendQualifierDeclElement(tmp, qualifierDecl);
     appendClassNameElement(out, classPath.getClassName());      os << tmp.getData() << PEGASUS_STD(endl);
     out << "</LOCALCLASSPATH>\n";  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendLocalInstancePathElement()  // appendQualifierFlavorEntity()
 // //
 //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>  //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
   //                                 TOSUBCLASS   (true|false)   'true'
   //                                 TOINSTANCE   (true|false)   'false'
   //                                 TRANSLATABLE (true|false)   'false'">
   //
   //     DEPRECATION NOTE:  The attribute TOINSTANCE is DEPRECATED and MAY be
   //     removed from the QualifierFlavor entity in a future version of this
   //     document.  Use of this qualifier is discouraged.
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendLocalInstancePathElement(  void XmlWriter::appendQualifierFlavorEntity(
     Array<Sint8>& out,      Buffer& out,
     const CIMReference& instancePath)      const CIMFlavor & flavor)
 { {
     out << "<LOCALINSTANCEPATH>\n";      if (!(flavor.hasFlavor (CIMFlavor::OVERRIDABLE)))
     appendLocalNameSpacePathElement(out, instancePath.getNameSpace());          out << STRLIT(" OVERRIDABLE=\"false\"");
     appendInstanceNameElement(out, instancePath);  
     out << "</LOCALINSTANCEPATH>\n";      if (!(flavor.hasFlavor (CIMFlavor::TOSUBCLASS)))
           out << STRLIT(" TOSUBCLASS=\"false\"");
   
       //if (flavor.hasFlavor (CIMFlavor::TOINSTANCE))
       //    out << STRLIT(" TOINSTANCE=\"true\"");
   
       if (flavor.hasFlavor (CIMFlavor::TRANSLATABLE))
           out << STRLIT(" TRANSLATABLE=\"true\"");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendLocalObjectPathElement()  // appendScopeElement()
 // //
 //     If the reference refers to an instance, write a LOCALINSTANCEPATH;  //     <!ELEMENT SCOPE EMPTY>
 //     otherwise write a LOCALCLASSPATH.  //     <!ATTLIST SCOPE
   //              CLASS        (true|false)      'false'
   //              ASSOCIATION  (true|false)      'false'
   //              REFERENCE    (true|false)      'false'
   //              PROPERTY     (true|false)      'false'
   //              METHOD       (true|false)      'false'
   //              PARAMETER    (true|false)      'false'
   //              INDICATION   (true|false)      'false'>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendLocalObjectPathElement(  void XmlWriter::appendScopeElement(
     Array<Sint8>& out,      Buffer& out,
     const CIMReference& objectPath)      const CIMScope & scope)
 {  
     if (objectPath.isInstanceName())  
     {     {
         appendLocalInstancePathElement(out, objectPath);      if (!(scope.equal (CIMScope ())))
     }  
     else  
     {     {
         appendLocalClassPathElement(out, objectPath);          out << STRLIT("<SCOPE");
   
           if (scope.hasScope (CIMScope::CLASS))
               out << STRLIT(" CLASS=\"true\"");
   
           if (scope.hasScope (CIMScope::ASSOCIATION))
               out << STRLIT(" ASSOCIATION=\"true\"");
   
           if (scope.hasScope (CIMScope::REFERENCE))
               out << STRLIT(" REFERENCE=\"true\"");
   
           if (scope.hasScope (CIMScope::PROPERTY))
               out << STRLIT(" PROPERTY=\"true\"");
   
           if (scope.hasScope (CIMScope::METHOD))
               out << STRLIT(" METHOD=\"true\"");
   
           if (scope.hasScope (CIMScope::PARAMETER))
               out << STRLIT(" PARAMETER=\"true\"");
   
           if (scope.hasScope (CIMScope::INDICATION))
               out << STRLIT(" INDICATION=\"true\"");
   
           out << STRLIT("/>");
     }     }
 } }
  
   // l10n - added content language and accept language support to
   // the header methods below
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendMethodCallHeader() // appendMethodCallHeader()
Line 424 
Line 1791 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendMethodCallHeader( void XmlWriter::appendMethodCallHeader(
     Array<Sint8>& out,      Buffer& out,
     const char* host,     const char* host,
     const char* cimMethod,      const CIMName& cimMethod,
     const String& cimObject,     const String& cimObject,
     const String& authenticationHeader,     const String& authenticationHeader,
     Uint32 contentLength)      HttpMethod httpMethod,
       const AcceptLanguageList& acceptLanguages,
       const ContentLanguageList& contentLanguages,
       Uint32 contentLength,
       bool binaryRequest,
       bool binaryResponse)
   {
       char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)),'\0'};
   
       // ATTN: KS 20020926 - Temporary change to issue only POST. This may
       // be changed in the DMTF CIM Operations standard in the future.
       // If we kept M-Post we would have to retry with Post. Does not
       // do that in client today. Permanent change is to retry until spec
       // updated. This change is temp to finish tests or until the retry
       // installed.  Required because of change to wbemservices cimom
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("M-POST /cimom HTTP/1.1\r\n");
       }
       else
       {
           out << STRLIT("POST /cimom HTTP/1.1\r\n");
       }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n");
   
       if (binaryRequest)
       {
           // Tell the server that the payload is encoded in the OpenPegasus
           // binary protocol.
           out << STRLIT("Content-Type: application/x-openpegasus\r\n");
       }
       else
       {
           out << STRLIT("Content-Type: application/xml; charset=utf-8\r\n");
       }
   
       if (binaryResponse)
       {
           // Tell the server that this client accepts the OpenPegasus binary
           // protocol.
           out << STRLIT("Accept: application/x-openpegasus\r\n");
       }
   
       OUTPUT_CONTENTLENGTH(out, contentLength);
       if (acceptLanguages.size() > 0)
       {
           out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
       }
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages <<
               STRLIT("\r\n");
       }
   
   #ifdef PEGASUS_DEBUG
       // backdoor environment variable to turn OFF client requesting transfer
       // encoding. The default is on. to turn off, set this variable to zero.
       // This should be removed when stable. This should only be turned off in
       // a debugging/testing environment.
   
       static const char *clientTransferEncodingOff =
           getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
   
       if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
   #endif
   
       if (!binaryResponse)
       {
           // The binary protocol does not allow chunking.
           out << STRLIT("TE: chunked, trailers\r\n");
       }
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMOperation: MethodCall\r\n");
           out << nn << STRLIT("-CIMMethod: ")
               << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << nn << STRLIT("-CIMObject: ")
               << encodeURICharacters(cimObject) << STRLIT("\r\n");
       }
       else
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };          out << STRLIT("CIMOperation: MethodCall\r\n");
           out << STRLIT("CIMMethod: ")
               << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << STRLIT("CIMObject: ") << encodeURICharacters(cimObject)
               << STRLIT("\r\n");
       }
  
     out << "M-POST /cimom HTTP/1.1\r\n";  
     out << "HOST: " << host << "\r\n";  
     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << contentLength << "\r\n";  
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMOperation: MethodCall\r\n";  
     out << nn << "-CIMMethod: " << cimMethod << "\r\n";  
     out << nn << "-CIMObject: " << cimObject << "\r\n";  
     if (authenticationHeader.size())     if (authenticationHeader.size())
     {     {
         out << authenticationHeader << "\r\n";          out << authenticationHeader << STRLIT("\r\n");
     }     }
     out << "\r\n";  
       out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------  
 //  
 // appendMethodResponseHeader()  
 //  
 //     Build HTTP response header.  
 //  
 //------------------------------------------------------------------------------  
  
 void XmlWriter::appendMethodResponseHeader( void XmlWriter::appendMethodResponseHeader(
     Array<Sint8>& out,       Buffer& out,
     Uint32 contentLength)       HttpMethod httpMethod,
        const ContentLanguageList& contentLanguages,
        Uint32 contentLength,
        Uint64 serverResponseTime,
        bool binaryResponse)
   {
       // Optimize the typical case for binary messages, circumventing the
       // more expensive logic below.
       if (binaryResponse &&
           contentLength == 0 &&
           httpMethod != HTTP_METHOD_M_POST &&
           contentLanguages.size() == 0)
       {
           static const char HEADERS[] =
               "HTTP/1.1 200 OK\r\n"
               "Content-Type: application/x-openpegasus\r\n"
               "content-length: 0000000000\r\n"
               "CIMOperation: MethodResponse\r\n"
               "\r\n";
   
           // The HTTP processor fills in the content-length value later.
           // It searches for a field matching "content-length" (so the first
           // character must be lower case).
           out.append(HEADERS, sizeof(HEADERS) - 1);
           return;
       }
   
        out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
   
   #ifndef PEGASUS_DISABLE_PERFINST
        if (StatisticalData::current()->copyGSD)
        {
            out << STRLIT("WBEMServerResponseTime: ") <<
                CIMValue(serverResponseTime).toString() << STRLIT("\r\n");
        }
   #endif
   
        if (binaryResponse)
        {
           // According to MIME RFC, the "x-" prefix should be used for all
           // non-registered values.
            out << STRLIT("Content-Type: application/x-openpegasus\r\n");
        }
        else
        {
            out << STRLIT("Content-Type: application/xml; charset=utf-8\r\n");
        }
   
        OUTPUT_CONTENTLENGTH(out, contentLength);
   
        if (contentLanguages.size() > 0)
        {
            out << STRLIT("Content-Language: ") << contentLanguages <<
                STRLIT("\r\n");
        }
        if (httpMethod == HTTP_METHOD_M_POST)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };           char nn[] = {char('0'+(rand() % 10)),char('0' + (rand() % 10)),'\0'};
  
     out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n";           out << STRLIT("Ext:\r\n"
     STAT_SERVERTIME                         "Cache-Control: no-cache\r\n"
     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";                         "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
     out << "Content-Length: " << contentLength << "\r\n";           out << nn << STRLIT("\r\n");
     out << "Ext:\r\n";           out << nn << STRLIT("-CIMOperation: MethodResponse\r\n\r\n");
     out << "Cache-Control: no-cache\r\n";       }
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";       else
     out << nn <<"\r\n";       {
     out << nn << "-CIMOperation: MethodResponse\r\n\r\n";           out << STRLIT("CIMOperation: MethodResponse\r\n\r\n");
 } }
   }
   
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
Line 489 
Line 1985 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendHttpErrorResponseHeader( void XmlWriter::appendHttpErrorResponseHeader(
     Array<Sint8>& out,      Buffer& out,
     const String& status,     const String& status,
     const String& cimError,     const String& cimError,
     const String& errorDetail)     const String& errorDetail)
 { {
     out << "HTTP/1.1 " << status << "\r\n";      out << STRLIT("HTTP/1.1 ") << status << STRLIT("\r\n");
     if (cimError != String::EMPTY)     if (cimError != String::EMPTY)
     {     {
         out << "CIMError: " << cimError << "\r\n";          out << STRLIT("CIMError: ") << cimError << STRLIT("\r\n");
     }     }
     if (errorDetail != String::EMPTY)     if (errorDetail != String::EMPTY)
     {     {
         // ATTN-RK-P3-20020404: It is critical that this text not contain '\n'          out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
         // ATTN-RK-P3-20020404: Need to encode this value properly.  (See              << encodeURICharacters(errorDetail) << STRLIT("\r\n");
         // CIM/HTTP Specification section 3.3.2  
         out << PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": " << errorDetail << "\r\n";  
     }     }
     out << "\r\n";      out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 518 
Line 2012 
 //     Returns unauthorized message in the following format: //     Returns unauthorized message in the following format:
 // //
 //        HTTP/1.1 401 Unauthorized //        HTTP/1.1 401 Unauthorized
 //        WWW-Authenticate: Basic "hostname:80"  //        PGErrorDetail: <error text>    (if specified by caller)
   //        WWW-Authenticate: Basic realm="HostName"
 //        <HTML><HEAD> //        <HTML><HEAD>
 //        <TITLE>401 Unauthorized</TITLE> //        <TITLE>401 Unauthorized</TITLE>
 //        </HEAD><BODY BGCOLOR="#99cc99"> //        </HEAD><BODY BGCOLOR="#99cc99">
Line 529 
Line 2024 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendUnauthorizedResponseHeader( void XmlWriter::appendUnauthorizedResponseHeader(
     Array<Sint8>& out,      Buffer& out,
       const String& errorDetail,
     const String& content)     const String& content)
 { {
     out << "HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n";      out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n");
     out << content << "\r\n";      if (errorDetail.size() > 0)
     out << "\r\n";      {
           out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
               << encodeURICharacters(errorDetail) << STRLIT("\r\n");
       }
   
       OUTPUT_CONTENTLENGTH(out, 0);
       out << content << STRLIT("\r\n\r\n");
  
 //ATTN: We may need to include the following line, so that the browsers //ATTN: We may need to include the following line, so that the browsers
 //      can display the error message. //      can display the error message.
Line 546 
Line 2048 
 //    out << "</BODY></HTML>\r\n"; //    out << "</BODY></HTML>\r\n";
 } }
  
   #ifdef PEGASUS_KERBEROS_AUTHENTICATION
   //------------------------------------------------------------------------------
   //
   // appendOKResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
   //
   //     Returns OK message in the following format:
   //
   //        HTTP/1.1 200 OK
   //        Content-Length: 0
   //        WWW-Authenticate: Negotiate "token"
   //        <HTML><HEAD>
   //        <TITLE>200 OK</TITLE>
   //        </HEAD><BODY BGCOLOR="#99cc99">
   //        <H2>TEST200 OK</H2>
   //        <HR>
   //        </BODY></HTML>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendOKResponseHeader(
       Buffer& out,
       const String& content)
   {
       out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
       // Content-Length header needs to be added because 200 OK record
       // is usually intended to have content.  But, for Kerberos this
       // may not always be the case so we need to indicate that there
       // is no content
       OUTPUT_CONTENTLENGTH(out, 0);
       out << content << STRLIT("\r\n\r\n");
   
   //ATTN: We may need to include the following line, so that the browsers
   //      can display the error message.
   //    out << "<HTML><HEAD>\r\n";
   //    out << "<TITLE>" << "200 OK" <<  "</TITLE>\r\n";
   //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
   //    out << "<H2>TEST" << "200 OK" << "</H2>\r\n";
   //    out << "<HR>\r\n";
   //    out << "</BODY></HTML>\r\n";
   }
   #endif
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _appendMessageElementBegin() // _appendMessageElementBegin()
Line 559 
Line 2105 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendMessageElementBegin( void XmlWriter::_appendMessageElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const String& messageId)     const String& messageId)
 { {
     out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";      out << STRLIT("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"
     out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";                    "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n"
     out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";                    "<MESSAGE ID=\"") << messageId;
       out << STRLIT("\" PROTOCOLVERSION=\"1.0\">\n");
 } }
  
 void XmlWriter::_appendMessageElementEnd( void XmlWriter::_appendMessageElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</MESSAGE>\n";      out << STRLIT("</MESSAGE>\n</CIM>\n");
     out << "</CIM>\n";  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 584 
Line 2130 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendSimpleReqElementBegin( void XmlWriter::_appendSimpleReqElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLEREQ>\n";      out << STRLIT("<SIMPLEREQ>\n");
 } }
  
 void XmlWriter::_appendSimpleReqElementEnd( void XmlWriter::_appendSimpleReqElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLEREQ>\n";      out << STRLIT("</SIMPLEREQ>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 606 
Line 2152 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendMethodCallElementBegin( void XmlWriter::_appendMethodCallElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<METHODCALL NAME=\"" << name << "\">\n";      out << STRLIT("<METHODCALL NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendMethodCallElementEnd( void XmlWriter::_appendMethodCallElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</METHODCALL>\n";      out << STRLIT("</METHODCALL>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 629 
Line 2175 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendIMethodCallElementBegin( void XmlWriter::_appendIMethodCallElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<IMETHODCALL NAME=\"" << name << "\">\n";      out << STRLIT("<IMETHODCALL NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendIMethodCallElementEnd( void XmlWriter::_appendIMethodCallElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IMETHODCALL>\n";      out << STRLIT("</IMETHODCALL>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 654 
Line 2200 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendIParamValueElementBegin( void XmlWriter::_appendIParamValueElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)     const char* name)
 { {
     out << "<IPARAMVALUE NAME=\"" << name << "\">\n";      out << STRLIT("<IPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendIParamValueElementEnd( void XmlWriter::_appendIParamValueElementEnd(
     Array<Sint8>& out)      Buffer& out)
   {
       out << STRLIT("</IPARAMVALUE>\n");
   }
   
   //EXP_PULL_BEGIN
   //------------------------------------------------------------------------------
   //
   // _appendParamValueElementBegin()
   // _appendParamValueElementEnd()
   //
   //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
   //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
   //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
   //     <!ATTLIST IPARAMVALUE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendParamValueElementBegin(
       Buffer& out,
       const char* name)
   {
       out << STRLIT("<PARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendParamValueElementEnd(
       Buffer& out)
 { {
     out << "</IPARAMVALUE>\n";      out << STRLIT("</PARAMVALUE>\n");
 } }
   //EXP_PULL_END
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
Line 676 
Line 2249 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendSimpleRspElementBegin( void XmlWriter::_appendSimpleRspElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLERSP>\n";      out << STRLIT("<SIMPLERSP>\n");
 } }
  
 void XmlWriter::_appendSimpleRspElementEnd( void XmlWriter::_appendSimpleRspElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLERSP>\n";      out << STRLIT("</SIMPLERSP>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 698 
Line 2271 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendMethodResponseElementBegin( void XmlWriter::_appendMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<METHODRESPONSE NAME=\"" << name << "\">\n";      out << STRLIT("<METHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendMethodResponseElementEnd( void XmlWriter::_appendMethodResponseElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</METHODRESPONSE>\n";      out << STRLIT("</METHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 721 
Line 2294 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendIMethodResponseElementBegin( void XmlWriter::_appendIMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";      out << STRLIT("<IMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendIMethodResponseElementEnd( void XmlWriter::_appendIMethodResponseElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IMETHODRESPONSE>\n";      out << STRLIT("</IMETHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 740 
Line 2313 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendErrorElement( void XmlWriter::_appendErrorElement(
     Array<Sint8>& out,      Buffer& out,
     const CIMException& cimException)     const CIMException& cimException)
 { {
     PEG_TRACE_STRING(TRC_XML_WRITER, Tracer::LEVEL2,      Tracer::traceCIMException(TRC_XML, Tracer::LEVEL2, cimException);
                      cimException.getTraceDescription());  
       out << STRLIT("<ERROR CODE=\"") << Uint32(cimException.getCode());
       out.append('"');
   
       String description = TraceableCIMException(cimException).getDescription();
  
     out << "<ERROR";  
     out << " CODE=\"" << Uint32(cimException.getCode()) << "\"";  
     String description = cimException.getDescription();  
     if (description != String::EMPTY)     if (description != String::EMPTY)
     {     {
         out << " DESCRIPTION=\"";          out << STRLIT(" DESCRIPTION=\"");
         appendSpecial(out, description);         appendSpecial(out, description);
         out << "\"";          out.append('"');
       }
   
       if (cimException.getErrorCount())
       {
           out << STRLIT(">");
   
           for (Uint32 i = 0, n = cimException.getErrorCount(); i < n; i++)
               appendInstanceElement(out, cimException.getError(i));
   
           out << STRLIT("</ERROR>");
       }
       else
           out << STRLIT("/>");
   }
   
   //----------------------------------------------------------------------
   //
   // appendParamTypeAndEmbeddedObjAttrib
   // Appends the Param type and EmbeddedObject Info to the buffer
   //     %EmbeddedObject; #IMPLIED
   //     %ParamType;>
   //
   //---------------------------------------------------------------------
   
   void XmlWriter::appendParamTypeAndEmbeddedObjAttrib(
       Buffer& out,
       const CIMType& type)
   {
   
       // If the property type is CIMObject, then
       //   encode the property in CIM-XML as a string with the EmbeddedObject
       //   attribute (there is not currently a CIM-XML "object"
       //   datatype).
       //   Because of an error in Pegasus we were earlier outputting
       //   upper case "EMBEDDEDOBJECT" as the attribute name. The
       //   spec calls for mixed case "EmbeddedObject. Fixed in
       //   bug 7131 to output EmbeddedObject  attribute in upper
       //   case and mixed case. Receiver will ignore one or the
       //   other.
       //else
       //      output the real type
       if (type == CIMTYPE_OBJECT)
       {
   
           out << STRLIT(" PARAMTYPE=\"string\""
                         " EmbeddedObject=\"object\""
                         " EMBEDDEDOBJECT=\"object\"");
       }
       else if (type == CIMTYPE_INSTANCE)
       {
           out << STRLIT(" PARAMTYPE=\"string\""
                         " EmbeddedObject=\"instance\""
                         " EMBEDDEDOBJECT=\"instance\"");
       }
       else
       {
           out << STRLIT(" PARAM") << xmlWriterTypeStrings(type);
     }     }
     out << "/>";  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 764 
Line 2394 
 // //
 // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)> // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
 // <!ATTLIST RETURNVALUE // <!ATTLIST RETURNVALUE
   //     %EmbeddedObject; #IMPLIED
 //     %ParamType;> //     %ParamType;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendReturnValueElement( void XmlWriter::appendReturnValueElement(
     Array<Sint8>& out,      Buffer& out,
     const CIMValue& value)     const CIMValue& value)
 { {
     out << "<RETURNVALUE";      out << STRLIT("<RETURNVALUE");
  
     CIMType type = value.getType();     CIMType type = value.getType();
     if (type != CIMType::NONE)  
     {  
         out << " PARAMTYPE=\"" << TypeToString(type) << "\"";  
     }  
  
     out << ">\n";      appendParamTypeAndEmbeddedObjAttrib(out, type);
   
       out << STRLIT(">\n");
  
     // Add value. If value is Null, then this method shouldn't have been called      // Add value.
     value.toXml(out);      appendValueElement(out, value);
     out << "</RETURNVALUE>\n";      out << STRLIT("</RETURNVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 800 
Line 2429 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendIReturnValueElementBegin( void XmlWriter::_appendIReturnValueElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<IRETURNVALUE>\n";      out << STRLIT("<IRETURNVALUE>\n");
 } }
  
 void XmlWriter::_appendIReturnValueElementEnd( void XmlWriter::_appendIReturnValueElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IRETURNVALUE>\n";      out << STRLIT("</IRETURNVALUE>\n");
 } }
  
   //EXP_PULL_BEGIN
   void XmlWriter::_appendIReturnValueElementWithNameBegin(
       Buffer& out,
       const char* name)
   {
       out << STRLIT("<IRETURNVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   //EXP_PULL_END
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendBooleanIParameter() // appendBooleanIParameter()
Line 818 
Line 2456 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendBooleanIParameter( void XmlWriter::appendBooleanIParameter(
     Array<Sint8>& out,      Buffer& out,
       const char* name,
       Boolean flag)
   {
       _appendIParamValueElementBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
   }
   
   //EXP_PULL_BEGIN
   void XmlWriter::appendBooleanParameter(
       Buffer& out,
       const char* name,
       Boolean flag)
   {
       _appendParamValueElementBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendParamValueElementEnd(out);
   }
   
   void XmlWriter::appendBooleanIReturnValue(
       Buffer& out,
     const char* name,     const char* name,
     Boolean flag)     Boolean flag)
 { {
       _appendIReturnValueElementWithNameBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendIReturnValueElementEnd(out);
   }
   void XmlWriter::appendUint32IParameter(
       Buffer& out,
       const char* name,
       Uint32 val)
   {
       _appendIParamValueElementBegin(out, name);
       out << STRLIT("<VALUE>");
       append(out, val);
       out << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
   }
   
   // Can be used to generate either parameters with value,
   // parameters with NULL (i.e. no value element) or
   // no parameters output at all.
   void XmlWriter::appendUint32ArgIParameter(
       Buffer& out,
       const char* name,
       const Uint32Arg& val,
       const Boolean required)
   {
       if (!required && val.isNull())
       {
           return;
       }
   
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     out << "<VALUE>" << (flag ? "TRUE" : "FALSE") << "</VALUE>\n";      if (!val.isNull())
       {
           out << STRLIT("<VALUE>");
           append(out, val.getValue());
           out << STRLIT("</VALUE>\n");
       }
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
   /* Output return value from Uint64Arg object as
      Value inside IRETURNVALUE
      If the state of the object is NULL output
      the parameter without value.  Else
      output the value
   */
   void XmlWriter::appendUint64ReturnValue(
       Buffer& out,
       const char* name,
       const Uint64Arg& val)
   {
       _appendIReturnValueElementBegin(out);
       out << STRLIT("<VALUE>");
       if (!val.isNull())
       {
           append(out, val.getValue());
       }
       out << STRLIT("</VALUE>\n");
       _appendIReturnValueElementEnd(out);
   }
   //EXP_PULL_END
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendStringIParameter() // appendStringIParameter()
Line 834 
Line 2556 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendStringIParameter( void XmlWriter::appendStringIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& str)     const String& str)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     out << "<VALUE>";      out << STRLIT("<VALUE>");
     appendSpecial(out, str);     appendSpecial(out, str);
     out << "</VALUE>\n";      out << STRLIT("</VALUE>\n");
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
   // EXP_PULL_BEGIN
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendQualifierNameIParameter()  // appendStringIParameterIfNotEmpty()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendQualifierNameIParameter(  void XmlWriter::appendStringIParameterIfNotEmpty(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& qualifierName)      const String& str)
 { {
     // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE      if (str != String::EMPTY)
     //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION      {
     //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>          appendStringIParameter(out,name,str);
       }
   }
   
   //------------------------------------------------------------------------------
     //     //
     // ATTN: notice that there is really no way to pass a qualifier name  // appendStringParameter()
     // as an IPARAMVALUE element according to the spec (look above). So we  //
     // just pass it as a class name. An answer must be obtained later.  //------------------------------------------------------------------------------
  
     _appendIParamValueElementBegin(out, name);  void XmlWriter::appendStringParameter(
     appendClassNameElement(out, qualifierName);      Buffer& out,
     _appendIParamValueElementEnd(out);      const char* name,
       const String& str)
   {
       _appendParamValueElementBegin(out, name);
       out << STRLIT("<VALUE>");
       appendSpecial(out, str);
       out << STRLIT("</VALUE>\n");
       _appendParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
   // appendStringIReturnValue()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendStringIReturnValue(
       Buffer& out,
       const char* name,
       const String& str)
   {
       _appendIReturnValueElementWithNameBegin(out, name);
       out << STRLIT("<VALUE>");
       appendSpecial(out, str);
       out << STRLIT("</VALUE>\n");
       _appendIReturnValueElementEnd(out);
   }
   //EXP_PULL_END
   //------------------------------------------------------------------------------
   //
 // appendClassNameIParameter() // appendClassNameIParameter()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassNameIParameter( void XmlWriter::appendClassNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& className)      const CIMName& className)
 { {
     _appendIParamValueElementBegin(out, name);     _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);     appendClassNameElement(out, className);
       }
   
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 892 
Line 2653 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendInstanceNameIParameter( void XmlWriter::appendInstanceNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMReference& instanceName)      const CIMObjectPath& instanceName)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     appendInstanceNameElement(out, instanceName);     appendInstanceNameElement(out, instanceName);
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
 void XmlWriter::appendObjectNameIParameter(  
     Array<Sint8>& out,  
     const char* name,  
     const CIMReference& objectName)  
 {  
     if (objectName.isClassName())  
     {  
         XmlWriter::appendClassNameIParameter(  
             out, name, objectName.getClassName());  
     }  
     else  
     {  
         XmlWriter::appendInstanceNameIParameter(  
             out, name, objectName);  
     }  
 }  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassIParameter() // appendClassIParameter()
Line 925 
Line 2669 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassIParameter( void XmlWriter::appendClassIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMConstClass& cimClass)     const CIMConstClass& cimClass)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     cimClass.toXml(out);      appendClassElement(out, cimClass);
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 941 
Line 2685 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendInstanceIParameter( void XmlWriter::appendInstanceIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMConstInstance& instance)     const CIMConstInstance& instance)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     instance.toXml(out);      appendInstanceElement(out, instance);
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 957 
Line 2701 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendNamedInstanceIParameter( void XmlWriter::appendNamedInstanceIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMNamedInstance& namedInstance)      const CIMInstance& namedInstance)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     namedInstance.toXml(out);      appendValueNamedInstanceElement(out, namedInstance);
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 976 
Line 2720 
 //     USE: Create parameter for getProperty operation //     USE: Create parameter for getProperty operation
 //========================================================== //==========================================================
 void XmlWriter::appendPropertyNameIParameter( void XmlWriter::appendPropertyNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const String& propertyName)      const CIMName& propertyName)
 { {
     _appendIParamValueElementBegin(out, "PropertyName");     _appendIParamValueElementBegin(out, "PropertyName");
     out << "<VALUE>" << propertyName << "</VALUE>\n";      out << STRLIT("<VALUE>") << propertyName << STRLIT("</VALUE>\n");
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 991 
Line 2735 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendPropertyValueIParameter( void XmlWriter::appendPropertyValueIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMValue& value)     const CIMValue& value)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     value.toXml(out);      appendValueElement(out, value);
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 1007 
Line 2751 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendPropertyListIParameter( void XmlWriter::appendPropertyListIParameter(
     Array<Sint8>& out,      Buffer& out,
     const CIMPropertyList& propertyList)     const CIMPropertyList& propertyList)
 { {
     // ATTN: P3 KS 4 Mar 2002 - As check shouldn't we check for null property list  
     _appendIParamValueElementBegin(out, "PropertyList");     _appendIParamValueElementBegin(out, "PropertyList");
  
     out << "<VALUE.ARRAY>\n";      //
     for (Uint32 i = 0; i < propertyList.getNumProperties(); i++)      //  A NULL (unassigned) value for a parameter is specified by an
       //  <IPARAMVALUE> element with no subelement
       //
       if (!propertyList.isNull ())
     {     {
         out << "<VALUE>" << propertyList.getPropertyName(i) << "</VALUE>\n";          out << STRLIT("<VALUE.ARRAY>\n");
           for (Uint32 i = 0; i < propertyList.size(); i++)
           {
               out << STRLIT("<VALUE>") << propertyList[i] << STRLIT("</VALUE>\n");
           }
           out << STRLIT("</VALUE.ARRAY>\n");
     }     }
     out << "</VALUE.ARRAY>\n";  
  
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
Line 1030 
Line 2780 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendQualifierDeclarationIParameter( void XmlWriter::appendQualifierDeclarationIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMConstQualifierDecl& qualifierDecl)     const CIMConstQualifierDecl& qualifierDecl)
 { {
     _appendIParamValueElementBegin(out, name);     _appendIParamValueElementBegin(out, name);
     qualifierDecl.toXml(out);      appendQualifierDeclElement(out, qualifierDecl);
     _appendIParamValueElementEnd(out);     _appendIParamValueElementEnd(out);
 } }
  
Line 1045 
Line 2795 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatHttpErrorRspMessage(  Buffer XmlWriter::formatHttpErrorRspMessage(
     const String& status,     const String& status,
     const String& cimError,     const String& cimError,
     const String& errorDetail)     const String& errorDetail)
 { {
     Array<Sint8> out;      Buffer out;
  
     appendHttpErrorResponseHeader(out, status, cimError, errorDetail);     appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
  
     return out;     return out;
 } }
  
   // l10n - add content language support to the format methods below
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleMethodReqMessage() // XmlWriter::formatSimpleMethodReqMessage()
Line 1064 
Line 2816 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 // ATTN-RK-P1-20020228: Need to complete copy elimination optimization // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
 Array<Sint8> XmlWriter::formatSimpleMethodReqMessage(  Buffer XmlWriter::formatSimpleMethodReqMessage(
     const char* host,     const char* host,
     const String& nameSpace,      const CIMNamespaceName& nameSpace,
     const CIMReference& path,      const CIMObjectPath& path,
     const char* methodName,      const CIMName& methodName,
     const Array<CIMParamValue>& parameters,     const Array<CIMParamValue>& parameters,
     const String& messageId,     const String& messageId,
     const String& authenticationHeader)      HttpMethod httpMethod,
 {      const String& authenticationHeader,
     Array<Sint8> out;      const AcceptLanguageList& httpAcceptLanguages,
     Array<Sint8> tmp;      const ContentLanguageList& httpContentLanguages,
     CIMReference localObjectPath = path;      bool binaryResponse)
     localObjectPath.setNameSpace(nameSpace);  {
       Buffer out;
       Buffer tmp;
       CIMObjectPath localObjectPath = path;
       localObjectPath.setNameSpace(nameSpace.getString());
       localObjectPath.setHost(String::EMPTY);
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleReqElementBegin(out);     _appendSimpleReqElementBegin(out);
Line 1084 
Line 2841 
     appendLocalObjectPathElement(out, localObjectPath);     appendLocalObjectPathElement(out, localObjectPath);
     for (Uint32 i=0; i < parameters.size(); i++)     for (Uint32 i=0; i < parameters.size(); i++)
     {     {
         parameters[i].toXml(out);          appendParamValueElement(out, parameters[i]);
     }     }
     _appendMethodCallElementEnd(out);     _appendMethodCallElementEnd(out);
     _appendSimpleReqElementEnd(out);     _appendSimpleReqElementEnd(out);
Line 1094 
Line 2851 
         tmp,         tmp,
         host,         host,
         methodName,         methodName,
         localObjectPath.toString(false),          localObjectPath.toString(),
         authenticationHeader,         authenticationHeader,
         out.size());          httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size(),
           false,
           binaryResponse);
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
 } }
  
 Array<Sint8> XmlWriter::formatSimpleMethodRspMessage(  Buffer XmlWriter::formatSimpleMethodRspMessage(
     const char* methodName,      const CIMName& methodName,
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
 {      const ContentLanguageList& httpContentLanguages,
     Array<Sint8> out;      const Buffer& bodyParams,
     Array<Sint8> tmp;      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);     _appendMessageElementBegin(out, messageId);
     _appendSimpleRspElementBegin(out);     _appendSimpleRspElementBegin(out);
     _appendMethodResponseElementBegin(out, methodName);     _appendMethodResponseElementBegin(out, methodName);
       }
   
       if (body.size() != 0)
       {
     out << body;     out << body;
       }
   
       if (isLast == true)
       {
     _appendMethodResponseElementEnd(out);     _appendMethodResponseElementEnd(out);
     _appendSimpleRspElementEnd(out);     _appendSimpleRspElementEnd(out);
     _appendMessageElementEnd(out);     _appendMessageElementEnd(out);
       }
  
     appendMethodResponseHeader(tmp, out.size());      return out;
     tmp << out;  
   
     return tmp;  
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleMethodErrorRspMessage() // XmlWriter::formatSimpleMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleMethodErrorRspMessage(  Buffer XmlWriter::formatSimpleMethodErrorRspMessage(
     const String& methodName,      const CIMName& methodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const CIMException& cimException)     const CIMException& cimException)
 { {
     ArrayDestroyer<char> tmp1(methodName.allocateCString());      Buffer out;
     Array<Sint8> out;      Buffer tmp;
     Array<Sint8> tmp;  
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleRspElementBegin(out);     _appendSimpleRspElementBegin(out);
     _appendMethodResponseElementBegin(out, tmp1.getPointer());      _appendMethodResponseElementBegin(out, methodName);
     _appendErrorElement(out, cimException);     _appendErrorElement(out, cimException);
     _appendMethodResponseElementEnd(out);     _appendMethodResponseElementEnd(out);
     _appendSimpleRspElementEnd(out);     _appendSimpleRspElementEnd(out);
     _appendMessageElementEnd(out);     _appendMessageElementEnd(out);
  
     appendMethodResponseHeader(tmp, out.size());      appendMethodResponseHeader(
           tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size(),
           false);
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1159 
Line 2944 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodReqMessage(  Buffer XmlWriter::formatSimpleIMethodReqMessage(
     const char* host,     const char* host,
     const String& nameSpace,      const CIMNamespaceName& nameSpace,
     const char* iMethodName,      const CIMName& iMethodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
     const Array<Sint8>& body)      const AcceptLanguageList& httpAcceptLanguages,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& body,
       bool binaryResponse)
 { {
     Array<Sint8> out;      Buffer out;
     Array<Sint8> tmp;      Buffer tmp;
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleReqElementBegin(out);     _appendSimpleReqElementBegin(out);
     _appendIMethodCallElementBegin(out, iMethodName);     _appendIMethodCallElementBegin(out, iMethodName);
     appendLocalNameSpacePathElement(out, nameSpace);      appendLocalNameSpacePathElement(out, nameSpace.getString());
     out << body;     out << body;
     _appendIMethodCallElementEnd(out);     _appendIMethodCallElementEnd(out);
     _appendSimpleReqElementEnd(out);     _appendSimpleReqElementEnd(out);
Line 1183 
Line 2972 
         tmp,         tmp,
         host,         host,
         iMethodName,         iMethodName,
         nameSpace,          nameSpace.getString(),
         authenticationHeader,         authenticationHeader,
         out.size());          httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
           out.size(),
           false,
           binaryResponse);
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1197 
Line 2991 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodRspMessage(  /*
     const char* iMethodName,      Formats a IMethod Response Message.  This function formats
       messages for chunking based on the isFirst and isLast parameters.
       If isFirst is set, it outputs headers and ResponseElement begin.
       It always sends the body.  If isLast is set,  it sends the rtnParams
       and the ResponseElement end followed by any parameter in the rtnParams.
       KS_PULL_TBD_TODO - Determine what we want to do with chunking. Since this
       This whole thing is based on the concept of each message sending a  single
       chunk and we will want in the future to modify so we can chose easily
       whether we want to chunk or not and send the chunks.
   */
   Buffer XmlWriter::formatSimpleIMethodRspMessage(
       const CIMName& iMethodName,
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
 {      const ContentLanguageList& httpContentLanguages,
     Array<Sint8> out;      const Buffer& rtnParams,
     Array<Sint8> tmp;      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);     _appendMessageElementBegin(out, messageId);
     _appendSimpleRspElementBegin(out);     _appendSimpleRspElementBegin(out);
     _appendIMethodResponseElementBegin(out, iMethodName);     _appendIMethodResponseElementBegin(out, iMethodName);
   
           // output the start of the return tag. Test if there is response data
           // by:
           // 1. there is data on the first chunk OR
           // 2. there is no data on the first chunk but isLast is false implying
           //    there is more non-empty data to come. If all subsequent chunks
           //    are empty, then this generates and empty response.
           if (body.size() != 0 || isLast == false)
               _appendIReturnValueElementBegin(out);
       }
   
     if (body.size() != 0)     if (body.size() != 0)
     {     {
         _appendIReturnValueElementBegin(out);  
         out << body;         out << body;
       }
   
       if (isLast == true)
       {
           if (body.size() != 0 || isFirst == false)
         _appendIReturnValueElementEnd(out);         _appendIReturnValueElementEnd(out);
   
           // Insert any return parameters.
           if (rtnParams.size() != 0)
           {
               out << rtnParams;
     }     }
           // //EXP_PULL_END
   
     _appendIMethodResponseElementEnd(out);     _appendIMethodResponseElementEnd(out);
     _appendSimpleRspElementEnd(out);     _appendSimpleRspElementEnd(out);
     _appendMessageElementEnd(out);     _appendMessageElementEnd(out);
       }
  
     appendMethodResponseHeader(tmp, out.size());      return out;
     tmp << out;  
   
     return tmp;  
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleIMethodErrorRspMessage() // XmlWriter::formatSimpleIMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodErrorRspMessage(  Buffer XmlWriter::formatSimpleIMethodErrorRspMessage(
     const String& iMethodName,      const CIMName& iMethodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const CIMException& cimException)     const CIMException& cimException)
 { {
     ArrayDestroyer<char> tmp1(iMethodName.allocateCString());      Buffer out;
     Array<Sint8> out;      Buffer tmp;
     Array<Sint8> tmp;  
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleRspElementBegin(out);     _appendSimpleRspElementBegin(out);
     _appendIMethodResponseElementBegin(out, tmp1.getPointer());      _appendIMethodResponseElementBegin(out, iMethodName);
     _appendErrorElement(out, cimException);     _appendErrorElement(out, cimException);
     _appendIMethodResponseElementEnd(out);     _appendIMethodResponseElementEnd(out);
     _appendSimpleRspElementEnd(out);     _appendSimpleRspElementEnd(out);
     _appendMessageElementEnd(out);     _appendMessageElementEnd(out);
  
     appendMethodResponseHeader(tmp, out.size());      appendMethodResponseHeader(tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size(), false);
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1268 
Line 3108 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendEMethodRequestHeader( void XmlWriter::appendEMethodRequestHeader(
     Array<Sint8>& out,      Buffer& out,
     const char* requestUri,     const char* requestUri,
     const char* host,     const char* host,
     const char* cimMethod,      const CIMName& cimMethod,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
       const AcceptLanguageList& acceptLanguages,
       const ContentLanguageList& contentLanguages,
     Uint32 contentLength)     Uint32 contentLength)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)), '\0' };
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
         out << STRLIT("M-POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
       }
       else
       {
         out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
       }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n"
                     "Content-Type: application/xml; charset=utf-8\r\n");
       OUTPUT_CONTENTLENGTH(out, contentLength);
   
       if (acceptLanguages.size() > 0)
       {
           out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
       }
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages <<
               STRLIT("\r\n");
       }
   
   #ifdef PEGASUS_DEBUG
       // backdoor environment variable to turn OFF client requesting transfer
       // encoding. The default is on. to turn off, set this variable to zero.
       // This should be removed when stable. This should only be turned off in
       // a debugging/testing environment.
   
       static const char *clientTransferEncodingOff =
           getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
       if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
   #endif
       out << STRLIT("TE: chunked, trailers\r\n");
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodRequest\r\n");
           out << nn << STRLIT("-CIMExportMethod: ") << cimMethod <<
               STRLIT("\r\n");
       }
       else
       {
           out << STRLIT("CIMExport: MethodRequest\r\n"
                         "CIMExportMethod: ") << cimMethod << STRLIT("\r\n");
       }
  
     out << "M-POST " << requestUri << " HTTP/1.1\r\n";  
     out << "HOST: " << host << "\r\n";  
     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << contentLength << "\r\n";  
     out << "Man: http://www.hp.com; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMExport: MethodRequest\r\n";  
     out << nn << "-CIMExportMethod: " << cimMethod << "\r\n";  
     if (authenticationHeader.size())     if (authenticationHeader.size())
     {     {
         out << authenticationHeader << "\r\n";          out << authenticationHeader << STRLIT("\r\n");
     }     }
     out << "\r\n";  
       out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1301 
Line 3185 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendEMethodResponseHeader( void XmlWriter::appendEMethodResponseHeader(
     Array<Sint8>& out,      Buffer& out,
       HttpMethod httpMethod,
       const ContentLanguageList& contentLanguages,
     Uint32 contentLength)     Uint32 contentLength)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      char nn[] = { char('0' + (rand() % 10)), char('0' + (rand() % 10)), '\0' };
   
       out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n"
                     "Content-Type: application/xml; charset=utf-8\r\n");
       OUTPUT_CONTENTLENGTH(out, contentLength);
  
     out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n";      if (contentLanguages.size() > 0)
     out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";      {
     out << "Content-Length: " << contentLength << "\r\n";          out << STRLIT("Content-Language: ") << contentLanguages <<
     out << "Ext:\r\n";              STRLIT("\r\n");
     out << "Cache-Control: no-cache\r\n";      }
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";      if (httpMethod == HTTP_METHOD_M_POST)
     out << nn <<"\r\n";      {
     out << nn << "-CIMExport: MethodResponse\r\n\r\n";          out << STRLIT("Ext:\r\n"
                         "Cache-Control: no-cache\r\n"
                         "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodResponse\r\n\r\n");
       }
       else
       {
           out << STRLIT("CIMExport: MethodResponse\r\n\r\n");
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1326 
Line 3225 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendSimpleExportReqElementBegin( void XmlWriter::_appendSimpleExportReqElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLEEXPREQ>\n";      out << STRLIT("<SIMPLEEXPREQ>\n");
 } }
  
 void XmlWriter::_appendSimpleExportReqElementEnd( void XmlWriter::_appendSimpleExportReqElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLEEXPREQ>\n";      out << STRLIT("</SIMPLEEXPREQ>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1348 
Line 3247 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendEMethodCallElementBegin( void XmlWriter::_appendEMethodCallElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<EXPMETHODCALL NAME=\"" << name << "\">\n";      out << STRLIT("<EXPMETHODCALL NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendEMethodCallElementEnd( void XmlWriter::_appendEMethodCallElementEnd(
     Array<Sint8>& out)      Buffer& out)
   {
       out << STRLIT("</EXPMETHODCALL>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendEParamValueElementBegin()
   // _appendEParamValueElementEnd()
   //
   //     <!ELEMENT EXPPARAMVALUE (INSTANCE)>
   //     <!ATTLIST EXPPARAMVALUE
   //         %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendEParamValueElementBegin(
       Buffer& out,
       const char* name)
   {
       out << STRLIT("<EXPPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendEParamValueElementEnd(
       Buffer& out)
   {
       out << STRLIT("</EXPPARAMVALUE>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceEParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceEParameter(
       Buffer& out,
       const char* name,
       const CIMInstance& instance)
 { {
     out << "</EXPMETHODCALL>\n";      _appendEParamValueElementBegin(out, name);
       appendInstanceElement(out, instance);
       _appendEParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1370 
Line 3309 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendSimpleExportRspElementBegin( void XmlWriter::_appendSimpleExportRspElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLEEXPRSP>\n";      out << STRLIT("<SIMPLEEXPRSP>\n");
 } }
  
 void XmlWriter::_appendSimpleExportRspElementEnd( void XmlWriter::_appendSimpleExportRspElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLEEXPRSP>\n";      out << STRLIT("</SIMPLEEXPRSP>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1392 
Line 3331 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::_appendEMethodResponseElementBegin( void XmlWriter::_appendEMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<EXPMETHODRESPONSE NAME=\"" << name << "\">\n";      out << STRLIT("<EXPMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::_appendEMethodResponseElementEnd( void XmlWriter::_appendEMethodResponseElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</EXPMETHODRESPONSE>\n";      out << STRLIT("</EXPMETHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1410 
Line 3349 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleEMethodReqMessage(  Buffer XmlWriter::formatSimpleEMethodReqMessage(
     const char* requestUri,     const char* requestUri,
     const char* host,     const char* host,
     const char* eMethodName,      const CIMName& eMethodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
     const Array<Sint8>& body)      const AcceptLanguageList& httpAcceptLanguages,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& body)
 { {
     Array<Sint8> out;      Buffer out;
     Array<Sint8> tmp;      Buffer tmp;
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleExportReqElementBegin(out);     _appendSimpleExportReqElementBegin(out);
Line 1434 
Line 3376 
         requestUri,         requestUri,
         host,         host,
         eMethodName,         eMethodName,
           httpMethod,
         authenticationHeader,         authenticationHeader,
           httpAcceptLanguages,
           httpContentLanguages,
         out.size());         out.size());
     tmp << out;     tmp << out;
  
Line 1447 
Line 3392 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleEMethodRspMessage(  Buffer XmlWriter::formatSimpleEMethodRspMessage(
     const char* eMethodName,      const CIMName& eMethodName,
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
       const ContentLanguageList& httpContentLanguages,
       const Buffer& body)
 { {
     Array<Sint8> out;      Buffer out;
     Array<Sint8> tmp;      Buffer tmp;
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleExportRspElementBegin(out);     _appendSimpleExportRspElementBegin(out);
Line 1463 
Line 3410 
     _appendSimpleExportRspElementEnd(out);     _appendSimpleExportRspElementEnd(out);
     _appendMessageElementEnd(out);     _appendMessageElementEnd(out);
  
     appendEMethodResponseHeader(tmp, out.size());      appendEMethodResponseHeader(tmp,
           httpMethod,
           httpContentLanguages,
           out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1475 
Line 3425 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleEMethodErrorRspMessage(  Buffer XmlWriter::formatSimpleEMethodErrorRspMessage(
     const String& eMethodName,      const CIMName& eMethodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const CIMException& cimException)     const CIMException& cimException)
 { {
     ArrayDestroyer<char> tmp1(eMethodName.allocateCString());      Buffer out;
     Array<Sint8> out;      Buffer tmp;
     Array<Sint8> tmp;  
  
     _appendMessageElementBegin(out, messageId);     _appendMessageElementBegin(out, messageId);
     _appendSimpleExportRspElementBegin(out);     _appendSimpleExportRspElementBegin(out);
     _appendEMethodResponseElementBegin(out, tmp1.getPointer());      _appendEMethodResponseElementBegin(out, eMethodName);
     _appendErrorElement(out, cimException);     _appendErrorElement(out, cimException);
     _appendEMethodResponseElementEnd(out);     _appendEMethodResponseElementEnd(out);
     _appendSimpleExportRspElementEnd(out);     _appendSimpleExportRspElementEnd(out);
     _appendMessageElementEnd(out);     _appendMessageElementEnd(out);
  
     appendEMethodResponseHeader(tmp, out.size());      appendEMethodResponseHeader(
           tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1500 
Line 3454 
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _printAttributes()  // XmlWriter::getNextMessageId()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 static void _printAttributes(  static IDFactory _messageIDFactory(1000);
     PEGASUS_STD(ostream)& os,  
     const XmlAttribute* attributes,  
     Uint32 attributeCount)  
 {  
     for (Uint32 i = 0; i < attributeCount; i++)  
     {  
         os << attributes[i].name << "=";  
   
         os << '"';  
         _appendSpecial(os, attributes[i].value);  
         os << '"';  
   
         if (i + 1 != attributeCount)  
             os << ' ';  
     }  
 }  
   
 //------------------------------------------------------------------------------  
 //  
 // _indent()  
 //  
 //------------------------------------------------------------------------------  
  
 static void _indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)  String XmlWriter::getNextMessageId()
 { {
     Uint32 n = level * indentChars;      char scratchBuffer[22];
       Uint32 n;
     for (Uint32 i = 0; i < n; i++)      const char * startP = Uint32ToString(scratchBuffer,
         os << ' ';                                           _messageIDFactory.getID(),
                                            n);
       return String(startP, n);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // indentedPrint()  // XmlWriter::keyBindingTypeToString
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
   const StrLit XmlWriter::keyBindingTypeToString (CIMKeyBinding::Type type)
 void XmlWriter::indentedPrint(  
     PEGASUS_STD(ostream)& os,  
     const char* text,  
     Uint32 indentChars)  
 {  
     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);  
   
                 os << "<" << entry.text;  
   
                 if (entry.attributeCount)  
                     os << ' ';  
   
                 _printAttributes(os, entry.attributes, entry.attributeCount);  
                 os << ">";  
                 stack.push(entry.text);  
                 break;  
             }  
   
             case XmlEntry::EMPTY_TAG:  
             {  
                 _indent(os, stack.size(), indentChars);  
   
                 os << "<" << entry.text << " ";  
                 _printAttributes(os, entry.attributes, entry.attributeCount);  
                 os << "/>";  
                 break;  
             }  
   
             case XmlEntry::END_TAG:  
             {  
                 if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)  
                     stack.pop();  
   
                 _indent(os, stack.size(), indentChars);  
   
                 os << "</" << entry.text << ">";  
                 break;  
             }  
   
             case XmlEntry::COMMENT:  
             {  
   
                 _indent(os, stack.size(), indentChars);  
                 os << "<!--";  
                 _appendSpecial(os, entry.text);  
                 os << "-->";  
                 break;  
             }  
   
             case XmlEntry::CONTENT:  
             {             {
                 _indent(os, stack.size(), indentChars);      switch (type)
                 _appendSpecial(os, entry.text);  
                 break;  
             }  
   
             case XmlEntry::CDATA:  
             {             {
                 _indent(os, stack.size(), indentChars);          case CIMKeyBinding::BOOLEAN:
                 os << "<![CDATA[...]]>";              return STRLIT("boolean");
                 break;  
             }  
  
             case XmlEntry::DOCTYPE:          case CIMKeyBinding::STRING:
             {              return STRLIT("string");
                 _indent(os, stack.size(), indentChars);  
                 os << "<!DOCTYPE...>";  
                 break;  
             }  
         }  
  
         os << PEGASUS_STD(endl);          case CIMKeyBinding::NUMERIC:
     }              return STRLIT("numeric");
  
     delete [] tmp;          case CIMKeyBinding::REFERENCE:
           default:
               PEGASUS_UNREACHABLE(PEGASUS_ASSERT(false);)
 } }
  
 //------------------------------------------------------------------------------      return STRLIT("unknown");
 //  
 // XmlWriter::getNextMessageId()  
 //  
 //------------------------------------------------------------------------------  
   
 String XmlWriter::getNextMessageId()  
 {  
     // ATTN: make thread-safe:  
     static Uint32 messageId = 1000;  
   
     messageId++;  
   
     if (messageId < 1000)  
         messageId = 1001;  
   
     char buffer[16];  
     sprintf(buffer, "%d", messageId);  
     return buffer;  
 } }
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.52  
changed lines
  Added in v.1.169.4.8

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2