(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.28 and 1.126

version 1.28, 2002/03/01 00:59:57 version 1.126, 2005/10/31 18:21:55
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%2005////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
 // The Open Group, Tivoli Systems  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation, The Open Group.
   // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; VERITAS Software Corporation; The Open Group.
 // //
 // 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
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 26 
Line 32 
 // 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)
   //              Amit K Arora, IBM (amita@in.ibm.com) for PEP#101
   //         Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase1
   //                               Willis White (whiwill@us.ibm.com) PEP 127 and 128
   //         Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase2
   //              Dave Sudlik, IBM (dsudlik@us.ibm.com)
   //              David Dillard, VERITAS Software Corp.
   //                  (david.dillard@veritas.com)
   //              Vijay Eli, vijayeli@in.ibm.com, fix for #2571
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
   #include <Pegasus/Common/Config.h>
 #include <cstdlib> #include <cstdlib>
 #include <cstdio> #include <cstdio>
 #include "Destroyer.h"  #include "Constants.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>
   #include "CommonUTF.h"
   #include "Buffer.h"
   // For a future optimization:
   #define STRLIT(X) X
   
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const char* x)  // This is a shortcut macro for outputing content length. This
   // pads the output number to the max characters representing a Uint32 number
   // so that it can be overwritten easily with a transfer encoding line later
   // on in HTTPConnection if required. This is strictly for performance since
   // messages can be very large. This overwriting shortcut allows us to NOT have
   // to repackage a large message later.
   
   #define OUTPUT_CONTENTLENGTH                                               \
   {                                                                          \
       char contentLengthP[11];                                               \
       sprintf(contentLengthP,"%.10u", contentLength);                        \
       out << STRLIT("content-length: ") << contentLengthP << STRLIT("\r\n"); \
   }
   
   ////////////////////////////////////////////////////////////////////////////////
   //
   // SpecialChar and table.
   //
   ////////////////////////////////////////////////////////////////////////////////
   
   struct SpecialChar
   {
       const char* str;
       size_t size;
   };
   
   // Defines encodings of special characters. Just use a 7-bit ASCII character
   // as an index into this array to retrieve its string encoding and encoding
   // length in bytes.
   static const SpecialChar _specialChars[] =
   {
       { "&#0;", 4 },
       { "&#1;", 4 },
       { "&#2;", 4 },
       { "&#3;", 4 },
       { "&#4;", 4 },
       { "&#5;", 4 },
       { "&#6;", 4 },
       { "&#7;", 4 },
       { "&#8;", 4 },
       { "&#9;", 4 },
       { "&#10;", 5 },
       { "&#11;", 5 },
       { "&#12;", 5 },
       { "&#13;", 5 },
       { "&#14;", 5 },
       { "&#15;", 5 },
       { "&#16;", 5 },
       { "&#17;", 5 },
       { "&#18;", 5 },
       { "&#19;", 5 },
       { "&#20;", 5 },
       { "&#21;", 5 },
       { "&#22;", 5 },
       { "&#23;", 5 },
       { "&#24;", 5 },
       { "&#25;", 5 },
       { "&#26;", 5 },
       { "&#27;", 5 },
       { "&#28;", 5 },
       { "&#29;", 5 },
       { "&#30;", 5 },
       { "&#31;", 5 },
       { " ", 1 },
       { "!", 1 },
       { "&quot;", 6 },
       { "#", 1 },
       { "$", 1 },
       { "%", 1 },
       { "&amp;", 5 },
       { "&apos;", 6 },
       { "(", 1 },
       { ")", 1 },
       { "*", 1 },
       { "+", 1 },
       { ",", 1 },
       { "-", 1 },
       { ".", 1 },
       { "/", 1 },
       { "0", 1 },
       { "1", 1 },
       { "2", 1 },
       { "3", 1 },
       { "4", 1 },
       { "5", 1 },
       { "6", 1 },
       { "7", 1 },
       { "8", 1 },
       { "9", 1 },
       { ":", 1 },
       { ";", 1 },
       { "&lt;", 4 },
       { "=", 1 },
       { "&gt;", 4 },
       { "?", 1 },
       { "@", 1 },
       { "A", 1 },
       { "B", 1 },
       { "C", 1 },
       { "D", 1 },
       { "E", 1 },
       { "F", 1 },
       { "G", 1 },
       { "H", 1 },
       { "I", 1 },
       { "J", 1 },
       { "K", 1 },
       { "L", 1 },
       { "M", 1 },
       { "N", 1 },
       { "O", 1 },
       { "P", 1 },
       { "Q", 1 },
       { "R", 1 },
       { "S", 1 },
       { "T", 1 },
       { "U", 1 },
       { "V", 1 },
       { "W", 1 },
       { "X", 1 },
       { "Y", 1 },
       { "Z", 1 },
       { "[", 1 },
       { "\\", 1 },
       { "]", 1 },
       { "^", 1 },
       { "_", 1 },
       { "`", 1 },
       { "a", 1 },
       { "b", 1 },
       { "c", 1 },
       { "d", 1 },
       { "e", 1 },
       { "f", 1 },
       { "g", 1 },
       { "h", 1 },
       { "i", 1 },
       { "j", 1 },
       { "k", 1 },
       { "l", 1 },
       { "m", 1 },
       { "n", 1 },
       { "o", 1 },
       { "p", 1 },
       { "q", 1 },
       { "r", 1 },
       { "s", 1 },
       { "t", 1 },
       { "u", 1 },
       { "v", 1 },
       { "w", 1 },
       { "x", 1 },
       { "y", 1 },
       { "z", 1 },
       { "{", 1 },
       { "|", 1 },
       { "}", 1 },
       { "~", 1 },
       { "&#127;", 6 },
   };
   
   // If _isSpecialChar7[ch] is true, then ch is a special character, which must
   // have a special encoding in XML. But only use 7-bit ASCII characters to
   // index this array.
   static const int _isSpecialChar7[] =
   {
       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,
       0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
   };
   
   ////////////////////////////////////////////////////////////////////////////////
   
   Buffer& operator<<(Buffer& out, const char* x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;     return out;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, char x)  Buffer& operator<<(Buffer& out, char x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;     return out;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Char16 x)  Buffer& operator<<(Buffer& out, const Char16& x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;     return out;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const String& x)  Buffer& operator<<(Buffer& out, const String& x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;     return out;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Indentor& x)  Buffer& operator<<(Buffer& out, const Indentor& x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;     return out;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, const Array<Sint8>& x)  Buffer& operator<<(Buffer& out, const Buffer& x)
 { {
     out.appendArray(x);      out.append(x.getData(), x.size());
     return out;     return out;
 } }
  
 Array<Sint8>& operator<<(Array<Sint8>& out, Uint32 x)  Buffer& operator<<(Buffer& out, Uint32 x)
 { {
     XmlWriter::append(out, x);     XmlWriter::append(out, x);
     return out;     return out;
 } }
  
 inline void _appendChar(Array<Sint8>& out, Char16 c)  Buffer& operator<<(Buffer& out, const CIMName& name)
 { {
     out.append(Sint8(c));      XmlWriter::append(out, name.getString ());
       return out;
 } }
  
 inline void _appendSpecialChar(Array<Sint8>& out, Char16 c)  
   // l10n
   Buffer& operator<<(Buffer& out, const AcceptLanguages& al)
 { {
     // ATTN-B: Only UTF-8 handled for now.      XmlWriter::append(out, al.toString ());
       return out;
   }
  
     switch (c)  // l10n
   Buffer& operator<<(Buffer& out, const ContentLanguages& cl)
     {     {
         case '&':      XmlWriter::append(out, cl.toString ());
             out.append("&amp;", 5);      return out;
             break;  }
  
         case '<':  
             out.append("&lt;", 4);  
             break;  
  
         case '>':  PEGASUS_STD(ostream)& operator<<(PEGASUS_STD(ostream)& os, const CIMDateTime& x)
             out.append("&gt;", 4);  {
             break;      return os << x.toString();
   }
  
         case '"':  PEGASUS_STD(ostream)& operator<<(PEGASUS_STD(ostream)& os, const CIMName& name)
             out.append("&quot;", 6);  {
             break;      os << name.getString();
       return os;
   }
  
         case '\'':  PEGASUS_STD(ostream)& operator<<(PEGASUS_STD(ostream)& os,
             out.append("&apos;", 6);      const CIMNamespaceName& name)
             break;  {
       os << name.getString();
       return os;
   }
  
         default:  static void _xmlWritter_appendChar(Buffer& out, const Char16& c)
             out.append(Sint8(c));  {
       // We need to convert the Char16 to UTF8 then append the UTF8
       // character into the array.
       // NOTE: The UTF8 character could be several bytes long.
       // WARNING: This function will put in replacement character for
       // all characters that have surogate pairs.
       char str[6];
       memset(str,0x00,sizeof(str));
       Uint8* charIN = (Uint8 *)&c;
   
       const Uint16 *strsrc = (Uint16 *)charIN;
       Uint16 *endsrc = (Uint16 *)&charIN[1];
   
       Uint8 *strtgt = (Uint8 *)str;
       Uint8 *endtgt = (Uint8 *)&str[5];
   
       UTF16toUTF8(&strsrc,
                   endsrc,
                   &strtgt,
                   endtgt);
   
       out.append(str, UTF_8_COUNT_TRAIL_BYTES(str[0]) + 1);
   }
   
   inline void _appendSpecialChar7(Buffer& out, char c)
   {
       if (_isSpecialChar7[int(c)])
           out.append(_specialChars[int(c)].str, _specialChars[int(c)].size);
       else
           out.append(c);
     }     }
   
   inline void _xmlWritter_appendSpecialChar(Buffer& out, const Char16& c)
   {
       if (c < 128)
           _appendSpecialChar7(out, char(c));
       else
           _xmlWritter_appendChar(out, c);
 } }
  
 static inline void _appendSpecialChar(PEGASUS_STD(ostream)& os, char c)  static void _xmlWritter_appendSpecialChar(PEGASUS_STD(ostream)& os, char c)
   {
       if ( ((c < 0x20) && (c >= 0)) || (c == 0x7f) )
       {
           char charref[7];
           sprintf(charref, "&#%u;", static_cast<Uint8>(c));
           os << charref;
       }
       else
 { {
     switch (c)     switch (c)
     {     {
Line 146 
Line 411 
             os << c;             os << c;
     }     }
 } }
   }
   
   void _xmlWritter_appendSurrogatePair(Buffer& out, Uint16 high, Uint16 low)
   {
       char str[6];
       Uint8 charIN[5];
       memset(str,0x00,sizeof(str));
       memcpy(&charIN,&high,2);
       memcpy(&charIN[2],&low,2);
       const Uint16 *strsrc = (Uint16 *)charIN;
       Uint16 *endsrc = (Uint16 *)&charIN[3];
   
       Uint8 *strtgt = (Uint8 *)str;
       Uint8 *endtgt = (Uint8 *)&str[5];
   
       UTF16toUTF8(&strsrc,
                   endsrc,
                   &strtgt,
                   endtgt);
   
       Uint32 number1 = UTF_8_COUNT_TRAIL_BYTES(str[0]) + 1;
       out.append(str,number1);
   }
   
   inline void _xmlWritter_appendSpecial(PEGASUS_STD(ostream)& os, const char* str)
   {
       while (*str)
           _xmlWritter_appendSpecialChar(os, *str++);
   }
   
   void XmlWriter::append(Buffer& out, const Char16& x)
   {
       _xmlWritter_appendChar(out, x);
   }
   
   void XmlWriter::append(Buffer& out, Boolean x)
   {
       append(out, (x ? "TRUE" : "FALSE"));
   }
   
   void XmlWriter::append(Buffer& out, Uint32 x)
   {
       char buffer[32];
       sprintf(buffer, "%u", x);
       append(out, buffer);
   }
   
   void XmlWriter::append(Buffer& out, Sint32 x)
   {
       char buffer[32];
       sprintf(buffer, "%d", x);
       append(out, buffer);
   }
   
   void XmlWriter::append(Buffer& out, Uint64 x)
   {
       char buffer[32];  // Should need 21 chars max
       sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "u", x);
       append(out, buffer);
   }
   
   void XmlWriter::append(Buffer& out, Sint64 x)
   {
       char buffer[32];  // Should need 21 chars max
       sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "d", x);
       append(out, buffer);
   }
   
   void XmlWriter::append(Buffer& out, Real32 x)
   {
       char buffer[128];
       // %.7e gives '[-]m.ddddddde+/-xx', which seems compatible with the format
       // given in the CIM/XML spec, and the precision required by the CIM 2.2 spec
       // (4 byte IEEE floating point)
       sprintf(buffer, "%.7e", x);
       append(out, buffer);
   }
   
   void XmlWriter::append(Buffer& out, Real64 x)
   {
       char buffer[128];
       // %.16e gives '[-]m.dddddddddddddddde+/-xx', which seems compatible with the format
       // given in the CIM/XML spec, and the precision required by the CIM 2.2 spec
       // (8 byte IEEE floating point)
       sprintf(buffer, "%.16e", x);
       append(out, buffer);
   }
   
   void XmlWriter::append(Buffer& out, const char* str)
   {
       size_t n = strlen(str);
       out.append(str, n);
   }
   
   void XmlWriter::append(Buffer& out, const String& str)
   {
       const Uint16* p = (const Uint16*)str.getChar16Data();
       size_t n = str.size();
   
       // Handle leading ASCII 7 characers in these next two loops (use unrolling).
   
       while (n >= 8 && ((p[0]|p[1]|p[2]|p[3]|p[4]|p[5]|p[6]|p[7]) & 0xFF80) == 0)
       {
           out.append(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
           p += 8;
           n -= 8;
       }
   
       while (n >= 4 && ((p[0]|p[1]|p[2]|p[3]) & 0xFF80) == 0)
       {
           out.append(p[0], p[1], p[2], p[3]);
           p += 4;
           n -= 4;
       }
   
       while (n--)
       {
           Uint16 c = *p++;
   
           // Special processing for UTF8 case:
   
           if (c < 128)
           {
               out.append(c);
               continue;
           }
   
           // Hanlde UTF8 case (if reached).
   
           if(((c >= FIRST_HIGH_SURROGATE) && (c <= LAST_HIGH_SURROGATE)) ||
              ((c >= FIRST_LOW_SURROGATE) && (c <= LAST_LOW_SURROGATE)))
           {
               Char16 highSurrogate = p[-1];
               Char16 lowSurrogate = p[0];
               p++;
               n--;
   
               _xmlWritter_appendSurrogatePair(
                   out, Uint16(highSurrogate),Uint16(lowSurrogate));
           }
           else
           {
               _xmlWritter_appendChar(out, c);
           }
       }
   }
   
   void XmlWriter::append(Buffer& out, const Indentor& x)
   {
       for (Uint32 i = 0; i < 4 * x.getLevel(); i++)
           out.append(' ');
   }
   
   void XmlWriter::appendSpecial(Buffer& out, const Char16& x)
   {
       _xmlWritter_appendSpecialChar(out, x);
   }
   
   void XmlWriter::appendSpecial(Buffer& out, char x)
   {
       _appendSpecialChar7(out, x);
   }
   
   void XmlWriter::appendSpecial(Buffer& out, const char* str)
   {
       while (*str)
           _appendSpecialChar7(out, *str++);
   }
   
   void XmlWriter::appendSpecial(Buffer& out, const String& str)
   {
       const Uint16* p = (const Uint16*)str.getChar16Data();
       size_t n = str.size();
   
       // Handle leading ASCII 7 characers in these next two loops (use unrolling).
   
       while (n >= 8)
       {
           // The following condition is equivalent to this:
           //     (p[0] < 128 && p[1] < 128 && p[2] < 128 && p[3] < 128 &&
           //      p[4] < 128 && p[5] < 128 && p[6] < 128 && p[7] < 128)
   
           if (((p[0]|p[1]|p[2]|p[3]|p[4]|p[5]|p[6]|p[7]) & 0xFF80) == 0)
           {
               // Note: "|" is faster than "||" and achieves the same effect
               // since p[i] is either 0 or 1.
   
               if (_isSpecialChar7[p[0]] | _isSpecialChar7[p[1]] |
                   _isSpecialChar7[p[2]] | _isSpecialChar7[p[3]] |
                   _isSpecialChar7[p[4]] | _isSpecialChar7[p[5]] |
                   _isSpecialChar7[p[6]] | _isSpecialChar7[p[7]])
               {
                   // Rare case.
                   _appendSpecialChar7(out, p[0]);
                   _appendSpecialChar7(out, p[1]);
                   _appendSpecialChar7(out, p[2]);
                   _appendSpecialChar7(out, p[3]);
                   _appendSpecialChar7(out, p[4]);
                   _appendSpecialChar7(out, p[5]);
                   _appendSpecialChar7(out, p[6]);
                   _appendSpecialChar7(out, p[7]);
               }
               else
               {
                   // Common case.
                   out.append(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);
               }
               p += 8;
               n -= 8;
           }
           else
               break;
       }
   
       while (n >= 4)
       {
           // The following condition is equivalent to this:
           //     (p[0] < 128 && p[1] < 128 && p[2] < 128 && p[3] < 128)
   
           if (((p[0]|p[1]|p[2]|p[3]) & 0xFF80) == 0)
           {
               if (_isSpecialChar7[p[0]] | _isSpecialChar7[p[1]] |
                   _isSpecialChar7[p[2]] | _isSpecialChar7[p[3]])
               {
                   // Rare case:
                   _appendSpecialChar7(out, p[0]);
                   _appendSpecialChar7(out, p[1]);
                   _appendSpecialChar7(out, p[2]);
                   _appendSpecialChar7(out, p[3]);
               }
               else
               {
                   // Common case:
                   out.append(p[0], p[1], p[2], p[3]);
               }
   
               p += 4;
               n -= 4;
           }
           else
               break;
       }
   
       // Process remaining characters. A UTF8 character must have been
       // encountered or this would have never been reached.
   
       while (n--)
       {
           Uint16 c = *p++;
   
           // Special processing for UTF8 case:
   
           if (c < 128)
           {
               _appendSpecialChar7(out, c);
               continue;
           }
   
           // Hanlde UTF8 case (if reached).
   
           if(((c >= FIRST_HIGH_SURROGATE) && (c <= LAST_HIGH_SURROGATE)) ||
              ((c >= FIRST_LOW_SURROGATE) && (c <= LAST_LOW_SURROGATE)))
           {
               Char16 highSurrogate = p[-1];
               Char16 lowSurrogate = p[0];
               p++;
               n--;
   
               _xmlWritter_appendSurrogatePair(
                   out, Uint16(highSurrogate),Uint16(lowSurrogate));
           }
           else
           {
               _xmlWritter_appendSpecialChar(out, c);
           }
       }
   }
   
   // See http://www.ietf.org/rfc/rfc2396.txt section 2
   // Reserved characters = ';' '/' '?' ':' '@' '&' '=' '+' '$' ','
   // Excluded characters:
   //   Control characters = 0x00-0x1f, 0x7f
   //   Space character = 0x20
   //   Delimiters = '<' '>' '#' '%' '"'
   //   Unwise = '{' '}' '|' '\\' '^' '[' ']' '`'
   //
   
   static const char _is_uri[128] =
   {
       1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,
       1,1,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
       0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
       0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,
   };
   
   static void _xmlWritter_encodeURIChar(String& outString, Sint8 char8)
   {
       Uint8 c = (Uint8)char8;
   
   #ifndef PEGASUS_DO_NOT_IMPLEMENT_URI_ENCODING
       if (c > 127 || _is_uri[int(c)])
       {
           char hexencoding[4];
           int n = sprintf(hexencoding, "%%%X%X", c/16, c%16);
   #ifdef PEGASUS_USE_STRING_EXTENSIONS
           outString.append(hexencoding, n);
   #else /* PEGASUS_USE_STRING_EXTENSIONS */
           outString.append(hexencoding);
   #endif /* PEGASUS_USE_STRING_EXTENSIONS */
       }
       else
   #endif
       {
           outString.append((Uint16)c);
       }
   }
   
   String XmlWriter::encodeURICharacters(const Buffer& uriString)
   {
       String encodedString;
   
       for (Uint32 i=0; i<uriString.size(); i++)
       {
           _xmlWritter_encodeURIChar(encodedString, uriString[i]);
       }
   
       return encodedString;
   }
   
   String XmlWriter::encodeURICharacters(const String& uriString)
   {
       String encodedString;
   
   /* i18n remove - did not handle surrogate pairs
       for (Uint32 i=0; i<uriString.size(); i++)
       {
           _xmlWritter_encodeURIChar(encodedString, uriString[i]);
       }
   */
   
       // See the "CIM Operations over HTTP" spec, section 3.3.2 and
       // 3.3.3, for the treatment of non US-ASCII (UTF-8) chars
   
       // First, convert to UTF-8 (include handling of surrogate pairs)
       Buffer utf8;
       for (Uint32 i = 0; i < uriString.size(); i++)
       {
           Uint16 c = uriString[i];
   
           if(((c >= FIRST_HIGH_SURROGATE) && (c <= LAST_HIGH_SURROGATE)) ||
              ((c >= FIRST_LOW_SURROGATE) && (c <= LAST_LOW_SURROGATE)))
           {
               Char16 highSurrogate = uriString[i];
               Char16 lowSurrogate = uriString[++i];
   
               _xmlWritter_appendSurrogatePair(utf8, Uint16(highSurrogate),Uint16(lowSurrogate));
           }
           else
           {
               _xmlWritter_appendChar(utf8, uriString[i]);
           }
       }
   
       // Second, escape the non HTTP-safe chars
       for (Uint32 i=0; i<utf8.size(); i++)
       {
           _xmlWritter_encodeURIChar(encodedString, utf8[i]);
       }
   
       return encodedString;
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalNameSpacePathElement()
   //
   //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalNameSpacePathElement(
       Buffer& out,
       const CIMNamespaceName& nameSpace)
   {
       out << STRLIT("<LOCALNAMESPACEPATH>\n");
   
       char* nameSpaceCopy = strdup(nameSpace.getString().getCString());
   
   #if defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || \
       defined(PEGASUS_OS_HPUX) || \
       defined(PEGASUS_OS_LINUX)
       char *last;
       for (const char* p = strtok_r(nameSpaceCopy, "/", &last); p;
            p = strtok_r(NULL, "/", &last))
   #else
       for (const char* p = strtok(nameSpaceCopy, "/"); p; p = strtok(NULL, "/"))
   #endif
       {
           out << STRLIT("<NAMESPACE NAME=\"") << p << STRLIT("\"/>\n");
       }
       free(nameSpaceCopy);
   
       out << STRLIT("</LOCALNAMESPACEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendNameSpacePathElement()
   //
   //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendNameSpacePathElement(
       Buffer& out,
       const String& host,
       const CIMNamespaceName& nameSpace)
   {
       out << STRLIT("<NAMESPACEPATH>\n");
       out << STRLIT("<HOST>") << host << STRLIT("</HOST>\n");
       appendLocalNameSpacePathElement(out, nameSpace);
       out << STRLIT("</NAMESPACEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassNameElement()
   //
   //     <!ELEMENT CLASSNAME EMPTY>
   //     <!ATTLIST CLASSNAME
   //              %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassNameElement(
       Buffer& out,
       const CIMName& className)
   {
       out << STRLIT("<CLASSNAME NAME=\"") << className << STRLIT("\"/>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceNameElement()
   //
   //    <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
   //    <!ATTLIST INSTANCENAME
   //              %ClassName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceNameElement(
       Buffer& out,
       const CIMObjectPath& instanceName)
   {
       out << STRLIT("<INSTANCENAME CLASSNAME=\"");
       out << instanceName.getClassName() << STRLIT("\">\n");
   
       const Array<CIMKeyBinding>& keyBindings = instanceName.getKeyBindings();
       for (Uint32 i = 0, n = keyBindings.size(); i < n; i++)
       {
           out << STRLIT("<KEYBINDING NAME=\"");
           out << keyBindings[i].getName() << STRLIT("\">\n");
   
           if (keyBindings[i].getType() == CIMKeyBinding::REFERENCE)
           {
               CIMObjectPath ref = keyBindings[i].getValue();
               appendValueReferenceElement(out, ref, true);
           }
           else {
               out << STRLIT("<KEYVALUE VALUETYPE=\"");
               out << keyBindingTypeToString(keyBindings[i].getType());
               out << STRLIT("\">");
   
               // fixed the special character problem - Markus
   
               appendSpecial(out, keyBindings[i].getValue());
               out << STRLIT("</KEYVALUE>\n");
           }
           out << STRLIT("</KEYBINDING>\n");
       }
       out << STRLIT("</INSTANCENAME>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassPathElement()
   //
   //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassPathElement(
       Buffer& out,
       const CIMObjectPath& classPath)
   {
       out << STRLIT("<CLASSPATH>\n");
       appendNameSpacePathElement(out,
                                  classPath.getHost(),
                                  classPath.getNameSpace());
       appendClassNameElement(out, classPath.getClassName());
       out << STRLIT("</CLASSPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstancePathElement()
   //
   //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstancePathElement(
       Buffer& out,
       const CIMObjectPath& instancePath)
   {
       out << STRLIT("<INSTANCEPATH>\n");
       appendNameSpacePathElement(out,
                                  instancePath.getHost(),
                                  instancePath.getNameSpace());
       appendInstanceNameElement(out, instancePath);
       out << STRLIT("</INSTANCEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalClassPathElement()
   //
   //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH, CLASSNAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalClassPathElement(
       Buffer& out,
       const CIMObjectPath& classPath)
   {
       out << STRLIT("<LOCALCLASSPATH>\n");
       appendLocalNameSpacePathElement(out, classPath.getNameSpace());
       appendClassNameElement(out, classPath.getClassName());
       out << STRLIT("</LOCALCLASSPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalInstancePathElement()
   //
   //     <!ELEMENT LOCALINSTANCEPATH (LOCALNAMESPACEPATH, INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalInstancePathElement(
       Buffer& out,
       const CIMObjectPath& instancePath)
   {
       out << STRLIT("<LOCALINSTANCEPATH>\n");
       appendLocalNameSpacePathElement(out, instancePath.getNameSpace());
       appendInstanceNameElement(out, instancePath);
       out << STRLIT("</LOCALINSTANCEPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendLocalObjectPathElement()
   //
   //     If the reference refers to an instance, write a LOCALINSTANCEPATH;
   //     otherwise write a LOCALCLASSPATH.
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendLocalObjectPathElement(
       Buffer& out,
       const CIMObjectPath& objectPath)
   {
       //
       //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class has no
       //  key bindings
       //
       if (objectPath.getKeyBindings ().size () != 0)
       {
           appendLocalInstancePathElement(out, objectPath);
       }
       else
       {
           appendLocalClassPathElement(out, objectPath);
       }
   }
   
   //------------------------------------------------------------------------------
   //
   // Helper functions for appendValueElement()
   //
   //------------------------------------------------------------------------------
   
   inline void _xmlWritter_appendValue(Buffer& out, Boolean x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint8 x)
   {
       XmlWriter::append(out, Uint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint8 x)
   {
       XmlWriter::append(out, Sint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint16 x)
   {
       XmlWriter::append(out, Uint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint16 x)
   {
       XmlWriter::append(out, Sint32(x));
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint32 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint32 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Uint64 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Sint64 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Real32 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, Real64 x)
   {
       XmlWriter::append(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const Char16& x)
   {
       XmlWriter::appendSpecial(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const String& x)
   {
       XmlWriter::appendSpecial(out, x);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const CIMDateTime& x)
   {
       out << x.toString();  //ATTN: append() method?
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const CIMObjectPath& x)
   {
       XmlWriter::appendValueReferenceElement(out, x, true);
   }
   
   inline void _xmlWritter_appendValue(Buffer& out, const CIMObject& x)
   {
       String myStr = x.toString();
       _xmlWritter_appendValue(out, myStr);
   }
   
   void _xmlWritter_appendValueArray(
       Buffer& out, const CIMObjectPath* p, Uint32 size)
   {
       out << STRLIT("<VALUE.REFARRAY>\n");
       while (size--)
       {
           _xmlWritter_appendValue(out, *p++);
       }
       out << STRLIT("</VALUE.REFARRAY>\n");
   }
   
   template<class T>
   void _xmlWritter_appendValueArray(Buffer& out, const T* p, Uint32 size)
   {
       out << STRLIT("<VALUE.ARRAY>\n");
   
       while (size--)
       {
           out << STRLIT("<VALUE>");
           _xmlWritter_appendValue(out, *p++);
           out << STRLIT("</VALUE>\n");
       }
   
       out << STRLIT("</VALUE.ARRAY>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueElement()
   //
   //    <!ELEMENT VALUE (#PCDATA)>
   //    <!ELEMENT VALUE.ARRAY (VALUE*)>
   //    <!ELEMENT VALUE.REFERENCE
   //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //    <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueElement(
       Buffer& out,
       const CIMValue& value)
   {
       if (value.isNull())
       {
           return;
       }
       if (value.isArray())
       {
           switch (value.getType())
           {
               case CIMTYPE_BOOLEAN:
               {
                   Array<Boolean> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT8:
               {
                   Array<Uint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT8:
               {
                   Array<Sint8> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT16:
               {
                   Array<Uint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT16:
               {
                   Array<Sint16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT32:
               {
                   Array<Uint32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT32:
               {
                   Array<Sint32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_UINT64:
               {
                   Array<Uint64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_SINT64:
               {
                   Array<Sint64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_REAL32:
               {
                   Array<Real32> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_REAL64:
               {
                   Array<Real64> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_CHAR16:
               {
                   Array<Char16> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_STRING:
               {
                   const String* data;
                   Uint32 size;
                   value._get(data, size);
                   _xmlWritter_appendValueArray(out, data, size);
                   break;
               }
   
               case CIMTYPE_DATETIME:
               {
                   Array<CIMDateTime> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_REFERENCE:
               {
                   Array<CIMObjectPath> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               case CIMTYPE_OBJECT:
               {
                   Array<CIMObject> a;
                   value.get(a);
                   _xmlWritter_appendValueArray(out, a.getData(), a.size());
                   break;
               }
   
               default:
                   PEGASUS_ASSERT(false);
           }
       }
       else if (value.getType() == CIMTYPE_REFERENCE)
       {
           // Has to be separate because it uses VALUE.REFERENCE tag
           CIMObjectPath v;
           value.get(v);
           _xmlWritter_appendValue(out, v);
       }
       else
       {
           out << STRLIT("<VALUE>");
   
           switch (value.getType())
           {
               case CIMTYPE_BOOLEAN:
               {
                   Boolean v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT8:
               {
                   Uint8 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT8:
               {
                   Sint8 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT16:
               {
                   Uint16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT16:
               {
                   Sint16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT32:
               {
                   Uint32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT32:
               {
                   Sint32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_UINT64:
               {
                   Uint64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_SINT64:
               {
                   Sint64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_REAL32:
               {
                   Real32 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_REAL64:
               {
                   Real64 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_CHAR16:
               {
                   Char16 v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_STRING:
               {
                   String v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_DATETIME:
               {
                   CIMDateTime v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               case CIMTYPE_OBJECT:
               {
                   CIMObject v;
                   value.get(v);
                   _xmlWritter_appendValue(out, v);
                   break;
               }
   
               default:
                   PEGASUS_ASSERT(false);
           }
   
           out << STRLIT("</VALUE>\n");
       }
   }
   
   void XmlWriter::printValueElement(
       const CIMValue& value,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendValueElement(tmp, value);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueObjectWithPathElement()
   //
   //     <!ELEMENT VALUE.OBJECTWITHPATH
   //         ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueObjectWithPathElement(
       Buffer& out,
       const CIMObject& objectWithPath)
   {
       out << STRLIT("<VALUE.OBJECTWITHPATH>\n");
   
       appendValueReferenceElement(out, objectWithPath.getPath (), false);
       appendObjectElement(out, objectWithPath);
   
       out << STRLIT("</VALUE.OBJECTWITHPATH>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueReferenceElement()
   //
   //    <!ELEMENT VALUE.REFERENCE
   //        (CLASSPATH|LOCALCLASSPATH|CLASSNAME|INSTANCEPATH|LOCALINSTANCEPATH|
   //         INSTANCENAME)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueReferenceElement(
       Buffer& out,
       const CIMObjectPath& reference,
       Boolean putValueWrapper)
   {
       if (putValueWrapper)
           out << STRLIT("<VALUE.REFERENCE>\n");
   
       // See if it is a class or instance reference (instance references have
       // key-bindings; class references do not).
       //
       //  ATTN-CAKG-P2-20020726:  The following condition does not correctly
       //  distinguish instanceNames from classNames in every case
       //  The instanceName of a singleton instance of a keyless class has no
       //  key bindings
       //
   
       const Array<CIMKeyBinding>& kbs = reference.getKeyBindings();
   
       if (kbs.size())
       {
           if (reference.getHost().size())
           {
               appendInstancePathElement(out, reference);
           }
           else if (!reference.getNameSpace().isNull())
           {
               appendLocalInstancePathElement(out, reference);
           }
           else
           {
               appendInstanceNameElement(out, reference);
           }
       }
       else
       {
           if (reference.getHost().size())
           {
               appendClassPathElement(out, reference);
           }
           else if (!reference.getNameSpace().isNull())
           {
               appendLocalClassPathElement(out, reference);
           }
           else
           {
               appendClassNameElement(out, reference.getClassName());
           }
       }
   
       if (putValueWrapper)
           out << STRLIT("</VALUE.REFERENCE>\n");
   }
   
   void XmlWriter::printValueReferenceElement(
       const CIMObjectPath& reference,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendValueReferenceElement(tmp, reference, true);
       tmp.append('\0');
       indentedPrint(os, tmp.getData());
   }
   
   //------------------------------------------------------------------------------
   //
   // appendValueNamedInstanceElement()
   //
   //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendValueNamedInstanceElement(
       Buffer& out,
       const CIMInstance& namedInstance)
   {
       out << STRLIT("<VALUE.NAMEDINSTANCE>\n");
   
       appendInstanceNameElement(out, namedInstance.getPath ());
       appendInstanceElement(out, namedInstance);
   
       out << STRLIT("</VALUE.NAMEDINSTANCE>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // appendClassElement()
   //
   //     <!ELEMENT CLASS
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
   //     <!ATTLIST CLASS
   //         %CIMName;
   //         %SuperClass;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendClassElement(
       Buffer& out,
       const CIMConstClass& cimclass)
   {
       cimclass._checkRep();
       cimclass._rep->toXml(out);
   }
   
   void XmlWriter::printClassElement(
       const CIMConstClass& cimclass,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendClassElement(tmp, cimclass);
       tmp.append('\0');
       indentedPrint(os, tmp.getData(), 4);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendInstanceElement()
   //
   //     <!ELEMENT INSTANCE
   //         (QUALIFIER*,(PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*)>
   //     <!ATTLIST INSTANCE
   //         %ClassName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceElement(
       Buffer& out,
       const CIMConstInstance& instance)
   {
       instance._checkRep();
       instance._rep->toXml(out);
   }
   
   void XmlWriter::printInstanceElement(
       const CIMConstInstance& instance,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendInstanceElement(tmp, instance);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendObjectElement()
   //
   // May refer to a CLASS or an INSTANCE
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendObjectElement(
       Buffer& out,
       const CIMConstObject& object)
   {
       if (object.isClass())
       {
           CIMConstClass c(object);
           appendClassElement(out, c);
       }
       else if (object.isInstance())
       {
           CIMConstInstance i(object);
           appendInstanceElement(out, i);
       }
       // else PEGASUS_ASSERT(0);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendPropertyElement()
   //
   //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
   //     <!ATTLIST PROPERTY
   //              %CIMName;
   //              %CIMType;           #REQUIRED
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
   //     <!ATTLIST PROPERTY.ARRAY
   //              %CIMName;
   //              %CIMType;           #REQUIRED
   //              %ArraySize;
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,VALUE.REFERENCE?)>
   //     <!ATTLIST PROPERTY.REFERENCE
   //              %CIMName;
   //              %ReferenceClass;
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendPropertyElement(
       Buffer& out,
       const CIMConstProperty& property)
   {
       property._checkRep();
       property._rep->toXml(out);
   }
   
   void XmlWriter::printPropertyElement(
       const CIMConstProperty& property,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendPropertyElement(tmp, property);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendMethodElement()
   //
   //     <!ELEMENT METHOD (QUALIFIER*,
   //         (PARAMETER|PARAMETER.REFERENCE|PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
   //     <!ATTLIST METHOD
   //              %CIMName;
   //              %CIMType;          #IMPLIED
   //              %ClassOrigin;
   //              %Propagated;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendMethodElement(
       Buffer& out,
       const CIMConstMethod& method)
   {
       method._checkRep();
       method._rep->toXml(out);
   }
   
   void XmlWriter::printMethodElement(
       const CIMConstMethod& method,
       PEGASUS_STD(ostream)& os)
   {
       Buffer tmp;
       appendMethodElement(tmp, method);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
   }
   
   //------------------------------------------------------------------------------
   //
   // appendParameterElement()
   //
   //     <!ELEMENT PARAMETER (QUALIFIER*)>
   //     <!ATTLIST PARAMETER
   //              %CIMName;
   //              %CIMType;      #REQUIRED>
   //
   //     <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
   //     <!ATTLIST PARAMETER.REFERENCE
   //              %CIMName;
   //              %ReferenceClass;>
   //
   //     <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
   //     <!ATTLIST PARAMETER.ARRAY
   //              %CIMName;
   //              %CIMType;           #REQUIRED
   //              %ArraySize;>
   //
   //     <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
   //     <!ATTLIST PARAMETER.REFARRAY
   //              %CIMName;
   //              %ReferenceClass;
   //              %ArraySize;>
   //
   //------------------------------------------------------------------------------
  
 static inline void _appendSpecial(PEGASUS_STD(ostream)& os, const char* str)  void XmlWriter::appendParameterElement(
       Buffer& out,
       const CIMConstParameter& parameter)
 { {
     while (*str)      parameter._checkRep();
         _appendSpecialChar(os, *str++);      parameter._rep->toXml(out);
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Char16 x)  void XmlWriter::printParameterElement(
       const CIMConstParameter& parameter,
       PEGASUS_STD(ostream)& os)
 { {
     _appendChar(out, x);      Buffer tmp;
       appendParameterElement(tmp, parameter);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 void XmlWriter::append(Array<Sint8>& out, Uint32 x)  //------------------------------------------------------------------------------
 {  //
     char buffer[32];  // appendParamValueElement()
     sprintf(buffer, "%d", x);  //
     append(out, buffer);  //     <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
 }  //     <!ATTLIST PARAMVALUE
   //              %CIMName;>
   //
   //------------------------------------------------------------------------------
  
 void XmlWriter::append(Array<Sint8>& out, const char* str)  void XmlWriter::appendParamValueElement(
       Buffer& out,
       const CIMParamValue& paramValue)
 { {
     while (*str)      paramValue._checkRep();
         _appendChar(out, *str++);      paramValue._rep->toXml(out);
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const String& str)  void XmlWriter::printParamValueElement(
       const CIMParamValue& paramValue,
       PEGASUS_STD(ostream)& os)
 { {
     const Char16* tmp = str.getData();      Buffer tmp;
       appendParamValueElement(tmp, paramValue);
     while (*tmp)      tmp.append('\0');
         _appendChar(out, *tmp++);      os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 void XmlWriter::append(Array<Sint8>& out, const Indentor& x)  //------------------------------------------------------------------------------
   //
   // appendQualifierElement()
   //
   //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
   //     <!ATTLIST QUALIFIER
   //              %CIMName;
   //              %CIMType;               #REQUIRED
   //              %Propagated;
   //              %QualifierFlavor;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierElement(
       Buffer& out,
       const CIMConstQualifier& qualifier)
 { {
     for (Uint32 i = 0; i < 4 * x.getLevel(); i++)      qualifier._checkRep();
         out.append(' ');      qualifier._rep->toXml(out);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, Char16 x)  void XmlWriter::printQualifierElement(
       const CIMConstQualifier& qualifier,
       PEGASUS_STD(ostream)& os)
 { {
     _appendSpecialChar(out, x);      Buffer tmp;
       appendQualifierElement(tmp, qualifier);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, char x)  //------------------------------------------------------------------------------
   //
   // appendQualifierDeclElement()
   //
   //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
   //     <!ATTLIST QUALIFIER.DECLARATION
   //              %CIMName;
   //              %CIMType;                       #REQUIRED
   //              ISARRAY        (true|false)     #IMPLIED
   //              %ArraySize;
   //              %QualifierFlavor;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierDeclElement(
       Buffer& out,
       const CIMConstQualifierDecl& qualifierDecl)
 { {
     _appendSpecialChar(out, Char16(x));      qualifierDecl._checkRep();
       qualifierDecl._rep->toXml(out);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const char* str)  void XmlWriter::printQualifierDeclElement(
       const CIMConstQualifierDecl& qualifierDecl,
       PEGASUS_STD(ostream)& os)
 { {
     while (*str)      Buffer tmp;
         _appendSpecialChar(out, *str++);      appendQualifierDeclElement(tmp, qualifierDecl);
       tmp.append('\0');
       os << tmp.getData() << PEGASUS_STD(endl);
 } }
  
 void XmlWriter::appendSpecial(Array<Sint8>& out, const String& str)  //------------------------------------------------------------------------------
   //
   // appendQualifierFlavorEntity()
   //
   //     <!ENTITY % QualifierFlavor "OVERRIDABLE  (true|false)   'true'
   //                                 TOSUBCLASS   (true|false)   'true'
   //                                 TOINSTANCE   (true|false)   'false'
   //                                 TRANSLATABLE (true|false)   'false'">
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendQualifierFlavorEntity(
       Buffer& out,
       const CIMFlavor & flavor)
 { {
     const Char16* tmp = str.getData();      if (!(flavor.hasFlavor (CIMFlavor::OVERRIDABLE)))
           out << STRLIT(" OVERRIDABLE=\"false\"");
   
       if (!(flavor.hasFlavor (CIMFlavor::TOSUBCLASS)))
           out << STRLIT(" TOSUBCLASS=\"false\"");
  
     while (*tmp)      if (flavor.hasFlavor (CIMFlavor::TOINSTANCE))
         _appendSpecialChar(out, *tmp++);          out << STRLIT(" TOINSTANCE=\"true\"");
   
       if (flavor.hasFlavor (CIMFlavor::TRANSLATABLE))
           out << STRLIT(" TRANSLATABLE=\"true\"");
 } }
  
 void XmlWriter::appendLocalNameSpaceElement(  //------------------------------------------------------------------------------
     Array<Sint8>& out,  //
     const String& nameSpace)  // appendScopeElement()
   //
   //     <!ELEMENT SCOPE EMPTY>
   //     <!ATTLIST SCOPE
   //              CLASS        (true|false)      'false'
   //              ASSOCIATION  (true|false)      'false'
   //              REFERENCE    (true|false)      'false'
   //              PROPERTY     (true|false)      'false'
   //              METHOD       (true|false)      'false'
   //              PARAMETER    (true|false)      'false'
   //              INDICATION   (true|false)      'false'>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendScopeElement(
       Buffer& out,
       const CIMScope & scope)
   {
       if (!(scope.equal (CIMScope ())))
 { {
     out << "<LOCALNAMESPACEPATH>\n";          out << STRLIT("<SCOPE");
  
     char* tmp = nameSpace.allocateCString();          if (scope.hasScope (CIMScope::CLASS))
               out << STRLIT(" CLASS=\"true\"");
  
     for (char* p = strtok(tmp, "/"); p; p = strtok(NULL, "/"))          if (scope.hasScope (CIMScope::ASSOCIATION))
     {              out << STRLIT(" ASSOCIATION=\"true\"");
         out << "<NAMESPACE NAME=\"" << p << "\"/>\n";  
     }          if (scope.hasScope (CIMScope::REFERENCE))
               out << STRLIT(" REFERENCE=\"true\"");
   
           if (scope.hasScope (CIMScope::PROPERTY))
               out << STRLIT(" PROPERTY=\"true\"");
  
     delete [] tmp;          if (scope.hasScope (CIMScope::METHOD))
               out << STRLIT(" METHOD=\"true\"");
  
     out << "</LOCALNAMESPACEPATH>\n";          if (scope.hasScope (CIMScope::PARAMETER))
               out << STRLIT(" PARAMETER=\"true\"");
   
           if (scope.hasScope (CIMScope::INDICATION))
               out << STRLIT(" INDICATION=\"true\"");
   
           out << STRLIT("/>");
 } }
   }
   
   // l10n - added content language and accept language support to
   // the header methods below
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendMethodCallHeader() // appendMethodCallHeader()
 // //
 //     Build HTTP request header.  //     Build HTTP method call request header.
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendMethodCallHeader( void XmlWriter::appendMethodCallHeader(
     Array<Sint8>& out,      Buffer& out,
     const char* host,     const char* host,
     const char* cimMethod,      const CIMName& cimMethod,
     const String& cimObject,     const String& cimObject,
     const String& authenticationHeader,     const String& authenticationHeader,
       HttpMethod httpMethod,
       const AcceptLanguages & acceptLanguages,
       const ContentLanguages & contentLanguages,
     Uint32 contentLength)     Uint32 contentLength)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
  
     out << "M-POST /cimom HTTP/1.1\r\n";      // ATTN: KS 20020926 - Temporary change to issue only POST. This may
     out << "HOST: " << host << "\r\n";      // be changed in the DMTF CIM Operations standard in the future.
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";      // If we kept M-Post we would have to retry with Post. Does not
     out << "Content-Length: " << contentLength << "\r\n";      // do that in client today. Permanent change is to retry until spec
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";      // updated. This change is temp to finish tests or until the retry
     out << nn <<"\r\n";      // installed.  Required because of change to wbemservices cimom
     out << nn << "-CIMOperation: MethodCall\r\n";      if (httpMethod == HTTP_METHOD_M_POST)
     out << nn << "-CIMMethod: " << cimMethod << "\r\n";      {
     out << nn << "-CIMObject: " << cimObject << "\r\n";          out << STRLIT("M-POST /cimom HTTP/1.1\r\n");
       }
       else
       {
           out << STRLIT("POST /cimom HTTP/1.1\r\n");
       }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n");
       out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
       OUTPUT_CONTENTLENGTH;
       if (acceptLanguages.size() > 0)
       {
           out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
       }
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages << STRLIT("\r\n");
       }
   
   #ifdef PEGASUS_DEBUG
                   // backdoor environment variable to turn OFF client requesting transfer
                   // encoding. The default is on. to turn off, set this variable to zero.
                   // This should be removed when stable. This should only be turned off in
                   // a debugging/testing environment.
   
                   static const char *clientTransferEncodingOff =
                           getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
                   if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
   #endif
   
                           out << STRLIT("TE: chunked, trailers\r\n");
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMOperation: MethodCall\r\n");
           out << nn << STRLIT("-CIMMethod: ")
               << encodeURICharacters(cimMethod.getString()) << STRLIT("\r\n");
           out << nn << STRLIT("-CIMObject: ") << encodeURICharacters(cimObject)
               << STRLIT("\r\n");
       }
       else
       {
           out << STRLIT("CIMOperation: MethodCall\r\n");
           out << STRLIT("CIMMethod: ") << encodeURICharacters(cimMethod.getString())
               << STRLIT("\r\n");
           out << STRLIT("CIMObject: ") << encodeURICharacters(cimObject)
               << STRLIT("\r\n");
       }
   
     if (authenticationHeader.size())     if (authenticationHeader.size())
     {     {
         out << authenticationHeader << "\r\n";          out << authenticationHeader << STRLIT("\r\n");
       }
   
       out << STRLIT("\r\n");
   }
   
   
   void XmlWriter::appendMethodResponseHeader(
        Buffer& out,
        HttpMethod httpMethod,
        const ContentLanguages & contentLanguages,
        Uint32 contentLength,
        Uint32 serverResponseTime)
   {
        char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
        out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
        STAT_SERVERTIME
        out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
        OUTPUT_CONTENTLENGTH;
   
        if (contentLanguages.size() > 0)
        {
            out << STRLIT("Content-Language: ") << contentLanguages << STRLIT("\r\n");
        }
        if (httpMethod == HTTP_METHOD_M_POST)
        {
            out << STRLIT("Ext:\r\n");
            out << STRLIT("Cache-Control: no-cache\r\n");
            out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
            out << nn << STRLIT("\r\n");
            out << nn << STRLIT("-CIMOperation: MethodResponse\r\n\r\n");
        }
        else
        {
            out << STRLIT("CIMOperation: MethodResponse\r\n\r\n");
     }     }
     out << "\r\n";  
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendMethodResponseHeader()  // appendHttpErrorResponseHeader()
   //
   //     Build HTTP error response header.
 // //
 //     Build HTTP 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::appendMethodResponseHeader(  void XmlWriter::appendHttpErrorResponseHeader(
     Array<Sint8>& out,      Buffer& out,
     Uint32 contentLength)      const String& status,
       const String& cimError,
       const String& errorDetail)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };      out << STRLIT("HTTP/1.1 ") << status << STRLIT("\r\n");
       if (cimError != String::EMPTY)
     out << "HTTP/1.1 200 OK\r\n";      {
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";          out << STRLIT("CIMError: ") << cimError << STRLIT("\r\n");
     out << "Content-Length: " << contentLength << "\r\n";      }
     out << "Ext:\r\n";      if (errorDetail != String::EMPTY)
     out << "Cache-Control: no-cache\r\n";      {
     out << "Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=";          // ATTN-RK-P3-20020404: It is critical that this text not contain '\n'
     out << nn <<"\r\n";          // ATTN-RK-P3-20020404: Need to encode this value properly.  (See
     out << nn << "-CIMOperation: MethodResponse\r\n\r\n";          // CIM/HTTP Specification section 3.3.2
           out << STRLIT(PEGASUS_HTTPHEADERTAG_ERRORDETAIL ": ")
               << encodeURICharacters(errorDetail) << STRLIT("\r\n");
       }
       out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 305 
Line 2092 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendUnauthorizedResponseHeader( void XmlWriter::appendUnauthorizedResponseHeader(
     Array<Sint8>& out,      Buffer& out,
     const String& content)     const String& content)
 { {
     out << "HTTP/1.1 401 Unauthorized\r\n";      out << STRLIT("HTTP/1.1 " HTTP_STATUS_UNAUTHORIZED "\r\n");
     out << content << "\r\n";      out << content << STRLIT("\r\n");
     out << "\r\n";      out << STRLIT("\r\n");
  
 //ATTN: We may need to include the following line, so that the browsers //ATTN: We may need to include the following line, so that the browsers
 //      can display the error message. //      can display the error message.
Line 322 
Line 2109 
 //    out << "</BODY></HTML>\r\n"; //    out << "</BODY></HTML>\r\n";
 } }
  
   #ifdef PEGASUS_KERBEROS_AUTHENTICATION
   //------------------------------------------------------------------------------
   //
   // appendOKResponseHeader()
   //
   //     Build HTTP authentication response header for unauthorized requests.
   //
   //     Returns OK message in the following format:
   //
   //        HTTP/1.1 200 OK
   //        Content-Length: 0
   //        WWW-Authenticate: Negotiate "token"
   //        <HTML><HEAD>
   //        <TITLE>200 OK</TITLE>
   //        </HEAD><BODY BGCOLOR="#99cc99">
   //        <H2>TEST200 OK</H2>
   //        <HR>
   //        </BODY></HTML>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendOKResponseHeader(
       Buffer& out,
       const String& content)
   {
       out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
       // Content-Length header needs to be added because 200 OK record
       // is usually intended to have content.  But, for Kerberos this
       // may not always be the case so we need to indicate that there
       // is no content
                   Uint32 contentLength = 0;
                   OUTPUT_CONTENTLENGTH;
       out << content << STRLIT("\r\n");
       out << STRLIT("\r\n");
   
   //ATTN: We may need to include the following line, so that the browsers
   //      can display the error message.
   //    out << "<HTML><HEAD>\r\n";
   //    out << "<TITLE>" << "200 OK" <<  "</TITLE>\r\n";
   //    out << "</HEAD><BODY BGCOLOR=\"#99cc99\">\r\n";
   //    out << "<H2>TEST" << "200 OK" << "</H2>\r\n";
   //    out << "<HR>\r\n";
   //    out << "</BODY></HTML>\r\n";
   }
   #endif
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendMessageElementBegin()  // _appendMessageElementBegin()
 // appendMessageElementEnd()  // _appendMessageElementEnd()
 // //
 //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)> //     <!ELEMENT MESSAGE (SIMPLEREQ|MULTIREQ|SIMPLERSP|MULTIRSP)>
 //     <!ATTLIST MESSAGE //     <!ATTLIST MESSAGE
Line 334 
Line 2167 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendMessageElementBegin(  void XmlWriter::_appendMessageElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const String& messageId)     const String& messageId)
 { {
     out << "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";      out << STRLIT("<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n");
     out << "<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n";      out << STRLIT("<CIM CIMVERSION=\"2.0\" DTDVERSION=\"2.0\">\n");
     out << "<MESSAGE ID=\"" << messageId << "\" PROTOCOLVERSION=\"1.0\">\n";      out << STRLIT("<MESSAGE ID=\"") << messageId;
       out << STRLIT("\" PROTOCOLVERSION=\"1.0\">\n");
 } }
  
 void XmlWriter::appendMessageElementEnd(  void XmlWriter::_appendMessageElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</MESSAGE>\n";      out << STRLIT("</MESSAGE>\n");
     out << "</CIM>\n";      out << STRLIT("</CIM>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendSimpleReqElementBegin()  // _appendSimpleReqElementBegin()
 // appendSimpleReqElementEnd()  // _appendSimpleReqElementEnd()
 // //
 //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)> //     <!ELEMENT SIMPLEREQ (IMETHODCALL|METHODCALL)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendSimpleReqElementBegin(  void XmlWriter::_appendSimpleReqElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLEREQ>\n";      out << STRLIT("<SIMPLEREQ>\n");
 } }
  
 void XmlWriter::appendSimpleReqElementEnd(  void XmlWriter::_appendSimpleReqElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLEREQ>\n";      out << STRLIT("</SIMPLEREQ>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendMethodCallElementBegin()  // _appendMethodCallElementBegin()
 // appendMethodCallElementEnd()  // _appendMethodCallElementEnd()
 // //
 //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)> //     <!ELEMENT METHODCALL ((LOCALCLASSPATH|LOCALINSTANCEPATH),PARAMVALUE*)>
 //     <!ATTLIST METHODCALL %CIMName;> //     <!ATTLIST METHODCALL %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendMethodCallElementBegin(  void XmlWriter::_appendMethodCallElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<METHODCALL NAME=\"" << name << "\">\n";      out << STRLIT("<METHODCALL NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::appendMethodCallElementEnd(  void XmlWriter::_appendMethodCallElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</METHODCALL>\n";      out << STRLIT("</METHODCALL>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendIMethodCallElementBegin()  // _appendIMethodCallElementBegin()
 // appendIMethodCallElementEnd()  // _appendIMethodCallElementEnd()
 // //
 //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)> //     <!ELEMENT IMETHODCALL (LOCALNAMESPACEPATH,IPARAMVALUE*)>
 //     <!ATTLIST IMETHODCALL %CIMName;> //     <!ATTLIST IMETHODCALL %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendIMethodCallElementBegin(  void XmlWriter::_appendIMethodCallElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<IMETHODCALL NAME=\"" << name << "\">\n";      out << STRLIT("<IMETHODCALL NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::appendIMethodCallElementEnd(  void XmlWriter::_appendIMethodCallElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IMETHODCALL>\n";      out << STRLIT("</IMETHODCALL>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendIParamValueElementBegin()  // _appendIParamValueElementBegin()
 // appendIParamValueElementEnd()  // _appendIParamValueElementEnd()
 // //
 //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE //     <!ELEMENT IPARAMVALUE (VALUE|VALUE.ARRAY|VALUE.REFERENCE
 //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION //         |INSTANCENAME|CLASSNAME|QUALIFIER.DECLARATION
Line 429 
Line 2263 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendIParamValueElementBegin(  void XmlWriter::_appendIParamValueElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)     const char* name)
 { {
     out << "<IPARAMVALUE NAME=\"" << name << "\">\n";      out << STRLIT("<IPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::appendIParamValueElementEnd(  void XmlWriter::_appendIParamValueElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IPARAMVALUE>\n";      out << STRLIT("</IPARAMVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendSimpleRspElementBegin()  // _appendSimpleRspElementBegin()
 // appendSimpleRspElementEnd()  // _appendSimpleRspElementEnd()
 // //
 //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)> //     <!ELEMENT SIMPLERSP (METHODRESPONSE|IMETHODRESPONSE)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendSimpleRspElementBegin(  void XmlWriter::_appendSimpleRspElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLERSP>\n";      out << STRLIT("<SIMPLERSP>\n");
 } }
  
 void XmlWriter::appendSimpleRspElementEnd(  void XmlWriter::_appendSimpleRspElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLERSP>\n";      out << STRLIT("</SIMPLERSP>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendMethodResponseElementBegin()  // _appendMethodResponseElementBegin()
 // appendMethodResponseElementEnd()  // _appendMethodResponseElementEnd()
 // //
 //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)> //     <!ELEMENT METHODRESPONSE (ERROR|IRETURNVALUE?)>
 //     <!ATTLIST METHODRESPONSE %CIMName;> //     <!ATTLIST METHODRESPONSE %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendMethodResponseElementBegin(  void XmlWriter::_appendMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<METHODRESPONSE NAME=\"" << name << "\">\n";      out << STRLIT("<METHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::appendMethodResponseElementEnd(  void XmlWriter::_appendMethodResponseElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</METHODRESPONSE>\n";      out << STRLIT("</METHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendIMethodResponseElementBegin()  // _appendIMethodResponseElementBegin()
 // appendIMethodResponseElementEnd()  // _appendIMethodResponseElementEnd()
 // //
 //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)> //     <!ELEMENT IMETHODRESPONSE (ERROR|IRETURNVALUE?)>
 //     <!ATTLIST IMETHODRESPONSE %CIMName;> //     <!ATTLIST IMETHODRESPONSE %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendIMethodResponseElementBegin(  void XmlWriter::_appendIMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<IMETHODRESPONSE NAME=\"" << name << "\">\n";      out << STRLIT("<IMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::appendIMethodResponseElementEnd(  void XmlWriter::_appendIMethodResponseElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IMETHODRESPONSE>\n";      out << STRLIT("</IMETHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendErrorElement()  // _appendErrorElement()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendErrorElement(  void XmlWriter::_appendErrorElement(
     Array<Sint8>& out,      Buffer& out,
     CIMStatusCode code,      const CIMException& cimException)
     const char* description)  {
       Tracer::traceCIMException(TRC_XML_WRITER, Tracer::LEVEL2, cimException);
   
       out << STRLIT("<ERROR");
       out << STRLIT(" CODE=\"") << Uint32(cimException.getCode());
       out.append('"');
       String description = TraceableCIMException(cimException).getDescription();
       if (description != String::EMPTY)
 { {
     out << "<ERROR";          out << STRLIT(" DESCRIPTION=\"");
     out << " CODE=\"" << Uint32(code) << "\"";  
     out << " DESCRIPTION=\"";  
     appendSpecial(out, description);     appendSpecial(out, description);
     out << "\"/>";          out.append('"');
       }
       out << STRLIT("/>");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 533 
Line 2374 
 // //
 // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)> // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
 // <!ATTLIST RETURNVALUE // <!ATTLIST RETURNVALUE
   //     %EmbeddedObject; #IMPLIED
 //     %ParamType;> //     %ParamType;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendReturnValueElement( void XmlWriter::appendReturnValueElement(
     Array<Sint8>& out,      Buffer& out,
     const CIMValue& value)     const CIMValue& value)
 { {
     out << "<RETURNVALUE";      out << STRLIT("<RETURNVALUE");
  
     CIMType type = value.getType();     CIMType type = value.getType();
     if (type != CIMType::NONE)      // If the property type is CIMObject, then
       //   encode the property in CIM-XML as a string with the EMBEDDEDOBJECT attribute
       //   (there is not currently a CIM-XML "object" datatype)
       // else
       //   output the real type
       if (type == CIMTYPE_OBJECT)
     {     {
         out << " PARAMTYPE=\"" << TypeToString(type) << "\"";          out << STRLIT(" PARAMTYPE=\"string\"");
           out << STRLIT(" EMBEDDEDOBJECT=\"object\"");
     }     }
       else
       {
           out << STRLIT(" PARAMTYPE=\"") << cimTypeToString (type);
           out.append('"');
       }
   
       out << STRLIT(">\n");
  
     out << ">\n";      // Add value.
     value.toXml(out);      appendValueElement(out, value);
     out << "</RETURNVALUE>\n";      out << STRLIT("</RETURNVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendIReturnValueElementBegin()  // _appendIReturnValueElementBegin()
 // appendIReturnValueElementEnd()  // _appendIReturnValueElementEnd()
 // //
 //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*| //      <!ELEMENT IRETURNVALUE (CLASSNAME*|INSTANCENAME*|VALUE*|
 //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*| //          VALUE.OBJECTWITHPATH*|VALUE.OBJECTWITHLOCALPATH*|VALUE.OBJECT*|
Line 566 
Line 2421 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendIReturnValueElementBegin(  void XmlWriter::_appendIReturnValueElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<IRETURNVALUE>\n";      out << STRLIT("<IRETURNVALUE>\n");
 } }
  
 void XmlWriter::appendIReturnValueElementEnd(  void XmlWriter::_appendIReturnValueElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</IRETURNVALUE>\n";      out << STRLIT("</IRETURNVALUE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 585 
Line 2440 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendBooleanIParameter( void XmlWriter::appendBooleanIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     Boolean flag)     Boolean flag)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     out << "<VALUE>" << (flag ? "TRUE" : "FALSE") << "</VALUE>\n";      out << STRLIT("<VALUE>");
     appendIParamValueElementEnd(out);      append(out, flag);
       out << STRLIT("</VALUE>\n");
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 601 
Line 2458 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendStringIParameter( void XmlWriter::appendStringIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& str)     const String& str)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     out << "<VALUE>";      out << STRLIT("<VALUE>");
     appendSpecial(out, str);     appendSpecial(out, str);
     out << "</VALUE>\n";      out << STRLIT("</VALUE>\n");
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 619 
Line 2476 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendQualifierNameIParameter( void XmlWriter::appendQualifierNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& qualifierName)     const String& qualifierName)
 { {
Line 631 
Line 2488 
     // as an IPARAMVALUE element according to the spec (look above). So we     // 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.     // just pass it as a class name. An answer must be obtained later.
  
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     appendClassNameElement(out, qualifierName);     appendClassNameElement(out, qualifierName);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 643 
Line 2500 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassNameIParameter( void XmlWriter::appendClassNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const String& className)      const CIMName& className)
   {
       _appendIParamValueElementBegin(out, name);
   
       //
       //  A NULL (unassigned) value for a parameter is specified by an
       //  <IPARAMVALUE> element with no subelement
       //
       if (!className.isNull ())
 { {
     appendIParamValueElementBegin(out, name);  
     appendClassNameElement(out, className);     appendClassNameElement(out, className);
     appendIParamValueElementEnd(out);      }
   
       _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 659 
Line 2525 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendInstanceNameIParameter( void XmlWriter::appendInstanceNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMReference& instanceName)      const CIMObjectPath& instanceName)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     instanceName.instanceNameToXml(out);      appendInstanceNameElement(out, instanceName);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 void XmlWriter::appendObjectNameIParameter( void XmlWriter::appendObjectNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMReference& objectName)      const CIMObjectPath& objectName)
 { {
     if (objectName.isClassName())      //
       //  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(         XmlWriter::appendClassNameIParameter(
             out, name, objectName.getClassName());             out, name, objectName.getClassName());
Line 692 
Line 2564 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassIParameter( void XmlWriter::appendClassIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMConstClass& cimClass)     const CIMConstClass& cimClass)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     cimClass.toXml(out);      appendClassElement(out, cimClass);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 708 
Line 2580 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendInstanceIParameter( void XmlWriter::appendInstanceIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMConstInstance& instance)     const CIMConstInstance& instance)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     instance.toXml(out);      appendInstanceElement(out, instance);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 724 
Line 2596 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendNamedInstanceIParameter( void XmlWriter::appendNamedInstanceIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMNamedInstance& namedInstance)      const CIMInstance& namedInstance)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     namedInstance.toXml(out);      appendValueNamedInstanceElement(out, namedInstance);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //---------------------------------------------------------- //----------------------------------------------------------
Line 743 
Line 2615 
 //     USE: Create parameter for getProperty operation //     USE: Create parameter for getProperty operation
 //========================================================== //==========================================================
 void XmlWriter::appendPropertyNameIParameter( void XmlWriter::appendPropertyNameIParameter(
     Array<Sint8>& out,      Buffer& out,
     const String& propertyName)      const CIMName& propertyName)
 { {
     appendIParamValueElementBegin(out, "PropertyName");      _appendIParamValueElementBegin(out, "PropertyName");
     out << "<VALUE>" << propertyName << "</VALUE>\n";      out << STRLIT("<VALUE>") << propertyName << STRLIT("</VALUE>\n");
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 758 
Line 2630 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendPropertyValueIParameter( void XmlWriter::appendPropertyValueIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMValue& value)     const CIMValue& value)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     value.toXml(out);      appendValueElement(out, value);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 774 
Line 2646 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendPropertyListIParameter( void XmlWriter::appendPropertyListIParameter(
     Array<Sint8>& out,      Buffer& out,
     const CIMPropertyList& propertyList)     const CIMPropertyList& propertyList)
 { {
     appendIParamValueElementBegin(out, "PropertyList");      _appendIParamValueElementBegin(out, "PropertyList");
  
     out << "<VALUE.ARRAY>\n";      //
     for (Uint32 i = 0; i < propertyList.getNumProperties(); i++)      //  A NULL (unassigned) value for a parameter is specified by an
       //  <IPARAMVALUE> element with no subelement
       //
       if (!propertyList.isNull ())
     {     {
         out << "<VALUE>" << propertyList.getPropertyName(i) << "</VALUE>\n";          out << STRLIT("<VALUE.ARRAY>\n");
           for (Uint32 i = 0; i < propertyList.size(); i++)
           {
               out << STRLIT("<VALUE>") << propertyList[i] << STRLIT("</VALUE>\n");
           }
           out << STRLIT("</VALUE.ARRAY>\n");
     }     }
     out << "</VALUE.ARRAY>\n";  
  
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 796 
Line 2675 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendQualifierDeclarationIParameter( void XmlWriter::appendQualifierDeclarationIParameter(
     Array<Sint8>& out,      Buffer& out,
     const char* name,     const char* name,
     const CIMConstQualifierDecl& qualifierDecl)     const CIMConstQualifierDecl& qualifierDecl)
 { {
     appendIParamValueElementBegin(out, name);      _appendIParamValueElementBegin(out, name);
     qualifierDecl.toXml(out);      appendQualifierDeclElement(out, qualifierDecl);
     appendIParamValueElementEnd(out);      _appendIParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendClassNameElement()  // XmlWriter::formatHttpErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendClassNameElement(  Buffer XmlWriter::formatHttpErrorRspMessage(
     Array<Sint8>& out,      const String& status,
     const String& className)      const String& cimError,
       const String& errorDetail)
 { {
     out << "<CLASSNAME NAME=\"" << className << "\"/>\n";      Buffer out;
 }  
  
 //------------------------------------------------------------------------------      appendHttpErrorResponseHeader(out, status, cimError, errorDetail);
 //  
 // appendInstanceNameElement()  
 //  
 //------------------------------------------------------------------------------  
  
 void XmlWriter::appendInstanceNameElement(      return out;
     Array<Sint8>& out,  
     const CIMReference& instanceName)  
 {  
     instanceName.instanceNameToXml(out);  
 } }
  
   // l10n - add content language support to the format methods below
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleMethodReqMessage() // XmlWriter::formatSimpleMethodReqMessage()
Line 838 
Line 2711 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 // ATTN-RK-P1-20020228: Need to complete copy elimination optimization // ATTN-RK-P1-20020228: Need to complete copy elimination optimization
 Array<Sint8> XmlWriter::formatSimpleMethodReqMessage(  Buffer XmlWriter::formatSimpleMethodReqMessage(
     const char* host,     const char* host,
     const String& nameSpace,      const CIMNamespaceName& nameSpace,
     const char* methodName,      const CIMObjectPath& path,
       const CIMName& methodName,
       const Array<CIMParamValue>& parameters,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
     const Array<Sint8>& body)      const AcceptLanguages& httpAcceptLanguages,
       const ContentLanguages& httpContentLanguages)
 { {
     Array<Sint8> out;      Buffer out;
     Array<Sint8> tmp;      Buffer tmp;
       CIMObjectPath localObjectPath = path;
     appendMessageElementBegin(out, messageId);      localObjectPath.setNameSpace(nameSpace.getString());
     appendSimpleReqElementBegin(out);      localObjectPath.setHost(String::EMPTY);
     appendMethodCallElementBegin(out, methodName);  
 //    appendLocalPathElement(out, nameSpace); // ATTN-RK-P1-20020228:  Need this      _appendMessageElementBegin(out, messageId);
     out << body;      _appendSimpleReqElementBegin(out);
     appendMethodCallElementEnd(out);      _appendMethodCallElementBegin(out, methodName);
     appendSimpleReqElementEnd(out);      appendLocalObjectPathElement(out, localObjectPath);
     appendMessageElementEnd(out);      for (Uint32 i=0; i < parameters.size(); i++)
       {
           appendParamValueElement(out, parameters[i]);
       }
       _appendMethodCallElementEnd(out);
       _appendSimpleReqElementEnd(out);
       _appendMessageElementEnd(out);
  
     appendMethodCallHeader(     appendMethodCallHeader(
         tmp,         tmp,
         host,         host,
         methodName,         methodName,
         nameSpace,  // ATTN-RK: Is this right?          localObjectPath.toString(),
         authenticationHeader,         authenticationHeader,
           httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
         out.size());         out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
 } }
  
 Array<Sint8> XmlWriter::formatSimpleMethodRspMessage(  //PEP 128 adding serverRsponseTime to header
     const char* methodName,  Buffer XmlWriter::formatSimpleMethodRspMessage(
       const CIMName& methodName,
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
 {      const ContentLanguages & httpContentLanguages,
     Array<Sint8> out;      const Buffer& body,
     Array<Sint8> tmp;                  Uint32 serverResponseTime,
                   Boolean isFirst,
                   Boolean isLast)
   {
           Buffer out;
   
           if (isFirst == true)
           {
                   // NOTE: temporarily put zero for content length. the http code
                   // will later decide to fill in the length or remove it altogether
                   appendMethodResponseHeader(out, httpMethod, httpContentLanguages, 0,
                                                                                                                            serverResponseTime);
                   _appendMessageElementBegin(out, messageId);
                   _appendSimpleRspElementBegin(out);
                   _appendMethodResponseElementBegin(out, methodName);
           }
  
     appendMessageElementBegin(out, messageId);          if (body.size() != 0)
     appendSimpleRspElementBegin(out);          {
     appendMethodResponseElementBegin(out, methodName);  
     out << body;     out << body;
     appendMethodResponseElementEnd(out);          }
     appendSimpleRspElementEnd(out);  
     appendMessageElementEnd(out);  
  
     appendMethodResponseHeader(tmp, out.size());          if (isLast == true)
     tmp << out;          {
                   _appendMethodResponseElementEnd(out);
                   _appendSimpleRspElementEnd(out);
                   _appendMessageElementEnd(out);
           }
  
     return tmp;          return out;
 } }
  
   
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleMethodErrorRspMessage() // XmlWriter::formatSimpleMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleMethodErrorRspMessage(  Buffer XmlWriter::formatSimpleMethodErrorRspMessage(
     const String& methodName,      const CIMName& methodName,
     const String& messageId,     const String& messageId,
     CIMStatusCode code,      HttpMethod httpMethod,
     const String& description)      const CIMException& cimException)
 { {
     ArrayDestroyer<char> tmp1(methodName.allocateCString());      Buffer out;
     ArrayDestroyer<char> tmp2(description.allocateCString());      Buffer tmp;
     Array<Sint8> out;  
     Array<Sint8> tmp;  
   
     appendMessageElementBegin(out, messageId);  
     appendSimpleRspElementBegin(out);  
     appendMethodResponseElementBegin(out, tmp1.getPointer());  
     appendErrorElement(out, code, tmp2.getPointer());  
     appendMethodResponseElementEnd(out);  
     appendSimpleRspElementEnd(out);  
     appendMessageElementEnd(out);  
  
     appendMethodResponseHeader(tmp, out.size());      _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendMethodResponseElementBegin(out, methodName);
       _appendErrorElement(out, cimException);
       _appendMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
   // l10n
       appendMethodResponseHeader(tmp,
           httpMethod,
           cimException.getContentLanguages(),
           out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 929 
Line 2836 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodReqMessage(  Buffer XmlWriter::formatSimpleIMethodReqMessage(
     const char* host,     const char* host,
     const String& nameSpace,      const CIMNamespaceName& nameSpace,
     const char* iMethodName,      const CIMName& iMethodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
     const Array<Sint8>& body)      const AcceptLanguages& httpAcceptLanguages,
 {      const ContentLanguages& httpContentLanguages,
     Array<Sint8> out;      const Buffer& body)
     Array<Sint8> tmp;  {
       Buffer out;
     appendMessageElementBegin(out, messageId);      Buffer tmp;
     appendSimpleReqElementBegin(out);  
     appendIMethodCallElementBegin(out, iMethodName);      _appendMessageElementBegin(out, messageId);
     appendLocalNameSpaceElement(out, nameSpace);      _appendSimpleReqElementBegin(out);
       _appendIMethodCallElementBegin(out, iMethodName);
       appendLocalNameSpacePathElement(out, nameSpace.getString());
     out << body;     out << body;
     appendIMethodCallElementEnd(out);      _appendIMethodCallElementEnd(out);
     appendSimpleReqElementEnd(out);      _appendSimpleReqElementEnd(out);
     appendMessageElementEnd(out);      _appendMessageElementEnd(out);
  
     appendMethodCallHeader(     appendMethodCallHeader(
         tmp,         tmp,
         host,         host,
         iMethodName,         iMethodName,
         nameSpace,          nameSpace.getString(),
         authenticationHeader,         authenticationHeader,
           httpMethod,
           httpAcceptLanguages,
           httpContentLanguages,
         out.size());         out.size());
     tmp << out;     tmp << out;
  
Line 967 
Line 2880 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodRspMessage(  Buffer XmlWriter::formatSimpleIMethodRspMessage(
     const char* iMethodName,      const CIMName& iMethodName,
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
 {      const ContentLanguages & httpContentLanguages,
     Array<Sint8> out;      const Buffer& body,
     Array<Sint8> tmp;      Uint32 serverResponseTime,
       Boolean isFirst,
       Boolean isLast)
   {
       Buffer out;
   
                   if (isFirst == true)
                   {
                           // NOTE: temporarily put zero for content length. the http code
                           // will later decide to fill in the length or remove it altogether
                           appendMethodResponseHeader(out, httpMethod, httpContentLanguages, 0,
                                                                                                                                    serverResponseTime);
                           _appendMessageElementBegin(out, messageId);
                           _appendSimpleRspElementBegin(out);
                           _appendIMethodResponseElementBegin(out, iMethodName);
   
                           // output the start of the return tag. Test if there is response data by:
                           // 1. there is data on the first chunk OR
                           // 2. there is no data on the first chunk but isLast is false implying
                           //    there is more non-empty data to come. If all subsequent chunks
                           //    are empty, then this generates and empty response.
                           if (body.size() != 0 || isLast == false)
                                   _appendIReturnValueElementBegin(out);
                   }
  
     appendMessageElementBegin(out, messageId);      if (body.size() != 0)
     appendSimpleRspElementBegin(out);      {
     appendIMethodResponseElementBegin(out, iMethodName);  
     appendIReturnValueElementBegin(out);  
     out << body;     out << body;
     appendIReturnValueElementEnd(out);      }
     appendIMethodResponseElementEnd(out);  
     appendSimpleRspElementEnd(out);  
     appendMessageElementEnd(out);  
  
     appendMethodResponseHeader(tmp, out.size());                  if (isLast == true)
     tmp << out;                  {
                           if (body.size() != 0 || isFirst == false)
                                   _appendIReturnValueElementEnd(out);
                           _appendIMethodResponseElementEnd(out);
                           _appendSimpleRspElementEnd(out);
                           _appendMessageElementEnd(out);
                   }
  
     return tmp;      return out;
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // XmlWriter::formatSimpleIMethodErrorRspMessage() // XmlWriter::formatSimpleIMethodErrorRspMessage()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleIMethodErrorRspMessage(  Buffer XmlWriter::formatSimpleIMethodErrorRspMessage(
     const String& iMethodName,      const CIMName& iMethodName,
     const String& messageId,     const String& messageId,
     CIMStatusCode code,      HttpMethod httpMethod,
     const String& description)      const CIMException& cimException)
 { {
     ArrayDestroyer<char> tmp1(iMethodName.allocateCString());      Buffer out;
     ArrayDestroyer<char> tmp2(description.allocateCString());      Buffer tmp;
     Array<Sint8> out;  
     Array<Sint8> tmp;  
   
     appendMessageElementBegin(out, messageId);  
     appendSimpleRspElementBegin(out);  
     appendIMethodResponseElementBegin(out, tmp1.getPointer());  
     appendErrorElement(out, code, tmp2.getPointer());  
     appendIMethodResponseElementEnd(out);  
     appendSimpleRspElementEnd(out);  
     appendMessageElementEnd(out);  
  
     appendMethodResponseHeader(tmp, out.size());      _appendMessageElementBegin(out, messageId);
       _appendSimpleRspElementBegin(out);
       _appendIMethodResponseElementBegin(out, iMethodName);
       _appendErrorElement(out, cimException);
       _appendIMethodResponseElementEnd(out);
       _appendSimpleRspElementEnd(out);
       _appendMessageElementEnd(out);
   
   // l10n
       appendMethodResponseHeader(tmp,
            httpMethod,
            cimException.getContentLanguages(),
            out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1037 
Line 2977 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendEMethodRequestHeader( void XmlWriter::appendEMethodRequestHeader(
     Array<Sint8>& out,      Buffer& out,
       const char* requestUri,
     const char* host,     const char* host,
     const char* cimMethod,      const CIMName& cimMethod,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
       const AcceptLanguages& acceptLanguages,
       const ContentLanguages& contentLanguages,
     Uint32 contentLength)     Uint32 contentLength)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
  
     out << "M-POST /cimom HTTP/1.1\r\n";      if (httpMethod == HTTP_METHOD_M_POST)
     out << "HOST: " << host << "\r\n";      {
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";        out << STRLIT("M-POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
     out << "Content-Length: " << contentLength << "\r\n";      }
     out << "Man: http://www.hp.com; ns=";      else
     out << nn <<"\r\n";      {
     out << nn << "-CIMExport: MethodRequest\r\n";  // ATTN-RK-P2-20020228: Should this be "MethodCall"?        out << STRLIT("POST ") << requestUri << STRLIT(" HTTP/1.1\r\n");
     out << nn << "-CIMExportMethod: " << cimMethod << "\r\n";      }
       out << STRLIT("HOST: ") << host << STRLIT("\r\n");
       out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
       OUTPUT_CONTENTLENGTH;
   
       if (acceptLanguages.size() > 0)
       {
           out << STRLIT("Accept-Language: ") << acceptLanguages << STRLIT("\r\n");
       }
       if (contentLanguages.size() > 0)
       {
           out << STRLIT("Content-Language: ") << contentLanguages << STRLIT("\r\n");
       }
   
   #ifdef PEGASUS_DEBUG
                   // backdoor environment variable to turn OFF client requesting transfer
                   // encoding. The default is on. to turn off, set this variable to zero.
                   // This should be removed when stable. This should only be turned off in
                   // a debugging/testing environment.
   
                   static const char *clientTransferEncodingOff =
                           getenv("PEGASUS_HTTP_TRANSFER_ENCODING_REQUEST");
                   if (!clientTransferEncodingOff || *clientTransferEncodingOff != '0')
   #endif
                           out << STRLIT("TE: chunked, trailers\r\n");
   
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodRequest\r\n");
           out << nn << STRLIT("-CIMExportMethod: ") << cimMethod << STRLIT("\r\n");
       }
       else
       {
           out << STRLIT("CIMExport: MethodRequest\r\n");
           out << STRLIT("CIMExportMethod: ") << cimMethod << STRLIT("\r\n");
       }
   
     if (authenticationHeader.size())     if (authenticationHeader.size())
     {     {
         out << authenticationHeader << "\r\n";          out << authenticationHeader << STRLIT("\r\n");
     }     }
     out << "\r\n";  
       out << STRLIT("\r\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1069 
Line 3052 
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendEMethodResponseHeader( void XmlWriter::appendEMethodResponseHeader(
     Array<Sint8>& out,      Buffer& out,
       HttpMethod httpMethod,
       const ContentLanguages& contentLanguages,
     Uint32 contentLength)     Uint32 contentLength)
 { {
     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };     char nn[] = { '0' + (rand() % 10), '0' + (rand() % 10), '\0' };
  
     out << "HTTP/1.1 200 OK\r\n";      out << STRLIT("HTTP/1.1 " HTTP_STATUS_OK "\r\n");
     out << "Content-CIMType: application/xml; charset=\"utf-8\"\r\n";      out << STRLIT("Content-Type: application/xml; charset=\"utf-8\"\r\n");
     out << "Content-Length: " << contentLength << "\r\n";      OUTPUT_CONTENTLENGTH;
     out << "Ext:\r\n";  
     out << "Cache-Control: no-cache\r\n";      if (contentLanguages.size() > 0)
     out << "Man:  http://www.dmtf.org/cim/mapping/http/v1.0; ns=";      {
     out << nn <<"\r\n";          out << STRLIT("Content-Language: ") << contentLanguages << STRLIT("\r\n");
     out << nn << "-CIMExport: MethodResponse\r\n\r\n";      }
       if (httpMethod == HTTP_METHOD_M_POST)
       {
           out << STRLIT("Ext:\r\n");
           out << STRLIT("Cache-Control: no-cache\r\n");
           out << STRLIT("Man: http://www.dmtf.org/cim/mapping/http/v1.0; ns=");
           out << nn << STRLIT("\r\n");
           out << nn << STRLIT("-CIMExport: MethodResponse\r\n\r\n");
       }
       else
       {
           out << STRLIT("CIMExport: MethodResponse\r\n\r\n");
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendSimpleExportReqElementBegin()  // _appendSimpleExportReqElementBegin()
 // appendSimpleExportReqElementEnd()  // _appendSimpleExportReqElementEnd()
 // //
 //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)> //     <!ELEMENT SIMPLEEXPREQ (EXPMETHODCALL)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendSimpleExportReqElementBegin(  void XmlWriter::_appendSimpleExportReqElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLEEXPREQ>\n";      out << STRLIT("<SIMPLEEXPREQ>\n");
 } }
  
 void XmlWriter::appendSimpleExportReqElementEnd(  void XmlWriter::_appendSimpleExportReqElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLEEXPREQ>\n";      out << STRLIT("</SIMPLEEXPREQ>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendEMethodCallElementBegin()  // _appendEMethodCallElementBegin()
 // appendEMethodCallElementEnd()  // _appendEMethodCallElementEnd()
 // //
 //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)> //     <!ELEMENT EXPMETHODCALL (IPARAMVALUE*)>
 //     <!ATTLIST EXPMETHODCALL %CIMName;> //     <!ATTLIST EXPMETHODCALL %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendEMethodCallElementBegin(  void XmlWriter::_appendEMethodCallElementBegin(
     Array<Sint8>& out,      Buffer& out,
       const CIMName& name)
   {
       out << STRLIT("<EXPMETHODCALL NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendEMethodCallElementEnd(
       Buffer& out)
   {
       out << STRLIT("</EXPMETHODCALL>\n");
   }
   
   //------------------------------------------------------------------------------
   //
   // _appendEParamValueElementBegin()
   // _appendEParamValueElementEnd()
   //
   //     <!ELEMENT EXPPARAMVALUE (INSTANCE)>
   //     <!ATTLIST EXPPARAMVALUE
   //         %CIMName;>
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::_appendEParamValueElementBegin(
       Buffer& out,
     const char* name)     const char* name)
 { {
     out << "<EXPMETHODCALL NAME=\"" << name << "\">\n";      out << STRLIT("<EXPPARAMVALUE NAME=\"") << name << STRLIT("\">\n");
   }
   
   void XmlWriter::_appendEParamValueElementEnd(
       Buffer& out)
   {
       out << STRLIT("</EXPPARAMVALUE>\n");
 } }
  
 void XmlWriter::appendEMethodCallElementEnd(  //------------------------------------------------------------------------------
     Array<Sint8>& out)  //
   // appendInstanceEParameter()
   //
   //------------------------------------------------------------------------------
   
   void XmlWriter::appendInstanceEParameter(
       Buffer& out,
       const char* name,
       const CIMInstance& instance)
 { {
     out << "</EXPMETHODCALL>\n";      _appendEParamValueElementBegin(out, name);
       appendInstanceElement(out, instance);
       _appendEParamValueElementEnd(out);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // appendSimpleExportRspElementBegin()  // _appendSimpleExportRspElementBegin()
 // appendSimpleExportRspElementEnd()  // _appendSimpleExportRspElementEnd()
 // //
 //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)> //     <!ELEMENT SIMPLEEXPRSP (EXPMETHODRESPONSE)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendSimpleExportRspElementBegin(  void XmlWriter::_appendSimpleExportRspElementBegin(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "<SIMPLEEXPRSP>\n";      out << STRLIT("<SIMPLEEXPRSP>\n");
 } }
  
 void XmlWriter::appendSimpleExportRspElementEnd(  void XmlWriter::_appendSimpleExportRspElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</SIMPLEEXPRSP>\n";      out << STRLIT("</SIMPLEEXPRSP>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // formatEMethodResponseElement()  // _appendEMethodResponseElementBegin()
   // _appendEMethodResponseElementEnd()
 // //
 //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)> //     <!ELEMENT EXPMETHODRESPONSE (ERROR|IRETURNVALUE?)>
 //     <!ATTLIST EXPMETHODRESPONSE %CIMName;> //     <!ATTLIST EXPMETHODRESPONSE %CIMName;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 void XmlWriter::appendEMethodResponseElementBegin(  void XmlWriter::_appendEMethodResponseElementBegin(
     Array<Sint8>& out,      Buffer& out,
     const char* name)      const CIMName& name)
 { {
     out << "<EXPMETHODRESPONSE NAME=\"" << name << "\">\n";      out << STRLIT("<EXPMETHODRESPONSE NAME=\"") << name << STRLIT("\">\n");
 } }
  
 void XmlWriter::appendEMethodResponseElementEnd(  void XmlWriter::_appendEMethodResponseElementEnd(
     Array<Sint8>& out)      Buffer& out)
 { {
     out << "</EXPMETHODRESPONSE>\n";      out << STRLIT("</EXPMETHODRESPONSE>\n");
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1177 
Line 3215 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleEMethodReqMessage(  Buffer XmlWriter::formatSimpleEMethodReqMessage(
       const char* requestUri,
     const char* host,     const char* host,
     const char* eMethodName,      const CIMName& eMethodName,
     const String& messageId,     const String& messageId,
       HttpMethod httpMethod,
     const String& authenticationHeader,     const String& authenticationHeader,
     const Array<Sint8>& body)      const AcceptLanguages& httpAcceptLanguages,
 {      const ContentLanguages& httpContentLanguages,
     Array<Sint8> out;      const Buffer& body)
     Array<Sint8> tmp;  {
       Buffer out;
     appendMessageElementBegin(out, messageId);      Buffer tmp;
     appendSimpleExportReqElementBegin(out);  
     appendEMethodCallElementBegin(out, eMethodName);      _appendMessageElementBegin(out, messageId);
       _appendSimpleExportReqElementBegin(out);
       _appendEMethodCallElementBegin(out, eMethodName);
     out << body;     out << body;
     appendEMethodCallElementEnd(out);      _appendEMethodCallElementEnd(out);
     appendSimpleExportReqElementEnd(out);      _appendSimpleExportReqElementEnd(out);
     appendMessageElementEnd(out);      _appendMessageElementEnd(out);
  
     appendEMethodRequestHeader(     appendEMethodRequestHeader(
         tmp,         tmp,
           requestUri,
         host,         host,
         eMethodName,         eMethodName,
           httpMethod,
         authenticationHeader,         authenticationHeader,
           httpAcceptLanguages,
           httpContentLanguages,
         out.size());         out.size());
     tmp << out;     tmp << out;
  
     return out;      return tmp;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1212 
Line 3258 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleEMethodRspMessage(  Buffer XmlWriter::formatSimpleEMethodRspMessage(
     const char* eMethodName,      const CIMName& eMethodName,
     const String& messageId,     const String& messageId,
     const Array<Sint8>& body)      HttpMethod httpMethod,
 {      const ContentLanguages& httpContentLanguages,
     Array<Sint8> out;      const Buffer& body)
     Array<Sint8> tmp;  {
       Buffer out;
     appendMessageElementBegin(out, messageId);      Buffer tmp;
     appendSimpleExportRspElementBegin(out);  
     appendEMethodResponseElementBegin(out, eMethodName);      _appendMessageElementBegin(out, messageId);
       _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
     out << body;     out << body;
     appendEMethodResponseElementEnd(out);      _appendEMethodResponseElementEnd(out);
     appendSimpleExportRspElementEnd(out);      _appendSimpleExportRspElementEnd(out);
     appendMessageElementEnd(out);      _appendMessageElementEnd(out);
   
     appendEMethodResponseHeader(tmp, out.size());      appendEMethodResponseHeader(tmp,
           httpMethod,
           httpContentLanguages,
           out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1240 
Line 3291 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Array<Sint8> XmlWriter::formatSimpleEMethodErrorRspMessage(  Buffer XmlWriter::formatSimpleEMethodErrorRspMessage(
     const String& eMethodName,      const CIMName& eMethodName,
     const String& messageId,     const String& messageId,
     CIMStatusCode code,      HttpMethod httpMethod,
     const String& description)      const CIMException& cimException)
 { {
     ArrayDestroyer<char> tmp1(eMethodName.allocateCString());      Buffer out;
     ArrayDestroyer<char> tmp2(description.allocateCString());      Buffer tmp;
     Array<Sint8> out;  
     Array<Sint8> tmp;  
   
     appendMessageElementBegin(out, messageId);  
     appendSimpleExportRspElementBegin(out);  
     appendEMethodResponseElementBegin(out, tmp1.getPointer());  
     appendErrorElement(out, code, tmp2.getPointer());  
     appendEMethodResponseElementEnd(out);  
     appendSimpleExportRspElementEnd(out);  
     appendMessageElementEnd(out);  
  
     appendEMethodResponseHeader(tmp, out.size());      _appendMessageElementBegin(out, messageId);
       _appendSimpleExportRspElementBegin(out);
       _appendEMethodResponseElementBegin(out, eMethodName);
       _appendErrorElement(out, cimException);
       _appendEMethodResponseElementEnd(out);
       _appendSimpleExportRspElementEnd(out);
       _appendMessageElementEnd(out);
   
   // l10n
       appendEMethodResponseHeader(tmp,
            httpMethod,
            cimException.getContentLanguages(),
                    out.size());
     tmp << out;     tmp << out;
  
     return tmp;     return tmp;
Line 1267 
Line 3320 
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _printAttributes()  // _xmlWritter_printAttributes()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 static void _printAttributes(  void _xmlWritter_printAttributes(
     PEGASUS_STD(ostream)& os,     PEGASUS_STD(ostream)& os,
     const XmlAttribute* attributes,     const XmlAttribute* attributes,
     Uint32 attributeCount)     Uint32 attributeCount)
Line 1281 
Line 3334 
         os << attributes[i].name << "=";         os << attributes[i].name << "=";
  
         os << '"';         os << '"';
         _appendSpecial(os, attributes[i].value);          _xmlWritter_appendSpecial(os, attributes[i].value);
         os << '"';         os << '"';
  
         if (i + 1 != attributeCount)         if (i + 1 != attributeCount)
Line 1291 
Line 3344 
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // _indent()  // _xmlWritter_indent()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 static void _indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)  void _xmlWritter_indent(PEGASUS_STD(ostream)& os, Uint32 level, Uint32 indentChars)
 { {
     Uint32 n = level * indentChars;     Uint32 n = level * indentChars;
  
Line 1314 
Line 3367 
     const char* text,     const char* text,
     Uint32 indentChars)     Uint32 indentChars)
 { {
     char* tmp = strcpy(new char[strlen(text) + 1], text);      AutoArrayPtr<char> tmp(strcpy(new char[strlen(text) + 1], text));
  
     XmlParser parser(tmp);      XmlParser parser(tmp.get());
     XmlEntry entry;     XmlEntry entry;
     Stack<const char*> stack;     Stack<const char*> stack;
  
Line 1326 
Line 3379 
         {         {
             case XmlEntry::XML_DECLARATION:             case XmlEntry::XML_DECLARATION:
             {             {
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
  
                 os << "<?" << entry.text << " ";                 os << "<?" << entry.text << " ";
                 _printAttributes(os, entry.attributes, entry.attributeCount);                  _xmlWritter_printAttributes(os, entry.attributes, entry.attributeCount);
                 os << "?>";                 os << "?>";
                 break;                 break;
             }             }
  
             case XmlEntry::START_TAG:             case XmlEntry::START_TAG:
             {             {
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
  
                 os << "<" << entry.text;                 os << "<" << entry.text;
  
                 if (entry.attributeCount)                 if (entry.attributeCount)
                     os << ' ';                     os << ' ';
  
                 _printAttributes(os, entry.attributes, entry.attributeCount);                  _xmlWritter_printAttributes(os, entry.attributes, entry.attributeCount);
                 os << ">";                 os << ">";
                 stack.push(entry.text);                 stack.push(entry.text);
                 break;                 break;
Line 1351 
Line 3404 
  
             case XmlEntry::EMPTY_TAG:             case XmlEntry::EMPTY_TAG:
             {             {
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
  
                 os << "<" << entry.text << " ";                 os << "<" << entry.text << " ";
                 _printAttributes(os, entry.attributes, entry.attributeCount);                  _xmlWritter_printAttributes(os, entry.attributes, entry.attributeCount);
                 os << "/>";                 os << "/>";
                 break;                 break;
             }             }
Line 1364 
Line 3417 
                 if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)                 if (!stack.isEmpty() && strcmp(stack.top(), entry.text) == 0)
                     stack.pop();                     stack.pop();
  
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
  
                 os << "</" << entry.text << ">";                 os << "</" << entry.text << ">";
                 break;                 break;
Line 1373 
Line 3426 
             case XmlEntry::COMMENT:             case XmlEntry::COMMENT:
             {             {
  
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
                 os << "<!--";                 os << "<!--";
                 _appendSpecial(os, entry.text);                  _xmlWritter_appendSpecial(os, entry.text);
                 os << "-->";                 os << "-->";
                 break;                 break;
             }             }
  
             case XmlEntry::CONTENT:             case XmlEntry::CONTENT:
             {             {
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
                 _appendSpecial(os, entry.text);                  _xmlWritter_appendSpecial(os, entry.text);
                 break;                 break;
             }             }
  
             case XmlEntry::CDATA:             case XmlEntry::CDATA:
             {             {
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
                 os << "<![CDATA[...]]>";                 os << "<![CDATA[...]]>";
                 break;                 break;
             }             }
  
             case XmlEntry::DOCTYPE:             case XmlEntry::DOCTYPE:
             {             {
                 _indent(os, stack.size(), indentChars);                  _xmlWritter_indent(os, stack.size(), indentChars);
                 os << "<!DOCTYPE...>";                 os << "<!DOCTYPE...>";
                 break;                 break;
             }             }
Line 1405 
Line 3458 
         os << PEGASUS_STD(endl);         os << PEGASUS_STD(endl);
     }     }
  
     delete [] tmp;  
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1429 
Line 3481 
     return buffer;     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.28  
changed lines
  Added in v.1.126

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2