(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.25 and 1.80

version 1.25, 2002/02/20 03:51:31 version 1.80, 2002/09/13 21:40:42
Line 1 
Line 1 
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,  // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
 // The Open Group, Tivoli Systems // The Open Group, Tivoli Systems
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
Line 26 
Line 26 
 // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com) // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
 //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com) //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
 //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com) //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
   //              Carol Ann Krug Graves, Hewlett-Packard Company
   //                  (carolann_graves@hp.com)
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
   #include <Pegasus/Common/Config.h>
 #include <cstdlib> #include <cstdlib>
 #include <cstdio> #include <cstdio>
   #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 "XmlParser.h"
   #include "Tracer.h"
   #include <Pegasus/Common/StatisticalData.h>
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
 inline void AppendChar(Array<Sint8>& out, Char16 c)  Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)
   {
       XmlWriter::append(out, x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, char x)
   {
       XmlWriter::append(out, x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, const Char16& x)
   {
       XmlWriter::append(out, x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)
   {
       XmlWriter::append(out, x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)
   {
       XmlWriter::append(out, x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)
   {
       out.appendArray(x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)
   {
       XmlWriter::append(out, x);
       return out;
   }
   
   Array<Sint8>& operator<<(Array<Sint8>& out, const CIMName& name)
   {
       XmlWriter::append(out, name.getString ());
       return out;
   }
   
   PEGASUS_STD(ostream)& operator<<(PEGASUS_STD(ostream)& os, const CIMDateTime& x)
   {
       return os << x.toString();
   }
   
   PEGASUS_STD(ostream)& operator<<(PEGASUS_STD(ostream)& os, const CIMName& name)
   {
       os << name.getString();
       return os;
   }
   
   PEGASUS_STD(ostream)& operator<<(PEGASUS_STD(ostream)& os,
       const CIMNamespaceName& name)
   {
       os << name.getString();
       return os;
   }
   
   inline void _appendChar(Array<Sint8>& out, const Char16& c)
 { {
     out.append(Sint8(c));     out.append(Sint8(c));
 } }
  
 inline void AppendSpecialChar(Array<Sint8>& out, Char16 c)  inline void _appendSpecialChar(Array<Sint8>& out, const Char16& c)
 { {
     // ATTN-B: Only UTF-8 handled for now.     // ATTN-B: Only UTF-8 handled for now.
  
Line 75 
Line 162 
     }     }
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Char16 x)  static inline void _appendSpecialChar(PEGASUS_STD(ostream)& os, char c)
   {
       switch (c)
       {
           case '&':
               os << "&amp;";
               break;
   
           case '<':
               os << "&lt;";
               break;
   
           case '>':
               os << "&gt;";
               break;
   
           case '"':
               os << "&quot;";
               break;
   
           case '\'':
               os << "&apos;";
               break;
   
           default:
               os << c;
       }
   }
   
   static inline void _appendSpecial(PEGASUS_STD(ostream)& os, const char* str)
   {
       while (*str)
           _appendSpecialChar(os, *str++);
   }
   
   void XmlWriter::append(Array<Sint8>& out, const Char16& x)
   {
       _appendChar(out, x);
   }
   
   void XmlWriter::append(Array<Sint8>& out, Boolean x)
 { {
     AppendChar(out, x);      append(out, (x ? "TRUE" : "FALSE"));
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Uint32 x) void XmlWriter::append(Array<Sint8>& out, Uint32 x)
 { {
     char buffer[32];     char buffer[32];
     sprintf(buffer, "%d", x);      sprintf(buffer, "%u", x);
     append(out, buffer);     append(out, buffer);
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const char* str)  void XmlWriter::append(Array<Sint8>& out, Sint32 x)
 { {
     while (*str)      char buffer[32];
         AppendChar(out, *str++);      sprintf(buffer, "%d", x);
       append(out, buffer);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)  void XmlWriter::append(Array<Sint8>& out, Uint64 x)
 { {
     AppendSpecialChar(out, x);      char buffer[32];  // Should need 21 chars max
       // I know I shouldn't put platform flags here, but the other way is too hard
   #if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
       sprintf(buffer, "%I64u", x);
   #else
       sprintf(buffer, "%llu", x);
   #endif
       append(out, buffer);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, char x)  void XmlWriter::append(Array<Sint8>& out, Sint64 x)
 { {
     AppendSpecialChar(out, Char16(x));      char buffer[32];  // Should need 21 chars max
       // I know I shouldn't put platform flags here, but the other way is too hard
   #if defined(PEGASUS_PLATFORM_WIN32_IX86_MSVC)
       sprintf(buffer, "%I64d", x);
   #else
       sprintf(buffer, "%lld", x);
   #endif
       append(out, buffer);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)  void XmlWriter::append(Array<Sint8>& out, Real64 x)
 { {
     while (*str)      char buffer[128];
         AppendSpecialChar(out, *str++);      // %e gives '[-]m.dddddde+/-xx', which seems compatible with CIM/XML spec
       sprintf(buffer, "%e", x);
       append(out, buffer);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)  void XmlWriter::append(Array<Sint8>& out, const char* str)
 { {
     const Char16* tmp = str.getData();      while (*str)
           _appendChar(out, *str++);
     while (*tmp)  
         AppendSpecialChar(out, *tmp++);  
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const String& str) void XmlWriter::append(Array<Sint8>& out, const String& str)
 { {
     const Char16* tmp = str.getData();      for (Uint32 i = 0; i < str.size(); i++)
       {
     while (*tmp)          _appendChar(out, str[i]);
         AppendChar(out, *tmp++);      }
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const Indentor& x) void XmlWriter::append(Array<Sint8>& out, const Indentor& x)
Line 131 
Line 273 
         out.append(' ');         out.append(' ');
 } }
  
 void XmlWriter::appendLocalNameSpaceElement(  void XmlWriter::appendSpecial(Array<Sint8>& out, const Char16& x)
     Array<Sint8>& out,  
     const String& nameSpace)  
 {  
     out << "<LOCALNAMESPACEPATH>\n";  
   
     char* tmp = nameSpace.allocateCString();  
   
     for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))  
     {     {
         out << "<NAMESPACE NAME=\"" << p << "\"/>\n";      _appendSpecialChar(out, x);
     }  
   
     delete [] tmp;  
   
     out << "</LOCALNAMESPACEPATH>\n";  
 } }
  
 static inline void AppendSpecialChar(PEGASUS_STD(ostream)& os, char c)  void XmlWriter::appendSpecial(Array<Sint8>& out, char x)
 {  
     switch (c)  
     {     {
         case '&':      _appendSpecialChar(out, Char16(x));
             os << "&amp;";  
             break;  
   
         case '<':  
             os << "&lt;";  
             break;  
   
         case '>':  
             os << "&gt;";  
             break;  
   
         case '"':  
             os << "&quot;";  
             break;  
   
         case '\'':  
             os << "&apos;";  
             break;  
   
         default:  
             os << c;  
     }  
 } }
  
 static inline void AppendSpecial(PEGASUS_STD(ostream)& os, const char* str)  void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)
 { {
     while (*str)     while (*str)
         AppendSpecialChar(os, *str++);          _appendSpecialChar(out, *str++);
 } }
  
 //------------------------------------------------------------------------------  void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)
 //  
 // formatGetHeader()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8> XmlWriter::formatGetHeader(  
     const char* documentPath)  
 { {
     Array<Sint8> out;      for (Uint32 i = 0; i < str.size(); i++)
     return out << "GET " << documentPath << "HTTP/1.0\r\n\r\n";      {
           _appendSpecialChar(out, str[i]);
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMPostHeader()  // appendLocalNameSpacePathElement()
 // //
 //     Build HTTP request header.  //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMPostHeader(  void XmlWriter::appendLocalNameSpacePathElement(
     const char* host,      Array<Sint8>& out,
     const char* cimOperation,      const CIMNamespaceName& nameSpace)
     const char* cimMethod,  
     const String& cimObject,  
     const String& authenticationHeader,  
     const Array<Sint8>& content)  
 { {
     Array<Sint8> out;      out << "<LOCALNAMESPACEPATH>\n";
     out.reserve(1024);  
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };  
  
     out << "M-POST /cimom HTTP/1.1\r\n";      char* nameSpaceCopy = strdup(nameSpace.getString().getCString());
     out << "HOST: " << host << "\r\n";      for (const char* p = strtok(nameSpaceCopy, "/"); p; p = strtok(NULL, "/"))
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << content.size() << "\r\n";  
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMOperation: " << cimOperation << "\r\n";  
     out << nn << "-CIMMethod: " << cimMethod << "\r\n";  
     out << nn << "-CIMObject: " << cimObject << "\r\n";  
     if (authenticationHeader.size())  
     {     {
         out << authenticationHeader << "\r\n";          out << "<NAMESPACE NAME=\"" << p << "\"/>\n";
     }     }
     out << "\r\n";      delete nameSpaceCopy;
     out << content;  
     return out;      out << "</LOCALNAMESPACEPATH>\n";
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseHeader()  // appendNameSpacePathElement()
 // //
 //     Build HTTP response header.  //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodResponseHeader(  void XmlWriter::appendNameSpacePathElement(
     const Array<Sint8>& content)      Array<Sint8>& out,
       const String& host,
       const CIMNamespaceName& nameSpace)
 { {
     Array<Sint8> out;      out << "<NAMESPACEPATH>\n";
     out.reserve(1024);      out << "<HOST>" << host << "</HOST>\n";
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      appendLocalNameSpacePathElement(out, nameSpace);
       out << "</NAMESPACEPATH>\n";
     out << "HTTP/1.1 200 OK\r\n";  
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";  
     out << "Content-Length: " << content.size() << "\r\n";  
     out << "Ext:\r\n";  
     out << "Cache-Control: no-cache\r\n";  
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";  
     out << nn <<"\r\n";  
     out << nn << "-CIMOperation: MethodResponse\r\n\r\n";  
     out << content;  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMessageElement()  // appendClassNameElement()
 // //
 //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>  //     <!ELEMENT CLASSNAME EMPTY>
 //     <!ATTLIST MESSAGE  //     <!ATTLIST CLASSNAME
 //         ID CDATA #REQUIRED  //              %CIMName;>
 //         PROTOCOLVERSION CDATA #REQUIRED>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMessageElement(  void XmlWriter::appendClassNameElement(
     const String& messageId,      Array<Sint8>& out,
     const Array<Sint8>& body)      const CIMName& className)
 { {
     Array<Sint8> out;      out << "<CLASSNAME NAME=\"" << className << "\"/>\n";
     out.reserve(1024);  
   
     out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";  
     out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";  
     out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";  
     out << body;  
     out << "</MESSAGE>\n";  
     out << "</CIM>\n";  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleReqElement()  // appendInstanceNameElement()
 // //
 //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>  //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
   //    <!ATTLIST INSTANCENAME
   //              %ClassName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleReqElement(  void XmlWriter::appendInstanceNameElement(
     const Array<Sint8>& body)      Array<Sint8>& out,
       const CIMObjectPath& instanceName)
 { {
     Array<Sint8> out;      out << "<INSTANCENAME CLASSNAME=\"" << instanceName.getClassName() << "\">\n";
     return out << "<SIMPLEREQ>\n" << body << "</SIMPLEREQ>\n";  
       Array<CIMKeyBinding> keyBindings = instanceName.getKeyBindings();
       for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
       {
           out << "<KEYBINDING NAME=\"" << keyBindings[i].getName() << "\">\n";
   
           if (keyBindings[i].getType() == CIMKeyBinding::REFERENCE)
           {
               CIMObjectPath ref = keyBindings[i].getValue();
               appendValueReferenceElement(out, ref, true);
           }
           else {
               out << "<KEYVALUE VALUETYPE=\"";
               out << keyBindingTypeToString(keyBindings[i].getType());
               out << "\">";
   
               // fixed the special character problem - Markus
   
               appendSpecial(out, keyBindings[i].getValue());
               out << "</KEYVALUE>\n";
           }
           out << "</KEYBINDING>\n";
       }
       out << "</INSTANCENAME>\n";
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleRspElement()  // appendClassPathElement()
 // //
 //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>  //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleRspElement(  void XmlWriter::appendClassPathElement(
     const Array<Sint8>& body)      Array<Sint8>& out,
       const CIMObjectPath& classPath)
 { {
     Array<Sint8> out;      out << "<CLASSPATH>\n";
     return out << "<SIMPLERSP>\n" << body << "</SIMPLERSP>\n";      appendNameSpacePathElement(out,
                                  classPath.getHost(),
                                  classPath.getNameSpace());
       appendClassNameElement(out, classPath.getClassName());
       out << "</CLASSPATH>\n";
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodCallElement()  // appendInstancePathElement()
 // //
 //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>  //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
 //     <!ATTLIST IMETHODCALL %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIMethodCallElement(  void XmlWriter::appendInstancePathElement(
     const char* name,      Array<Sint8>& out,
     const String& nameSpace,      const CIMObjectPath& instancePath)
     const Array<Sint8>& iParamValues)  
 { {
     Array<Sint8> out;      out << "<INSTANCEPATH>\n";
     out << "<IMETHODCALL NAME=\"" << name << "\">\n";      appendNameSpacePathElement(out,
     XmlWriter::appendLocalNameSpaceElement(out, nameSpace);                                 instancePath.getHost(),
     out << iParamValues;                                 instancePath.getNameSpace());
     out << "</IMETHODCALL>\n";      appendInstanceNameElement(out, instancePath);
     return out;      out << "</INSTANCEPATH>\n";
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodResponseElement()  // appendLocalClassPathElement()
 // //
 //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>  //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
 //     <!ATTLIST IMETHODRESPONSE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIMethodResponseElement(  void XmlWriter::appendLocalClassPathElement(
     const char* name,      Array<Sint8>& out,
     const Array<Sint8>& body)      const CIMObjectPath& classPath)
 { {
     Array<Sint8> out;      out << "<LOCALCLASSPATH>\n";
     out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";      appendLocalNameSpacePathElement(out, classPath.getNameSpace());
     out << body;      appendClassNameElement(out, classPath.getClassName());
     out << "</IMETHODRESPONSE>\n";      out << "</LOCALCLASSPATH>\n";
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIReturnValueElement()  // appendLocalInstancePathElement()
 // //
 //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|  //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
 //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|  
 //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|  
 //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatIReturnValueElement(  void XmlWriter::appendLocalInstancePathElement(
     const Array<Sint8>& body)      Array<Sint8>& out,
       const CIMObjectPath& instancePath)
 { {
     Array<Sint8> out;      out << "<LOCALINSTANCEPATH>\n";
     return out << "<IRETURNVALUE>\n" << body << "</IRETURNVALUE>\n";      appendLocalNameSpacePathElement(out, instancePath.getNameSpace());
       appendInstanceNameElement(out, instancePath);
       out << "</LOCALINSTANCEPATH>\n";
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIParamValueElement()  // appendLocalObjectPathElement()
 // //
 //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE  //     If the reference refers to an instance, write a LOCALINSTANCEPATH;
 //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION  //     otherwise write a LOCALCLASSPATH.
 //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
 //     <!ATTLIST IPARAMVALUE %CIMName;>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::formatIParamValueElement(  void XmlWriter::appendLocalObjectPathElement(
     Array<Sint8>& out,     Array<Sint8>& out,
     const char* name,      const CIMObjectPath& objectPath)
     const Array<Sint8>& body)  
 { {
     out << "<IPARAMVALUE NAME=\"" << name << "\">\n";  
     out << body;  
     out << "</IPARAMVALUE>\n";  
     return out;  
 }  
   
 //------------------------------------------------------------------------------  
 // //
 // formatErrorElement()      //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class has no
       //  key bindings
 // //
 //------------------------------------------------------------------------------      if (objectPath.getKeyBindings ().size () != 0)
   
 Array<Sint8> XmlWriter::formatErrorElement(  
     CIMStatusCode code,  
     const char* description)  
 { {
     Array<Sint8> out;          appendLocalInstancePathElement(out, objectPath);
     out << "<ERROR";  
     out << " CODE=\"" << Uint32(code) << "\"";  
     out << " DESCRIPTION=\"";  
     appendSpecial(out, description);  
     out << "\"/>";  
     return out;  
 } }
       else
 //------------------------------------------------------------------------------  
 //  
 // appendBooleanParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendBooleanParameter(  
     Array<Sint8>& out,  
     const char* name,  
     Boolean flag)  
 { {
     Array<Sint8> tmp;          appendLocalClassPathElement(out, objectPath);
     tmp << "<VALUE>" << (flag ? "TRUE" : "FALSE") << "</VALUE>\n";      }
     return formatIParamValueElement(out, name, tmp);  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendStringIParameter()  // Helper functions for appendValueElement()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8>& XmlWriter::appendStringIParameter(  inline void _appendValue(Array<Sint8>& out, Boolean x)
     Array<Sint8>& out,  
     const char* name,  
     const String& str)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, x);
     tmp << "<VALUE>";  
     appendSpecial(tmp, str);  
     tmp << "</VALUE>\n";  
     return formatIParamValueElement(out, name, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Uint8 x)
 //  
 // appendClassNameParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendClassNameParameter(  
     Array<Sint8>& out,  
     const char* name,  
     const String& className)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, Uint32(x));
     appendClassNameElement(tmp, className);  
     return formatIParamValueElement(out, name, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Sint8 x)
 //  
 // appendQualifierNameParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendQualifierNameParameter(  
     Array<Sint8>& out,  
     const char* name,  
     const String& qualifierName)  
 { {
     // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE      XmlWriter::append(out, Sint32(x));
     //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION  
     //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>  
     //  
     // ATTN: notice that there is really no way to pass a qualifier name  
     // as an IPARAMVALUE element according to the spec (look above). So we  
     // just pass it as a class name. An answer must be obtained later.  
   
     Array<Sint8> tmp;  
     appendClassNameElement(tmp, qualifierName);  
     return formatIParamValueElement(out, name, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Uint16 x)
 //  
 // appendClassParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendClassParameter(  
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMConstClass& cimClass)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, Uint32(x));
     cimClass.toXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Sint16 x)
 //  
 // appendInstanceNameParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendInstanceNameParameter(  
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMReference& instanceName)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, Sint32(x));
     instanceName.instanceNameToXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Uint32 x)
 //  
 // appendInstanceParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendInstanceParameter(  
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMConstInstance& instance)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, x);
     instance.toXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Sint32 x)
 //  
 // appendNamedInstanceParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendNamedInstanceParameter(  
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMNamedInstance& namedInstance)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, x);
     namedInstance.toXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //----------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Uint64 x)
 //  
 //  appendPropertyNameParameter()  
 //  
 //     </IPARAMVALUE>  
 //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>  
 //  
 //     USE: Create parameter for getProperty operation  
 //==========================================================  
 Array<Sint8>& XmlWriter::appendPropertyNameParameter(  
     Array<Sint8>& out,  
     const String& propertyName)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, x);
     tmp << "<VALUE>" << propertyName << "</VALUE>\n";  }
     return formatIParamValueElement(out,"PropertyName", tmp);}  
   
 //------------------------------------------------------------------------------  
 //  
 // appendPropertyValueParameter()  
 //  
 //------------------------------------------------------------------------------  
  
 Array<Sint8>& XmlWriter::appendPropertyValueParameter(  inline void _appendValue(Array<Sint8>& out, Sint64 x)
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMValue& value)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, x);
     value.toXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, Real32 x)
 //  
 // appendPropertyListParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendPropertyListParameter(  
     Array<Sint8>& out,  
     const CIMPropertyList& propertyList)  
 { {
     Array<Sint8> tmp;      XmlWriter::append(out, Real64(x));
   }
  
     tmp << "<VALUE.ARRAY>\n";  inline void _appendValue(Array<Sint8>& out, Real64 x)
     for (Uint32 i = 0; i < propertyList.getNumProperties(); i++)  
     {     {
         tmp << "<VALUE>" << propertyList.getPropertyName(i) << "</VALUE>\n";      XmlWriter::append(out, x);
     }  
     tmp << "</VALUE.ARRAY>\n";  
     return formatIParamValueElement(out, "PropertyList", tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, const Char16& x)
 //  
 // appendQualifierDeclarationParameter()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendQualifierDeclarationParameter(  
     Array<Sint8>& out,  
     const char* parameterName,  
     const CIMConstQualifierDecl& qualifierDecl)  
 { {
     Array<Sint8> tmp;      XmlWriter::appendSpecial(out, x);
     qualifierDecl.toXml(tmp);  
     return formatIParamValueElement(out, parameterName, tmp);  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, const String& x)
 //  
 // appendClassNameElement()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendClassNameElement(  
     Array<Sint8>& out,  
     const String& className)  
 { {
     return out << "<CLASSNAME NAME=\"" << className << "\"/>\n";      XmlWriter::appendSpecial(out, x);
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, const CIMDateTime& x)
 //  
 // appendInstanceNameElement()  
 //  
 //------------------------------------------------------------------------------  
   
 Array<Sint8>& XmlWriter::appendInstanceNameElement(  
     Array<Sint8>& out,  
     const CIMReference& instanceName)  
 { {
     instanceName.instanceNameToXml(out);      out << x.toString();  //ATTN: append() method?
     return out;  
 } }
  
 //------------------------------------------------------------------------------  inline void _appendValue(Array<Sint8>& out, const CIMObjectPath& x)
 //  {
 // _printAttributes()      XmlWriter::appendValueReferenceElement(out, x, true);
 //  }
 //------------------------------------------------------------------------------  
  
 static void _printAttributes(  void _appendValueArray(Array<Sint8>& out, const CIMObjectPath* p, Uint32 size)
     PEGASUS_STD(ostream)& os,  
     const XmlAttribute* attributes,  
     Uint32 attributeCount)  
 { {
     for (Uint32 i = 0; i < attributeCount; i++)      out << "<VALUE.REFARRAY>\n";
       while (size--)
     {     {
         os << attributes[i].name << "=";          _appendValue(out, *p++);
   
         os << '"';  
         AppendSpecial(os, attributes[i].value);  
         os << '"';  
   
         if (i + 1 != attributeCount)  
             os << ' ';  
     }     }
       out << "</VALUE.REFARRAY>\n";
 } }
  
 //------------------------------------------------------------------------------  template<class T>
 //  void _appendValueArray(Array<Sint8>& out, const T* p, Uint32 size)
 // _indent()  {
 //      out << "<VALUE.ARRAY>\n";
 //------------------------------------------------------------------------------  
  
 static void _indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)      while (size--)
 { {
     Uint32 n = level * indentChars;          out << "<VALUE>";
           _appendValue(out, *p++);
           out << "</VALUE>\n";
       }
  
     for (Uint32 i = 0; i < n; i++)      out << "</VALUE.ARRAY>\n";
         os << ' ';  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // indentedPrint()  // appendValueElement()
   //
   //    <!ELEMENT VALUE (#PCDATA)>
   //    <!ELEMENT VALUE.ARRAY (VALUE*)>
   //    <!ELEMENT VALUE.REFERENCE
   //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::indentedPrint(  void XmlWriter::appendValueElement(
     PEGASUS_STD(ostream)& os,      Array<Sint8>& out,
     const char* text,      const CIMValue& value)
     Uint32 indentChars)  
 { {
     char* tmp = strcpy(new char[strlen(text) + 1], text);      if (value.isNull())
   
     XmlParser parser(tmp);  
     XmlEntry entry;  
     Stack<const char*> stack;  
   
     while (parser.next(entry))  
     {     {
         switch (entry.type)          return;
       }
       if (value.isArray())
         {         {
             case XmlEntry::XML_DECLARATION:          switch (value.getType())
             {             {
                 _indent(os, stack.size(), indentChars);              case CIMTYPE_BOOLEAN:
               {
                 os << "<?" << entry.text << " ";                  Array<Boolean> a;
                 _printAttributes(os, entry.attributes, entry.attributeCount);                  value.get(a);
                 os << "?>";                  _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::START_TAG:              case CIMTYPE_UINT8:
             {             {
                 _indent(os, stack.size(), indentChars);                  Array<Uint8> a;
                   value.get(a);
                 os << "<" << entry.text;                  _appendValueArray(out, a.getData(), a.size());
                   break;
                 if (entry.attributeCount)              }
                     os << ' ';  
  
                 _printAttributes(os, entry.attributes, entry.attributeCount);              case CIMTYPE_SINT8:
                 os << ">";              {
                 stack.push(entry.text);                  Array<Sint8> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::EMPTY_TAG:              case CIMTYPE_UINT16:
             {             {
                 _indent(os, stack.size(), indentChars);                  Array<Uint16> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                   break;
               }
  
                 os << "<" << entry.text << " ";              case CIMTYPE_SINT16:
                 _printAttributes(os, entry.attributes, entry.attributeCount);              {
                 os << "/>";                  Array<Sint16> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::END_TAG:              case CIMTYPE_UINT32:
             {             {
                 if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)                  Array<Uint32> a;
                     stack.pop();                  value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                   break;
               }
  
                 _indent(os, stack.size(), indentChars);              case CIMTYPE_SINT32:
               {
                   Array<Sint32> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                   break;
               }
  
                 os << "</" << entry.text << ">";              case CIMTYPE_UINT64:
               {
                   Array<Uint64> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::COMMENT:              case CIMTYPE_SINT64:
             {             {
                   Array<Sint64> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                   break;
               }
  
                 _indent(os, stack.size(), indentChars);              case CIMTYPE_REAL32:
                 os << "<!--";              {
                 AppendSpecial(os, entry.text);                  Array<Real32> a;
                 os << "-->";                  value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::CONTENT:              case CIMTYPE_REAL64:
             {             {
                 _indent(os, stack.size(), indentChars);                  Array<Real64> a;
                 AppendSpecial(os, entry.text);                  value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::CDATA:              case CIMTYPE_CHAR16:
             {             {
                 _indent(os, stack.size(), indentChars);                  Array<Char16> a;
                 os << "<![CDATA[...]]>";                  value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
  
             case XmlEntry::DOCTYPE:              case CIMTYPE_STRING:
             {             {
                 _indent(os, stack.size(), indentChars);                  Array<String> a;
                 os << "<!DOCTYPE...>";                  value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                 break;                 break;
             }             }
   
               case CIMTYPE_DATETIME:
               {
                   Array<CIMDateTime> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                   break;
         }         }
  
         os << PEGASUS_STD(endl);              case CIMTYPE_REFERENCE:
               {
                   Array<CIMObjectPath> a;
                   value.get(a);
                   _appendValueArray(out, a.getData(), a.size());
                   break;
     }     }
  
     delete [] tmp;              default:
                   PEGASUS_ASSERT(false);
           }
       }
       else if (value.getType() == CIMTYPE_REFERENCE)
       {
           // Has to be separate because it uses VALUE.REFERENCE tag
           CIMObjectPath v;
           value.get(v);
           _appendValue(out, v);
 } }
       else
       {
           out << "<VALUE>";
  
 //------------------------------------------------------------------------------          switch (value.getType())
 //  
 // XmlWriter::getNextMessageId()  
 //  
 //------------------------------------------------------------------------------  
   
 String XmlWriter::getNextMessageId()  
 { {
     // ATTN: make thread-safe:              case CIMTYPE_BOOLEAN:
     static Uint32 messageId = 1000;              {
                   Boolean v;
     messageId++;                  value.get(v);
                   _appendValue(out, v);
     if (messageId < 1000)                  break;
         messageId = 1001;  
   
     char buffer[16];  
     sprintf(buffer, "%d", messageId);  
     return buffer;  
 } }
  
 //------------------------------------------------------------------------------              case CIMTYPE_UINT8:
 //              {
 // XmlWriter::formatSimpleIMethodReqMessage()                  Uint8 v;
 //                  value.get(v);
 //------------------------------------------------------------------------------                  _appendValue(out, v);
                   break;
               }
  
 Array<Sint8> XmlWriter::formatSimpleIMethodReqMessage(              case CIMTYPE_SINT8:
     const char* host,  
     const String& nameSpace,  
     const char* iMethodName,  
     const String& messageId,  
     const String& authenticationHeader,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMPostHeader(                  Sint8 v;
         host,                  value.get(v);
         "MethodCall",                  _appendValue(out, v);
         iMethodName,                  break;
         nameSpace,  
         authenticationHeader,  
         XmlWriter::formatMessageElement(  
             messageId,  
             XmlWriter::formatSimpleReqElement(  
                 XmlWriter::formatIMethodCallElement(  
                     iMethodName,  
                     nameSpace,  
                     body))));  
 } }
  
 Array<Sint8> XmlWriter::formatSimpleRspMessage(              case CIMTYPE_UINT16:
     const char* iMethodName,  
     const String& messageId,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMethodResponseHeader(                  Uint16 v;
         XmlWriter::formatMessageElement(                  value.get(v);
             messageId,                  _appendValue(out, v);
             XmlWriter::formatSimpleRspElement(                  break;
                 XmlWriter::formatIMethodResponseElement(  
                     iMethodName,  
                     XmlWriter::formatIReturnValueElement(body)))));  
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)              case CIMTYPE_SINT16:
 { {
     XmlWriter::append(out, x);                  Sint16 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, char x)              case CIMTYPE_UINT32:
 { {
     XmlWriter::append(out, x);                  Uint32 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Char16 x)              case CIMTYPE_SINT32:
 { {
     XmlWriter::append(out, x);                  Sint32 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)              case CIMTYPE_UINT64:
 { {
     XmlWriter::append(out, x);                  Uint64 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)              case CIMTYPE_SINT64:
 { {
     XmlWriter::append(out, x);                  Sint64 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)              case CIMTYPE_REAL32:
 { {
     out.appendArray(x);                  Real32 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)              case CIMTYPE_REAL64:
 { {
     XmlWriter::append(out, x);                  Real64 v;
     return out;                  value.get(v);
                   _appendValue(out, v);
                   break;
 } }
  
 Array<Sint8>& XmlWriter::appendObjectNameParameter(              case CIMTYPE_CHAR16:
     Array<Sint8>& out,  
     const char* name,  
     const CIMReference& objectName)  
 { {
     if (objectName.isClassName())                  Char16 v;
                   value.get(v);
                   _appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_STRING:
     {     {
         XmlWriter::appendClassNameParameter(                  String v;
             out, name, objectName.getClassName());                  value.get(v);
                   _appendValue(out, v);
                   break;
     }     }
     else  
               case CIMTYPE_DATETIME:
     {     {
         XmlWriter::appendInstanceNameParameter(                  CIMDateTime v;
             out, name, objectName);                  value.get(v);
                   _appendValue(out, v);
                   break;
     }     }
  
     return out;              default:
                   PEGASUS_ASSERT(false);
 } }
  
 Array<Sint8> XmlWriter::formatEMethodCallElement(          out << "</VALUE>\n";
     const char* name,      }
     const Array<Sint8>& iParamValues)  }
   
   void XmlWriter::printValueElement(
       const CIMValue& value,
       PEGASUS_STD(ostream)& os)
 { {
     Array<Sint8> out;      Array<Sint8> tmp;
     out << "<EXPMETHODCALL NAME=\"" << name << "\">\n";      appendValueElement(tmp, value);
     out << iParamValues;      tmp.append('\0');
     out << "</EXPMETHODCALL>\n";      os << tmp.getData() << PEGASUS_STD(endl);
     return out;  
 } }
  
 Array<Sint8> XmlWriter::formatSimpleIndicationReqMessage(  //------------------------------------------------------------------------------
     const char* host,  //
     const char* iMethodName,  // appendValueObjectWithPathElement()
     const String& messageId,  //
     const String& authenticationHeader,  //     <!ELEMENT VALUE.OBJECTWITHPATH
     const Array<Sint8>& body)  //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueObjectWithPathElement(
       Array<Sint8>& out,
       const CIMObject& objectWithPath)
 { {
     return XmlWriter::formatMPostIndicationHeader(      out << "<VALUE.OBJECTWITHPATH>\n";
         host,  
         "MethodRequest",      appendValueReferenceElement(out, objectWithPath.getPath (), false);
         iMethodName,      appendObjectElement(out, objectWithPath);
         authenticationHeader,  
         XmlWriter::formatMessageElement(      out << "</VALUE.OBJECTWITHPATH>\n";
             messageId,  
             XmlWriter::formatSimpleExportReqElement(  
                 XmlWriter::formatEMethodCallElement(  
                     iMethodName,  
                     body))));  
 } }
  
 Array<Sint8> XmlWriter::formatMPostIndicationHeader(  //------------------------------------------------------------------------------
     const char* host,  //
     const char* cimOperation,  // appendValueReferenceElement()
     const char* cimMethod,  //
     const String& authenticationHeader,  //    <!ELEMENT VALUE.REFERENCE
     const Array<Sint8>& content)  //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueReferenceElement(
       Array<Sint8>& out,
       const CIMObjectPath& reference,
       Boolean putValueWrapper)
 { {
     Array<Sint8> out;      if (putValueWrapper)
     out.reserve(1024);          out << "<VALUE.REFERENCE>\n";
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };  
  
     out << "M-POST /cimom HTTP/1.1\r\n";      // See if it is a class or instance reference (instance references have
     out << "HOST: " << host << "\r\n";      // key-bindings; class references do not).
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";      //
     out << "Content-Length: " << content.size() << "\r\n";      //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
     out << "Man: http://www.hp.com; ns=";      //  distinguish instanceNames from classNames in every case
     out << nn <<"\r\n";      //  The instanceName of a singleton instance of a keyless class has no
     out << nn << "-CIMExport: " << cimOperation << "\r\n";      //  key bindings
     out << nn << "-CIMExportMethod: " << cimMethod << "\r\n";      //
     if (authenticationHeader.size())  
       Array<CIMKeyBinding> kbs = reference.getKeyBindings();
   
       if (kbs.size())
     {     {
         out << authenticationHeader << "\r\n";          if (reference.getHost().size())
           {
               appendInstancePathElement(out, reference);
     }     }
     out << "\r\n";          else if (!reference.getNameSpace().isNull())
     out << content;          {
     return out;              appendLocalInstancePathElement(out, reference);
 } }
           else
 Array<Sint8> XmlWriter::formatSimpleExportReqElement(  
     const Array<Sint8>& body)  
 { {
     Array<Sint8> out;              appendInstanceNameElement(out, reference);
     return out << "<SIMPLEEXPREQ>\n" << body << "</SIMPLEEXPREQ>\n";          }
       }
       else
       {
           if (reference.getHost().size())
           {
               appendClassPathElement(out, reference);
           }
           else if (!reference.getNameSpace().isNull())
           {
               appendLocalClassPathElement(out, reference);
           }
           else
           {
               appendClassNameElement(out, reference.getClassName());
           }
 } }
  
 Array<Sint8> XmlWriter::formatSimpleIndicationRspMessage(      if (putValueWrapper)
     const char* iMethodName,          out << "</VALUE.REFERENCE>\n";
     const String& messageId,  }
     const Array<Sint8>& body)  
   void XmlWriter::printValueReferenceElement(
       const CIMObjectPath& reference,
       PEGASUS_STD(ostream)& os)
 { {
     return XmlWriter::formatEMethodResponseHeader(      Array<Sint8> tmp;
         XmlWriter::formatMessageElement(      appendValueReferenceElement(tmp, reference, true);
             messageId,      tmp.append('\0');
             XmlWriter::formatSimpleExportRspElement(      indentedPrint(os, tmp.getData());
                 XmlWriter::formatEMethodResponseElement(  
                     iMethodName,  
                     XmlWriter::formatIReturnValueElement(body)))));  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatSimpleExportRspElement()  // appendValueNamedInstanceElement()
 // //
 //     <!ELEMENT SIMPLEEXPRSP (METHODRESPONSE|EXPMETHODRESPONSE)>  //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleExportRspElement(  void XmlWriter::appendValueNamedInstanceElement(
     const Array<Sint8>& body)      Array<Sint8>& out,
       const CIMInstance& namedInstance)
 { {
     Array<Sint8> out;      out << "<VALUE.NAMEDINSTANCE>\n";
     return out << "<SIMPLEEXPRSP>\n" << body << "</SIMPLEEXPRSP>\n";  
       appendInstanceNameElement(out, namedInstance.getPath ());
       appendInstanceElement(out, namedInstance);
   
       out << "</VALUE.NAMEDINSTANCE>\n";
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatIMethodResponseElement()  // appendClassElement()
 // //
 //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>  //     <!ELEMENT CLASS
 //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>  //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
   //     <!ATTLIST CLASS
   //         %CIMName;
   //         %SuperClass;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatEMethodResponseElement(  void XmlWriter::appendClassElement(
     const char* name,      Array<Sint8>& out,
     const Array<Sint8>& body)      const CIMConstClass& cimclass)
 { {
     Array<Sint8> out;      cimclass._checkRep();
     out << "<EXPMETHODRESPONSE NAME=\"" << name << "\">\n";      cimclass._rep->toXml(out);
     out << body;  }
     out << "</EXPMETHODRESPONSE>\n";  
     return out;  void XmlWriter::printClassElement(
       const CIMConstClass& cimclass,
       PEGASUS_STD(ostream)& os)
   {
       Array<Sint8> tmp;
       appendClassElement(tmp, cimclass);
       tmp.append('\0');
       indentedPrint(os, tmp.getData(), 4);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseHeader()  // appendInstanceElement()
 // //
 //     Build HTTP response header.  //     <!ELEMENT INSTANCE
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
   //     <!ATTLIST INSTANCE
   //         %ClassName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatEMethodResponseHeader(  void XmlWriter::appendInstanceElement(
     const Array<Sint8>& content)      Array<Sint8>& out,
       const CIMConstInstance& instance)
 { {
     Array<Sint8> out;      instance._checkRep();
     out.reserve(1024);      instance._rep->toXml(out);
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };  }
  
     out << "HTTP/1.1 200 OK\r\n";  void XmlWriter::printInstanceElement(
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";      const CIMConstInstance& instance,
     out << "Content-Length: " << content.size() << "\r\n";      PEGASUS_STD(ostream)& os)
     out << "Ext:\r\n";  {
     out << "Cache-Control: no-cache\r\n";      Array<Sint8> tmp;
     out << "Man:  http://www.dmtf.org/cim/mapping/http/v1.0; ns=";      appendInstanceElement(tmp, instance);
     out << nn <<"\r\n";      tmp.append('\0');
     out << nn << "-CIMExport: MethodResponse\r\n\r\n";      os << tmp.getData() << PEGASUS_STD(endl);
     out << content;  
     return out;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleMethodReqMessage()  // appendObjectElement()
   //
   // May refer to a CLASS or an INSTANCE
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleMethodReqMessage(  void XmlWriter::appendObjectElement(
     const char* host,      Array<Sint8>& out,
     const String& nameSpace,      const CIMConstObject& object)
     const char* iMethodName,  
     const String& messageId,  
    const String& authenticationHeader,  
     const Array<Sint8>& body)  
 { {
     return XmlWriter::formatMPostHeader(      if (object.isClass())
         host,      {
         "MethodCall",          CIMConstClass c(object);
         iMethodName,          appendClassElement(out, c);
         nameSpace,      }
         authenticationHeader,      else if (object.isInstance())
         XmlWriter::formatMessageElement(      {
             messageId,          CIMConstInstance i(object);
             XmlWriter::formatSimpleReqElement(          appendInstanceElement(out, i);
                 XmlWriter::formatMethodCallElement(      }
                     iMethodName,      // else PEGASUS_ASSERT(0);
                     nameSpace,  
                     body))));  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodCallElement()  // appendPropertyElement()
 // //
 //     <!ELEMENT METHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>  //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
 //     <!ATTLIST METHODCALL %CIMName;>  //     <!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;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodCallElement(  void XmlWriter::appendPropertyElement(
     const char* name,      Array<Sint8>& out,
     const String& nameSpace,      const CIMConstProperty& property)
     const Array<Sint8>& iParamValues)  
 { {
     Array<Sint8> out;      property._checkRep();
     out << "<METHODCALL NAME=\"" << name << "\">\n";      property._rep->toXml(out);
     out << iParamValues;  
     out << "</METHODCALL>\n";  
     return out;  
 } }
  
 Array<Sint8> XmlWriter::formatSimpleMethodRspMessage(  void XmlWriter::printPropertyElement(
     const char* iMethodName,      const CIMConstProperty& property,
     const String& messageId,      PEGASUS_STD(ostream)& os)
     const Array<Sint8>& body)  
 { {
     /*return XmlWriter::formatMethodResponseHeader(      Array<Sint8> tmp;
         XmlWriter::formatMessageElement(      appendPropertyElement(tmp, property);
             messageId,      tmp.append('\0');
             XmlWriter::formatSimpleRspElement(      os << tmp.getData() << PEGASUS_STD(endl);
                 XmlWriter::formatMethodResponseElement(  
                     iMethodName,  
                     XmlWriter::formatReturnValueElement(body)))));*/  
     return XmlWriter::formatMethodResponseHeader(  
         XmlWriter::formatMessageElement(  
             messageId,  
             XmlWriter::formatSimpleRspElement(  
                 XmlWriter::formatMethodResponseElement(  
                     iMethodName,  
                     body))));  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatMethodResponseElement()  // appendMethodElement()
 // //
 //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>  //     <!ELEMENT METHOD (QUALIFIER*,
 //     <!ATTLIST METHODRESPONSE %CIMName;>  //         (PARAMETER|PARAMETER.REFERENCE|PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
   //     <!ATTLIST METHOD
   //              %CIMName;
   //              %CIMType;          #IMPLIED
   //              %ClassOrigin;
   //              %Propagated;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatMethodResponseElement(  void XmlWriter::appendMethodElement(
     const char* name,      Array<Sint8>& out,
     const Array<Sint8>& body)      const CIMConstMethod& method)
 { {
     Array<Sint8> out;      method._checkRep();
     out << "<METHODRESPONSE NAME=\"" << name << "\">\n";      method._rep->toXml(out);
     out << body;  }
     out << "</METHODRESPONSE>\n";  
     return out;  void XmlWriter::printMethodElement(
       const CIMConstMethod& method,
       PEGASUS_STD(ostream)& os)
   {
       Array<Sint8> tmp;
       appendMethodElement(tmp, method);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatReturnValueElement()  // appendParameterElement()
 // //
 // ATTN-RK-P2-20020219: This spec snippet reflects an update that has not yet  //     <!ELEMENT PARAMETER (QUALIFIER*)>
 // been implemented  //     <!ATTLIST PARAMETER
 // <!ELEMENT RETURNVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE|VALUE.REFARRAY)>  //              %CIMName;
 // <!ATTLIST RETURNVALUE  //              %CIMType;      #REQUIRED>
 //     %ParamType;>  //
   //     <!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;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatReturnValueElement(  void XmlWriter::appendParameterElement(
     const Array<Sint8>& body)      Array<Sint8>& out,
       const CIMConstParameter& parameter)
 { {
     Array<Sint8> out;      parameter._checkRep();
     return out << "<RETURNVALUE>\n" << body << "</RETURNVALUE>\n";      parameter._rep->toXml(out);
   }
   
   void XmlWriter::printParameterElement(
       const CIMConstParameter& parameter,
       PEGASUS_STD(ostream)& os)
   {
       Array<Sint8> tmp;
       appendParameterElement(tmp, parameter);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatUnauthorizedResponseHeader()  // appendParamValueElement()
 //  
 //     Build HTTP authentication response header for unauthorized requests.  
 //  
 //     Returns unauthorized message in the following format:  
 // //
 //        HTTP/1.1 401 Unauthorized  //     <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
 //        WWW-Authenticate: Basic "hostname:80"  //     <!ATTLIST PARAMVALUE
 //        <HTML><HEAD>  //              %CIMName;>
 //        <TITLE>401 Unauthorized</TITLE>  
 //        </HEAD><BODY BGCOLOR="#99cc99">  
 //        <H2>TEST401 Unauthorized</H2>  
 //        <HR>  
 //        </BODY></HTML>  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatUnauthorizedResponseHeader(  void XmlWriter::appendParamValueElement(
     const String& content)      Array<Sint8>& out,
       const CIMParamValue& paramValue)
 { {
     Array<Sint8> out;      paramValue._checkRep();
     out.reserve(1024);      paramValue._rep->toXml(out);
   }
   
   void XmlWriter::printParamValueElement(
       const CIMParamValue& paramValue,
       PEGASUS_STD(ostream)& os)
   {
       Array<Sint8> tmp;
       appendParamValueElement(tmp, paramValue);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierElement()
   //
   //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
   //     <!ATTLIST QUALIFIER
   //              %CIMName;
   //              %CIMType;               #REQUIRED
   //              %Propagated;
   //              %QualifierFlavor;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierElement(
       Array<Sint8>& out,
       const CIMConstQualifier& qualifier)
   {
       qualifier._checkRep();
       qualifier._rep->toXml(out);
   }
   
   void XmlWriter::printQualifierElement(
       const CIMConstQualifier& qualifier,
       PEGASUS_STD(ostream)& os)
   {
       Array<Sint8> tmp;
       appendQualifierElement(tmp, qualifier);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierDeclElement()
   //
   //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
   //     <!ATTLIST QUALIFIER.DECLARATION
   //              %CIMName;
   //              %CIMType;                       #REQUIRED
   //              ISARRAY        (true|false)     #IMPLIED
   //              %ArraySize;
   //              %QualifierFlavor;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierDeclElement(
       Array<Sint8>& out,
       const CIMConstQualifierDecl& qualifierDecl)
   {
       qualifierDecl._checkRep();
       qualifierDecl._rep->toXml(out);
   }
   
   void XmlWriter::printQualifierDeclElement(
       const CIMConstQualifierDecl& qualifierDecl,
       PEGASUS_STD(ostream)& os)
   {
       Array<Sint8> tmp;
       appendQualifierDeclElement(tmp, qualifierDecl);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierFlavorEntity()
   //
   //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
   //                                 TOSUBCLASS   (true|false)   'true'
   //                                 TOINSTANCE   (true|false)   'false'
   //                                 TRANSLATABLE (true|false)   'false'">
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierFlavorEntity(
       Array<Sint8>& out,
       const CIMFlavor & flavor)
   {
       if (!(flavor.hasFlavor (CIMFlavor::OVERRIDABLE)))
           out << " OVERRIDABLE=\"false\"";
   
       if (!(flavor.hasFlavor (CIMFlavor::TOSUBCLASS)))
           out << " TOSUBCLASS=\"false\"";
   
       if (flavor.hasFlavor (CIMFlavor::TOINSTANCE))
           out << " TOINSTANCE=\"true\"";
   
       if (flavor.hasFlavor (CIMFlavor::TRANSLATABLE))
           out << " TRANSLATABLE=\"true\"";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendScopeElement()
   //
   //     <!ELEMENT SCOPE EMPTY>
   //     <!ATTLIST SCOPE
   //              CLASS        (true|false)      'false'
   //              ASSOCIATION  (true|false)      'false'
   //              REFERENCE    (true|false)      'false'
   //              PROPERTY     (true|false)      'false'
   //              METHOD       (true|false)      'false'
   //              PARAMETER    (true|false)      'false'
   //              INDICATION   (true|false)      'false'>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendScopeElement(
       Array<Sint8>& out,
       const CIMScope & scope)
   {
       if (!(scope.equal (CIMScope ())))
       {
           out << "<SCOPE";
   
           if (scope.hasScope (CIMScope::CLASS))
               out << " CLASS=\"true\"";
   
           if (scope.hasScope (CIMScope::ASSOCIATION))
               out << " ASSOCIATION=\"true\"";
   
           if (scope.hasScope (CIMScope::REFERENCE))
               out << " REFERENCE=\"true\"";
   
           if (scope.hasScope (CIMScope::PROPERTY))
               out << " PROPERTY=\"true\"";
   
           if (scope.hasScope (CIMScope::METHOD))
               out << " METHOD=\"true\"";
   
           if (scope.hasScope (CIMScope::PARAMETER))
               out << " PARAMETER=\"true\"";
   
           if (scope.hasScope (CIMScope::INDICATION))
               out << " INDICATION=\"true\"";
   
           out << "/>";
       }
   }
   
   //------------------------------------------------------------------------------
   //
   // appendMethodCallHeader()
   //
   //     Build HTTP method call request header.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendMethodCallHeader(
       Array<Sint8>& out,
       const char* host,
       const CIMName& cimMethod,
       const String& cimObject,
       const String& authenticationHeader,
       Uint32 contentLength)
   {
       char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
       out << "M-POST /cimom HTTP/1.1\r\n";
       out << "HOST: " << host << "\r\n";
       out << "Content-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())
       {
           out << authenticationHeader << "\r\n";
       }
       out << "\r\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendMethodResponseHeader()
   //
   //     Build HTTP response header.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendMethodResponseHeader(
       Array<Sint8>& out,
       Uint32 contentLength)
   {
       char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
       out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n";
       STAT_SERVERTIME
       out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";
       out << "Content-Length: " << contentLength << "\r\n";
       out << "Ext:\r\n";
       out << "Cache-Control: no-cache\r\n";
       out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
       out << nn <<"\r\n";
       out << nn << "-CIMOperation: MethodResponse\r\n\r\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendHttpErrorResponseHeader()
   //
   //     Build HTTP error response header.
   //
   //     Returns error response message in the following format:
   //
   //        HTTP/1.1 400 Bad Request       (using specified status code)
   //        CIMError: <error type>         (if specified by caller)
   //        PGErrorDetail: <error text>    (if specified by caller)
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendHttpErrorResponseHeader(
       Array<Sint8>& out,
       const String& status,
       const String& cimError,
       const String& errorDetail)
   {
       out << "HTTP/1.1 " << status << "\r\n";
       if (cimError != String::EMPTY)
       {
           out << "CIMError: " << cimError << "\r\n";
       }
       if (errorDetail != String::EMPTY)
       {
           // ATTN-RK-P3-20020404: It is critical that this text not contain '\n'
           // ATTN-RK-P3-20020404: Need to encode this value properly.  (See
           // CIM/HTTP Specification section 3.3.2
           out << PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": " << errorDetail << "\r\n";
       }
       out << "\r\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendUnauthorizedResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
   //
   //     Returns unauthorized message in the following format:
   //
   //        HTTP/1.1 401 Unauthorized
   //        WWW-Authenticate: Basic "hostname:80"
   //        <HTML><HEAD>
   //        <TITLE>401 Unauthorized</TITLE>
   //        </HEAD><BODY BGCOLOR="#99cc99">
   //        <H2>TEST401 Unauthorized</H2>
   //        <HR>
   //        </BODY></HTML>
   //
   //------------------------------------------------------------------------------
  
     out << "HTTP/1.1 401 Unauthorized\r\n";  void XmlWriter::appendUnauthorizedResponseHeader(
       Array<Sint8>& out,
       const String& content)
   {
       out << "HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n";
     out << content << "\r\n";     out << content << "\r\n";
     out << "\r\n";     out << "\r\n";
  
Line 1212 
Line 1521 
 //    out << "<H2>TEST" << "401 Unauthorized" << "</H2>\r\n"; //    out << "<H2>TEST" << "401 Unauthorized" << "</H2>\r\n";
 //    out << "<HR>\r\n"; //    out << "<HR>\r\n";
 //    out << "</BODY></HTML>\r\n"; //    out << "</BODY></HTML>\r\n";
   }
  
     return out;  //------------------------------------------------------------------------------
   //
   // _appendMessageElementBegin()
   // _appendMessageElementEnd()
   //
   //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
   //     <!ATTLIST MESSAGE
   //         ID CDATA #REQUIRED
   //         PROTOCOLVERSION CDATA #REQUIRED>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendMessageElementBegin(
       Array<Sint8>& out,
       const String& messageId)
   {
       out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
       out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";
       out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";
   }
   
   void XmlWriter::_appendMessageElementEnd(
       Array<Sint8>& out)
   {
       out << "</MESSAGE>\n";
       out << "</CIM>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendSimpleReqElementBegin()
   // _appendSimpleReqElementEnd()
   //
   //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendSimpleReqElementBegin(
       Array<Sint8>& out)
   {
       out << "<SIMPLEREQ>\n";
   }
   
   void XmlWriter::_appendSimpleReqElementEnd(
       Array<Sint8>& out)
   {
       out << "</SIMPLEREQ>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendMethodCallElementBegin()
   // _appendMethodCallElementEnd()
   //
   //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)>
   //     <!ATTLIST METHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendMethodCallElementBegin(
       Array<Sint8>& out,
       const CIMName& name)
   {
       out << "<METHODCALL NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendMethodCallElementEnd(
       Array<Sint8>& out)
   {
       out << "</METHODCALL>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIMethodCallElementBegin()
   // _appendIMethodCallElementEnd()
   //
   //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
   //     <!ATTLIST IMETHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIMethodCallElementBegin(
       Array<Sint8>& out,
       const CIMName& name)
   {
       out << "<IMETHODCALL NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendIMethodCallElementEnd(
       Array<Sint8>& out)
   {
       out << "</IMETHODCALL>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIParamValueElementBegin()
   // _appendIParamValueElementEnd()
   //
   //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
   //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
   //         |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
   //     <!ATTLIST IPARAMVALUE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIParamValueElementBegin(
       Array<Sint8>& out,
       const char* name)
   {
       out << "<IPARAMVALUE NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendIParamValueElementEnd(
       Array<Sint8>& out)
   {
       out << "</IPARAMVALUE>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendSimpleRspElementBegin()
   // _appendSimpleRspElementEnd()
   //
   //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendSimpleRspElementBegin(
       Array<Sint8>& out)
   {
       out << "<SIMPLERSP>\n";
   }
   
   void XmlWriter::_appendSimpleRspElementEnd(
       Array<Sint8>& out)
   {
       out << "</SIMPLERSP>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendMethodResponseElementBegin()
   // _appendMethodResponseElementEnd()
   //
   //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST METHODRESPONSE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendMethodResponseElementBegin(
       Array<Sint8>& out,
       const CIMName& name)
   {
       out << "<METHODRESPONSE NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendMethodResponseElementEnd(
       Array<Sint8>& out)
   {
       out << "</METHODRESPONSE>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIMethodResponseElementBegin()
   // _appendIMethodResponseElementEnd()
   //
   //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST IMETHODRESPONSE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIMethodResponseElementBegin(
       Array<Sint8>& out,
       const CIMName& name)
   {
       out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendIMethodResponseElementEnd(
       Array<Sint8>& out)
   {
       out << "</IMETHODRESPONSE>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendErrorElement()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendErrorElement(
       Array<Sint8>& out,
       const CIMException& cimException)
   {
       Tracer::traceCIMException(TRC_XML_WRITER, Tracer::LEVEL2, cimException);
   
       out << "<ERROR";
       out << " CODE=\"" << Uint32(cimException.getCode()) << "\"";
       String description = TraceableCIMException(cimException).getDescription();
       if (description != String::EMPTY)
       {
           out << " DESCRIPTION=\"";
           appendSpecial(out, description);
           out << "\"";
       }
       out << "/>";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendReturnValueElement()
   //
   // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
   // <!ATTLIST RETURNVALUE
   //     %ParamType;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendReturnValueElement(
       Array<Sint8>& out,
       const CIMValue& value)
   {
       out << "<RETURNVALUE";
   
       CIMType type = value.getType();
       out << " PARAMTYPE=\"" << cimTypeToString (type) << "\"";
   
       out << ">\n";
   
       // Add value.
       appendValueElement(out, value);
       out << "</RETURNVALUE>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendIReturnValueElementBegin()
   // _appendIReturnValueElementEnd()
   //
   //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|
   //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|
   //          OBJECTPATH*|QUALIFIER.DECLARATION*|VALUE.ARRAY?|VALUE.REFERENCE?|
   //          CLASS*|INSTANCE*|VALUE.NAMEDINSTANCE*)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendIReturnValueElementBegin(
       Array<Sint8>& out)
   {
       out << "<IRETURNVALUE>\n";
   }
   
   void XmlWriter::_appendIReturnValueElementEnd(
       Array<Sint8>& out)
   {
       out << "</IRETURNVALUE>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendBooleanIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendBooleanIParameter(
       Array<Sint8>& out,
       const char* name,
       Boolean flag)
   {
       _appendIParamValueElementBegin(out, name);
       out << "<VALUE>";
       append(out, flag);
       out << "</VALUE>\n";
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendStringIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendStringIParameter(
       Array<Sint8>& out,
       const char* name,
       const String& str)
   {
       _appendIParamValueElementBegin(out, name);
       out << "<VALUE>";
       appendSpecial(out, str);
       out << "</VALUE>\n";
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierNameIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierNameIParameter(
       Array<Sint8>& out,
       const char* name,
       const String& qualifierName)
   {
       // <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
       //     |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
       //     |CLASS|INSTANCE|VALUE.NAMEDINSTANCE)?>
       //
       // ATTN: notice that there is really no way to pass a qualifier name
       // 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);
       appendClassNameElement(out, qualifierName);
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassNameIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassNameIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMName& className)
   {
       _appendIParamValueElementBegin(out, name);
       appendClassNameElement(out, className);
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceNameIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceNameIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMObjectPath& instanceName)
   {
       _appendIParamValueElementBegin(out, name);
       appendInstanceNameElement(out, instanceName);
       _appendIParamValueElementEnd(out);
   }
   
   void XmlWriter::appendObjectNameIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMObjectPath& objectName)
   {
       //
       //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class also
       //  has no key bindings
       //
       if (objectName.getKeyBindings ().size () == 0)
       {
           XmlWriter::appendClassNameIParameter(
               out, name, objectName.getClassName());
       }
       else
       {
           XmlWriter::appendInstanceNameIParameter(
               out, name, objectName);
       }
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMConstClass& cimClass)
   {
       _appendIParamValueElementBegin(out, name);
       appendClassElement(out, cimClass);
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMConstInstance& instance)
   {
       _appendIParamValueElementBegin(out, name);
       appendInstanceElement(out, instance);
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendNamedInstanceIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendNamedInstanceIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMInstance& namedInstance)
   {
       _appendIParamValueElementBegin(out, name);
       appendValueNamedInstanceElement(out, namedInstance);
       _appendIParamValueElementEnd(out);
   }
   
   //----------------------------------------------------------
   //
   //  appendPropertyNameIParameter()
   //
   //     </IPARAMVALUE>
   //     <IPARAMVALUE NAME="PropertyName"><VALUE>FreeSpace</VALUE></IPARAMVALUE>
   //
   //     USE: Create parameter for getProperty operation
   //==========================================================
   void XmlWriter::appendPropertyNameIParameter(
       Array<Sint8>& out,
       const CIMName& propertyName)
   {
       _appendIParamValueElementBegin(out, "PropertyName");
       out << "<VALUE>" << propertyName << "</VALUE>\n";
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendPropertyValueIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendPropertyValueIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMValue& value)
   {
       _appendIParamValueElementBegin(out, name);
       appendValueElement(out, value);
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendPropertyListIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendPropertyListIParameter(
       Array<Sint8>& out,
       const CIMPropertyList& propertyList)
   {
       // ATTN: P3 KS 4 Mar 2002 - As check shouldn't we check for null property list
       _appendIParamValueElementBegin(out, "PropertyList");
   
       out << "<VALUE.ARRAY>\n";
       for (Uint32 i = 0; i < propertyList.size(); i++)
       {
           out << "<VALUE>" << propertyList[i] << "</VALUE>\n";
       }
       out << "</VALUE.ARRAY>\n";
   
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendQualifierDeclarationIParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierDeclarationIParameter(
       Array<Sint8>& out,
       const char* name,
       const CIMConstQualifierDecl& qualifierDecl)
   {
       _appendIParamValueElementBegin(out, name);
       appendQualifierDeclElement(out, qualifierDecl);
       _appendIParamValueElementEnd(out);
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatHttpErrorRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatHttpErrorRspMessage(
       const String& status,
       const String& cimError,
       const String& errorDetail)
   {
       Array<Sint8> out;
   
       appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
   
       return out;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleMethodReqMessage()
   //
   //------------------------------------------------------------------------------
   
   // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
   Array<Sint8> XmlWriter::formatSimpleMethodReqMessage(
       const char* host,
       const CIMNamespaceName& nameSpace,
       const CIMObjectPath& path,
       const CIMName& methodName,
       const Array<CIMParamValue>& parameters,
       const String& messageId,
       const String& authenticationHeader)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
       CIMObjectPath localObjectPath = path;
       localObjectPath.setNameSpace(nameSpace.getString());
       localObjectPath.setHost(String::EMPTY);
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleReqElementBegin(out);
       _appendMethodCallElementBegin(out, methodName);
       appendLocalObjectPathElement(out, localObjectPath);
       for (Uint32 i=0; i < parameters.size(); i++)
       {
           appendParamValueElement(out, parameters[i]);
       }
       _appendMethodCallElementEnd(out);
       _appendSimpleReqElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodCallHeader(
           tmp,
           host,
           methodName,
           localObjectPath.toString(),
           authenticationHeader,
           out.size());
       tmp << out;
   
       return tmp;
   }
   
   Array<Sint8> XmlWriter::formatSimpleMethodRspMessage(
       const CIMName& methodName,
       const String& messageId,
       const Array<Sint8>& body)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendMethodResponseElementBegin(out, methodName);
       out << body;
       _appendMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(tmp, out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleMethodErrorRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleMethodErrorRspMessage(
       const CIMName& methodName,
       const String& messageId,
       const CIMException& cimException)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendMethodResponseElementBegin(out, methodName);
       _appendErrorElement(out, cimException);
       _appendMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(tmp, out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleIMethodReqMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleIMethodReqMessage(
       const char* host,
       const CIMNamespaceName& nameSpace,
       const CIMName& iMethodName,
       const String& messageId,
       const String& authenticationHeader,
       const Array<Sint8>& body)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleReqElementBegin(out);
       _appendIMethodCallElementBegin(out, iMethodName);
       appendLocalNameSpacePathElement(out, nameSpace.getString());
       out << body;
       _appendIMethodCallElementEnd(out);
       _appendSimpleReqElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodCallHeader(
           tmp,
           host,
           iMethodName,
           nameSpace.getString(),
           authenticationHeader,
           out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleIMethodRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleIMethodRspMessage(
       const CIMName& iMethodName,
       const String& messageId,
       const Array<Sint8>& body)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendIMethodResponseElementBegin(out, iMethodName);
       if (body.size() != 0)
       {
           _appendIReturnValueElementBegin(out);
           out << body;
           _appendIReturnValueElementEnd(out);
       }
       _appendIMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(tmp, out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleIMethodErrorRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleIMethodErrorRspMessage(
       const CIMName& iMethodName,
       const String& messageId,
       const CIMException& cimException)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendIMethodResponseElementBegin(out, iMethodName);
       _appendErrorElement(out, cimException);
       _appendIMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendMethodResponseHeader(tmp, out.size());
       tmp << out;
   
       return tmp;
   }
   
   //******************************************************************************
   //
   // Export Messages (used for indications)
   //
   //******************************************************************************
   
   //------------------------------------------------------------------------------
   //
   // appendEMethodRequestHeader()
   //
   //     Build HTTP request header for export operation.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendEMethodRequestHeader(
       Array<Sint8>& out,
       const char* requestUri,
       const char* host,
       const CIMName& cimMethod,
       const String& authenticationHeader,
       Uint32 contentLength)
   {
       char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
       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())
       {
           out << authenticationHeader << "\r\n";
       }
       out << "\r\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // appendEMethodResponseHeader()
   //
   //     Build HTTP response header for export operation.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendEMethodResponseHeader(
       Array<Sint8>& out,
       Uint32 contentLength)
   {
       char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
   
       out << "HTTP/1.1 " HTTP_STATUS_OK "\r\n";
       out << "Content-Type: application/xml; charset=\"utf-8\"\r\n";
       out << "Content-Length: " << contentLength << "\r\n";
       out << "Ext:\r\n";
       out << "Cache-Control: no-cache\r\n";
       out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";
       out << nn <<"\r\n";
       out << nn << "-CIMExport: MethodResponse\r\n\r\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendSimpleExportReqElementBegin()
   // _appendSimpleExportReqElementEnd()
   //
   //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendSimpleExportReqElementBegin(
       Array<Sint8>& out)
   {
       out << "<SIMPLEEXPREQ>\n";
   }
   
   void XmlWriter::_appendSimpleExportReqElementEnd(
       Array<Sint8>& out)
   {
       out << "</SIMPLEEXPREQ>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendEMethodCallElementBegin()
   // _appendEMethodCallElementEnd()
   //
   //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)>
   //     <!ATTLIST EXPMETHODCALL %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendEMethodCallElementBegin(
       Array<Sint8>& out,
       const CIMName& name)
   {
       out << "<EXPMETHODCALL NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendEMethodCallElementEnd(
       Array<Sint8>& out)
   {
       out << "</EXPMETHODCALL>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendSimpleExportRspElementBegin()
   // _appendSimpleExportRspElementEnd()
   //
   //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendSimpleExportRspElementBegin(
       Array<Sint8>& out)
   {
       out << "<SIMPLEEXPRSP>\n";
   }
   
   void XmlWriter::_appendSimpleExportRspElementEnd(
       Array<Sint8>& out)
   {
       out << "</SIMPLEEXPRSP>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendEMethodResponseElementBegin()
   // _appendEMethodResponseElementEnd()
   //
   //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>
   //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendEMethodResponseElementBegin(
       Array<Sint8>& out,
       const CIMName& name)
   {
       out << "<EXPMETHODRESPONSE NAME=\"" << name << "\">\n";
   }
   
   void XmlWriter::_appendEMethodResponseElementEnd(
       Array<Sint8>& out)
   {
       out << "</EXPMETHODRESPONSE>\n";
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleEMethodReqMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleEMethodReqMessage(
       const char* requestUri,
       const char* host,
       const CIMName& eMethodName,
       const String& messageId,
       const String& authenticationHeader,
       const Array<Sint8>& body)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleExportReqElementBegin(out);
       _appendEMethodCallElementBegin(out, eMethodName);
       out << body;
       _appendEMethodCallElementEnd(out);
       _appendSimpleExportReqElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendEMethodRequestHeader(
           tmp,
           requestUri,
           host,
           eMethodName,
           authenticationHeader,
           out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleEMethodRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleEMethodRspMessage(
       const CIMName& eMethodName,
       const String& messageId,
       const Array<Sint8>& body)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
       out << body;
       _appendEMethodResponseElementEnd(out);
       _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendEMethodResponseHeader(tmp, out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::formatSimpleEMethodErrorRspMessage()
   //
   //------------------------------------------------------------------------------
   
   Array<Sint8> XmlWriter::formatSimpleEMethodErrorRspMessage(
       const CIMName& eMethodName,
       const String& messageId,
       const CIMException& cimException)
   {
       Array<Sint8> out;
       Array<Sint8> tmp;
   
       _appendMessageElementBegin(out, messageId);
       _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
       _appendErrorElement(out, cimException);
       _appendEMethodResponseElementEnd(out);
       _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
   
       appendEMethodResponseHeader(tmp, out.size());
       tmp << out;
   
       return tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // _printAttributes()
   //
   //------------------------------------------------------------------------------
   
   static void _printAttributes(
       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)
   {
       Uint32 n = level * indentChars;
   
       for (Uint32 i = 0; i < n; i++)
           os << ' ';
   }
   
   //------------------------------------------------------------------------------
   //
   // indentedPrint()
   //
   //------------------------------------------------------------------------------
   
   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);
                   _appendSpecial(os, entry.text);
                   break;
               }
   
               case XmlEntry::CDATA:
               {
                   _indent(os, stack.size(), indentChars);
                   os << "<![CDATA[...]]>";
                   break;
               }
   
               case XmlEntry::DOCTYPE:
               {
                   _indent(os, stack.size(), indentChars);
                   os << "<!DOCTYPE...>";
                   break;
               }
           }
   
           os << PEGASUS_STD(endl);
       }
   
       delete [] tmp;
   }
   
   //------------------------------------------------------------------------------
   //
   // 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;
   }
   
   //------------------------------------------------------------------------------
   //
   // XmlWriter::keyBindingTypeToString
   //
   //------------------------------------------------------------------------------
   const char* XmlWriter::keyBindingTypeToString (CIMKeyBinding::Type type)
   {
       switch (type)
       {
           case CIMKeyBinding::BOOLEAN:
               return "boolean";
   
           case CIMKeyBinding::STRING:
               return "string";
   
           case CIMKeyBinding::NUMERIC:
               return "numeric";
   
           case CIMKeyBinding::REFERENCE:
           default:
               PEGASUS_ASSERT(false);
       }
   
       return "unknown";
 } }
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


Legend:
Removed from v.1.25  
changed lines
  Added in v.1.80

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2