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

Diff for /pegasus/src/Pegasus/Common/XmlReader.cpp between version 1.80 and 1.150

version 1.80, 2002/10/03 23:31:09 version 1.150, 2014/08/27 23:10:08
Line 1 
Line 1 
 //%/////////////////////////////////////////////////////////////////////////////  //%LICENSE////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,  // Licensed to The Open Group (TOG) under one or more contributor license
 // The Open Group, Tivoli Systems  // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   // this work for additional information regarding copyright ownership.
   // Each contributor licenses this file to you under the OpenPegasus Open
   // Source License; you may not use this file except in compliance with the
   // License.
   //
   // Permission is hereby granted, free of charge, to any person obtaining a
   // copy of this software and associated documentation files (the "Software"),
   // to deal in the Software without restriction, including without limitation
   // the rights to use, copy, modify, merge, publish, distribute, sublicense,
   // and/or sell copies of the Software, and to permit persons to whom the
   // Software is furnished to do so, subject to the following conditions:
   //
   // The above copyright notice and this permission notice shall be included
   // in all copies or substantial portions of the Software.
   //
   // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
   // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy  //////////////////////////////////////////////////////////////////////////
 // of this software and associated documentation files (the "Software"), to  
 // deal in the Software without restriction, including without limitation the  
 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or  
 // sell copies of the Software, and to permit persons to whom the Software is  
 // furnished to do so, subject to the following conditions:  
 //  
 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN  
 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED  
 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT  
 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR  
 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT  
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN  
 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
 //  
 //==============================================================================  
 //  
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company  
 //                  (carolann_graves@hp.com)  
 //              Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)  
 //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)  
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
   #include <Pegasus/Common/Constants.h>
   #include <errno.h>
 #include <cctype> #include <cctype>
 #include <cstdio> #include <cstdio>
 #include <cstdlib> #include <cstdlib>
 #if defined(PEGASUS_OS_TYPE_UNIX)  #if defined(PEGASUS_OS_TYPE_UNIX) || defined(PEGASUS_OS_VMS)
 #include <errno.h> #include <errno.h>
 #endif #endif
 #include "CIMName.h" #include "CIMName.h"
   #include "CIMNameCast.h"
 #include "XmlReader.h" #include "XmlReader.h"
 #include "XmlWriter.h" #include "XmlWriter.h"
 #include "CIMQualifier.h" #include "CIMQualifier.h"
Line 46 
Line 48 
 #include "CIMObject.h" #include "CIMObject.h"
 #include "CIMParamValue.h" #include "CIMParamValue.h"
 #include "System.h" #include "System.h"
   #include "XmlConstants.h"
  
 #define PEGASUS_SINT64_MIN (-PEGASUS_SINT64_LITERAL(0x8000000000000000))  #include <Pegasus/Common/MessageLoader.h>
 #define PEGASUS_UINT64_MAX PEGASUS_UINT64_LITERAL(0xFFFFFFFFFFFFFFFF)  #include <Pegasus/Common/StringConversion.h>
   #include <Pegasus/Common/AutoPtr.h>
  
 PEGASUS_USING_STD; PEGASUS_USING_STD;
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
Line 74 
Line 78 
         entry.type != XmlEntry::XML_DECLARATION ||         entry.type != XmlEntry::XML_DECLARATION ||
         strcmp(entry.text, "xml") != 0)         strcmp(entry.text, "xml") != 0)
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_XML_STYLE",
             "Expected <?xml ... ?> style declaration");             "Expected <?xml ... ?> style declaration");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     if (!entry.getAttributeValue("version", xmlVersion))     if (!entry.getAttributeValue("version", xmlVersion))
         throw XmlValidationError(      {
             parser.getLine(), "missing xml.version attribute");          MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_XML_ATTRIBUTE",
               "missing xml.version attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     if (!entry.getAttributeValue("encoding", xmlEncoding))     if (!entry.getAttributeValue("encoding", xmlEncoding))
     {     {
Line 124 
Line 134 
         entry.type != XmlEntry::START_TAG ||         entry.type != XmlEntry::START_TAG ||
         strcmp(entry.text, tagName) != 0)         strcmp(entry.text, tagName) != 0)
     {     {
         char message[MESSAGE_SIZE];          MessageLoaderParms mlParms(
         sprintf(message, "Expected open of %s element", tagName);              "Common.XmlReader.EXPECTED_OPEN",
         throw XmlValidationError(parser.getLine(), message);              "Expected open of $0 element",
               tagName);
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
 } }
  
Line 144 
Line 156 
         entry.type != XmlEntry::END_TAG ||         entry.type != XmlEntry::END_TAG ||
         strcmp(entry.text, tagName) != 0)         strcmp(entry.text, tagName) != 0)
     {     {
         char message[MESSAGE_SIZE];          MessageLoaderParms mlParms(
         sprintf(message, "Expected close of %s element, got %s instead",              "Common.XmlReader.EXPECTED_CLOSE",
               "Expected close of $0 element, got $1 instead",
               tagName,entry.text);               tagName,entry.text);
         throw XmlValidationError(parser.getLine(), message);          throw XmlValidationError(parser.getLine(), mlParms);
     }     }
 } }
  
Line 167 
Line 180 
         entry.type != XmlEntry::EMPTY_TAG) ||         entry.type != XmlEntry::EMPTY_TAG) ||
         strcmp(entry.text, tagName) != 0)         strcmp(entry.text, tagName) != 0)
     {     {
         char message[MESSAGE_SIZE];          MessageLoaderParms mlParms(
         sprintf(message,              "Common.XmlReader.EXPECTED_OPENCLOSE",
             "Expected either open or open/close %s element", tagName);              "Expected either open or open/close $0 element",
         throw XmlValidationError(parser.getLine(), message);              tagName);
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
 } }
  
Line 188 
Line 202 
         (entry.type != XmlEntry::CONTENT &&         (entry.type != XmlEntry::CONTENT &&
         entry.type != XmlEntry::CDATA))         entry.type != XmlEntry::CDATA))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
             "Expected content of CDATA");              "Common.XmlReader.EXPECTED_CDATA",
               "Expected content or CDATA");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     return true;     return true;
Line 249 
Line 265 
     XmlEntry& entry,     XmlEntry& entry,
     const char* tagName)     const char* tagName)
 { {
     if (!parser.next(entry) ||      if (!parser.next(entry))
         (entry.type != XmlEntry::START_TAG &&      {
           return false;
       }
       if ((entry.type != XmlEntry::START_TAG &&
         entry.type != XmlEntry::EMPTY_TAG) ||         entry.type != XmlEntry::EMPTY_TAG) ||
         strcmp(entry.text, tagName) != 0)         strcmp(entry.text, tagName) != 0)
     {     {
Line 263 
Line 282 
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
   // testStartTagOrEmptyTag()
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::testStartTagOrEmptyTag(
       XmlParser& parser,
       XmlEntry& entry)
   {
       if (!parser.next(entry) ||
           (entry.type != XmlEntry::START_TAG &&
            entry.type != XmlEntry::EMPTY_TAG))
       {
           parser.putBack(entry);
           return false;
       }
   
       return true;
   }
   
   //------------------------------------------------------------------------------
   //
 // testContentOrCData() // testContentOrCData()
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 302 
Line 342 
     XmlReader::expectStartTag(parser, entry, "CIM");     XmlReader::expectStartTag(parser, entry, "CIM");
  
     if (!entry.getAttributeValue("CIMVERSION", cimVersion))     if (!entry.getAttributeValue("CIMVERSION", cimVersion))
         throw XmlValidationError(      {
             parser.getLine(), "missing CIM.CIMVERSION attribute");          MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_CIMVERSION_ATTRIBUTE",
               "missing CIM.CIMVERSION attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     if (!entry.getAttributeValue("DTDVERSION", dtdVersion))     if (!entry.getAttributeValue("DTDVERSION", dtdVersion))
         throw XmlValidationError(      {
             parser.getLine(), "missing CIM.DTDVERSION attribute");          MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_DTDVERSION_ATTRIBUTE",
               "missing CIM.DTDVERSION attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 324 
Line 372 
     const char* elementName,     const char* elementName,
     Boolean acceptNull)     Boolean acceptNull)
 { {
     String name;      const char* name;
  
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
     {     {
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(buffer, "missing %s.NAME attribute", elementName);          sprintf(buffer, "%s.NAME", elementName);
         throw XmlValidationError(lineNumber, buffer);          MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_ATTRIBUTE",
               "missing $0 attribute",
               buffer);
   
           throw XmlValidationError(lineNumber, mlParms);
     }     }
  
     if (acceptNull && name.size() == 0)      if (acceptNull && *name == '\0')
         return CIMName ();         return CIMName ();
  
       Uint32 size = CIMNameLegalASCII(name);
   
       if (size)
       {
           String tmp(name, size);
           return CIMName(CIMNameCast(tmp));
       }
   
     if (!CIMName::legal(name))     if (!CIMName::legal(name))
     {     {
 #ifdef PEGASUS_SNIA_INTEROP_TEST  
     // In testing, replace illegal CIMName with this value to avoid the  
     // exception and let xml parsing continue.  THIS IS TEMP.  
     name = "BADNAMESUBSTITUTEDBYPEGASUSCLIENT";  
 #else  
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(buffer, "Illegal value for %s.NAME attribute", elementName);          sprintf(buffer, "%s.NAME", elementName);
         throw XmlSemanticError(lineNumber, buffer);  
 #endif          MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
               "Illegal value for $0 attribute",
               buffer);
   
           throw XmlSemanticError(lineNumber, mlParms);
     }     }
     return CIMName (name);  
       return CIMNameCast(name);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 369 
Line 431 
     if (!entry.getAttributeValue("CLASSNAME", name))     if (!entry.getAttributeValue("CLASSNAME", name))
     {     {
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(buffer, "missing %s.CLASSNAME attribute", elementName);          sprintf(buffer, "%s.CLASSNAME", elementName);
         throw XmlValidationError(lineNumber, buffer);  
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_ATTRIBUTE",
               "missing $0 attribute",
               buffer);
   
           throw XmlValidationError(lineNumber, mlParms);
     }     }
  
     if (!CIMName::legal(name))     if (!CIMName::legal(name))
     {     {
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(buffer,          sprintf(buffer, "%s.CLASSNAME", elementName);
             "Illegal value for %s.CLASSNAME attribute", elementName);  
         throw XmlSemanticError(lineNumber, buffer);          MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
               "Illegal value for $0 attribute",
               buffer);
           throw XmlSemanticError(lineNumber, mlParms);
     }     }
  
     return name;     return name;
Line 402 
Line 474 
     if (!entry.getAttributeValue("CLASSORIGIN", name))     if (!entry.getAttributeValue("CLASSORIGIN", name))
         return CIMName();         return CIMName();
  
     // KS 200209 This may be temp but we are adding test for form      /* Interoperability hack to make the C++ client of OpenPegasus able
     // CLASSNAME = "" for Wbemservices interoperability.  Returns same         to deal with the wbemservices CIMOM delivered with Sun Solaris.
     // as if attribute did not exist.         The issue is that the wbemservices delivers Xml responses with
          CLASSORIGIN=""
          Originally this had been reported with Bug#537.
       */
     if (name.size() == 0)     if (name.size() == 0)
       {
         return CIMName();         return CIMName();
       }
  
     if (!CIMName::legal(name))     if (!CIMName::legal(name))
     {     {
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(buffer,          sprintf(buffer, "%s.CLASSORIGIN", tagName);
             "Illegal value for %s.CLASSORIGIN attribute", tagName);  
         throw XmlSemanticError(lineNumber, buffer);          MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
               "Illegal value for $0 attribute",
               buffer);
           throw XmlSemanticError(lineNumber, mlParms);
       }
       // The CIMName was already checked with legal() + String()
       return CIMNameCast(name);
     }     }
  
     return name;  //------------------------------------------------------------------------------
   //
   // getEmbeddedObjectAttribute()
   //
   //     <!ENTITY % EmbeddedObject "EmbeddedObject (object | instance) #IMPLIED">
   //
   //     EmbeddedObjectAttributeType:
   //        NO_EMBEDDED_OBJECT     = 0,
   //        EMBEDDED_OBJECT_ATTR   = 1,
   //        EMBEDDED_INSTANCE_ATTR = 2
   //
   //------------------------------------------------------------------------------
   
   XmlReader::EmbeddedObjectAttributeType XmlReader::getEmbeddedObjectAttribute(
       Uint32 lineNumber,
       const XmlEntry& entry,
       const char* tagName)
   {
       const char* embeddedObject;
   
       // Check for both upper case and mixed case "EmbeddedObject"
       // because of an error in an earlier pegasus version  where we
       // used upper case in the generation of the attribute name
       // whereas the DMTF spec calls for mixed case.
       if (!entry.getAttributeValue("EmbeddedObject", embeddedObject) &&
           !entry.getAttributeValue("EMBEDDEDOBJECT", embeddedObject))
           return NO_EMBEDDED_OBJECT;
   
       // The embeddedObject attribute, if present, must have the string
       // value "object" or "instance".
       if (strcmp(embeddedObject, "object") == 0)
       {
           return EMBEDDED_OBJECT_ATTR;
       }
   
       if (strcmp(embeddedObject, "instance") == 0)
       {
           return EMBEDDED_INSTANCE_ATTR;
       }
   
       char buffer[MESSAGE_SIZE];
       sprintf(buffer, "%s.EmbeddedObject", tagName);
   
       MessageLoaderParms mlParms(
           "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
           "Illegal value for $0 attribute",
           buffer);
       throw XmlSemanticError(lineNumber, mlParms);
   
       return NO_EMBEDDED_OBJECT;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 439 
Line 572 
  
     if (!CIMName::legal(name))     if (!CIMName::legal(name))
     {     {
 #ifdef PEGASUS_SNIA_INTEROP_TEST  
     name = "PEGASUS_SUBSTITUED_THIS_FOR_BAD_NAME";  
     return name;  
 #endif  
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(buffer,          sprintf(buffer, "%s.REFERENCECLASS", elementName);
             "Illegal value for %s.REFERENCECLASS attribute", elementName);  
         throw XmlSemanticError(lineNumber, buffer);  
     }  
  
     return name;          MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
               "Illegal value for $0 attribute",
               buffer);
           throw XmlSemanticError(lineNumber, mlParms);
       }
       // The CIMName was already checked with legal() + String()
       return CIMNameCast(name);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 473 
Line 606 
     if (!CIMName::legal(superClass))     if (!CIMName::legal(superClass))
     {     {
         char buffer[MESSAGE_SIZE];         char buffer[MESSAGE_SIZE];
         sprintf(          sprintf(buffer, "%s.SUPERCLASS", tagName);
             buffer, "Illegal value for %s.SUPERCLASS attribute", tagName);  
         throw XmlSemanticError(lineNumber, buffer);  
     }  
  
     return superClass;          MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
               "Illegal value for $0 attribute",
               buffer);
           throw XmlSemanticError(lineNumber, mlParms);
       }
       // The CIMName was already checked with legal() + String()
       return CIMNameCast(superClass);
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 514 
Line 651 
         if (required)         if (required)
         {         {
             char message[MESSAGE_SIZE];             char message[MESSAGE_SIZE];
             sprintf(message, "missing %s.%s attribute", tagName, attributeName);              sprintf(message, "%s.%s", tagName, attributeName);
             throw XmlValidationError(lineNumber, message);  
               MessageLoaderParms mlParms(
                   "Common.XmlReader.MISSING_ATTRIBUTE",
                   "missing $0 attribute",
                   message);
               throw XmlValidationError(lineNumber, mlParms);
         }         }
         else         else
         {         {
Line 556 
Line 698 
         type = CIMTYPE_REAL64;         type = CIMTYPE_REAL64;
     else if (strcmp(typeName, "reference") == 0)     else if (strcmp(typeName, "reference") == 0)
         type = CIMTYPE_REFERENCE;         type = CIMTYPE_REFERENCE;
   //  PEP 194:
   //  Note that "object" (ie. CIMTYPE_OBJECT) is not a real CIM datatype, just a
   //  Pegasus internal representation of an embedded object, so it won't be
   //  found here.
     else unrecognizedType = true;     else unrecognizedType = true;
  
     if (unrecognizedType ||     if (unrecognizedType ||
         ((type == CIMTYPE_REFERENCE) &&         ((type == CIMTYPE_REFERENCE) &&
          (strcmp(attributeName, "PARAMTYPE") != 0)))          (strcmp(attributeName, "PARAMTYPE") != 0)))
     {     {
         char message[MESSAGE_SIZE];          char buffer[MESSAGE_SIZE];
         sprintf(message, "Illegal value for %s.%s attribute", tagName,          sprintf(buffer, "%s.%s", tagName, attributeName);
                 attributeName);  
         throw XmlSemanticError(lineNumber, message);          MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
               "Illegal value for $0 attribute",
               buffer);
   
           throw XmlSemanticError(lineNumber, mlParms);
     }     }
  
     cimType = type;     cimType = type;
Line 593 
Line 744 
         if (!required)         if (!required)
             return defaultValue;             return defaultValue;
  
         char buffer[62];          char buffer[MESSAGE_SIZE];
         sprintf(buffer, "missing required %s.%s attribute",          sprintf(buffer, "%s.%s", attributeName, tagName);
             attributeName, tagName);  
  
         throw XmlValidationError(lineNumber, buffer);          MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_REQUIRED_ATTRIBUTE",
               "missing required $0 attribute",
               buffer);
           throw XmlValidationError(lineNumber, mlParms);
     }     }
  
     if (strcmp(tmp, "true") == 0)     if (strcmp(tmp, "true") == 0)
Line 605 
Line 759 
     else if (strcmp(tmp, "false") == 0)     else if (strcmp(tmp, "false") == 0)
         return false;         return false;
  
     char buffer[62];      char buffer[MESSAGE_SIZE];
     sprintf(buffer, "Invalid %s.%s attribute value", attributeName, tagName);      sprintf(buffer, "%s.%s", attributeName, tagName);
     throw XmlSemanticError(lineNumber, buffer);  
     return false;  
 }  
   
 //------------------------------------------------------------------------------  
 //  
 // SringToReal()  
 //  
 //      [ "+" | "-" ] *decimalDigit "." 1*decimalDigit  
 //          [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]  
 //  
 //------------------------------------------------------------------------------  
   
 Boolean XmlReader::stringToReal(const char* stringValue, Real64& x)  
 {  
     //  
     // Check the string against the DMTF-defined grammar  
     //  
     const char* p = stringValue;  
   
     if (!*p)  
         return false;  
   
     // Skip optional sign:  
   
     if (*p == '+' || *p  == '-')  
         p++;  
   
     // Skip optional first set of digits:  
   
     while (isdigit(*p))  
         p++;  
   
     // Test required dot:  
  
     if (*p++ != '.')      MessageLoaderParms mlParms(
         return false;          "Common.XmlReader.INVALID_ATTRIBUTE",
           "Invalid $0 attribute value",
           buffer);
  
     // One or more digits required:      throw XmlSemanticError(lineNumber, mlParms);
  
     if (!isdigit(*p++))  
         return false;         return false;
   }
  
     while (isdigit(*p))  // See http://www.ietf.org/rfc/rfc2396.txt section 2
         p++;  //
   // Also see the "CIM Operations over HTTP" spec, section 3.3.2 and
     // If there is an exponent now:  // 3.3.3, for the treatment of non US-ASCII chars (UTF-8)
   String XmlReader::decodeURICharacters(String uriString)
     if (*p)  
     {     {
         // Test exponent:      Uint32 i;
   
         if (*p != 'e' && *p != 'E')  
             return false;  
   
         p++;  
  
         // Skip optional sign:      Buffer utf8Chars;
  
         if (*p == '+' || *p  == '-')      for (i=0; i<uriString.size(); i++)
             p++;      {
           if (uriString[i] == '%')
         // One or more digits required:          {
               if (i+2 >= uriString.size())
         if (!isdigit(*p++))              {
             return false;                  MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_URI_ENCODING",
         while (isdigit(*p))                      "Invalid URI encoding");
             p++;                  throw ParseError(MessageLoader::getMessage(mlParms));
     }     }
  
     if (*p)              Uint8 digit1 =
         return false;                  StringConversion::hexCharToNumeric(char(uriString[++i]));
               Uint8 digit2 =
     //                  StringConversion::hexCharToNumeric(char(uriString[++i]));
     // Do the conversion              if ( (digit1 > 15) || (digit2 > 15) )
     //  
     char* end;  
     errno = 0;  
     x = strtod(stringValue, &end);  
     if (*end || (errno == ERANGE))  
     {     {
         return false;                  MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_URI_ENCODING",
                       "Invalid URI encoding");
                   throw ParseError(MessageLoader::getMessage(mlParms));
     }     }
  
     return true;              Uint16 decodedChar = Uint16(digit1<<4) + Uint16(digit2);
               utf8Chars.append((char)decodedChar);
 } }
           else
 inline Uint8 _hexCharToNumeric(const char c)  
 { {
     Uint8 n;              utf8Chars.append((char)uriString[i]);
           }
     if (isdigit(c))      }
         n = (c - '0');  
     else if (isupper(c))  
         n = (c - 'A' + 10);  
     else // if (islower(c))  
         n = (c - 'a' + 10);  
  
     return n;      // If there was a string to decode...
       if (uriString.size() > 0)
       {
           // Convert UTF-8 to UTF-16 and return the String
           return String(utf8Chars.getData(), utf8Chars.size());
       }
       else
       {
           return String();
       }
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // stringToSignedInteger  // stringToValue()
   //
   // Return: CIMValue. If the string input is zero length creates a CIMValue
   //         with value defined by the type.  Else the value is inserted.
 // //
 //      [ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )  //         Note that this does not set the CIMValue Null if the string is empty.
 //    or  
 //      [ "+" | "-" ] ( "0x" | "0X" ) 1*hexDigit  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Boolean XmlReader::stringToSignedInteger(  CIMValue XmlReader::stringToValue(
     const char* stringValue,      Uint32 lineNumber,
     Sint64& x)      const char* valueString,
       CIMType type)
 { {
     x = 0;      return stringToValue(lineNumber, valueString, strlen(valueString), type);
     const char* p = stringValue;  }
   
     if (!p || !*p)  
         return false;  
   
     // Skip optional sign:  
  
     Boolean negative = *p == '-';  CIMValue XmlReader::stringToValue(
       Uint32 lineNumber,
       const char* valueString,
       Uint32 valueStringLen,
       CIMType type)
   {
       // ATTN-B: accepting only UTF-8 for now! (affects string and char16):
  
     if (negative || *p == '+')      // Char string must have been null terminated.
         p++;      PEGASUS_ASSERT (!valueString[valueStringLen]);
  
     if (*p == '0')      // Create value per type
       switch (type)
     {     {
         if ( (p[1] == 'x') || (p[1] == 'X') )          case CIMTYPE_BOOLEAN:
         {         {
             // Convert a hexadecimal string              if (System::strcasecmp(valueString, "TRUE") == 0)
                   return CIMValue(true);
               else if (System::strcasecmp(valueString, "FALSE") == 0)
                   return CIMValue(false);
               else
               {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_BOOLEAN_VALUE",
                       "Invalid boolean value");
                   throw XmlSemanticError(lineNumber, mlParms);
               }
           }
  
             // Skip over the "0x"          case CIMTYPE_STRING:
             p+=2;          {
               return CIMValue(String(valueString, valueStringLen));
           }
  
             // At least one hexadecimal digit is required          case CIMTYPE_CHAR16:
             if (!isxdigit(*p))          {
                 return false;              // Converts UTF-8 to UTF-16
               String tmp(valueString, valueStringLen);
               if (tmp.size() != 1)
               {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_CHAR16_VALUE",
                       "Invalid char16 value");
                   throw XmlSemanticError(lineNumber, mlParms);
               }
  
             // Build the Sint64 as a negative number, regardless of the              return CIMValue(tmp[0]);
             // eventual sign (negative numbers can be bigger than positive ones)          }
  
             // Add on each digit, checking for overflow errors          case CIMTYPE_UINT8:
             while (isxdigit(*p))          case CIMTYPE_UINT16:
           case CIMTYPE_UINT32:
           case CIMTYPE_UINT64:
             {             {
                 // Make sure we won't overflow when we multiply by 16              Uint64 x;
                 if (x < PEGASUS_SINT64_MIN/16)  
               if (!StringConversion::stringToUnsignedInteger(valueString, x))
                 {                 {
                     return false;                  MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_UI_VALUE",
                       "Invalid unsigned integer value");
                   throw XmlSemanticError(lineNumber, mlParms);
                 }                 }
                 x = x << 4;  
  
                 // Make sure we don't overflow when we add the next digit              switch (type)
                 Sint64 newDigit = Sint64(_hexCharToNumeric(*p++));  
                 if (PEGASUS_SINT64_MIN - x > -newDigit)  
                 {                 {
                     return false;                  case CIMTYPE_UINT8:
                   {
                       if (!StringConversion::checkUintBounds(x, type))
                       {
                           MessageLoaderParms mlParms(
                               "Common.XmlReader.U8_VALUE_OUT_OF_RANGE",
                               "Uint8 value out of range");
                           throw XmlSemanticError(lineNumber, mlParms);
                 }                 }
                 x = x - newDigit;                      return CIMValue(Uint8(x));
             }             }
                   case CIMTYPE_UINT16:
             // If we found a non-hexadecimal digit, report an error  
             if (*p)  
                 return false;  
   
             // Return the integer to positive, if necessary, checking for an  
             // overflow error  
             if (!negative)  
             {             {
                 if (x == PEGASUS_SINT64_MIN)                      if (!StringConversion::checkUintBounds(x, type))
                 {                 {
                     return false;                          MessageLoaderParms mlParms(
                 }                              "Common.XmlReader.U16_VALUE_OUT_OF_RANGE",
                 x = -x;                              "Uint16 value out of range");
                           throw XmlSemanticError(lineNumber, mlParms);
             }             }
             return true;                      return CIMValue(Uint16(x));
         }         }
         else                  case CIMTYPE_UINT32:
                   {
                       if (!StringConversion::checkUintBounds(x, type))
         {         {
             // A decimal string that starts with '0' must be exactly "0".                          MessageLoaderParms mlParms(
             return p[1] == '\0';                              "Common.XmlReader.U32_VALUE_OUT_OF_RANGE",
                               "Uint32 value out of range");
                           throw XmlSemanticError(lineNumber, mlParms);
                       }
                       return CIMValue(Uint32(x));
                   }
                   case CIMTYPE_UINT64: return CIMValue(Uint64(x));
                   default: break;
         }         }
     }     }
  
     // Expect a positive decimal digit:          case CIMTYPE_SINT8:
           case CIMTYPE_SINT16:
     // At least one decimal digit is required          case CIMTYPE_SINT32:
     if (!isdigit(*p))          case CIMTYPE_SINT64:
         return false;          {
               Sint64 x;
  
     // Build the Sint64 as a negative number, regardless of the              if (!StringConversion::stringToSignedInteger(valueString, x))
     // eventual sign (negative numbers can be bigger than positive ones)              {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_SI_VALUE",
                       "Invalid signed integer value");
                   throw XmlSemanticError(lineNumber, mlParms);
               }
  
     // Add on each digit, checking for overflow errors              switch (type)
     while (isdigit(*p))  
     {     {
         // Make sure we won't overflow when we multiply by 10                  case CIMTYPE_SINT8:
         if (x < PEGASUS_SINT64_MIN/10)  
         {         {
             return false;                      if (!StringConversion::checkSintBounds(x, type))
                       {
                           MessageLoaderParms mlParms(
                               "Common.XmlReader.S8_VALUE_OUT_OF_RANGE",
                               "Sint8 value out of range");
                           throw XmlSemanticError(lineNumber, mlParms);
         }         }
         x = 10 * x;                      return CIMValue(Sint8(x));
                   }
         // Make sure we won't overflow when we add the next digit                  case CIMTYPE_SINT16:
         Sint64 newDigit = (*p++ - '0');  
         if (PEGASUS_SINT64_MIN - x > -newDigit)  
         {         {
             return false;                      if (!StringConversion::checkSintBounds(x, type))
                       {
                           MessageLoaderParms mlParms(
                               "Common.XmlReader.S16_VALUE_OUT_OF_RANGE",
                               "Sint16 value out of range");
                           throw XmlSemanticError(lineNumber, mlParms);
         }         }
         x = x - newDigit;                      return CIMValue(Sint16(x));
     }     }
                   case CIMTYPE_SINT32:
     // If we found a non-decimal digit, report an error  
     if (*p)  
         return false;  
   
     // Return the integer to positive, if necessary, checking for an  
     // overflow error  
     if (!negative)  
     {     {
         if (x == PEGASUS_SINT64_MIN)                      if (!StringConversion::checkSintBounds(x, type))
         {         {
             return false;                          MessageLoaderParms mlParms(
                               "Common.XmlReader.S32_VALUE_OUT_OF_RANGE",
                               "Sint32 value out of range");
                           throw XmlSemanticError(lineNumber, mlParms);
         }         }
         x = -x;                      return CIMValue(Sint32(x));
                   }
                   case CIMTYPE_SINT64: return CIMValue(Sint64(x));
                   default: break;
     }     }
     return true;  
 } }
  
 //------------------------------------------------------------------------------          case CIMTYPE_DATETIME:
 //  
 // stringToUnsignedInteger  
 //  
 //      ( positiveDecimalDigit *decimalDigit | "0" )  
 //    or  
 //      ( "0x" | "0X" ) 1*hexDigit  
 //  
 //------------------------------------------------------------------------------  
   
 Boolean XmlReader::stringToUnsignedInteger(  
     const char* stringValue,  
     Uint64& x)  
 { {
     x = 0;              CIMDateTime tmp;
     const char* p = stringValue;  
   
     if (!p || !*p)  
         return false;  
  
     if (*p == '0')              try
     {     {
         if ( (p[1] == 'x') || (p[1] == 'X') )                  if (valueStringLen != 0)
         {         {
             // Convert a hexadecimal string                      tmp.set(valueString);
                   }
             // Skip over the "0x"              }
             p+=2;              catch (InvalidDateTimeFormatException&)
               {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_DATETIME_VALUE",
                       "Invalid datetime value");
                   throw XmlSemanticError(lineNumber, mlParms);
               }
  
             // At least one hexadecimal digit is required              return CIMValue(tmp);
             if (!*p)          }
                 return false;  
  
             // Add on each digit, checking for overflow errors          case CIMTYPE_REAL32:
             while (isxdigit(*p))  
             {             {
                 // Make sure we won't overflow when we multiply by 16              Real64 x;
                 if (x > PEGASUS_UINT64_MAX/16)  
               if (!StringConversion::stringToReal64(valueString, x))
                 {                 {
                     return false;                  MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_RN_VALUE",
                       "Invalid real number value");
                   throw XmlSemanticError(lineNumber, mlParms);
               }
               return CIMValue(Real32(x));
                 }                 }
                 x = x << 4;  
  
                 // We can't overflow when we add the next digit          case CIMTYPE_REAL64:
                 Uint64 newDigit = Uint64(_hexCharToNumeric(*p++));  
                 if (PEGASUS_UINT64_MAX - x < newDigit)  
                 {                 {
                     return false;              Real64 x;
   
               if (!StringConversion::stringToReal64(valueString, x))
               {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_RN_VALUE",
                       "Invalid real number value");
                   throw XmlSemanticError(lineNumber, mlParms);
                 }                 }
                 x = x + newDigit;              return CIMValue(x);
             }             }
  
             // If we found a non-hexadecimal digit, report an error  //  PEP 194:
             if (*p)  //  Note that "object" (ie. CIMTYPE_OBJECT) is not a real CIM datatype, but
                 return false;  //  just a Pegasus internal representation of an embedded object. However,
   //  this case is used when decoding string representations of embedded objects.
           case CIMTYPE_OBJECT:
           case CIMTYPE_INSTANCE:
           {
               CIMObject x;
  
             return true;              if (*valueString == '\0')
               {
                   return CIMValue(type, false, 0);
         }         }
         else         else
         {         {
             // A decimal string that starts with '0' must be exactly "0".                  // Convert the non-NULL string to a CIMObject (containing
             return p[1] == '\0';                  // either a CIMInstance or a CIMClass).
         }  
     }  
  
     // Expect a positive decimal digit:                  // First we need to create a new "temporary" XmlParser that is
                   // just the value of the Embedded Object in String
                   // representation.
                   AutoArrayPtr<char> tmp_buffer(
                       new char[valueStringLen + 1]);
                   memcpy(tmp_buffer.get(), valueString, valueStringLen + 1);
                   XmlParser tmp_parser(tmp_buffer.get());
   
                   // The next bit of logic constructs a CIMObject from the
                   // Embedded Object String.  It is similar to the method
                   // XmlReader::getValueObjectElement().
                   CIMInstance cimInstance;
                   CIMClass cimClass;
  
     // Add on each digit, checking for overflow errors                  if (XmlReader::getInstanceElement(tmp_parser, cimInstance))
     while (isdigit(*p))  
     {     {
         // Make sure we won't overflow when we multiply by 10                      if (type == CIMTYPE_INSTANCE)
         if (x > PEGASUS_UINT64_MAX/10)                          return CIMValue(cimInstance);
                       x = CIMObject(cimInstance);
                   }
                   else if (XmlReader::getClassElement(tmp_parser, cimClass))
         {         {
             return false;                      x = CIMObject(cimClass);
         }         }
         x = 10 * x;                  else
   
         // Make sure we won't overflow when we add the next digit  
         Uint64 newDigit = (*p++ - '0');  
         if (PEGASUS_UINT64_MAX - x < newDigit)  
         {         {
             return false;                      if (type == CIMTYPE_OBJECT)
                       {
                           // change "element" to "embedded object"
                           MessageLoaderParms mlParms(
                               "Common.XmlReader."
                                   "EXPECTED_INSTANCE_OR_CLASS_ELEMENT",
                               "Expected INSTANCE or CLASS element");
                           throw XmlValidationError(lineNumber, mlParms);
                       }
                       else
                       {
                           // change "element" to "embedded object"
                           MessageLoaderParms mlParms(
                               "Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
                               "Expected INSTANCE element");
                           throw XmlValidationError(lineNumber, mlParms);
         }         }
         x = x + newDigit;                  }
                   // Ok, now we can delete the storage for the temporary
                   // XmlParser.
                   tmp_buffer.reset();
               }
               return CIMValue(x);
     }     }
  
     // If we found a non-decimal digit, report an error          default:
     if (*p)              break;
         return false;      }
  
     return true;      MessageLoaderParms mlParms(
           "Common.XmlReader.MALFORMED_XML",
           "malformed XML");
       throw XmlSemanticError(lineNumber, mlParms);
   
       return false;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // stringToValue()  // skipElement()
 //  
 // Return: CIMValue. If the string input is zero length creates a CIMValue  
 //         with value defined by the type.  Else the value is inserted.  
 //  
 //         Note that this does not set the CIMValue Null if the string is empty.  
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
   void XmlReader::skipElement(
 CIMValue XmlReader::stringToValue(      XmlParser& parser,
     Uint32 lineNumber,      XmlEntry& entry)
     const char* valueString,  
     CIMType type)  
 { {
     // ATTN-B: accepting only UTF-8 for now! (affects string and char16):      const char * tag_name = entry.text;
  
     // Create value per type      if (entry.type == XmlEntry::EMPTY_TAG)
     switch (type)  
     {  
         case CIMTYPE_BOOLEAN:  
         {         {
             if (System::strcasecmp(valueString, "TRUE") == 0)          return;
                 return CIMValue(true);  
             else if (System::strcasecmp(valueString, "FALSE") == 0)  
                 return CIMValue(false);  
             else  
                 throw XmlSemanticError(  
                     lineNumber, "Invalid boolean value");  
         }         }
  
         case CIMTYPE_STRING:      while (testStartTagOrEmptyTag(parser, entry))
         {         {
             return CIMValue(String(valueString));          skipElement(parser, entry);
         }         }
  
         case CIMTYPE_CHAR16:      if (testContentOrCData(parser, entry))
         {         {
             if (strlen(valueString) != 1)          ; // skip
                 throw XmlSemanticError(lineNumber, "Invalid char16 value");      }
  
             return CIMValue(Char16(valueString[0]));      expectEndTag(parser, tag_name);
       return;
         }         }
  
         case CIMTYPE_UINT8:  //------------------------------------------------------------------------------
         case CIMTYPE_UINT16:  //
         case CIMTYPE_UINT32:  // getValueElement()
         case CIMTYPE_UINT64:  //
         {  //     <!ELEMENT VALUE (#PCDATA)>
             Uint64 x;  //
   // Return: false if no value element.
   //
   //------------------------------------------------------------------------------
  
             if (!stringToUnsignedInteger(valueString, x))  Boolean XmlReader::getValueElement(
       XmlParser& parser,
       CIMType type,
       CIMValue& value)
             {             {
             char message[128];      // Get VALUE start tag: Return false if no VALUE start Tag
             sprintf(message, "Illegal unsigned integer value - %s", valueString);  
                 throw XmlSemanticError(  
                     lineNumber, message);  
             }  
  
             switch (type)      XmlEntry entry;
             {      if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
                 case CIMTYPE_UINT8:  
                 {  
                     if (x >= (Uint64(1)<<8))  
                     {  
                         throw XmlSemanticError(  
                             lineNumber, "Uint8 value out of range");  
                     }  
                     return CIMValue(Uint8(x));  
                 }  
                 case CIMTYPE_UINT16:  
                 {  
                     if (x >= (Uint64(1)<<16))  
                     {                     {
                         throw XmlSemanticError(          return false;
                             lineNumber, "Uint16 value out of range");  
                     }  
                     return CIMValue(Uint16(x));  
                 }                 }
                 case CIMTYPE_UINT32:  
       Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
   
       const char* valueString = "";
       Uint32 valueStringLen = 0;
       if (!empty)
                 {                 {
                     if (x >= (Uint64(1)<<32))          if (testContentOrCData(parser, entry))
                     {                     {
                         throw XmlSemanticError(              valueString = entry.text;
                             lineNumber, "Uint32 value out of range");              valueStringLen = entry.textLen;
                     }  
                     return CIMValue(Uint32(x));  
                 }  
                 case CIMTYPE_UINT64: return CIMValue(Uint64(x));  
                 default: break;  
             }  
         }         }
  
         case CIMTYPE_SINT8:          expectEndTag(parser, "VALUE");
         case CIMTYPE_SINT16:      }
         case CIMTYPE_SINT32:      value = stringToValue(parser.getLine(),valueString,valueStringLen,type);
         case CIMTYPE_SINT64:  
         {  
             Sint64 x;  
  
             if (!stringToSignedInteger(valueString, x))      return true;
             {  
                 throw XmlSemanticError(  
                     lineNumber, "Invalid signed integer value");  
             }             }
  
             switch (type)  //------------------------------------------------------------------------------
             {  //
                 case CIMTYPE_SINT8:  // getStringValueElement()
                 {  //
                     if(  (x >= (Sint64(1)<<7)) || (x < (-(Sint64(1)<<7))) )  //     <!ELEMENT VALUE (#PCDATA)>
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::getStringValueElement(
       XmlParser& parser,
       String& str,
       Boolean required)
                     {                     {
                         throw XmlSemanticError(      XmlEntry entry;
                             lineNumber, "Sint8 value out of range");  
                     }      if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
                     return CIMValue(Sint8(x));  
                 }  
                 case CIMTYPE_SINT16:  
                 {                 {
                     if(  (x >= (Sint64(1)<<15)) || (x < (-(Sint64(1)<<15))) )          if (required)
                     {                     {
                         throw XmlSemanticError(              MessageLoaderParms mlParms(
                             lineNumber, "Sint16 value out of range");                  "Common.XmlReader.EXPECTED_VALUE_ELEMENT",
                   "Expected VALUE element");
               throw XmlValidationError(parser.getLine(), mlParms);
                     }                     }
                     return CIMValue(Sint16(x));          return false;
                 }                 }
                 case CIMTYPE_SINT32:  
       Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
   
       const char* valueString = "";
       Uint32 valueStringLen = 0;
   
       if (!empty)
                 {                 {
                     if(  (x >= (Sint64(1)<<31)) || (x < (-(Sint64(1)<<31))) )          if (testContentOrCData(parser, entry))
                     {                     {
                         throw XmlSemanticError(              valueString = entry.text;
                             lineNumber, "Sint32 value out of range");              valueStringLen = entry.textLen;
                     }  
                     return CIMValue(Sint32(x));  
                 }                 }
                 case CIMTYPE_SINT64: return CIMValue(Sint64(x));  
                 default: break;          expectEndTag(parser, "VALUE");
             }             }
   
       str = String(valueString, valueStringLen);
       return true;
         }         }
  
         case CIMTYPE_DATETIME:  // EXP_PULL_BEGIN
   //------------------------------------------------------------------------------
   //
   // getUint32ArgValueElement()
   //
   //     <!ELEMENT VALUE (#PCDATA)>
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::getUint32ArgValueElement(
       XmlParser& parser,
       Uint32Arg& val,
       Boolean required)
         {         {
             CIMDateTime tmp;      XmlEntry entry;
  
             try      if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
             {             {
             // KS 20021002 - Exception if no datatime value. Test for          if (required)
             // zero length and leave the NULL value in the variable  
             // Bugzilla 137  Adds the following if line.  
             // Expect this to become permanent but test only for now  
 #ifdef PEGASUS_SNIA_INTEROP_TEST  
             if (strlen(valueString) != 0)  
 #endif  
                 tmp.set(valueString);  
             }  
             catch (InvalidDateTimeFormatException&)  
             {             {
             throw XmlSemanticError(lineNumber, "Invalid datetime value");              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_VALUE_ELEMENT",
                   "Expected VALUE element");
               throw XmlValidationError(parser.getLine(), mlParms);
             }             }
           return false;
             return CIMValue(tmp);  
         }         }
  
         case CIMTYPE_REAL32:      Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
         {  
             Real64 x;  
  
             if (!stringToReal(valueString, x))      const char* valueString = "";
                 throw XmlSemanticError(lineNumber, "Invalid real number value");  
  
             return CIMValue(Real32(x));      if (!empty)
         }      {
           if (testContentOrCData(parser, entry))
               valueString = entry.text;
  
         case CIMTYPE_REAL64:          expectEndTag(parser, "VALUE");
       }
       else
         {         {
             Real64 x;          // create the arg object with the NULL value in it.
           val = Uint32Arg();
           return true;
       }
  
             if (!stringToReal(valueString, x))      //convert to Uint32. Note error if overflow.
                 throw XmlSemanticError(lineNumber, "Invalid real number value");  
  
             return CIMValue(x);      Uint64 x;
       if (!StringConversion::stringToUnsignedInteger(valueString, x))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.INVALID_UI_VALUE",
               "Invalid unsigned integer value");
           throw XmlSemanticError(parser.getLine(), mlParms);
         }         }
  
         default:      if (!StringConversion::checkUintBounds(x, CIMTYPE_UINT32))
             break;      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.U32_VALUE_OUT_OF_RANGE",
               "Uint32 value out of range");
           throw XmlSemanticError(parser.getLine(), mlParms);
     }     }
       // create the arg object with the value in it.
       val = Uint32Arg(x);
  
     throw XmlSemanticError(lineNumber, "malformed XML");      return true;
     return false;  
 } }
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // getValueElement()  // getUint64ValueElement()
 // //
 //     <!ELEMENT VALUE (#PCDATA)> //     <!ELEMENT VALUE (#PCDATA)>
 // //
 // Return: false if no value element.  
 //  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Boolean XmlReader::getValueElement(  Boolean XmlReader::getUint64ValueElement(
     XmlParser& parser,     XmlParser& parser,
     CIMType type,      Uint64Arg& val,
     CIMValue& value)      Boolean required)
 { {
     // Get VALUE start tag: Return false if no VALUE start Tag  
   
     XmlEntry entry;     XmlEntry entry;
   
     if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))     if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
       {
           if (required)
           {
               MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_VALUE_ELEMENT",
                   "Expected VALUE element");
               throw XmlValidationError(parser.getLine(), mlParms);
           }
         return false;         return false;
       }
  
     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
  
Line 1156 
Line 1362 
  
         expectEndTag(parser, "VALUE");         expectEndTag(parser, "VALUE");
     }     }
 #ifdef PEGASUS_SNIA_INTEROP_TEST      else
     // KS 20021004 - tries to put value in even if empty.      {
     // Think this is general problem with empty value          // create the arg object with the NULL value in it.
     // Need to check meaning of (#PCDATA) - Does it allow empty.          val = Uint64Arg();
     // Bugzilla tbd          return true;
     if (!empty)      }
 #endif  
         value = stringToValue(parser.getLine(), valueString,type);      Uint64 x;
   
       if (!StringConversion::stringToUnsignedInteger(valueString, x))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.INVALID_UI_VALUE",
               "The unsigned integer value is not valid.");
           throw XmlSemanticError(parser.getLine(), mlParms);
       }
   
       // create the arg object with the value in it.
       val = Uint64Arg(x);
  
     return true;     return true;
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // getStringValueElement()  // getUint32ValueElement()
 // //
 //     <!ELEMENT VALUE (#PCDATA)> //     <!ELEMENT VALUE (#PCDATA)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Boolean XmlReader::getStringValueElement(  Boolean XmlReader::getUint32ValueElement(
     XmlParser& parser,     XmlParser& parser,
     String& str,      Uint32& val,
     Boolean required)     Boolean required)
 { {
     XmlEntry entry;     XmlEntry entry;
Line 1186 
Line 1404 
     if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))     if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
     {     {
         if (required)         if (required)
             throw XmlValidationError(parser.getLine(),"Expected VALUE element");          {
               MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_VALUE_ELEMENT",
                   "Expected VALUE element");
               throw XmlValidationError(parser.getLine(), mlParms);
           }
         return false;         return false;
     }     }
  
Line 1201 
Line 1424 
  
         expectEndTag(parser, "VALUE");         expectEndTag(parser, "VALUE");
     }     }
       else
       {
           // leave the existing value
           return true;
       }
   
       //convert to Uint32. Note error if overflow.
   
       Uint64 x;
       if (!StringConversion::stringToUnsignedInteger(valueString, x))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.INVALID_UI_VALUE",
               "Invalid unsigned integer value");
           throw XmlSemanticError(parser.getLine(), mlParms);
       }
   
       if (!StringConversion::checkUintBounds(x, CIMTYPE_UINT32))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.U32_VALUE_OUT_OF_RANGE",
               "Uint32 value out of range");
           throw XmlSemanticError(parser.getLine(), mlParms);
       }
       // create the arg object with the value in it.
       val = x;
  
     str = valueString;  
     return true;     return true;
 } }
   //EXP_PULL_END
  
 //---------------------------------------------------------------------------- //----------------------------------------------------------------------------
 // //
Line 1271 
Line 1520 
 template<class T> template<class T>
 CIMValue StringArrayToValueAux( CIMValue StringArrayToValueAux(
     Uint32 lineNumber,     Uint32 lineNumber,
     const Array<const char*>& stringArray,      const Array<CharString>& stringArray,
     CIMType type,     CIMType type,
     T*)     T*)
 { {
Line 1280 
Line 1529 
     for (Uint32 i = 0, n = stringArray.size(); i < n; i++)     for (Uint32 i = 0, n = stringArray.size(); i < n; i++)
     {     {
         CIMValue value = XmlReader::stringToValue(         CIMValue value = XmlReader::stringToValue(
             lineNumber, stringArray[i], type);              lineNumber,
               stringArray[i].value,
               stringArray[i].length,
               type);
  
         T x;         T x;
         value.get(x);         value.get(x);
Line 1295 
Line 1547 
     const Array<const char*>& array,     const Array<const char*>& array,
     CIMType type)     CIMType type)
 { {
       Array<CharString> strArray;
   
       for (Uint32 i = 0, n = array.size() ; i < n ; ++i)
       {
           strArray.append(CharString(array[i], strlen(array[i])));
       }
   
       return _stringArrayToValue(lineNumber, strArray, type);
   }
   
   CIMValue XmlReader::_stringArrayToValue(
       Uint32 lineNumber,
       const Array<CharString> &array,
       CIMType type)
   {
     switch (type)     switch (type)
     {     {
         case CIMTYPE_BOOLEAN:         case CIMTYPE_BOOLEAN:
Line 1331 
Line 1598 
             return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);             return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);
  
         case CIMTYPE_DATETIME:         case CIMTYPE_DATETIME:
             return StringArrayToValueAux(lineNumber, array, type, (CIMDateTime*)0);              return StringArrayToValueAux(
                   lineNumber, array, type, (CIMDateTime*)0);
  
         case CIMTYPE_REAL32:         case CIMTYPE_REAL32:
             return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);             return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);
Line 1339 
Line 1607 
         case CIMTYPE_REAL64:         case CIMTYPE_REAL64:
             return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);             return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);
  
   //  PEP 194:
   //  Note that "object" (ie. CIMTYPE_OBJECT) is not a real CIM datatype, but
   //  just a Pegasus internal representation of an embedded object. However,
   //  this case is used when decoding string representations of embedded objects.
           case CIMTYPE_OBJECT:
               return StringArrayToValueAux(
                   lineNumber, array, type, (CIMObject*)0);
           case CIMTYPE_INSTANCE:
               return StringArrayToValueAux(
                   lineNumber, array, type, (CIMInstance*)0);
         default:         default:
             break;             break;
     }     }
Line 1368 
Line 1646 
     // Get VALUE.ARRAY open tag:     // Get VALUE.ARRAY open tag:
  
     XmlEntry entry;     XmlEntry entry;
     Array<const char*> stringArray;      Array<CharString> stringArray;
  
     // If no VALUE.ARRAY start tag, return false     // If no VALUE.ARRAY start tag, return false
     if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))     if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))
Line 1380 
Line 1658 
  
         while (testStartTagOrEmptyTag(parser, entry, "VALUE"))         while (testStartTagOrEmptyTag(parser, entry, "VALUE"))
         {         {
               // ATTN: NULL values in array will have VALUE.NULL subelement
               // See DSP0201 Version 2.3.0, Section 5.2.3.2
             if (entry.type == XmlEntry::EMPTY_TAG)             if (entry.type == XmlEntry::EMPTY_TAG)
             {             {
                 stringArray.append("");                  stringArray.append(CharString("", 0));
                 continue;                 continue;
             }             }
  
             if (testContentOrCData(parser, entry))             if (testContentOrCData(parser, entry))
                 stringArray.append(entry.text);              {
                   stringArray.append(CharString(entry.text, entry.textLen));
               }
             else             else
                 stringArray.append("");              {
                   stringArray.append(CharString("", 0));
               }
             expectEndTag(parser, "VALUE");             expectEndTag(parser, "VALUE");
         }         }
  
         expectEndTag(parser, "VALUE.ARRAY");         expectEndTag(parser, "VALUE.ARRAY");
     }     }
  
     value = stringArrayToValue(parser.getLine(), stringArray, type);      value = _stringArrayToValue(parser.getLine(), stringArray, type);
     return true;     return true;
 } }
  
Line 1548 
Line 1831 
     // Get QUALIFIER element:     // Get QUALIFIER element:
  
     XmlEntry entry;     XmlEntry entry;
     if (!testStartTag(parser, entry, "QUALIFIER"))      if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER"))
         return false;         return false;
  
       Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
   
     // Get QUALIFIER.NAME attribute:     // Get QUALIFIER.NAME attribute:
  
     CIMName name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");     CIMName name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");
Line 1573 
Line 1858 
  
     CIMValue value;     CIMValue value;
  
       if (empty)
       {
           value.setNullValue(type, false);
       }
       else
       {
     if (!getValueElement(parser, type, value) &&     if (!getValueElement(parser, type, value) &&
         !getValueArrayElement(parser, type, value))         !getValueArrayElement(parser, type, value))
     {     {
Line 1582 
Line 1873 
     // Expect </QUALIFIER>:     // Expect </QUALIFIER>:
  
     expectEndTag(parser, "QUALIFIER");     expectEndTag(parser, "QUALIFIER");
       }
  
     // Build qualifier:     // Build qualifier:
  
Line 1608 
Line 1900 
         }         }
         catch (AlreadyExistsException&)         catch (AlreadyExistsException&)
         {         {
             throw XmlSemanticError(parser.getLine(), "duplicate qualifier");              MessageLoaderParms mlParms(
                   "Common.XmlReader.DUPLICATE_QUALIFIER",
                   "duplicate qualifier");
               throw XmlSemanticError(parser.getLine(), mlParms);
         }         }
     }     }
 } }
Line 1622 
Line 1917 
 //         %CIMName; //         %CIMName;
 //         %ClassOrigin; //         %ClassOrigin;
 //         %Propagated; //         %Propagated;
   //         %EmbeddedObject; #IMPLIED
 //         %CIMType; #REQUIRED> //         %CIMType; #REQUIRED>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 1649 
Line 1945 
     Boolean propagated = getCimBooleanAttribute(     Boolean propagated = getCimBooleanAttribute(
         parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);         parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
  
       // Get PROPERTY.EmbeddedObject attribute:
   
       EmbeddedObjectAttributeType embeddedObject =
           getEmbeddedObjectAttribute(parser.getLine(), entry, "PROPERTY");
   
     // Get PROPERTY.TYPE attribute:     // Get PROPERTY.TYPE attribute:
  
     CIMType type;     CIMType type;
Line 1661 
Line 1962 
  
     if (!empty)     if (!empty)
     {     {
         // Get qualifiers:          // Get qualifiers. We need to do this before checking for the
           // property as an embedded object, because we need to also check
           // for the EmbeddedObject qualifier.
         getQualifierElements(parser, property);         getQualifierElements(parser, property);
       }
  
         // Get value:  Insert value if getValueElement exists (returns True)      Boolean embeddedObjectQualifierValue = false;
       Uint32 ix = property.findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT);
       if (ix != PEG_NOT_FOUND)
       {
           property.getQualifier(ix).getValue().get(embeddedObjectQualifierValue);
       }
       String embeddedInstanceQualifierValue;
       ix = property.findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE);
       if (ix != PEG_NOT_FOUND)
       {
           property.getQualifier(ix).getValue().get(
               embeddedInstanceQualifierValue);
       }
       // If the EmbeddedObject attribute is present with value "object"
       // or the EmbeddedObject qualifier exists on this property with value "true"
       // then convert the EmbeddedObject-encoded string into a CIMObject
       Boolean isEmbeddedObject = (embeddedObject == EMBEDDED_OBJECT_ATTR) ||
           embeddedObjectQualifierValue;
       Boolean isEmbeddedInstance = (embeddedObject == EMBEDDED_INSTANCE_ATTR) ||
           embeddedInstanceQualifierValue.size() > 0;
       if (isEmbeddedObject || isEmbeddedInstance)
       {
           // The EmbeddedObject attribute is only valid on Properties of type
           // string
           if (type == CIMTYPE_STRING)
           {
               if (isEmbeddedObject)
                   type = CIMTYPE_OBJECT;
               else
                   type = CIMTYPE_INSTANCE;
               CIMValue new_value(type, false);
               CIMProperty new_property = CIMProperty(
                   name, new_value, 0, CIMName(), classOrigin, propagated);
   
               // Copy the qualifiers from the String property to the CIMObject
               // property.
               for (Uint32 i = 0; i < property.getQualifierCount(); ++i)
               {
                   // All properties are copied, including the EmbeddedObject
                   // qualifier.  This way we don't have to keep track to know
                   // that the EmbeddedObject qualifier needs to be added back
                   // during the encode step.
                   new_property.addQualifier(property.getQualifier(i));
               }
  
               value = new_value;
               property = new_property;
           }
           else
           {
               MessageLoaderParms mlParms(
                   "Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
                   "The EmbeddedObject attribute is only valid on string types.");
               throw XmlValidationError(parser.getLine(), mlParms);
           }
       }
       // Continue on to get property value, if not empty.
       if (!empty)
       {
         if (getValueElement(parser, type, value))         if (getValueElement(parser, type, value))
             property.setValue(value);             property.setValue(value);
   
         expectEndTag(parser, "PROPERTY");         expectEndTag(parser, "PROPERTY");
     }     }
  
Line 1700 
Line 2059 
  
     Uint64 arraySize;     Uint64 arraySize;
  
     if (!stringToUnsignedInteger(tmp, arraySize) || arraySize == 0)      if (!StringConversion::stringToUnsignedInteger(tmp, arraySize) ||
           (arraySize == 0) ||
           !StringConversion::checkUintBounds(arraySize, CIMTYPE_UINT32))
     {     {
         char message[128];         char message[128];
         sprintf(message, "Illegal value for %s.%s", tagName, "ARRAYSIZE");          sprintf(message, "%s.%s", tagName, "ARRAYSIZE");
         throw XmlSemanticError(lineNumber, message);  
           MessageLoaderParms mlParms(
               "Common.XmlReader.ILLEGAL_VALUE",
               "Illegal value for $0",
               message);
           throw XmlSemanticError(lineNumber, mlParms);
     }     }
  
     value = Uint32(arraySize);     value = Uint32(arraySize);
Line 1721 
Line 2087 
 //             %CIMType; #REQUIRED //             %CIMType; #REQUIRED
 //             %ArraySize; //             %ArraySize;
 //             %ClassOrigin; //             %ClassOrigin;
 //             %Propagated;>  //             %Propagated;
   //             %EmbeddedObject; #IMPLIED>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
Line 1755 
Line 2122 
  
     // Get PROPERTY.CLASSORIGIN attribute:     // Get PROPERTY.CLASSORIGIN attribute:
  
     CIMName classOrigin      CIMName classOrigin =
         = getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");          getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
  
     // Get PROPERTY.ARRAY.PROPAGATED     // Get PROPERTY.ARRAY.PROPAGATED
  
     Boolean propagated = getCimBooleanAttribute(     Boolean propagated = getCimBooleanAttribute(
         parser.getLine(), entry, "PROPERTY.ARRAY", "PROPAGATED", false, false);          parser.getLine(),
           entry,
           "PROPERTY.ARRAY",
           "PROPAGATED",
           false,
           false);
   
       // Get PROPERTY.EmbeddedObject attribute:
   
       EmbeddedObjectAttributeType embeddedObject = getEmbeddedObjectAttribute(
           parser.getLine(), entry, "PROPERTY.ARRAY");
  
     // Create property:     // Create property:
  
Line 1772 
Line 2149 
     if (!empty)     if (!empty)
     {     {
         // Get qualifiers:         // Get qualifiers:
   
         getQualifierElements(parser, property);         getQualifierElements(parser, property);
       }
  
         // Get value:      Boolean embeddedObjectQualifierValue = false;
       Uint32 ix = property.findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDOBJECT);
       if (ix != PEG_NOT_FOUND)
       {
           property.getQualifier(ix).getValue().get(embeddedObjectQualifierValue);
       }
       String embeddedInstanceQualifierValue;
       ix = property.findQualifier(PEGASUS_QUALIFIERNAME_EMBEDDEDINSTANCE);
       if (ix != PEG_NOT_FOUND)
       {
           property.getQualifier(ix).getValue().get(
               embeddedInstanceQualifierValue);
       }
       // If the EmbeddedObject attribute is present with value "object"
       // or the EmbeddedObject qualifier exists on this property with value "true"
       // then
       //     Convert the EmbeddedObject-encoded string into a CIMObject
       Boolean isEmbeddedObject = (embeddedObject == EMBEDDED_OBJECT_ATTR) ||
           embeddedObjectQualifierValue;
       Boolean isEmbeddedInstance = (embeddedObject == EMBEDDED_INSTANCE_ATTR) ||
           embeddedInstanceQualifierValue.size() > 0;
       if (isEmbeddedObject || isEmbeddedInstance)
       {
           // The EmbeddedObject attribute is only valid on Properties of type
           // string
           if (type == CIMTYPE_STRING)
           {
               if (isEmbeddedObject)
                   type = CIMTYPE_OBJECT;
               else
                   type = CIMTYPE_INSTANCE;
               CIMValue new_value(type, true, arraySize);
               CIMProperty new_property = CIMProperty(
                   name, new_value, arraySize, CIMName(), classOrigin, propagated);
   
               // Copy the qualifiers from the String property to the CIMObject
               // property.
               for (Uint32 i = 0; i < property.getQualifierCount(); ++i)
               {
                   // All properties are copied, including the EmbeddedObject
                   // qualifier.  This way we don't have to keep track to know
                   // that the EmbeddedObject qualifier needs to be added back
                   // during the encode step.
                   new_property.addQualifier(property.getQualifier(i));
               }
  
               value = new_value;
               property = new_property;
           }
           else
           {
               MessageLoaderParms mlParms(
                   "Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
                   "The EmbeddedObject attribute is only valid on string types.");
               throw XmlValidationError(parser.getLine(), mlParms);
           }
       }
       // Continue on to get property array value, if not empty.
       // Else not an embedded object, if not empty, get the property array value.
       if (!empty)
       {
         if (getValueArrayElement(parser, type, value))         if (getValueArrayElement(parser, type, value))
         {         {
             if (arraySize && arraySize != value.getArraySize())             if (arraySize && arraySize != value.getArraySize())
             {             {
                 throw XmlSemanticError(parser.getLine(),                  MessageLoaderParms mlParms(
                       "Common.XmlReader.ARRAY_SIZE_DIFFERENT",
                     "ARRAYSIZE attribute and value-array size are different");                     "ARRAYSIZE attribute and value-array size are different");
                   throw XmlSemanticError(parser.getLine(), mlParms);
             }             }
  
             property.setValue(value);             property.setValue(value);
         }         }
   
         expectEndTag(parser, "PROPERTY.ARRAY");         expectEndTag(parser, "PROPERTY.ARRAY");
     }     }
  
Line 1810 
Line 2247 
  
     if (!testStartTag(parser, entry, "HOST"))     if (!testStartTag(parser, entry, "HOST"))
         return false;         return false;
 #ifdef PEGASUS_SNIA_INTEROP_TEST  
     // Temp code to allow empty HOST field.  
     // SNIA CIMOMs return empty field particularly on enumerateinstance.  
     // Simply substitute a string for the empty.  
         if (!parser.next(entry))  
             throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());  
   
         if (entry.type == XmlEntry::CONTENT)  
             host = entry.text;  
         else  
     {  
             parser.putBack(entry);  
         host = "HOSTNAMEINSERTEDBYPEGASUSCLIENT";  
     }  
   
 #else  
  
     if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)     if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_CONTENT_ELEMENT",
             "expected content of HOST element");             "expected content of HOST element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     host = entry.text;      host = String(entry.text);
 #endif  
     expectEndTag(parser, "HOST");     expectEndTag(parser, "HOST");
     return true;     return true;
 } }
Line 1897 
Line 2319 
  
     if (!nameSpace.size())     if (!nameSpace.size())
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_NAMESPACE_ELEMENTS",
             "Expected one or more NAMESPACE elements within "             "Expected one or more NAMESPACE elements within "
             "LOCALNAMESPACEPATH element");             "LOCALNAMESPACEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     expectEndTag(parser, "LOCALNAMESPACEPATH");     expectEndTag(parser, "LOCALNAMESPACEPATH");
Line 1928 
Line 2352 
         return false;         return false;
  
     if (!getHostElement(parser, host))     if (!getHostElement(parser, host))
         throw XmlValidationError(parser.getLine(), "expected HOST element");      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_HOST_ELEMENT",
               "expected HOST element");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     if (!getLocalNameSpacePathElement(parser, nameSpace))     if (!getLocalNameSpacePathElement(parser, nameSpace))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
             "expected LOCALNAMESPACEPATH element");             "expected LOCALNAMESPACEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     expectEndTag(parser, "NAMESPACEPATH");     expectEndTag(parser, "NAMESPACEPATH");
Line 1961 
Line 2392 
     {     {
         if (required)         if (required)
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
                 "expected CLASSNAME element");                 "expected CLASSNAME element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
         else         else
             return false;             return false;
Line 1970 
Line 2403 
     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
  
     className = getCimNameAttribute(     className = getCimNameAttribute(
         parser.getLine(), entry, "CLASSNAME", true);          parser.getLine(), entry, "CLASSNAME", false);
  
     if (!empty)     if (!empty)
         expectEndTag(parser, "CLASSNAME");         expectEndTag(parser, "CLASSNAME");
Line 1991 
Line 2424 
     const XmlEntry& entry,     const XmlEntry& entry,
     const char* elementName)     const char* elementName)
 { {
     String tmp;      const char* tmp;
  
     if (!entry.getAttributeValue("VALUETYPE", tmp))     if (!entry.getAttributeValue("VALUETYPE", tmp))
         return CIMKeyBinding::STRING;         return CIMKeyBinding::STRING;
  
     if (String::equal(tmp, "string"))      if (strcmp(tmp, "string") == 0)
         return CIMKeyBinding::STRING;         return CIMKeyBinding::STRING;
     else if (String::equal(tmp, "boolean"))      else if (strcmp(tmp, "boolean") == 0)
         return CIMKeyBinding::BOOLEAN;         return CIMKeyBinding::BOOLEAN;
     else if (String::equal(tmp, "numeric"))      else if (strcmp(tmp, "numeric") == 0)
         return CIMKeyBinding::NUMERIC;         return CIMKeyBinding::NUMERIC;
  
     char buffer[MESSAGE_SIZE];     char buffer[MESSAGE_SIZE];
       sprintf(buffer, "%s.VALUETYPE", elementName);
  
     sprintf(buffer,      MessageLoaderParms mlParms(
         "Illegal value for %s.VALUETYPE attribute; "          "Common.XmlReader.ILLEGAL_VALUE_FOR_CIMVALUE_ATTRIBUTE",
         "CIMValue must be one of \"string\", \"boolean\", or \"numeric\"",          "Illegal value for $0 attribute; CIMValue must be one of \"string\", "
         elementName);              "\"boolean\", or \"numeric\"",
           buffer);
       throw XmlSemanticError(lineNumber, mlParms);
  
     throw XmlSemanticError(lineNumber, buffer);  
     return CIMKeyBinding::BOOLEAN;     return CIMKeyBinding::BOOLEAN;
 } }
  
Line 2046 
Line 2481 
             throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());             throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
  
         if (entry.type == XmlEntry::CONTENT)         if (entry.type == XmlEntry::CONTENT)
             value = entry.text;              value = String(entry.text);
         else         else
             parser.putBack(entry);             parser.putBack(entry);
  
Line 2085 
Line 2520 
  
         if (!getValueReferenceElement(parser, reference))         if (!getValueReferenceElement(parser, reference))
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_KEYVALUE_OR_REFERENCE_ELEMENT",
                       "Expected KEYVALUE or VALUE.REFERENCE element");                       "Expected KEYVALUE or VALUE.REFERENCE element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
  
         type = CIMKeyBinding::REFERENCE;         type = CIMKeyBinding::REFERENCE;
Line 2152 
Line 2589 
     else     else
     {     {
         while (getKeyBindingElement(parser, name, value, type))         while (getKeyBindingElement(parser, name, value, type))
           {
             keyBindings.append(CIMKeyBinding(name, value, type));             keyBindings.append(CIMKeyBinding(name, value, type));
               if (keyBindings.size() > PEGASUS_MAXELEMENTS_NUM)
               {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.TOO_MANY_KEYBINDINGS",
                       "More than $0 key-value pairs per object path"
                           " are not supported.",
                       PEGASUS_MAXELEMENTS_NUM);
                   throw XmlValidationError(parser.getLine(), mlParms);
               }
           }
     }     }
  
     expectEndTag(parser, "INSTANCENAME");     expectEndTag(parser, "INSTANCENAME");
Line 2196 
Line 2644 
  
     if (!getNameSpacePathElement(parser, host, nameSpace))     if (!getNameSpacePathElement(parser, host, nameSpace))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_NAMESPACEPATH_ELEMENT",
             "expected NAMESPACEPATH element");             "expected NAMESPACEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     String className;     String className;
Line 2205 
Line 2655 
  
     if (!getInstanceNameElement(parser, className, keyBindings))     if (!getInstanceNameElement(parser, className, keyBindings))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
             "expected INSTANCENAME element");             "expected INSTANCENAME element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     reference.set(host, nameSpace, className, keyBindings);     reference.set(host, nameSpace, className, keyBindings);
Line 2236 
Line 2688 
  
     if (!getLocalNameSpacePathElement(parser, nameSpace))     if (!getLocalNameSpacePathElement(parser, nameSpace))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
             "expected LOCALNAMESPACEPATH element");             "expected LOCALNAMESPACEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     String className;     String className;
Line 2245 
Line 2699 
  
     if (!getInstanceNameElement(parser, className, keyBindings))     if (!getInstanceNameElement(parser, className, keyBindings))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
             "expected INSTANCENAME element");             "expected INSTANCENAME element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     reference.set(String(), nameSpace, className, keyBindings);     reference.set(String(), nameSpace, className, keyBindings);
Line 2277 
Line 2733 
  
     if (!getNameSpacePathElement(parser, host, nameSpace))     if (!getNameSpacePathElement(parser, host, nameSpace))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_NAMESPACEPATH_ELEMENT",
             "expected NAMESPACEPATH element");             "expected NAMESPACEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     CIMName className;     CIMName className;
  
     if (!getClassNameElement(parser, className))     if (!getClassNameElement(parser, className))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
             "expected CLASSNAME element");             "expected CLASSNAME element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     reference.set(host, nameSpace, className);     reference.set(host, nameSpace, className);
Line 2316 
Line 2776 
  
     if (!getLocalNameSpacePathElement(parser, nameSpace))     if (!getLocalNameSpacePathElement(parser, nameSpace))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
             "expected LOCALNAMESPACEPATH element");             "expected LOCALNAMESPACEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     CIMName className;     CIMName className;
  
     if (!getClassNameElement(parser, className))     if (!getClassNameElement(parser, className))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
             "expected CLASSNAME element");             "expected CLASSNAME element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     reference.set(String(), nameSpace, className);     reference.set(String(), nameSpace, className);
Line 2344 
Line 2808 
 // //
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
   //
   // Parses the input to a CIMObjectPath.  Note that today the differences
   // between ClassPath and InstancePath are lost in this mapping because
   // Pegasus uses the existence of keys as separator . See BUG_3302
 Boolean XmlReader::getValueReferenceElement( Boolean XmlReader::getValueReferenceElement(
     XmlParser& parser,     XmlParser& parser,
     CIMObjectPath& reference)     CIMObjectPath& reference)
Line 2360 
Line 2827 
     if (entry.type != XmlEntry::START_TAG &&     if (entry.type != XmlEntry::START_TAG &&
         entry.type != XmlEntry::EMPTY_TAG)         entry.type != XmlEntry::EMPTY_TAG)
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
             "Expected one of the following start tags: "              "Common.XmlReader.EXPECTED_START_TAGS",
             "CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, "              "Expected one of the following start tags: CLASSPATH, "
             "LOCALINSTANCEPATH, INSTANCENAME");                  "LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, LOCALINSTANCEPATH, "
                   "INSTANCENAME");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     if (strcmp(entry.text, "CLASSPATH") == 0)     if (strcmp(entry.text, "CLASSPATH") == 0)
Line 2532 
Line 3001 
         }         }
         catch (AlreadyExistsException&)         catch (AlreadyExistsException&)
         {         {
             throw XmlSemanticError(parser.getLine(), "duplicate property");              MessageLoaderParms mlParms(
                   "Common.XmlReader.DUPLICATE_PROPERTY",
                   "duplicate property");
               throw XmlSemanticError(parser.getLine(), mlParms);
         }         }
     }     }
 } }
Line 2715 
Line 3187 
     // Get PARAMETER.ARRAYSIZE attribute:     // Get PARAMETER.ARRAYSIZE attribute:
  
     Uint32 arraySize = 0;     Uint32 arraySize = 0;
     getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.REFARRAY",      getArraySizeAttribute(
                           arraySize);          parser.getLine(), entry, "PARAMETER.REFARRAY", arraySize);
  
     // Create parameter:     // Create parameter:
  
     parameter = CIMParameter(name, CIMTYPE_REFERENCE, true, arraySize,      parameter = CIMParameter(
                              referenceClass);          name, CIMTYPE_REFERENCE, true, arraySize, referenceClass);
  
     if (!empty)     if (!empty)
     {     {
Line 2754 
Line 3226 
         }         }
         catch (AlreadyExistsException&)         catch (AlreadyExistsException&)
         {         {
             throw XmlSemanticError(parser.getLine(), "duplicate parameter");              MessageLoaderParms mlParms(
                   "Common.XmlReader.DUPLICATE_PARAMETER",
                   "duplicate parameter");
               throw XmlSemanticError(parser.getLine(), mlParms);
         }         }
     }     }
 } }
Line 2803 
Line 3278 
     // Get ARRAYSIZE attribute:     // Get ARRAYSIZE attribute:
  
     Uint32 arraySize = 0;     Uint32 arraySize = 0;
     Boolean gotArraySize = getArraySizeAttribute(parser.getLine(),      getArraySizeAttribute(parser.getLine(),
         entry, "QUALIFIER.DECLARATION", arraySize);         entry, "QUALIFIER.DECLARATION", arraySize);
  
     // Get flavor oriented attributes:     // Get flavor oriented attributes:
Line 2829 
Line 3304 
         {         {
             if (!isArray)             if (!isArray)
             {             {
                 throw XmlSemanticError(parser.getLine(),                  MessageLoaderParms mlParms(
                     "VALUE.ARRAY element encountered without "                      "Common.XmlReader.ARRAY_WITHOUT_ISARRAY",
                     "ISARRAY attribute");                      "VALUE.ARRAY element encountered without ISARRAY "
                           "attribute");
                   throw XmlSemanticError(parser.getLine(), mlParms);
             }             }
  
             if (arraySize && arraySize != value.getArraySize())             if (arraySize && arraySize != value.getArraySize())
             {             {
                 throw XmlSemanticError(parser.getLine(),                  MessageLoaderParms mlParms(
                     "VALUE.ARRAY size is not the same as "                      "Common.XmlReader.ARRAY_SIZE_NOT_SAME",
                     "ARRAYSIZE attribute");                      "VALUE.ARRAY size is not the same as ARRAYSIZE attribute");
                   throw XmlSemanticError(parser.getLine(), mlParms);
             }             }
  
             gotValue = true;             gotValue = true;
Line 2847 
Line 3325 
         {         {
             if (isArray)             if (isArray)
             {             {
                 throw XmlSemanticError(parser.getLine(),                  MessageLoaderParms mlParms(
                       "Common.XmlReader.ARRAY_ATTRIBUTE_DIFFERENT",
                     "ISARRAY attribute used but VALUE element encountered");                     "ISARRAY attribute used but VALUE element encountered");
                   throw XmlSemanticError(parser.getLine(), mlParms);
             }             }
  
             gotValue = true;             gotValue = true;
Line 2894 
Line 3374 
  
     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
  
     CIMName name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");      CIMName name = getCimNameAttribute(parser.getLine(), entry, "METHOD");
  
     CIMType type;     CIMType type;
     getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY");      getCimTypeAttribute(parser.getLine(), entry, type, "METHOD");
  
     CIMName classOrigin =     CIMName classOrigin =
         getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");          getClassOriginAttribute(parser.getLine(), entry, "METHOD");
  
     Boolean propagated = getCimBooleanAttribute(     Boolean propagated = getCimBooleanAttribute(
         parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);          parser.getLine(), entry, "METHOD", "PROPAGATED", false, false);
  
     method = CIMMethod(name, type, classOrigin, propagated);     method = CIMMethod(name, type, classOrigin, propagated);
  
Line 2934 
Line 3414 
 { {
     XmlEntry entry;     XmlEntry entry;
  
     if (!testStartTag(parser, entry, "CLASS"))      if (!testStartTagOrEmptyTag(parser, entry, "CLASS"))
         return false;         return false;
  
     CIMName name = getCimNameAttribute(parser.getLine(), entry, "CLASS");     CIMName name = getCimNameAttribute(parser.getLine(), entry, "CLASS");
  
     CIMName superClass = getSuperClassAttribute(parser.getLine(), entry,"CLASS");      CIMName superClass =
           getSuperClassAttribute(parser.getLine(), entry,"CLASS");
  
     cimClass = CIMClass(name, superClass);     cimClass = CIMClass(name, superClass);
  
       if (entry.type != XmlEntry::EMPTY_TAG)
       {
     // Get QUALIFIER elements:     // Get QUALIFIER elements:
  
     getQualifierElements(parser, cimClass);     getQualifierElements(parser, cimClass);
Line 2961 
Line 3444 
     // Get CLASS end tag:     // Get CLASS end tag:
  
     expectEndTag(parser, "CLASS");     expectEndTag(parser, "CLASS");
       }
  
     return true;     return true;
 } }
Line 2981 
Line 3465 
 { {
     XmlEntry entry;     XmlEntry entry;
  
     if (!testStartTag(parser, entry, "INSTANCE"))      if (!testStartTagOrEmptyTag(parser, entry, "INSTANCE"))
         return false;         return false;
  
       Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
   
     String className = getClassNameAttribute(     String className = getClassNameAttribute(
         parser.getLine(), entry, "INSTANCE");         parser.getLine(), entry, "INSTANCE");
  
     cimInstance = CIMInstance(className);     cimInstance = CIMInstance(className);
  
       if (!empty)
       {
     // Get QUALIFIER elements:     // Get QUALIFIER elements:
   
     getQualifierElements(parser, cimInstance);     getQualifierElements(parser, cimInstance);
  
     // Get PROPERTY elements:     // Get PROPERTY elements:
           GetPropertyElements(parser, cimInstance);
   
           // Get INSTANCE end tag:
           expectEndTag(parser, "INSTANCE");
       }
   
       return true;
   }
   
   //------------------------------------------------------------------------------
   // getNamedInstanceElement()
   //
   //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::getNamedInstanceElement(
       XmlParser& parser,
       CIMInstance& namedInstance)
   {
       XmlEntry entry;
   
       if (!testStartTag(parser, entry, "VALUE.NAMEDINSTANCE"))
           return false;
   
       CIMObjectPath instanceName;
   
       // Get INSTANCENAME elements:
   
       if (!getInstanceNameElement(parser, instanceName))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
               "expected INSTANCENAME element");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
       // Get INSTANCE elements:
   
       if (!getInstanceElement(parser, namedInstance))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
               "expected INSTANCE element");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     GetPropertyElements(parser, cimInstance);      // Get VALUE.NAMEDINSTANCE end tag:
  
     // Get INSTANCE end tag:      expectEndTag(parser, "VALUE.NAMEDINSTANCE");
  
     expectEndTag(parser, "INSTANCE");      namedInstance.setPath (instanceName);
  
     return true;     return true;
 } }
  
   
   //EXP_PULL_BEGIN
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // getNamedInstanceElement()  // getInstanceWithPathElement()
 // //
 //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)> //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
 Boolean XmlReader::getNamedInstanceElement(  Boolean XmlReader::getInstanceWithPathElement(
     XmlParser& parser,     XmlParser& parser,
     CIMInstance& namedInstance)     CIMInstance& namedInstance)
 { {
     XmlEntry entry;     XmlEntry entry;
       if (!testStartTag(parser, entry, "VALUE.INSTANCEWITHPATH"))
     if (!testStartTag(parser, entry, "VALUE.NAMEDINSTANCE"))  
         return false;         return false;
  
     CIMObjectPath instanceName;     CIMObjectPath instanceName;
  
     // Get INSTANCENAME elements:     // Get INSTANCENAME elements:
       if (!getInstancePathElement(parser, instanceName))
     if (!getInstanceNameElement(parser, instanceName))  
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
             "expected INSTANCENAME element");              "Common.XmlReader.EXPECTED_INSTANCEPATH_ELEMENT",
               "expected INSTANCEPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     // Get INSTANCE elements:     // Get INSTANCE elements:
  
     if (!getInstanceElement(parser, namedInstance))     if (!getInstanceElement(parser, namedInstance))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
             "expected INSTANCE element");             "expected INSTANCE element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
   
     // Get VALUE.NAMEDINSTANCE end tag:     // Get VALUE.NAMEDINSTANCE end tag:
  
     expectEndTag(parser, "VALUE.NAMEDINSTANCE");      expectEndTag(parser, "VALUE.INSTANCEWITHPATH");
  
     namedInstance.setPath (instanceName);     namedInstance.setPath (instanceName);
  
     return true;     return true;
 } }
  
   //EXP_PULL_END
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // getObject() // getObject()
Line 3057 
Line 3595 
 { {
     if (!getClassElement(parser, x))     if (!getClassElement(parser, x))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_CLASS_ELEMENT",
             "expected CLASS element");             "expected CLASS element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
 } }
  
Line 3072 
Line 3612 
 { {
     if (!getInstanceElement(parser, x))     if (!getInstanceElement(parser, x))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
             "expected INSTANCE element");             "expected INSTANCE element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
 } }
  
Line 3087 
Line 3629 
 { {
     if (!getQualifierDeclElement(parser, x))     if (!getQualifierDeclElement(parser, x))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_QUALIFIER_DECLARATION_ELEMENT",
             "expected QUALIFIER.DECLARATION element");             "expected QUALIFIER.DECLARATION element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
 } }
  
Line 3111 
Line 3655 
     // Get MESSAGE.ID:     // Get MESSAGE.ID:
  
     if (!entry.getAttributeValue("ID", id))     if (!entry.getAttributeValue("ID", id))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.INVALID_MISSING_MESSAGE_ID_ATTRIBUTE",
             "Invalid or missing MESSAGE.ID attribute");             "Invalid or missing MESSAGE.ID attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
  
     // Get MESSAGE.PROTOCOLVERSION:     // Get MESSAGE.PROTOCOLVERSION:
  
     if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion))     if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.INVALID_MISSING_PROTOCOLVERSION_ATTRIBUTE",
             "Invalid or missing MESSAGE.PROTOCOLVERSION attribute");             "Invalid or missing MESSAGE.PROTOCOLVERSION attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     return true;     return true;
 } }
Line 3140 
Line 3693 
  
     // Get IMETHODCALL.NAME attribute:     // Get IMETHODCALL.NAME attribute:
  
   
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_IMETHODCALL_ATTRIBUTE",
             "Missing IMETHODCALL.NAME attribute");             "Missing IMETHODCALL.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
  
     return true;     return true;
 } }
Line 3155 
Line 3714 
  
 Boolean XmlReader::getIMethodResponseStartTag( Boolean XmlReader::getIMethodResponseStartTag(
     XmlParser& parser,     XmlParser& parser,
     const char*& name)      const char*& name,
       Boolean& isEmptyTag)
 { {
     XmlEntry entry;     XmlEntry entry;
  
     if (!testStartTag(parser, entry, "IMETHODRESPONSE"))      if (!testStartTagOrEmptyTag(parser, entry, "IMETHODRESPONSE"))
         return false;         return false;
  
       isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
   
     // Get IMETHODRESPONSE.NAME attribute:     // Get IMETHODRESPONSE.NAME attribute:
  
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_IMETHODRESPONSE_ATTRIBUTE",
             "Missing IMETHODRESPONSE.NAME attribute");             "Missing IMETHODRESPONSE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
  
     return true;     return true;
 } }
Line 3179 
Line 3746 
  
 Boolean XmlReader::getIParamValueTag( Boolean XmlReader::getIParamValueTag(
     XmlParser& parser,     XmlParser& parser,
     const char*& name)      const char*& name,
       Boolean& isEmptyTag)
 { {
     XmlEntry entry;     XmlEntry entry;
  
     if (!testStartTag(parser, entry, "IPARAMVALUE"))      if (!testStartTagOrEmptyTag(parser, entry, "IPARAMVALUE"))
         return false;         return false;
  
       isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
   
     // Get IPARAMVALUE.NAME attribute:     // Get IPARAMVALUE.NAME attribute:
  
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_IPARAMVALUE_ATTRIBUTE",
             "Missing IPARAMVALUE.NAME attribute");             "Missing IPARAMVALUE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
       return true;
   }
   
   //EXP_PULL_BEGIN
   //------------------------------------------------------------------------------
   //
   // getIParamValueTag()
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::getParamValueTag(
       XmlParser& parser,
       const char*& name,
       Boolean& isEmptyTag)
   {
       XmlEntry entry;
   
       if (!testStartTagOrEmptyTag(parser, entry, "PARAMVALUE"))
       {
   
           return false;
       }
   
       isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
   
       // Get PARAMVALUE.NAME attribute:
   
       if (!entry.getAttributeValue("NAME", name))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_PARAMVALUE_ATTRIBUTE",
               "Missing PARAMVALUE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
       return true;
   }
   //------------------------------------------------------------------------------
   //
   // getIReturnValueTag()
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::getIReturnValueTag(
       XmlParser& parser,
       const char*& name,
       Boolean& isEmptyTag)
   {
       XmlEntry entry;
       if (!testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
           return false;
       //entry.print();
       isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
  
       if (!entry.getAttributeValue("NAME", name))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_IRETURNVALUE_ATTRIBUTE",
               "Missing IRETURNVALUE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
     return true;     return true;
 } }
  
   //EXP_PULL_END
   //------------------------------------------------------------------------------
   //
   // rejectNullIParamValue()
   //
   //------------------------------------------------------------------------------
   
   void XmlReader::rejectNullIParamValue(
       XmlParser& parser,
       Boolean isEmptyTag,
       const char* paramName)
   {
       if (isEmptyTag)
       {
           MessageLoaderParms mlParms("Common.XmlReader.INVALID_NULL_IPARAMVALUE",
               "A null value is not valid for IPARAMVALUE \"$0\".",
               paramName);
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   }
   
   // EXP_PULL_BEGIN
   //------------------------------------------------------------------------------
   //
   // rejectNullIReturnParamValue()
   //
   //------------------------------------------------------------------------------
   
   void XmlReader::rejectNullIReturnValue(
       XmlParser& parser,
       Boolean isEmptyTag,
       const char* paramName)
   {
       if (isEmptyTag)
       {
           MessageLoaderParms mlParms("Common.XmlReader.INVALID_NULL_IRETURNVALUE",
               "A null value is not valid for IRETURNVALUE \"$0\".",
               paramName);
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   }
   
   void XmlReader::rejectNullParamValue(
       XmlParser& parser,
       Boolean isEmptyTag,
       const char* paramName)
   {
       if (isEmptyTag)
       {
           MessageLoaderParms mlParms("Common.XmlReader.INVALID_NULL_PARAMVALUE",
               "A null value is not valid for PARAMVALUE \"$0\".",
               paramName);
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   }
   // EXP_PULL_END
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // getBooleanValueElement() // getBooleanValueElement()
Line 3214 
Line 3904 
     {     {
         if (required)         if (required)
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_VALUE_ELEMENT",
                 "Expected VALUE element");                 "Expected VALUE element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
         return false;         return false;
     }     }
Line 3227 
Line 3919 
     else if (System::strcasecmp(entry.text, "FALSE") == 0)     else if (System::strcasecmp(entry.text, "FALSE") == 0)
         result = false;         result = false;
     else     else
         throw XmlSemanticError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.INVALID_VALUE_FOR_VALUE_ELEMENT",
             "Invalid value for VALUE element: must be \"TRUE\" or \"FALSE\"");             "Invalid value for VALUE element: must be \"TRUE\" or \"FALSE\"");
           throw XmlSemanticError(parser.getLine(), mlParms);
       }
  
     expectEndTag(parser, "VALUE");     expectEndTag(parser, "VALUE");
  
Line 3237 
Line 3933 
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // //
 // getErrorElement()  //     DMTF CR Pending
 // //
 //     <!ELEMENT ERROR EMPTY>  //     <!ELEMENT ERROR (INSTANCE*)>
 //     <!ATTLIST ERROR //     <!ATTLIST ERROR
 //         CODE CDATA #REQUIRED //         CODE CDATA #REQUIRED
 //         DESCRIPTION CDATA #IMPLIED> //         DESCRIPTION CDATA #IMPLIED>
Line 3256 
Line 3952 
     if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))     if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))
     {     {
         if (required)         if (required)
             throw XmlValidationError(parser.getLine(),"Expected ERROR element");          {
               MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_ERROR_ELEMENT",
                   "Expected ERROR element");
               throw XmlValidationError(parser.getLine(), mlParms);
           }
         return false;         return false;
     }     }
  
Line 3267 
Line 3968 
     Uint32 tmpCode;     Uint32 tmpCode;
  
     if (!entry.getAttributeValue("CODE", tmpCode))     if (!entry.getAttributeValue("CODE", tmpCode))
         throw XmlValidationError(      {
             parser.getLine(), "missing ERROR.CODE attribute");          MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_ERROR_CODE_ATTRIBUTE",
               "missing ERROR.CODE attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     // Get ERROR.DESCRIPTION:     // Get ERROR.DESCRIPTION:
  
Line 3276 
Line 3981 
  
     entry.getAttributeValue("DESCRIPTION", tmpDescription);     entry.getAttributeValue("DESCRIPTION", tmpDescription);
  
       cimException =
           PEGASUS_CIM_EXCEPTION(CIMStatusCode(tmpCode), tmpDescription);
   
     if (!empty)     if (!empty)
       {
           CIMInstance instance;
   
           while (getInstanceElement(parser, instance))
           {
               cimException.addError(instance);
           }
   
         expectEndTag(parser, "ERROR");         expectEndTag(parser, "ERROR");
       }
  
     cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(tmpCode), tmpDescription);  
     return true;     return true;
 } }
  
   
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
 // getValueObjectElement() // getValueObjectElement()
 // //
Line 3307 
Line 4022 
     {     {
         object = CIMObject(cimInstance);         object = CIMObject(cimInstance);
     }     }
     else if (!XmlReader::getClassElement(parser, cimClass))      else if (XmlReader::getClassElement(parser, cimClass))
     {     {
         object = CIMObject(cimClass);         object = CIMObject(cimClass);
     }     }
     else     else
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCE_OR_CLASS_ELEMENT",
             "Expected INSTANCE or CLASS element");             "Expected INSTANCE or CLASS element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     expectEndTag(parser, "VALUE.OBJECT");     expectEndTag(parser, "VALUE.OBJECT");
Line 3345 
Line 4062 
         isInstance = true;         isInstance = true;
     else if (!XmlReader::getClassPathElement(parser, reference))     else if (!XmlReader::getClassPathElement(parser, reference))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCEPATH_OR_CLASSPATH_ELEMENT",
             "Expected INSTANCEPATH or CLASSPATH element");             "Expected INSTANCEPATH or CLASSPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     if (isInstance)     if (isInstance)
Line 3355 
Line 4074 
  
         if (!XmlReader::getInstanceElement(parser, cimInstance))         if (!XmlReader::getInstanceElement(parser, cimInstance))
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
                 "Expected INSTANCE element");                 "Expected INSTANCE element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
         objectWithPath = CIMObject (cimInstance);         objectWithPath = CIMObject (cimInstance);
         objectWithPath.setPath (reference);         objectWithPath.setPath (reference);
Line 3367 
Line 4088 
  
         if (!XmlReader::getClassElement(parser, cimClass))         if (!XmlReader::getClassElement(parser, cimClass))
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_CLASS_ELEMENT",
                 "Expected CLASS element");                 "Expected CLASS element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
         objectWithPath = CIMObject (cimClass);         objectWithPath = CIMObject (cimClass);
         objectWithPath.setPath (reference);         objectWithPath.setPath (reference);
Line 3403 
Line 4126 
         isInstance = true;         isInstance = true;
     else if (!XmlReader::getLocalClassPathElement(parser, reference))     else if (!XmlReader::getLocalClassPathElement(parser, reference))
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
             "Expected LOCALINSTANCEPATH or LOCALCLASSPATH element");              "Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
               MISSING_ELEMENT_LOCALPATH);
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     if (isInstance)     if (isInstance)
Line 3413 
Line 4138 
  
         if (!XmlReader::getInstanceElement(parser, cimInstance))         if (!XmlReader::getInstanceElement(parser, cimInstance))
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
                 "Expected INSTANCE element");                 "Expected INSTANCE element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
         objectWithPath = CIMObject (cimInstance);         objectWithPath = CIMObject (cimInstance);
         objectWithPath.setPath (reference);         objectWithPath.setPath (reference);
Line 3425 
Line 4152 
  
         if (!XmlReader::getClassElement(parser, cimClass))         if (!XmlReader::getClassElement(parser, cimClass))
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_CLASS_ELEMENT",
                 "Expected CLASS element");                 "Expected CLASS element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
         objectWithPath = CIMObject (cimClass);         objectWithPath = CIMObject (cimClass);
         objectWithPath.setPath (reference);         objectWithPath.setPath (reference);
Line 3480 
Line 4209 
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
  
   // Returns true if ClassNameElement or false if InstanceNameElement
   // Parse errors always throw exception
 Boolean XmlReader::getObjectNameElement( Boolean XmlReader::getObjectNameElement(
     XmlParser& parser,     XmlParser& parser,
     CIMObjectPath& objectName)     CIMObjectPath& objectName)
Line 3489 
Line 4220 
     if (getClassNameElement(parser, className, false))     if (getClassNameElement(parser, className, false))
     {     {
         objectName.set(String(), CIMNamespaceName(), className);         objectName.set(String(), CIMNamespaceName(), className);
   
           // Return flag indicating this is ClassNameElement
         return true;         return true;
     }     }
     else if (getInstanceNameElement(parser, objectName))  
         return true;      if (!getInstanceNameElement(parser, objectName))
     else  
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
             "expected CLASSNAME or INSTANCENAME element");              "Common.XmlReader.EXPECTED_CLASSNAME_OR_INSTANCENAME_ELEMENT",
               "Expected CLASSNAME or INSTANCENAME element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
       // Return flag indicating this is InstanceNameElement
     return false;     return false;
 } }
  
Line 3517 
Line 4252 
     if (!testStartTag(parser, entry, "OBJECTPATH"))     if (!testStartTag(parser, entry, "OBJECTPATH"))
         return false;         return false;
  
     if (getClassPathElement(parser, objectPath))      if (!getClassPathElement(parser, objectPath) &&
     {          !getInstancePathElement(parser, objectPath))
         expectEndTag(parser, "OBJECTPATH");  
         return true;  
     }  
     else if (getInstancePathElement(parser, objectPath))  
     {  
         expectEndTag(parser, "OBJECTPATH");  
         return true;  
     }  
     else  
     {     {
         throw XmlValidationError(parser.getLine(),          MessageLoaderParms mlParms(
               "Common.XmlReader.EXPECTED_INSTANCEPATH_OR_CLASSPATH_ELEMENT",
             "expected INSTANCEPATH or CLASSPATH element");             "expected INSTANCEPATH or CLASSPATH element");
           throw XmlValidationError(parser.getLine(), mlParms);
     }     }
  
     PEGASUS_UNREACHABLE ( return false; )      expectEndTag(parser, "OBJECTPATH");
       return true;
 } }
  
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 3553 
Line 4282 
  
     // Get EXPMETHODCALL.NAME attribute:     // Get EXPMETHODCALL.NAME attribute:
  
   
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_EXPMETHODCALL_ATTRIBUTE",
             "Missing EXPMETHODCALL.NAME attribute");             "Missing EXPMETHODCALL.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     return true;     return true;
 } }
Line 3568 
Line 4302 
  
 Boolean XmlReader::getEMethodResponseStartTag( Boolean XmlReader::getEMethodResponseStartTag(
     XmlParser& parser,     XmlParser& parser,
     const char*& name)      const char*& name,
       Boolean& isEmptyTag)
 { {
     XmlEntry entry;     XmlEntry entry;
  
     if (!testStartTag(parser, entry, "EXPMETHODRESPONSE"))      if (!testStartTagOrEmptyTag(parser, entry, "EXPMETHODRESPONSE"))
         return false;         return false;
  
       isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
   
     // Get EXPMETHODRESPONSE.NAME attribute:     // Get EXPMETHODRESPONSE.NAME attribute:
  
   
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_EXPMETHODRESPONSE_ATTRIBUTE",
             "Missing EXPMETHODRESPONSE.NAME attribute");             "Missing EXPMETHODRESPONSE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
       return true;
   }
   
   //------------------------------------------------------------------------------
   //
   // getEParamValueTag()
   //
   //------------------------------------------------------------------------------
   
   Boolean XmlReader::getEParamValueTag(
       XmlParser& parser,
       const char*& name)
   {
       XmlEntry entry;
   
       if (!testStartTag(parser, entry, "EXPPARAMVALUE"))
           return false;
   
       // Get EXPPARAMVALUE.NAME attribute:
   
   
       if (!entry.getAttributeValue("NAME", name))
       {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_EXPPARAMVALUE_ATTRIBUTE",
               "Missing EXPPARAMVALUE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
   
  
     return true;     return true;
 } }
Line 3601 
Line 4374 
  
     // Get METHODCALL.NAME attribute:     // Get METHODCALL.NAME attribute:
  
   
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_METHODCALL_ATTRIBUTE",
             "Missing METHODCALL.NAME attribute");             "Missing METHODCALL.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
  
     return true;     return true;
 } }
Line 3616 
Line 4395 
  
 Boolean XmlReader::getMethodResponseStartTag( Boolean XmlReader::getMethodResponseStartTag(
     XmlParser& parser,     XmlParser& parser,
     const char*& name)      const char*& name,
       Boolean& isEmptyTag)
 { {
     XmlEntry entry;     XmlEntry entry;
  
     if (!testStartTag(parser, entry, "METHODRESPONSE"))      if (!testStartTagOrEmptyTag(parser, entry, "METHODRESPONSE"))
         return false;         return false;
  
       isEmptyTag = (entry.type == XmlEntry::EMPTY_TAG);
   
     // Get METHODRESPONSE.NAME attribute:     // Get METHODRESPONSE.NAME attribute:
  
   
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_METHODRESPONSE_ATTRIBUTE",
             "Missing METHODRESPONSE.NAME attribute");             "Missing METHODRESPONSE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
  
     return true;     return true;
 } }
Line 3639 
Line 4426 
 // <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?> // <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
 // <!ATTLIST PARAMVALUE // <!ATTLIST PARAMVALUE
 //      %CIMName; //      %CIMName;
   //      %EmbeddedObject; #IMPLIED
 //      %ParamType;> //      %ParamType;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 3649 
Line 4437 
 { {
     XmlEntry entry;     XmlEntry entry;
     const char* name;     const char* name;
     CIMType type;      CIMType type=CIMTYPE_BOOLEAN;
     CIMValue value;     CIMValue value;
  
     if (!testStartTagOrEmptyTag(parser, entry, "PARAMVALUE"))     if (!testStartTagOrEmptyTag(parser, entry, "PARAMVALUE"))
Line 3660 
Line 4448 
     // Get PARAMVALUE.NAME attribute:     // Get PARAMVALUE.NAME attribute:
  
     if (!entry.getAttributeValue("NAME", name))     if (!entry.getAttributeValue("NAME", name))
         throw XmlValidationError(parser.getLine(),      {
           MessageLoaderParms mlParms(
               "Common.XmlReader.MISSING_PARAMVALUE_ATTRIBUTE",
             "Missing PARAMVALUE.NAME attribute");             "Missing PARAMVALUE.NAME attribute");
           throw XmlValidationError(parser.getLine(), mlParms);
       }
   
       // Get PROPERTY.EmbeddedObject
   
       EmbeddedObjectAttributeType embeddedObject = getEmbeddedObjectAttribute(
           parser.getLine(), entry, "PARAMVALUE");
  
     // Get PARAMVALUE.PARAMTYPE attribute:     // Get PARAMVALUE.PARAMTYPE attribute:
  
     Boolean gotType = getCimTypeAttribute(parser.getLine(), entry, type,     Boolean gotType = getCimTypeAttribute(parser.getLine(), entry, type,
                                           "PARAMVALUE", "PARAMTYPE", false);                                           "PARAMVALUE", "PARAMTYPE", false);
  
     if (!empty)      if (empty)
       {
           gotType = false; // Can't distinguish array and non-array types
       }
       else
     {     {
         // Parse VALUE.REFERENCE and VALUE.REFARRAY type         // Parse VALUE.REFERENCE and VALUE.REFARRAY type
         if ( (type == CIMTYPE_REFERENCE) || !gotType )         if ( (type == CIMTYPE_REFERENCE) || !gotType )
Line 3685 
Line 4486 
                 type = CIMTYPE_REFERENCE;                 type = CIMTYPE_REFERENCE;
                 gotType = true;                 gotType = true;
             }             }
             // If type==reference but no VALUE.REFERENCE found, use null value              else
               {
                   gotType = false; // Can't distinguish array and non-array types
               }
         }         }
  
         // Parse non-reference value         // Parse non-reference value
Line 3702 
Line 4506 
                 effectiveType = type;                 effectiveType = type;
             }             }
  
             if ( !XmlReader::getValueArrayElement(parser, effectiveType, value) &&              // If the EmbeddedObject attribute is present with value "object"
                  !XmlReader::getValueElement(parser, effectiveType, value) )              // then
               //     Convert the EmbeddedObject-encoded string into a CIMObject
               if (embeddedObject != NO_EMBEDDED_OBJECT)
               {
                   // The EmbeddedObject attribute is only valid on Parameters
                   // of type string
                   // The type must have been specified.
                   if (gotType && (type == CIMTYPE_STRING))
                   {
                     if (embeddedObject == EMBEDDED_OBJECT_ATTR)
                         // Used below by getValueElement() or
                         // getValueArrayElement()
                         effectiveType = CIMTYPE_OBJECT;
                     else
                         effectiveType = CIMTYPE_INSTANCE;
                   }
                   else
                   {
                       MessageLoaderParms mlParms(
                           "Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
                           "The EmbeddedObject attribute is only valid on "
                               "string types.");
                       throw XmlValidationError(parser.getLine(), mlParms);
                   }
               }
   
               if (!XmlReader::getValueArrayElement(parser, effectiveType, value)
                   && !XmlReader::getValueElement(parser, effectiveType, value))
             {             {
                   gotType = false; // Can't distinguish array and non-array types
                 value.clear();    // Isn't necessary; should already be cleared                 value.clear();    // Isn't necessary; should already be cleared
             }             }
         }         }
Line 3723 
Line 4555 
 // //
 // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)> // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
 // <!ATTLIST RETURNVALUE // <!ATTLIST RETURNVALUE
   //      %EmbeddedObject; #IMPLIED
 //      %ParamType;> //      %ParamType;>
 // //
 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------
Line 3738 
Line 4571 
     if (!testStartTag(parser, entry, "RETURNVALUE"))     if (!testStartTag(parser, entry, "RETURNVALUE"))
         return false;         return false;
  
       // Get PROPERTY.EmbeddedObject
   
       EmbeddedObjectAttributeType embeddedObject = getEmbeddedObjectAttribute(
           parser.getLine(), entry, "RETURNVALUE");
   
     // Get RETURNVALUE.PARAMTYPE attribute:     // Get RETURNVALUE.PARAMTYPE attribute:
     // NOTE: Array type return values are not allowed (2/20/02)     // NOTE: Array type return values are not allowed (2/20/02)
  
Line 3756 
Line 4594 
         }         }
         else if (type == CIMTYPE_REFERENCE)         else if (type == CIMTYPE_REFERENCE)
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_VALUE_REFERENCE_ELEMENT",
                 "expected VALUE.REFERENCE element");                 "expected VALUE.REFERENCE element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
     }     }
  
Line 3769 
Line 4609 
             // If we don't know what type the value is, read it as a String             // If we don't know what type the value is, read it as a String
             type = CIMTYPE_STRING;             type = CIMTYPE_STRING;
         }         }
           if (embeddedObject != NO_EMBEDDED_OBJECT)
           {
               if (gotType && (type == CIMTYPE_STRING))
               {
                   if (embeddedObject == EMBEDDED_OBJECT_ATTR)
                       // Used below by getValueElement() or getValueArrayElement()
                       type = CIMTYPE_OBJECT;
                   else
                     type = CIMTYPE_INSTANCE;
               }
               else
               {
                   MessageLoaderParms mlParms(
                       "Common.XmlReader.INVALID_EMBEDDEDOBJECT_TYPE",
                       "The EmbeddedObject attribute is only valid on string "
                           "types.");
                   throw XmlValidationError(parser.getLine(), mlParms);
               }
           }
         if ( !XmlReader::getValueElement(parser, type, returnValue) )         if ( !XmlReader::getValueElement(parser, type, returnValue) )
         {         {
             throw XmlValidationError(parser.getLine(),              MessageLoaderParms mlParms(
                   "Common.XmlReader.EXPECTED_VALUE_ELEMENT",
                 "expected VALUE element");                 "expected VALUE element");
               throw XmlValidationError(parser.getLine(), mlParms);
         }         }
     }     }
  
Line 3782 
Line 4642 
     return true;     return true;
 } }
  
   //-----------------------------------------------------------------------------
   //
   // The following is a common set of version tests used by the different
   // Pegasus Request and Response Decoders
   //
   //------------------------------------------------------------------------------
   //
   // isSupportedCIMVersion()
   // tests for valid CIMVersion number
   //
   // Reject cimVersion not in 2.[0-9]+
   //
   // CIMXML Secification, Version 2.2 Final, Sect 3.2.1.1
   // The CIMVERSION attribute defines the version of the CIM Specification to
   // which the XML Document conforms.  It MUST be in the form of "M.N".  Where
   // M is the Major Version of the specification in numeric form and N is the
   // minor version of the specification in numeric form.  For example, "2.0",
   // "2.1".  Implementations must only validate the major version as all minor
   // versions are backward compatible.  Implementations may look at the minor
   // version to determine additional capabilites.
   //
   //------------------------------------------------------------------------------
   Boolean XmlReader::isSupportedCIMVersion(
       const char* cimVersion)
   {
       Boolean cimVersionAccepted = false;
       //printf("testCIMVersion %s \n", cimVersion);
       if ((cimVersion[0] == '2') &&
           (cimVersion[1] == '.') &&
           (cimVersion[2] != 0))
       {
           // Verify that all characters after the '.' are digits
           Uint32 index = 2;
           while (isdigit(cimVersion[index]))
           {
               index++;
           }
   
           if (cimVersion[index] == 0)
           {
              cimVersionAccepted = true;
           }
       }
       return cimVersionAccepted;
   }
   
   //------------------------------------------------------------------------------
   //
   // isSupportedProtocolVersion()
   // tests for valid ProtocolVersion number
   //
   // Reject ProtocolVersion not 1.[0-9]
   //
   // cimxml spec 2.2 Final Section 3261
   // The PROTOCOLVERSION attribute defines the version of the CIM Operations to
   // which this message conforms.  It MUST be in the form of  "M.N". Where M is
   // the Major Version of the specification in numeric form and N is the minor
   // version of the specification in numeric form.  For example, "1.0", "1.1".
   // Implementations must only validate the major version as all minor versions
   // are backward compatible. Implementations may look at the minor version to
   // determine additional capabilites.
   //
   //------------------------------------------------------------------------------
   Boolean XmlReader::isSupportedProtocolVersion(
       const String& protocolVersion)
   {
       Boolean protocolVersionAccepted = false;
   
       //cout << "testProtocolVersion " << protocolVersion << endl;
       if ((protocolVersion.size() >= 3) &&
           (protocolVersion[0] == '1') &&
           (protocolVersion[1] == '.'))
       {
           // Verify that all characters after the '.' are digits
           Uint32 index = 2;
           while ((index < protocolVersion.size()) &&
                  (protocolVersion[index] >= '0') &&
                  (protocolVersion[index] <= '9'))
           {
               index++;
           }
   
           if (index == protocolVersion.size())
           {
               protocolVersionAccepted = true;
           }
       }
       return protocolVersionAccepted;
   }
   
   //------------------------------------------------------------------------------
   //
   // isSupportedDTDVersion()
   // Tests for Valid dtdVersion number
   // We accept DTD version 2.[0-9]+ (see Bugzilla 1556)//
   //
   // CIM/XML Specification, V 2.2 Final, Section 3.2.1.1
   // The DTDVERSION attribute defines the version of the CIM XML Mapping to
   // which the XML Document conforms.  It MUST be in the form of "M.N".  Where
   // M is the Major Version of the specification in numeric form and N is the
   // minor version of the specification in numeric form.  For example, "2.0",
   // "2.1".  Implementations must only validate the major version as all minor
   // versions are backward compatible.  Implementations may look at the minor
   // version to determine additional capabilites.
   //
   //------------------------------------------------------------------------------
   Boolean XmlReader::isSupportedDTDVersion(
       const char* dtdVersion)
   {
       Boolean dtdVersionAccepted = false;
   
       //printf("testDTDVersion %s \n", dtdVersion);
       if ((dtdVersion[0] == '2') &&
           (dtdVersion[1] == '.') &&
           (dtdVersion[2] != 0))
       {
           // Verify that all characters after the '.' are digits
           Uint32 index = 2;
           while (isdigit(dtdVersion[index]))
           {
               index++;
           }
   
           if (dtdVersion[index] == 0)
           {
              dtdVersionAccepted = true;
           }
       }
       return dtdVersionAccepted;
   }
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END


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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2