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

   1 mike  1.25 //%/////////////////////////////////////////////////////////////////////////////
   2 mike  1.23 //
   3 kumpf 1.58 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
   4 mike  1.25 // The Open Group, Tivoli Systems
   5 mike  1.23 //
   6            // Permission is hereby granted, free of charge, to any person obtaining a copy
   7 kumpf 1.58 // of this software and associated documentation files (the "Software"), to
   8            // deal in the Software without restriction, including without limitation the
   9            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  10 mike  1.23 // sell copies of the Software, and to permit persons to whom the Software is
  11            // furnished to do so, subject to the following conditions:
  12            // 
  13 kumpf 1.58 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  14 mike  1.23 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  15            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  16 kumpf 1.58 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  17            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  19 mike  1.23 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21            //
  22            //==============================================================================
  23            //
  24            // Author: Mike Brasher (mbrasher@bmc.com)
  25            //
  26 mike  1.25 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
  27            //                  (carolann_graves@hp.com)
  28            //              Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
  29            //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
  30 mike  1.23 //
  31            //%/////////////////////////////////////////////////////////////////////////////
  32 mday  1.45 #include <Pegasus/Common/Config.h>
  33 mike  1.23 #include <cctype>
  34            #include <cstdio>
  35            #include <cstdlib>
  36 ramnath 1.46 #if defined(PEGASUS_OS_TYPE_UNIX)
  37 mday    1.45 #include <errno.h>
  38              #endif
  39 mike    1.23 #include "CIMName.h"
  40              #include "XmlReader.h"
  41              #include "XmlWriter.h"
  42              #include "CIMQualifier.h"
  43              #include "CIMQualifierDecl.h"
  44              #include "CIMClass.h"
  45              #include "CIMInstance.h"
  46              #include "CIMObject.h"
  47 mike    1.25 #include "CIMParamValue.h"
  48 kumpf   1.72 #include "System.h"
  49 humberto 1.91 #include "XmlConstants.h"
  50 david    1.86 #ifdef PEGASUS_PLATFORM_OS400_ISERIES_IBM
  51               #include "OS400ConvertChar.h"
  52               #endif
  53 humberto 1.85 // l10n
  54               #include <Pegasus/Common/MessageLoader.h>
  55               
  56 kumpf    1.82 #define PEGASUS_SINT64_MIN (PEGASUS_SINT64_LITERAL(0x8000000000000000))
  57 kumpf    1.74 #define PEGASUS_UINT64_MAX PEGASUS_UINT64_LITERAL(0xFFFFFFFFFFFFFFFF)
  58 kumpf    1.68 
  59 mike     1.25 PEGASUS_USING_STD;
  60 mike     1.23 PEGASUS_NAMESPACE_BEGIN
  61               
  62               static const Uint32 MESSAGE_SIZE = 128;
  63               
  64               //------------------------------------------------------------------------------
  65               //
  66 kumpf    1.49 // getXmlDeclaration()
  67               //
  68               //     <?xml version="1.0" encoding="utf-8"?>
  69 mike     1.23 //
  70               //------------------------------------------------------------------------------
  71               
  72 kumpf    1.49 void XmlReader::getXmlDeclaration(
  73 mike     1.23     XmlParser& parser, 
  74 kumpf    1.49     const char*& xmlVersion,
  75                   const char*& xmlEncoding)
  76 mike     1.23 {
  77 kumpf    1.49     XmlEntry entry;
  78               
  79 mike     1.23     if (!parser.next(entry) ||
  80               	entry.type != XmlEntry::XML_DECLARATION ||
  81               	strcmp(entry.text, "xml") != 0)
  82                   {
  83 humberto 1.85 
  84                     // l10n
  85               
  86                     // throw XmlValidationError(parser.getLine(),
  87                     //   "Expected <?xml ... ?> style declaration");
  88               
  89                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_XML_STYLE",
  90 humberto 1.87 				 "Expected <?xml ... ?> style declaration");
  91 humberto 1.85 
  92                     throw XmlValidationError(parser.getLine(), mlParms);
  93               
  94 kumpf    1.49     }
  95               
  96 humberto 1.85     if (!entry.getAttributeValue("version", xmlVersion)) {
  97               
  98                     // l10n
  99               
 100                     // throw XmlValidationError(
 101                     //   parser.getLine(), "missing xml.version attribute");
 102               
 103 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_XML_ATTRIBUTE",
 104               				 "missing xml.version attribute");
 105 humberto 1.85 
 106                     throw XmlValidationError(parser.getLine(), mlParms);
 107                   }
 108 kumpf    1.49 
 109                   if (!entry.getAttributeValue("encoding", xmlEncoding))
 110                   {
 111                       // ATTN-RK-P3-20020403:  Is there a default encoding?
 112 mike     1.23     }
 113               }
 114               
 115               //------------------------------------------------------------------------------
 116               //
 117 mike     1.25 //  testXmlDeclaration ()
 118               //
 119               //------------------------------------------------------------------------------
 120               
 121               Boolean XmlReader::testXmlDeclaration (
 122                   XmlParser& parser,
 123                   XmlEntry& entry)
 124               {
 125                   if (!parser.next (entry) ||
 126                       entry.type != XmlEntry::XML_DECLARATION ||
 127                       strcmp (entry.text, "xml") != 0)
 128                   {
 129                       parser.putBack (entry);
 130                       return false;
 131                   }
 132               
 133                   return true;
 134               }
 135               
 136               //------------------------------------------------------------------------------
 137               //
 138 mike     1.23 // expectStartTag()
 139               //
 140               //------------------------------------------------------------------------------
 141               
 142               void XmlReader::expectStartTag(
 143                   XmlParser& parser, 
 144                   XmlEntry& entry,
 145                   const char* tagName)
 146               {
 147                   if (!parser.next(entry) ||
 148               	entry.type != XmlEntry::START_TAG ||
 149               	strcmp(entry.text, tagName) != 0)
 150                   {
 151 humberto 1.85       // l10n
 152               
 153                     // char message[MESSAGE_SIZE];
 154                     // sprintf(message, "Expected open of %s element", tagName);
 155                     // throw XmlValidationError(parser.getLine(), message);
 156               
 157                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
 158               				 "Expected open of $0 element",
 159               				 tagName);
 160               
 161                     throw XmlValidationError(parser.getLine(), mlParms);
 162 mike     1.23     }
 163               }
 164               
 165               //------------------------------------------------------------------------------
 166               //
 167               // expectEndTag()
 168               //
 169               //------------------------------------------------------------------------------
 170               
 171               void XmlReader::expectEndTag(XmlParser& parser, const char* tagName)
 172               {
 173                   XmlEntry entry;
 174               
 175                   if (!parser.next(entry) ||
 176               	entry.type != XmlEntry::END_TAG ||
 177               	strcmp(entry.text, tagName) != 0)
 178                   {
 179 humberto 1.85 
 180                     // l10n
 181               
 182                     // char message[MESSAGE_SIZE];
 183                     // sprintf(message, "Expected close of %s element, got %s instead",
 184                     //     tagName,entry.text);
 185                     // throw XmlValidationError(parser.getLine(), message);
 186               
 187                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLOSE",
 188               				 "Expected close of $0 element, got $1 instead",
 189               				 tagName,entry.text);
 190               
 191                     throw XmlValidationError(parser.getLine(), mlParms);
 192 mike     1.23     }
 193               }
 194               
 195               //------------------------------------------------------------------------------
 196               //
 197               // expectStartTagOrEmptyTag()
 198               //
 199               //------------------------------------------------------------------------------
 200               
 201               void XmlReader::expectStartTagOrEmptyTag(
 202                   XmlParser& parser, 
 203                   XmlEntry& entry,
 204                   const char* tagName)
 205               {
 206                   if (!parser.next(entry) ||
 207               	(entry.type != XmlEntry::START_TAG &&
 208               	entry.type != XmlEntry::EMPTY_TAG) ||
 209               	strcmp(entry.text, tagName) != 0)
 210                   {
 211 humberto 1.85       // l10n
 212                     
 213                     // char message[MESSAGE_SIZE];
 214                     // sprintf(message, 
 215                     //   "Expected either open or open/close %s element", tagName);
 216                     // throw XmlValidationError(parser.getLine(), message);
 217               
 218                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPENCLOSE",
 219               				 "Expected either open or open/close $0 element",
 220               				 tagName);
 221               
 222                     throw XmlValidationError(parser.getLine(), mlParms);
 223 mike     1.23     }
 224               }
 225               
 226               //------------------------------------------------------------------------------
 227               //
 228               // expectContentOrCData()
 229               //
 230               //------------------------------------------------------------------------------
 231               
 232               Boolean XmlReader::expectContentOrCData(
 233                   XmlParser& parser, 
 234                   XmlEntry& entry)
 235               {
 236                   if (!parser.next(entry) ||
 237               	(entry.type != XmlEntry::CONTENT &&
 238               	entry.type != XmlEntry::CDATA))
 239                   {
 240 humberto 1.85       // l10n
 241               
 242                     // throw XmlValidationError(parser.getLine(),
 243                     //	       "Expected content of CDATA");
 244               
 245                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CDATA",
 246 humberto 1.87 				 "Expected content of CDATA");
 247 humberto 1.85 
 248                     throw XmlValidationError(parser.getLine(), mlParms);
 249               
 250 mike     1.23     }
 251               
 252                   return true;
 253               }
 254               
 255               //------------------------------------------------------------------------------
 256               //
 257               // testStartTag()
 258               //
 259               //------------------------------------------------------------------------------
 260               
 261               Boolean XmlReader::testStartTag(
 262                   XmlParser& parser, 
 263                   XmlEntry& entry,
 264                   const char* tagName)
 265               {
 266                   if (!parser.next(entry) ||
 267               	entry.type != XmlEntry::START_TAG ||
 268               	strcmp(entry.text, tagName) != 0)
 269                   {
 270               	parser.putBack(entry);
 271 mike     1.23 	return false;
 272                   }
 273               
 274                   return true;
 275               }
 276               
 277               //------------------------------------------------------------------------------
 278               //
 279 kumpf    1.48 // testEndTag()
 280 mike     1.23 //
 281               //------------------------------------------------------------------------------
 282               
 283               Boolean XmlReader::testEndTag(XmlParser& parser, const char* tagName)
 284               {
 285                   XmlEntry entry;
 286               
 287                   if (!parser.next(entry) ||
 288               	entry.type != XmlEntry::END_TAG ||
 289               	strcmp(entry.text, tagName) != 0)
 290                   {
 291               	parser.putBack(entry);
 292               	return false;
 293                   }
 294               
 295                   return true;
 296               }
 297               
 298               //------------------------------------------------------------------------------
 299               //
 300               // testStartTagOrEmptyTag()
 301 mike     1.23 //
 302               //------------------------------------------------------------------------------
 303               
 304               Boolean XmlReader::testStartTagOrEmptyTag(
 305                   XmlParser& parser, 
 306                   XmlEntry& entry,
 307                   const char* tagName)
 308               {
 309                   if (!parser.next(entry) ||
 310               	(entry.type != XmlEntry::START_TAG &&
 311               	entry.type != XmlEntry::EMPTY_TAG) ||
 312               	strcmp(entry.text, tagName) != 0)
 313                   {
 314               	parser.putBack(entry);
 315               	return false;
 316                   }
 317               
 318                   return true;
 319               }
 320               
 321               //------------------------------------------------------------------------------
 322 mike     1.23 //
 323               // testContentOrCData()
 324               //
 325               //------------------------------------------------------------------------------
 326               
 327               Boolean XmlReader::testContentOrCData(
 328                   XmlParser& parser, 
 329                   XmlEntry& entry)
 330               {
 331                   if (!parser.next(entry) ||
 332               	(entry.type != XmlEntry::CONTENT &&
 333               	entry.type != XmlEntry::CDATA))
 334                   {
 335               	parser.putBack(entry);
 336               	return false;
 337                   }
 338               
 339                   return true;
 340               }
 341               
 342               //------------------------------------------------------------------------------
 343 mike     1.23 //
 344 kumpf    1.34 // getCimStartTag()
 345 mike     1.23 //
 346               //     <!ELEMENT CIM (MESSAGE|DECLARATION)>
 347               //     <!ATTRLIST CIM 
 348               //         CIMVERSION CDATA #REQUIRED
 349               //         DTDVERSION CDATA #REQUIRED>
 350               //
 351               //------------------------------------------------------------------------------
 352               
 353 kumpf    1.34 void XmlReader::getCimStartTag(
 354                   XmlParser& parser, 
 355                   const char*& cimVersion,
 356                   const char*& dtdVersion)
 357 mike     1.23 {
 358                   XmlEntry entry;
 359                   XmlReader::expectStartTag(parser, entry, "CIM");
 360               
 361 humberto 1.85     if (!entry.getAttributeValue("CIMVERSION", cimVersion)) {
 362               
 363                     // l10n
 364               
 365                     // throw XmlValidationError(
 366                     //   parser.getLine(), "missing CIM.CIMVERSION attribute");
 367               
 368 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_CIMVERSION_ATTRIBUTE",
 369               				 "missing CIM.CIMVERSION attribute");
 370 humberto 1.85 
 371                     throw XmlValidationError(parser.getLine(), mlParms);
 372                   }
 373               
 374                   if (!entry.getAttributeValue("DTDVERSION", dtdVersion)){
 375               
 376                     // l10n
 377                     
 378                     // throw XmlValidationError(
 379                     //   parser.getLine(), "missing CIM.DTDVERSION attribute");
 380                     
 381 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_DTDVERSION_ATTRIBUTE",
 382               				 "missing CIM.DTDVERSION attribute");
 383 humberto 1.85       
 384                     throw XmlValidationError(parser.getLine(), mlParms);
 385                   }
 386 mike     1.23 }
 387               
 388               //------------------------------------------------------------------------------
 389               //
 390               // getCimNameAttribute()
 391               //
 392               //     <!ENTITY % CIMName "NAME CDATA #REQUIRED">
 393               //
 394               //------------------------------------------------------------------------------
 395               
 396 kumpf    1.74 CIMName XmlReader::getCimNameAttribute(
 397 mike     1.23     Uint32 lineNumber, 
 398                   const XmlEntry& entry,
 399                   const char* elementName,
 400                   Boolean acceptNull)
 401               {
 402                   String name;
 403               
 404                   if (!entry.getAttributeValue("NAME", name))
 405 humberto 1.85       {
 406               
 407               	// l10n
 408               
 409               	// char buffer[MESSAGE_SIZE];
 410               	// sprintf(buffer, "missing %s.NAME attribute", elementName);
 411               	// throw XmlValidationError(lineNumber, buffer);
 412               
 413 mike     1.23 	char buffer[MESSAGE_SIZE];
 414 humberto 1.85 	sprintf(buffer, "%s.NAME", elementName);
 415               	MessageLoaderParms mlParms("Common.XmlReader.MISSING_ATTRIBUTE",
 416               				   "missing $0 attribute",
 417               				   buffer);
 418               
 419               	throw XmlValidationError(lineNumber, mlParms);
 420 mike     1.23     }
 421               
 422                   if (acceptNull && name.size() == 0)
 423 kumpf    1.74 	return CIMName ();
 424 karl     1.78     
 425 mike     1.23     if (!CIMName::legal(name))
 426                   {
 427 karl     1.78 #ifdef PEGASUS_SNIA_INTEROP_TEST
 428                   // In testing, replace illegal CIMName with this value to avoid the
 429                   // exception and let xml parsing continue.  THIS IS TEMP.    
 430                   name = "BADNAMESUBSTITUTEDBYPEGASUSCLIENT";
 431               #else
 432 humberto 1.85 
 433                   // l10n
 434               
 435                   // char buffer[MESSAGE_SIZE];
 436                   // sprintf(buffer, "Illegal value for %s.NAME attribute", elementName);
 437                   // throw XmlSemanticError(lineNumber, buffer);
 438               
 439                   char buffer[MESSAGE_SIZE];
 440                   sprintf(buffer, "%s.NAME", elementName);
 441                   
 442                   MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
 443               			       "Illegal value for $0 attribute",
 444               			       buffer);
 445                   
 446                   throw XmlSemanticError(lineNumber, mlParms);
 447               
 448 karl     1.78 #endif
 449 mike     1.23     }
 450 kumpf    1.74     return CIMName (name);
 451 mike     1.23 }
 452               
 453               //------------------------------------------------------------------------------
 454               //
 455               // getClassNameAttribute()
 456               //
 457               //     <!ENTITY % CIMName "CLASSNAME CDATA #REQUIRED">
 458               //
 459               //------------------------------------------------------------------------------
 460               
 461               String XmlReader::getClassNameAttribute(
 462                   Uint32 lineNumber, 
 463                   const XmlEntry& entry,
 464                   const char* elementName)
 465               {
 466                   String name;
 467               
 468                   if (!entry.getAttributeValue("CLASSNAME", name))
 469                   {
 470 humberto 1.85 
 471               
 472                     // l10n
 473               
 474                     // char buffer[MESSAGE_SIZE];
 475                     // sprintf(buffer, "missing %s.CLASSNAME attribute", elementName);
 476                     // throw XmlValidationError(lineNumber, buffer);
 477               
 478                     char buffer[MESSAGE_SIZE];
 479                     sprintf(buffer, "%s.CLASSNAME", elementName);
 480               
 481                     MessageLoaderParms mlParms("Common.XmlReader.MISSING_ATTRIBUTE",
 482               				 "missing $0 attribute",
 483               				 buffer);
 484               
 485                     throw XmlValidationError(lineNumber, mlParms);
 486               
 487 mike     1.23     }
 488               
 489                   if (!CIMName::legal(name))
 490                   {
 491 humberto 1.85       // l10n
 492               
 493                     // char buffer[MESSAGE_SIZE];
 494                     // sprintf(buffer, 
 495                     //   "Illegal value for %s.CLASSNAME attribute", elementName);
 496                     // throw XmlSemanticError(lineNumber, buffer);
 497               
 498                     char buffer[MESSAGE_SIZE];
 499                     sprintf(buffer, "%s.CLASSNAME", elementName);
 500                     
 501                     MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
 502               				 "Illegal value for $0 attribute",
 503               				 buffer);
 504                     
 505                     throw XmlSemanticError(lineNumber, mlParms);
 506                     
 507 mike     1.23     }
 508               
 509                   return name;
 510               }
 511               
 512               //------------------------------------------------------------------------------
 513               //
 514               // getClassOriginAttribute()
 515               //
 516               //     <!ENTITY % ClassOrigin "CLASSORIGIN CDATA #IMPLIED">
 517               //
 518               //------------------------------------------------------------------------------
 519               
 520 kumpf    1.62 CIMName XmlReader::getClassOriginAttribute(
 521 mike     1.23     Uint32 lineNumber, 
 522                   const XmlEntry& entry,
 523                   const char* tagName)
 524               {
 525                   String name;
 526               
 527                   if (!entry.getAttributeValue("CLASSORIGIN", name))
 528 kumpf    1.62 	return CIMName();
 529 mike     1.23 
 530 karl     1.75     // KS 200209 This may be temp but we are adding test for form
 531                   // CLASSNAME = "" for Wbemservices interoperability.  Returns same
 532                   // as if attribute did not exist.
 533                   if (name.size() == 0)
 534                       return CIMName();
 535                   
 536 mike     1.23     if (!CIMName::legal(name))
 537                   {
 538 humberto 1.85       // l10n
 539               
 540                     // char buffer[MESSAGE_SIZE];
 541                     // sprintf(buffer, 
 542                     //    "Illegal value for %s.CLASSORIGIN attribute", tagName);
 543                     // throw XmlSemanticError(lineNumber, buffer);
 544               
 545                     char buffer[MESSAGE_SIZE];
 546                     sprintf(buffer, "%s.CLASSORIGIN", tagName);
 547                     
 548                     MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
 549               				 "Illegal value for $0 attribute",
 550               				 buffer);
 551                     
 552                     throw XmlSemanticError(lineNumber, mlParms);
 553 mike     1.23     }
 554               
 555                   return name;
 556               }
 557               
 558               //------------------------------------------------------------------------------
 559               //
 560               // getReferenceClassAttribute()
 561               //
 562               //     <!ENTITY % ReferenceClass "REFERENCECLASS CDATA #IMPLIED">
 563               //
 564               //------------------------------------------------------------------------------
 565               
 566 kumpf    1.62 CIMName XmlReader::getReferenceClassAttribute(
 567 mike     1.23     Uint32 lineNumber, 
 568                   const XmlEntry& entry,
 569                   const char* elementName)
 570               {
 571                   String name;
 572               
 573                   if (!entry.getAttributeValue("REFERENCECLASS", name))
 574 kumpf    1.62 	return CIMName();
 575 mike     1.23 
 576                   if (!CIMName::legal(name))
 577                   {
 578 karl     1.79 #ifdef PEGASUS_SNIA_INTEROP_TEST
 579                   name = "PEGASUS_SUBSTITUED_THIS_FOR_BAD_NAME";
 580                   return name;
 581               #endif 
 582 humberto 1.85 
 583                   // l10n
 584               
 585                   // char buffer[MESSAGE_SIZE];
 586                   // sprintf(buffer, 
 587                   //     "Illegal value for %s.REFERENCECLASS attribute", elementName);
 588                   // throw XmlSemanticError(lineNumber, buffer);
 589               
 590                   char buffer[MESSAGE_SIZE];
 591                   sprintf(buffer, "%s.REFERENCECLASS", elementName);
 592                   
 593                   MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
 594               			       "Illegal value for $0 attribute",
 595               			       buffer);
 596                   
 597                   throw XmlSemanticError(lineNumber, mlParms);
 598 mike     1.23     }
 599               
 600                   return name;
 601               }
 602               
 603               //------------------------------------------------------------------------------
 604               //
 605               // getSuperClassAttribute()
 606               //
 607               //     <!ENTITY % SuperClass "SUPERCLASS CDATA #IMPLIED">
 608               //
 609               //------------------------------------------------------------------------------
 610               
 611 kumpf    1.62 CIMName XmlReader::getSuperClassAttribute(
 612 mike     1.23     Uint32 lineNumber, 
 613                   const XmlEntry& entry,
 614                   const char* tagName)
 615               {
 616                   String superClass;
 617               
 618                   if (!entry.getAttributeValue("SUPERCLASS", superClass))
 619 kumpf    1.62 	return CIMName();
 620 mike     1.23 
 621                   if (!CIMName::legal(superClass))
 622                   {
 623 humberto 1.85 
 624                     // l10n
 625               
 626                     // char buffer[MESSAGE_SIZE];
 627                     // sprintf(
 628                     //   buffer, "Illegal value for %s.SUPERCLASS attribute", tagName);
 629                     // throw XmlSemanticError(lineNumber, buffer);
 630                     
 631                     char buffer[MESSAGE_SIZE];
 632                     sprintf(buffer, "%s.SUPERCLASS", tagName);
 633                     
 634                     MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
 635               				 "Illegal value for $0 attribute",
 636               				 buffer);
 637                     
 638                     throw XmlSemanticError(lineNumber, mlParms);
 639 mike     1.23     }
 640               
 641                   return superClass;
 642               }
 643               
 644               //------------------------------------------------------------------------------
 645               //
 646               // getCimTypeAttribute()
 647               //
 648 kumpf    1.26 // This method can be used to get a TYPE attribute or a PARAMTYPE attribute.
 649               // The only significant difference is that PARAMTYPE may specify a value of
 650               // "reference" type.  This method recognizes these attributes by name, and
 651               // does not allow a "TYPE" attribute to be of "reference" type.
 652               //
 653 mike     1.23 //     <!ENTITY % CIMType "TYPE (boolean|string|char16|uint8|sint8|uint16
 654               //         |sint16|uint32|sint32|uint64|sint64|datetime|real32|real64)">
 655               //
 656 kumpf    1.26 //     <!ENTITY % ParamType "PARAMTYPE (boolean|string|char16|uint8|sint8
 657               //         |uint16|sint16|uint32|sint32|uint64|sint64|datetime|real32|real64
 658               //         |reference)">
 659               //
 660 mike     1.23 //------------------------------------------------------------------------------
 661               
 662 kumpf    1.67 Boolean XmlReader::getCimTypeAttribute(
 663 mike     1.23     Uint32 lineNumber, 
 664                   const XmlEntry& entry, 
 665 kumpf    1.67     CIMType& cimType,  // Output parameter
 666 kumpf    1.26     const char* tagName,
 667                   const char* attributeName,
 668                   Boolean required)
 669 mike     1.23 {
 670                   const char* typeName;
 671               
 672 kumpf    1.26     if (!entry.getAttributeValue(attributeName, typeName))
 673 mike     1.23     {
 674 kumpf    1.26         if (required)
 675               	{
 676 humberto 1.85 
 677               	  // l10n
 678               
 679               	  // char message[MESSAGE_SIZE];
 680               	  // sprintf(message, "missing %s.%s attribute", tagName, attributeName);
 681               	  // throw XmlValidationError(lineNumber, message);
 682               
 683               	  char message[MESSAGE_SIZE];
 684               	  sprintf(message, "%s.%s", tagName, attributeName);
 685               
 686               	  MessageLoaderParms mlParms("Common.XmlReader.MISSING_ATTRIBUTE",
 687               				     "missing $0 attribute",
 688               				     message);
 689               	  
 690               	  throw XmlValidationError(lineNumber, mlParms);
 691               	  
 692 kumpf    1.26 	}
 693               	else
 694 humberto 1.85 	  {
 695 kumpf    1.67 	    return false;
 696 humberto 1.85 	  }
 697 mike     1.23     }
 698               
 699 kumpf    1.67     CIMType type = CIMTYPE_BOOLEAN;
 700                   Boolean unrecognizedType = false;
 701 mike     1.23 
 702                   if (strcmp(typeName, "boolean") == 0)
 703 kumpf    1.61 	type = CIMTYPE_BOOLEAN;
 704 mike     1.23     else if (strcmp(typeName, "string") == 0)
 705 kumpf    1.61 	type = CIMTYPE_STRING;
 706 mike     1.23     else if (strcmp(typeName, "char16") == 0)
 707 kumpf    1.61 	type = CIMTYPE_CHAR16;
 708 mike     1.23     else if (strcmp(typeName, "uint8") == 0)
 709 kumpf    1.61 	type = CIMTYPE_UINT8;
 710 mike     1.23     else if (strcmp(typeName, "sint8") == 0)
 711 kumpf    1.61 	type = CIMTYPE_SINT8;
 712 mike     1.23     else if (strcmp(typeName, "uint16") == 0)
 713 kumpf    1.61 	type = CIMTYPE_UINT16;
 714 mike     1.23     else if (strcmp(typeName, "sint16") == 0)
 715 kumpf    1.61 	type = CIMTYPE_SINT16;
 716 mike     1.23     else if (strcmp(typeName, "uint32") == 0)
 717 kumpf    1.61 	type = CIMTYPE_UINT32;
 718 mike     1.23     else if (strcmp(typeName, "sint32") == 0)
 719 kumpf    1.61 	type = CIMTYPE_SINT32;
 720 mike     1.23     else if (strcmp(typeName, "uint64") == 0)
 721 kumpf    1.61 	type = CIMTYPE_UINT64;
 722 mike     1.23     else if (strcmp(typeName, "sint64") == 0)
 723 kumpf    1.61 	type = CIMTYPE_SINT64;
 724 mike     1.23     else if (strcmp(typeName, "datetime") == 0)
 725 kumpf    1.61 	type = CIMTYPE_DATETIME;
 726 mike     1.23     else if (strcmp(typeName, "real32") == 0)
 727 kumpf    1.61 	type = CIMTYPE_REAL32;
 728 mike     1.23     else if (strcmp(typeName, "real64") == 0)
 729 kumpf    1.61 	type = CIMTYPE_REAL64;
 730 kumpf    1.26     else if (strcmp(typeName, "reference") == 0)
 731 kumpf    1.61 	type = CIMTYPE_REFERENCE;
 732 kumpf    1.67     else unrecognizedType = true;
 733 mike     1.23 
 734 kumpf    1.67     if (unrecognizedType ||
 735 kumpf    1.61         ((type == CIMTYPE_REFERENCE) &&
 736 kumpf    1.26          (strcmp(attributeName, "PARAMTYPE") != 0)))
 737 mike     1.23     {
 738 humberto 1.85       // l10n
 739               
 740                     // char message[MESSAGE_SIZE];
 741                     // sprintf(message, "Illegal value for %s.%s attribute", tagName,
 742                     //       attributeName);
 743                     // throw XmlSemanticError(lineNumber, message);
 744               
 745                     char buffer[MESSAGE_SIZE];
 746                     sprintf(buffer, "%s.%s", tagName, attributeName);
 747                     
 748                     MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_ATTRIBUTE",
 749               				 "Illegal value for $0 attribute",
 750               				 buffer);
 751                     
 752                     throw XmlSemanticError(lineNumber, mlParms);
 753 mike     1.23     }
 754               
 755 kumpf    1.67     cimType = type;
 756                   return true;
 757 mike     1.23 }
 758               
 759               //------------------------------------------------------------------------------
 760               //
 761               // getCimBooleanAttribute()
 762               //
 763               //------------------------------------------------------------------------------
 764               
 765               Boolean XmlReader::getCimBooleanAttribute(
 766                   Uint32 lineNumber,
 767                   const XmlEntry& entry,
 768                   const char* tagName,
 769                   const char* attributeName,
 770                   Boolean defaultValue,
 771                   Boolean required)
 772               {
 773                   const char* tmp;
 774               
 775                   if (!entry.getAttributeValue(attributeName, tmp))
 776                   {
 777               	if (!required)
 778 mike     1.23 	    return defaultValue;
 779               
 780 humberto 1.85 	// l10n
 781               
 782               	// char buffer[62];
 783               	// sprintf(buffer, "missing required %s.%s attribute", 
 784               	// attributeName, tagName);
 785               
 786               	// throw XmlValidationError(lineNumber, buffer);
 787               
 788 mike     1.23 	char buffer[62];
 789 humberto 1.85 	sprintf(buffer, "%s.%s", attributeName, tagName);
 790 mike     1.23 
 791 humberto 1.85 	MessageLoaderParms mlParms("Common.XmlReader.MISSING_REQUIRED_ATTRIBUTE",
 792               				   "missing required $0 attribute",
 793               				   buffer);
 794               	
 795               	throw XmlValidationError(lineNumber, mlParms);
 796 mike     1.23     }
 797               
 798                   if (strcmp(tmp, "true") == 0)
 799               	return true;
 800                   else if (strcmp(tmp, "false") == 0)
 801               	return false;
 802               
 803 humberto 1.85     // l10n
 804               
 805                   // char buffer[62];
 806                   // sprintf(buffer, "Invalid %s.%s attribute value", attributeName, tagName);
 807                   // throw XmlSemanticError(lineNumber, buffer);
 808               
 809 mike     1.23     char buffer[62];
 810 humberto 1.85     sprintf(buffer, "%s.%s", attributeName, tagName);
 811               
 812                   MessageLoaderParms mlParms("Common.XmlReader.INVALID_ATTRIBUTE",
 813               			       "Invalid $0 attribute value",
 814               			       buffer);
 815               
 816                   throw XmlSemanticError(lineNumber, mlParms);
 817               
 818 mike     1.23     return false;
 819               }
 820               
 821               //------------------------------------------------------------------------------
 822               //
 823               // SringToReal()
 824               //
 825               //	[ "+" | "-" ] *decimalDigit "." 1*decimalDigit 
 826               //	    [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]
 827               //
 828               //------------------------------------------------------------------------------
 829               
 830               Boolean XmlReader::stringToReal(const char* stringValue, Real64& x)
 831               {
 832 kumpf    1.43     //
 833                   // Check the string against the DMTF-defined grammar
 834                   //
 835 mike     1.23     const char* p = stringValue;
 836               
 837                   if (!*p)
 838               	return false;
 839               
 840                   // Skip optional sign:
 841               
 842                   if (*p == '+' || *p  == '-')
 843               	p++;
 844               
 845                   // Skip optional first set of digits:
 846               
 847                   while (isdigit(*p))
 848               	p++;
 849               
 850                   // Test required dot:
 851               
 852                   if (*p++ != '.')
 853               	return false;
 854               
 855                   // One or more digits required:
 856 mike     1.23 
 857                   if (!isdigit(*p++))
 858               	return false;
 859               
 860                   while (isdigit(*p))
 861               	p++;
 862               
 863                   // If there is an exponent now:
 864               
 865                   if (*p)
 866                   {
 867               	// Test exponent:
 868               
 869               	if (*p != 'e' && *p != 'E')
 870               	    return false;
 871               
 872               	p++;
 873               
 874               	// Skip optional sign:
 875               
 876               	if (*p == '+' || *p  == '-')
 877 mike     1.23 	    p++;
 878               
 879               	// One or more digits required:
 880               
 881               	if (!isdigit(*p++))
 882               	    return false;
 883               
 884               	while (isdigit(*p))
 885               	    p++;
 886                   }
 887               
 888                   if (*p)
 889               	return false;
 890               
 891 kumpf    1.43     //
 892                   // Do the conversion
 893                   //
 894 mike     1.23     char* end;
 895 kumpf    1.43     errno = 0;
 896 mike     1.23     x = strtod(stringValue, &end);
 897 kumpf    1.43     if (*end || (errno == ERANGE))
 898                   {
 899                       return false;
 900                   }
 901               
 902 mike     1.23     return true;
 903               }
 904               
 905 s.hills  1.92 static inline Uint8 _hexCharToNumeric(const char c)
 906 kumpf    1.41 {
 907                   Uint8 n;
 908               
 909                   if (isdigit(c))
 910                       n = (c - '0');
 911                   else if (isupper(c))
 912                       n = (c - 'A' + 10);
 913                   else // if (islower(c))
 914                       n = (c - 'a' + 10);
 915               
 916                   return n;
 917 kumpf    1.82 }
 918               
 919               // See http://www.ietf.org/rfc/rfc2396.txt section 2
 920 chuck    1.88 //
 921               // Also see the "CIM Operations over HTTP" spec, section 3.3.2 and
 922               // 3.3.3, for the treatment of non US-ASCII chars (UTF-8)
 923 kumpf    1.82 String XmlReader::decodeURICharacters(String uriString)
 924               {
 925                   Uint32 i;
 926               
 927 chuck    1.88     Array<Uint8> utf8Chars; 
 928               
 929 kumpf    1.82     for (i=0; i<uriString.size(); i++)
 930                   {
 931                       if (uriString[i] == '%')
 932                       {
 933                           if (i+2 >= uriString.size())
 934                           {
 935 humberto 1.85 	      // l10n
 936               
 937               	      // throw ParseError("Invalid URI encoding");
 938               
 939 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_URI_ENCODING",
 940               					 "Invalid URI encoding");
 941 humberto 1.85 
 942               	      throw ParseError(MessageLoader::getMessage(mlParms));
 943               
 944 kumpf    1.82             }
 945               
 946                           Uint8 digit1 = _hexCharToNumeric(char(uriString[++i]));
 947                           Uint8 digit2 = _hexCharToNumeric(char(uriString[++i]));
 948                           if ( (digit1 > 15) || (digit2 > 15) )
 949                           {
 950 humberto 1.85 	      // l10n
 951               
 952               	      // throw ParseError("Invalid URI encoding");
 953               
 954 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_URI_ENCODING",
 955               					 "Invalid URI encoding");
 956 humberto 1.85 
 957               	      throw ParseError(MessageLoader::getMessage(mlParms));
 958 kumpf    1.82             }
 959               
 960                           Uint16 decodedChar = Uint16(digit1<<4) + Uint16(digit2);
 961 chuck    1.88             utf8Chars.append((Uint8)decodedChar);				
 962 kumpf    1.82         }
 963                       else
 964                       {
 965 chuck    1.88             utf8Chars.append((Uint8)uriString[i]);	
 966 kumpf    1.82         }
 967                   }
 968               
 969 chuck    1.88     // If there was a string to decode...
 970                   if (uriString.size() > 0)
 971                   {
 972                       // Convert UTF-8 to UTF-16 and return the String
 973                       utf8Chars.append('\0');
 974                       return String((char *)utf8Chars.getData(),STRING_FLAG_UTF8);
 975                   }
 976                   else
 977                   {
 978                       return String();
 979                   }
 980 kumpf    1.41 }
 981               
 982 mike     1.23 //------------------------------------------------------------------------------
 983               //
 984               // stringToSignedInteger
 985               //
 986               //	[ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
 987 kumpf    1.41 //    or
 988               //      [ "+" | "-" ] ( "0x" | "0X" ) 1*hexDigit
 989 mike     1.23 //
 990               //------------------------------------------------------------------------------
 991               
 992               Boolean XmlReader::stringToSignedInteger(
 993                   const char* stringValue, 
 994                   Sint64& x)
 995               {
 996                   x = 0;
 997                   const char* p = stringValue;
 998               
 999 kumpf    1.41     if (!p || !*p)
1000 mike     1.23 	return false;
1001               
1002                   // Skip optional sign:
1003               
1004                   Boolean negative = *p == '-';
1005               
1006                   if (negative || *p == '+')
1007               	p++;
1008               
1009                   if (*p == '0')
1010 kumpf    1.41     {
1011                       if ( (p[1] == 'x') || (p[1] == 'X') )
1012                       {
1013                           // Convert a hexadecimal string
1014 mike     1.23 
1015 kumpf    1.41             // Skip over the "0x"
1016                           p+=2;
1017 mike     1.23 
1018 kumpf    1.41             // At least one hexadecimal digit is required
1019                           if (!isxdigit(*p))
1020                               return false;
1021               
1022                           // Build the Sint64 as a negative number, regardless of the
1023                           // eventual sign (negative numbers can be bigger than positive ones)
1024               
1025                           // Add on each digit, checking for overflow errors
1026                           while (isxdigit(*p))
1027                           {
1028                               // Make sure we won't overflow when we multiply by 16
1029 kumpf    1.68                 if (x < PEGASUS_SINT64_MIN/16)
1030 kumpf    1.41                 {
1031                                   return false;
1032                               }
1033                               x = x << 4;
1034               
1035                               // Make sure we don't overflow when we add the next digit
1036                               Sint64 newDigit = Sint64(_hexCharToNumeric(*p++));
1037 kumpf    1.68                 if (PEGASUS_SINT64_MIN - x > -newDigit)
1038 kumpf    1.41                 {
1039                                   return false;
1040                               }
1041                               x = x - newDigit;
1042                           }
1043               
1044                           // If we found a non-hexadecimal digit, report an error
1045                           if (*p)
1046                               return false;
1047               
1048                           // Return the integer to positive, if necessary, checking for an
1049                           // overflow error
1050                           if (!negative)
1051                           {
1052 kumpf    1.68                 if (x == PEGASUS_SINT64_MIN)
1053 kumpf    1.41                 {
1054                                   return false;
1055                               }
1056                               x = -x;
1057                           }
1058                           return true;
1059                       }
1060                       else
1061                       {
1062                           // A decimal string that starts with '0' must be exactly "0".
1063               	    return p[1] == '\0';
1064                       }
1065                   }
1066 mike     1.23 
1067 kumpf    1.41     // Expect a positive decimal digit:
1068 mike     1.23 
1069 kumpf    1.41     // At least one decimal digit is required
1070                   if (!isdigit(*p))
1071                       return false;
1072               
1073                   // Build the Sint64 as a negative number, regardless of the
1074                   // eventual sign (negative numbers can be bigger than positive ones)
1075 mike     1.23 
1076 kumpf    1.41     // Add on each digit, checking for overflow errors
1077 mike     1.23     while (isdigit(*p))
1078 kumpf    1.37     {
1079 kumpf    1.41         // Make sure we won't overflow when we multiply by 10
1080 kumpf    1.68         if (x < PEGASUS_SINT64_MIN/10)
1081 kumpf    1.37         {
1082                           return false;
1083                       }
1084                       x = 10 * x;
1085 kumpf    1.41 
1086                       // Make sure we won't overflow when we add the next digit
1087                       Sint64 newDigit = (*p++ - '0');
1088 kumpf    1.68         if (PEGASUS_SINT64_MIN - x > -newDigit)
1089 kumpf    1.37         {
1090                           return false;
1091                       }
1092 kumpf    1.41         x = x - newDigit;
1093 kumpf    1.37     }
1094 mike     1.23 
1095 kumpf    1.41     // If we found a non-decimal digit, report an error
1096                   if (*p)
1097               	return false;
1098               
1099                   // Return the integer to positive, if necessary, checking for an
1100                   // overflow error
1101 kumpf    1.37     if (!negative)
1102                   {
1103 kumpf    1.68         if (x == PEGASUS_SINT64_MIN)
1104 kumpf    1.37         {
1105                           return false;
1106                       }
1107 kumpf    1.41         x = -x;
1108 kumpf    1.37     }
1109 mike     1.23     return true;
1110               }
1111               
1112               //------------------------------------------------------------------------------
1113               //
1114               // stringToUnsignedInteger
1115               //
1116 kumpf    1.40 //	( positiveDecimalDigit *decimalDigit | "0" )
1117 kumpf    1.41 //    or
1118               //      ( "0x" | "0X" ) 1*hexDigit
1119 mike     1.23 //
1120               //------------------------------------------------------------------------------
1121               
1122               Boolean XmlReader::stringToUnsignedInteger(
1123                   const char* stringValue, 
1124                   Uint64& x)
1125               {
1126                   x = 0;
1127                   const char* p = stringValue;
1128               
1129 kumpf    1.41     if (!p || !*p)
1130 mike     1.23 	return false;
1131               
1132                   if (*p == '0')
1133 kumpf    1.41     {
1134                       if ( (p[1] == 'x') || (p[1] == 'X') )
1135                       {
1136                           // Convert a hexadecimal string
1137 mike     1.23 
1138 kumpf    1.41             // Skip over the "0x"
1139                           p+=2;
1140 mike     1.23 
1141 kumpf    1.41             // At least one hexadecimal digit is required
1142                           if (!*p)
1143                               return false;
1144               
1145                           // Add on each digit, checking for overflow errors
1146                           while (isxdigit(*p))
1147                           {
1148                               // Make sure we won't overflow when we multiply by 16
1149 kumpf    1.68                 if (x > PEGASUS_UINT64_MAX/16)
1150 kumpf    1.41                 {
1151                                   return false;
1152                               }
1153                               x = x << 4;
1154               
1155                               // We can't overflow when we add the next digit
1156                               Uint64 newDigit = Uint64(_hexCharToNumeric(*p++));
1157 kumpf    1.68                 if (PEGASUS_UINT64_MAX - x < newDigit)
1158 kumpf    1.41                 {
1159                                   return false;
1160                               }
1161                               x = x + newDigit;
1162                           }
1163               
1164                           // If we found a non-hexadecimal digit, report an error
1165                           if (*p)
1166                               return false;
1167 mike     1.23 
1168 kumpf    1.41             return true;
1169                       }
1170                       else
1171                       {
1172                           // A decimal string that starts with '0' must be exactly "0".
1173               	    return p[1] == '\0';
1174                       }
1175                   }
1176 mike     1.23 
1177 kumpf    1.41     // Expect a positive decimal digit:
1178 mike     1.23 
1179 kumpf    1.41     // Add on each digit, checking for overflow errors
1180 mike     1.23     while (isdigit(*p))
1181 kumpf    1.37     {
1182 kumpf    1.41         // Make sure we won't overflow when we multiply by 10
1183 kumpf    1.68         if (x > PEGASUS_UINT64_MAX/10)
1184 kumpf    1.37         {
1185                           return false;
1186                       }
1187                       x = 10 * x;
1188 kumpf    1.41 
1189                       // Make sure we won't overflow when we add the next digit
1190                       Uint64 newDigit = (*p++ - '0');
1191 kumpf    1.68         if (PEGASUS_UINT64_MAX - x < newDigit)
1192 kumpf    1.37         {
1193                           return false;
1194                       }
1195 kumpf    1.41         x = x + newDigit;
1196 kumpf    1.37     }
1197 kumpf    1.41 
1198                   // If we found a non-decimal digit, report an error
1199                   if (*p)
1200               	return false;
1201 mike     1.23 
1202                   return true;
1203               }
1204               
1205               //------------------------------------------------------------------------------
1206               //
1207               // stringToValue()
1208               //
1209 karl     1.35 // Return: CIMValue. If the string input is zero length creates a CIMValue
1210               //         with value defined by the type.  Else the value is inserted.
1211               //         
1212               //         Note that this does not set the CIMValue Null if the string is empty.
1213               //
1214 mike     1.23 //------------------------------------------------------------------------------
1215               
1216               CIMValue XmlReader::stringToValue(
1217                   Uint32 lineNumber, 
1218                   const char* valueString, 
1219                   CIMType type)
1220               {
1221                   // ATTN-B: accepting only UTF-8 for now! (affects string and char16):
1222               
1223 karl     1.35     // Create value per type
1224 mike     1.23     switch (type)
1225                   {
1226 kumpf    1.61 	case CIMTYPE_BOOLEAN:
1227 mike     1.23 	{
1228 kumpf    1.72 	    if (System::strcasecmp(valueString, "TRUE") == 0)
1229 mike     1.23 		return CIMValue(true);
1230 kumpf    1.72 	    else if (System::strcasecmp(valueString, "FALSE") == 0)
1231 mike     1.23 		return CIMValue(false);
1232 humberto 1.85 	    else {
1233               
1234               	      // l10n
1235               
1236               	      //  throw XmlSemanticError(
1237               	      //	     lineNumber, "Invalid boolean value");
1238               
1239 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_BOOLEAN_VALUE",
1240               					 "Invalid boolean value");
1241 humberto 1.85 	      
1242               	      throw XmlSemanticError(lineNumber, mlParms);
1243               	      
1244               	    }
1245 mike     1.23 	}
1246               
1247 kumpf    1.61 	case CIMTYPE_STRING:
1248 mike     1.23 	{
1249 david    1.86 	    return CIMValue(String(valueString, STRING_FLAG_UTF8));
1250 mike     1.23 	}
1251               
1252 kumpf    1.61 	case CIMTYPE_CHAR16:
1253 mike     1.23 	{
1254 chuck    1.88 
1255               // remove this test, utf-8 can be up to 6 bytes per char
1256               /*
1257 humberto 1.85 	  if (strlen(valueString) != 1) {
1258 chuck    1.88 	    // l10n
1259 humberto 1.85 
1260 chuck    1.88 	    // throw XmlSemanticError(lineNumber, "Invalid char16 value");
1261               	    
1262               	    MessageLoaderParms mlParms("Common.XmlReader.INVALID_CHAR16_VALUE",
1263               				       "Invalid char16 value");
1264               	    
1265               	    throw XmlSemanticError(lineNumber, mlParms);
1266               	  }
1267               */
1268                         // Converts UTF-8 to UTF-16
1269                         String tmp(valueString, STRING_FLAG_UTF8);
1270                         if (tmp.size() != 1)
1271                         {
1272 humberto 1.85 	    // l10n
1273               
1274               	    // throw XmlSemanticError(lineNumber, "Invalid char16 value");
1275               	    
1276 humberto 1.87 	    MessageLoaderParms mlParms("Common.XmlReader.INVALID_CHAR16_VALUE",
1277               				       "Invalid char16 value");
1278 humberto 1.85 	    
1279               	    throw XmlSemanticError(lineNumber, mlParms);
1280 chuck    1.88           }
1281 mike     1.23 
1282 chuck    1.88 	    return CIMValue(tmp[0]);
1283 mike     1.23 	}
1284               
1285 kumpf    1.61 	case CIMTYPE_UINT8:
1286               	case CIMTYPE_UINT16:
1287               	case CIMTYPE_UINT32:
1288               	case CIMTYPE_UINT64:
1289 mike     1.23 	{
1290               	    Uint64 x;
1291               
1292               	    if (!stringToUnsignedInteger(valueString, x))
1293               	    {
1294 humberto 1.85 
1295               	      // l10n
1296               
1297               	      // throw XmlSemanticError(
1298               	      //   lineNumber, "Invalid unsigned integer value");
1299               
1300 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_UI_VALUE",
1301               					 "Invalid unsigned integer value");
1302 humberto 1.85 	      
1303               	      throw XmlSemanticError(lineNumber, mlParms);
1304               
1305 mike     1.23 	    }
1306               
1307               	    switch (type)
1308               	    {
1309 kumpf    1.61 		case CIMTYPE_UINT8:
1310 kumpf    1.37                 {
1311                                   if (x >= (Uint64(1)<<8))
1312               		    {
1313 humberto 1.85 
1314               		      // l10n
1315               		      
1316               		      // throw XmlSemanticError(
1317               		      //   lineNumber, "Uint8 value out of range");
1318               		      
1319 humberto 1.87 		      MessageLoaderParms mlParms("Common.XmlReader.U8_VALUE_OUT_OF_RANGE",
1320               						 "Uint8 value out of range");
1321 humberto 1.85 		      
1322               		      throw XmlSemanticError(lineNumber, mlParms);	
1323 kumpf    1.37 		    }
1324               		    return CIMValue(Uint8(x));
1325                               }
1326 kumpf    1.61 		case CIMTYPE_UINT16:
1327 kumpf    1.37                 {
1328                                   if (x >= (Uint64(1)<<16))
1329               		    {
1330 humberto 1.85 
1331               		      // l10n
1332               
1333               		      // throw XmlSemanticError(
1334               		      //	     lineNumber, "Uint16 value out of range");
1335               
1336 humberto 1.87 		      MessageLoaderParms mlParms("Common.XmlReader.U16_VALUE_OUT_OF_RANGE",
1337               						 "Uint16 value out of range");
1338 humberto 1.85 		      
1339               		      throw XmlSemanticError(lineNumber, mlParms);	
1340               
1341 kumpf    1.37 		    }
1342               		    return CIMValue(Uint16(x));
1343                               }
1344 kumpf    1.61 		case CIMTYPE_UINT32:
1345 kumpf    1.37                 {
1346                                   if (x >= (Uint64(1)<<32))
1347               		    {
1348 humberto 1.85 
1349               		      // l10n
1350               
1351               		      // throw XmlSemanticError(
1352               		      //   lineNumber, "Uint32 value out of range");
1353               
1354 humberto 1.87 		      MessageLoaderParms mlParms("Common.XmlReader.U32_VALUE_OUT_OF_RANGE",
1355               						 "Uint32 value out of range");
1356 humberto 1.85 		      
1357               		      throw XmlSemanticError(lineNumber, mlParms);	
1358 kumpf    1.37 		    }
1359               		    return CIMValue(Uint32(x));
1360                               }
1361 kumpf    1.61 		case CIMTYPE_UINT64: return CIMValue(Uint64(x));
1362 mike     1.23 		default: break;
1363               	    }
1364               	}
1365               
1366 kumpf    1.61 	case CIMTYPE_SINT8:
1367               	case CIMTYPE_SINT16:
1368               	case CIMTYPE_SINT32:
1369               	case CIMTYPE_SINT64:
1370 mike     1.23 	{
1371               	    Sint64 x;
1372               
1373               	    if (!stringToSignedInteger(valueString, x))
1374               	    {
1375 humberto 1.85 
1376               	      // l10n
1377               
1378               	      // throw XmlSemanticError(
1379               	      //   lineNumber, "Invalid signed integer value");
1380               
1381 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_SI_VALUE",
1382               					 "Invalid signed integer value");
1383 humberto 1.85 	      
1384               	      throw XmlSemanticError(lineNumber, mlParms);
1385               
1386 mike     1.23 	    }
1387               
1388               	    switch (type)
1389               	    {
1390 kumpf    1.61 		case CIMTYPE_SINT8:
1391 kumpf    1.37                 {
1392                                   if(  (x >= (Sint64(1)<<7)) || (x < (-(Sint64(1)<<7))) )
1393               		    {
1394 humberto 1.85 
1395               		      // l10n
1396               
1397               		      // throw XmlSemanticError(
1398               		      //   lineNumber, "Sint8 value out of range");
1399               		      
1400 humberto 1.87 		      MessageLoaderParms mlParms("Common.XmlReader.S8_VALUE_OUT_OF_RANGE",
1401               						 "Sint8 value out of range");
1402 humberto 1.85 		      
1403               		      throw XmlSemanticError(lineNumber, mlParms);	
1404 kumpf    1.37 		    }
1405               		    return CIMValue(Sint8(x));
1406                               }
1407 kumpf    1.61 		case CIMTYPE_SINT16:
1408 kumpf    1.37                 {
1409                                   if(  (x >= (Sint64(1)<<15)) || (x < (-(Sint64(1)<<15))) )
1410               		    {
1411 humberto 1.85 
1412               		      // l10n
1413               
1414               		      // throw XmlSemanticError(
1415               		      //   lineNumber, "Sint16 value out of range");
1416               		      
1417 humberto 1.87 		      MessageLoaderParms mlParms("Common.XmlReader.S16_VALUE_OUT_OF_RANGE",
1418               						 "Sint16 value out of range");
1419 humberto 1.85 		      
1420               		      throw XmlSemanticError(lineNumber, mlParms);	
1421 kumpf    1.37 		    }
1422               		    return CIMValue(Sint16(x));
1423                               }
1424 kumpf    1.61 		case CIMTYPE_SINT32:
1425 kumpf    1.37                 {
1426                                   if(  (x >= (Sint64(1)<<31)) || (x < (-(Sint64(1)<<31))) )
1427               		    {
1428 humberto 1.85 
1429               		      // l10n
1430               
1431               		      // throw XmlSemanticError(
1432               		      //   lineNumber, "Sint32 value out of range");
1433               
1434 humberto 1.87 		      MessageLoaderParms mlParms("Common.XmlReader.S32_VALUE_OUT_OF_RANGE",
1435               						 "Sint32 value out of range");
1436 humberto 1.85 		      
1437               		      throw XmlSemanticError(lineNumber, mlParms);	
1438 kumpf    1.37 		    }
1439               		    return CIMValue(Sint32(x));
1440                               }
1441 kumpf    1.61 		case CIMTYPE_SINT64: return CIMValue(Sint64(x));
1442 mike     1.23 		default: break;
1443               	    }
1444               	}
1445               
1446 kumpf    1.61 	case CIMTYPE_DATETIME:
1447 mike     1.23 	{
1448               	    CIMDateTime tmp;
1449               
1450               	    try
1451               	    {
1452 karl     1.76             // KS 20021002 - Exception if no datatime value. Test for
1453                           // zero length and leave the NULL value in the variable
1454                           // Bugzilla 137  Adds the following if line.
1455 karl     1.78             // Expect this to become permanent but test only for now
1456 karl     1.76 #ifdef PEGASUS_SNIA_INTEROP_TEST
1457                           if (strlen(valueString) != 0)
1458               #endif
1459 karl     1.77                 tmp.set(valueString);
1460 mike     1.23 	    }
1461 kumpf    1.66 	    catch (InvalidDateTimeFormatException&)
1462 mike     1.23 	    {
1463 humberto 1.85 
1464               	      // l10n
1465               
1466               	      // throw XmlSemanticError(lineNumber, "Invalid datetime value");
1467               
1468 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_DATETIME_VALUE",
1469               					 "Invalid datetime value");
1470 humberto 1.85 	      
1471               	      throw XmlSemanticError(lineNumber, mlParms);
1472 mike     1.23 	    }
1473               
1474               	    return CIMValue(tmp);
1475               	}
1476               
1477 kumpf    1.61 	case CIMTYPE_REAL32:
1478 mike     1.23 	{
1479               	    Real64 x;
1480               
1481 humberto 1.85 	    if (!stringToReal(valueString, x)) {
1482               
1483               	      // l10n
1484               
1485               	      // throw XmlSemanticError(lineNumber, "Invalid real number value");
1486 mike     1.23 
1487 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_RN_VALUE",
1488               					 "Invalid real number value");
1489 humberto 1.85 	      
1490               	      throw XmlSemanticError(lineNumber, mlParms);
1491               	    }
1492 mike     1.23 	    return CIMValue(Real32(x));
1493               	}
1494               
1495 kumpf    1.61 	case CIMTYPE_REAL64:
1496 mike     1.23 	{
1497               	    Real64 x;
1498               
1499 humberto 1.85 	    if (!stringToReal(valueString, x)) {
1500               
1501               	      // l10n
1502               
1503               	      // throw XmlSemanticError(lineNumber, "Invalid real number value");
1504 mike     1.23 
1505 humberto 1.87 	      MessageLoaderParms mlParms("Common.XmlReader.INVALID_RN_VALUE",
1506               					 "Invalid real number value");
1507 humberto 1.85 	      
1508               	      throw XmlSemanticError(lineNumber, mlParms);
1509               	    }
1510 mike     1.23 	    return CIMValue(x);
1511               	}
1512               
1513               	default:
1514               	    break;
1515                   }
1516               
1517 humberto 1.85     // l10n
1518               
1519                   // throw XmlSemanticError(lineNumber, "malformed XML");
1520               
1521                   MessageLoaderParms mlParms("Common.XmlReader.MALFORMED_XML",
1522               			       "malformed XML");
1523                   
1524                   throw XmlSemanticError(lineNumber, mlParms);
1525               
1526 mike     1.23     return false;
1527               }
1528               
1529               //------------------------------------------------------------------------------
1530               //
1531               // getValueElement()
1532               //
1533               //     <!ELEMENT VALUE (#PCDATA)>
1534               //
1535 karl     1.35 // Return: false if no value element.
1536               //
1537 mike     1.23 //------------------------------------------------------------------------------
1538               
1539               Boolean XmlReader::getValueElement(
1540                   XmlParser& parser, 
1541                   CIMType type, 
1542                   CIMValue& value)
1543               {
1544 karl     1.35     // Get VALUE start tag: Return false if no VALUE start Tag
1545 mike     1.23 
1546                   XmlEntry entry;
1547                   if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
1548               	return false;
1549               
1550                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1551               
1552                   const char* valueString = "";
1553               
1554                   if (!empty)
1555                   {
1556               	if (testContentOrCData(parser, entry))
1557               	    valueString = entry.text;
1558               
1559               	expectEndTag(parser, "VALUE");
1560                   }
1561 karl     1.80 #ifdef PEGASUS_SNIA_INTEROP_TEST
1562                   // KS 20021004 - tries to put value in even if empty.
1563                   // Think this is general problem with empty value
1564                   // Need to check meaning of (#PCDATA) - Does it allow empty.
1565                   // Bugzilla tbd
1566                   if (!empty)
1567               #endif
1568                       value = stringToValue(parser.getLine(), valueString,type);
1569 karl     1.33     
1570 mike     1.23     return true;
1571               }
1572               
1573               //------------------------------------------------------------------------------
1574               //
1575               // getStringValueElement()
1576               //
1577               //     <!ELEMENT VALUE (#PCDATA)>
1578               //
1579               //------------------------------------------------------------------------------
1580               
1581               Boolean XmlReader::getStringValueElement(
1582                   XmlParser& parser, 
1583                   String& str,
1584                   Boolean required)
1585               {
1586                   XmlEntry entry;
1587               
1588                   if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
1589                   {
1590 humberto 1.85       if (required) {
1591               
1592               	// l10n
1593               
1594               	// throw XmlValidationError(parser.getLine(),"Expected VALUE element");
1595               
1596 humberto 1.87 	MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_ELEMENT",
1597               				   "Expected VALUE element");
1598 humberto 1.85 	
1599               	throw XmlValidationError(parser.getLine(), mlParms);
1600               	
1601               
1602                     }
1603                     return false;
1604 mike     1.23     }
1605               
1606                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1607               
1608                   const char* valueString = "";
1609               
1610                   if (!empty)
1611                   {
1612               	if (testContentOrCData(parser, entry))
1613               	    valueString = entry.text;
1614               
1615               	expectEndTag(parser, "VALUE");
1616                   }
1617               
1618 david    1.86     str = String(valueString,STRING_FLAG_UTF8);
1619 mike     1.23     return true;
1620               }
1621               
1622               //----------------------------------------------------------------------------
1623               //
1624               // getPropertyValue
1625 kumpf    1.30 //     Use: Decode property value from SetProperty request and
1626               //     GetProperty response.
1627 mike     1.23 //
1628 kumpf    1.30 //     PropertyValue is one of:
1629 mike     1.23 //
1630               //
1631 karl     1.33 //	<!ELEMENT VALUE.ARRAY (VALUE*)>
1632               //
1633               //	<!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
1634 kumpf    1.30 //         <!ELEMENT VALUE.ARRAY (VALUE*)>
1635               //
1636               //         <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
1637 mike     1.23 //                           INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
1638               //
1639 kumpf    1.30 //         <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
1640               //
1641 mike     1.23 //----------------------------------------------------------------------------
1642               Boolean XmlReader::getPropertyValue(
1643                   XmlParser& parser, 
1644                   CIMValue& cimValue)
1645               {
1646 kumpf    1.30     // Can not test for value type, so assume String
1647 kumpf    1.61     const CIMType type = CIMTYPE_STRING;
1648 mike     1.23 
1649 kumpf    1.30     // Test for VALUE element
1650 mike     1.23     if (XmlReader::getValueElement(parser, type, cimValue))
1651                   {
1652               	return true;
1653                   }
1654               
1655 kumpf    1.30     // Test for VALUE.ARRAY element
1656                   if (XmlReader::getValueArrayElement(parser, type, cimValue))
1657                   {
1658 mike     1.23        return true;
1659 kumpf    1.30     }
1660 mike     1.23 
1661 kumpf    1.30     // Test for VALUE.REFERENCE element
1662 kumpf    1.54     CIMObjectPath reference;
1663 kumpf    1.30     if (XmlReader::getValueReferenceElement(parser, reference))
1664 mike     1.25     {
1665                       cimValue.set(reference);
1666                       return true;
1667                   }
1668 mike     1.23 
1669 kumpf    1.30     // Test for VALUE.REFARRAY element
1670                   if (XmlReader::getValueReferenceArrayElement(parser, cimValue))
1671                   {
1672                      return true;
1673                   }
1674               
1675                   return false;
1676 mike     1.23 }
1677               
1678               //------------------------------------------------------------------------------
1679               //
1680               // stringArrayToValue()
1681               //
1682               //------------------------------------------------------------------------------
1683               
1684               template<class T>
1685               CIMValue StringArrayToValueAux(
1686                   Uint32 lineNumber, 
1687                   const Array<const char*>& stringArray,
1688                   CIMType type,
1689                   T*)
1690               {
1691                   Array<T> array;
1692               
1693                   for (Uint32 i = 0, n = stringArray.size(); i < n; i++)
1694                   {
1695               	CIMValue value = XmlReader::stringToValue(
1696               	    lineNumber, stringArray[i], type);
1697 mike     1.23 
1698               	T x;
1699               	value.get(x);
1700               	array.append(x);
1701                   }
1702               
1703                   return CIMValue(array);
1704               }
1705               
1706               CIMValue XmlReader::stringArrayToValue(
1707                   Uint32 lineNumber, 
1708                   const Array<const char*>& array, 
1709                   CIMType type)
1710               {
1711                   switch (type)
1712                   {
1713 kumpf    1.61 	case CIMTYPE_BOOLEAN: 
1714 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Boolean*)0);
1715               
1716 kumpf    1.61 	case CIMTYPE_STRING:
1717 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (String*)0);
1718               
1719 kumpf    1.61 	case CIMTYPE_CHAR16:
1720 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Char16*)0);
1721               
1722 kumpf    1.61 	case CIMTYPE_UINT8:
1723 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Uint8*)0);
1724               
1725 kumpf    1.61 	case CIMTYPE_UINT16:
1726 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Uint16*)0);
1727               
1728 kumpf    1.61 	case CIMTYPE_UINT32:
1729 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Uint32*)0);
1730               
1731 kumpf    1.61 	case CIMTYPE_UINT64:
1732 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Uint64*)0);
1733               
1734 kumpf    1.61 	case CIMTYPE_SINT8:
1735 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Sint8*)0);
1736               
1737 kumpf    1.61 	case CIMTYPE_SINT16:
1738 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Sint16*)0);
1739               
1740 kumpf    1.61 	case CIMTYPE_SINT32:
1741 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Sint32*)0);
1742               
1743 kumpf    1.61 	case CIMTYPE_SINT64:
1744 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);
1745               
1746 kumpf    1.61 	case CIMTYPE_DATETIME:
1747 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (CIMDateTime*)0);
1748               
1749 kumpf    1.61 	case CIMTYPE_REAL32:
1750 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);
1751               
1752 kumpf    1.61 	case CIMTYPE_REAL64:
1753 mike     1.23 	    return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);
1754               
1755               	default:
1756               	    break;
1757                   }
1758               
1759                   // Unreachable:
1760                   return CIMValue();
1761               }
1762               
1763               //------------------------------------------------------------------------------
1764               //
1765               // getValueArrayElement()
1766               //
1767               //     <!ELEMENT VALUE.ARRAY (VALUE*)>
1768               //
1769 karl     1.35 //  Return: Boolean. Returns false if there is no VALUE.ARRAY start element
1770               //
1771 mike     1.23 //------------------------------------------------------------------------------
1772               
1773               Boolean XmlReader::getValueArrayElement(
1774                   XmlParser& parser, 
1775                   CIMType type, 
1776                   CIMValue& value)
1777               {
1778 karl     1.35     // Clears any values from the Array. Assumes this is array CIMValue
1779 mike     1.23     value.clear();
1780               
1781                   // Get VALUE.ARRAY open tag:
1782               
1783                   XmlEntry entry;
1784 kumpf    1.32     Array<const char*> stringArray;
1785 mike     1.23 
1786 karl     1.35     // If no VALUE.ARRAY start tag, return false
1787 mike     1.23     if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))
1788               	return false;
1789 karl     1.33 
1790 kumpf    1.32     if (entry.type != XmlEntry::EMPTY_TAG)
1791                   {
1792                       // For each VALUE element:
1793 mike     1.23 
1794 kumpf    1.32         while (testStartTagOrEmptyTag(parser, entry, "VALUE"))
1795                       {
1796               	    if (entry.type == XmlEntry::EMPTY_TAG)
1797               	    {
1798               	        stringArray.append("");
1799               	        continue;
1800               	    }
1801 mike     1.23 
1802 kumpf    1.32 	    if (testContentOrCData(parser, entry))
1803               	        stringArray.append(entry.text);
1804               	    else
1805               	        stringArray.append("");
1806 mike     1.23 
1807 kumpf    1.32 	    expectEndTag(parser, "VALUE");
1808                       }
1809 mike     1.23 
1810 kumpf    1.32         expectEndTag(parser, "VALUE.ARRAY");
1811 mike     1.23     }
1812               
1813                   value = stringArrayToValue(parser.getLine(), stringArray, type);
1814                   return true;
1815               }
1816               
1817               //------------------------------------------------------------------------------
1818               //
1819               // getFlavor()
1820               //
1821               //     <!ENTITY % QualifierFlavor 
1822               //         "OVERRIDABLE (true|false) 'true'
1823               //         TOSUBCLASS (true|false) 'true'
1824               //         TOINSTANCE (true|false)  'false'
1825               //         TRANSLATABLE (true|false)  'false'">
1826               //
1827               //------------------------------------------------------------------------------
1828               
1829 kumpf    1.64 CIMFlavor XmlReader::getFlavor(
1830 mike     1.23     XmlEntry& entry, 
1831                   Uint32 lineNumber, 
1832                   const char* tagName)
1833               {
1834                   // Get QUALIFIER.OVERRIDABLE
1835               
1836                   Boolean overridable = getCimBooleanAttribute(
1837               	lineNumber, entry, tagName, "OVERRIDABLE", true, false);
1838               
1839                   // Get QUALIFIER.TOSUBCLASS
1840               
1841                   Boolean toSubClass = getCimBooleanAttribute(
1842               	lineNumber, entry, tagName, "TOSUBCLASS", true, false);
1843               
1844                   // Get QUALIFIER.TOINSTANCE
1845               
1846                   Boolean toInstance = getCimBooleanAttribute(
1847               	lineNumber, entry, tagName, "TOINSTANCE", false, false);
1848               
1849                   // Get QUALIFIER.TRANSLATABLE
1850               
1851 mike     1.23     Boolean translatable = getCimBooleanAttribute(
1852               	lineNumber, entry, tagName, "TRANSLATABLE", false, false);
1853               
1854 kumpf    1.44     // Start with CIMFlavor::NONE.  Defaults are specified in the
1855                   // getCimBooleanAttribute() calls above.
1856 kumpf    1.64     CIMFlavor flavor = CIMFlavor (CIMFlavor::NONE);
1857 mike     1.23 
1858                   if (overridable)
1859 kumpf    1.64         flavor.addFlavor (CIMFlavor::OVERRIDABLE);
1860                   else
1861                       flavor.addFlavor (CIMFlavor::DISABLEOVERRIDE);
1862 mike     1.23 
1863                   if (toSubClass)
1864 kumpf    1.64         flavor.addFlavor (CIMFlavor::TOSUBCLASS);
1865                   else
1866                       flavor.addFlavor (CIMFlavor::RESTRICTED);
1867 mike     1.23 
1868                   if (toInstance)
1869 kumpf    1.64         flavor.addFlavor (CIMFlavor::TOINSTANCE);
1870 mike     1.23 
1871                   if (translatable)
1872 kumpf    1.64         flavor.addFlavor (CIMFlavor::TRANSLATABLE);
1873 mike     1.23 
1874                   return flavor;
1875               }
1876               
1877               //------------------------------------------------------------------------------
1878               //
1879               // getOptionalScope()
1880               //
1881               //     DTD:
1882               //         <!ELEMENT SCOPE EMPTY>
1883               //         <!ATTLIST SCOPE 
1884               //              CLASS (true|false) 'false'
1885               //              ASSOCIATION (true|false) 'false'
1886               //              REFERENCE (true|false) 'false'
1887               //              PROPERTY (true|false) 'false'
1888               //              METHOD (true|false) 'false'
1889               //              PARAMETER (true|false) 'false'
1890               //              INDICATION (true|false) 'false'>
1891               //
1892               //------------------------------------------------------------------------------
1893               
1894 kumpf    1.63 CIMScope XmlReader::getOptionalScope(XmlParser& parser)
1895 mike     1.23 {
1896                   XmlEntry entry;
1897 kumpf    1.65     CIMScope scope;
1898 mike     1.23 
1899                   if (!parser.next(entry))
1900 kumpf    1.65 	return scope;    // No SCOPE element found; return the empty scope
1901 mike     1.23 
1902                   Boolean isEmptyTag = entry.type == XmlEntry::EMPTY_TAG;
1903               
1904                   if ((!isEmptyTag && 
1905               	entry.type != XmlEntry::START_TAG) ||
1906               	strcmp(entry.text, "SCOPE") != 0)
1907                   {
1908 kumpf    1.65 	// No SCOPE element found; return the empty scope
1909 mike     1.23 	parser.putBack(entry);
1910 kumpf    1.65 	return scope;
1911 mike     1.23     }
1912               
1913                   Uint32 line = parser.getLine();
1914               
1915                   if (getCimBooleanAttribute(line, entry, "SCOPE", "CLASS", false, false))
1916 kumpf    1.63 	scope.addScope (CIMScope::CLASS);
1917 mike     1.23 
1918                   if (getCimBooleanAttribute(
1919               	line, entry, "SCOPE", "ASSOCIATION", false, false))
1920 kumpf    1.63 	scope.addScope (CIMScope::ASSOCIATION);
1921 mike     1.23 
1922                   if (getCimBooleanAttribute(
1923               	line, entry, "SCOPE", "REFERENCE", false, false))
1924 kumpf    1.63 	scope.addScope (CIMScope::REFERENCE);
1925 mike     1.23 
1926                   if (getCimBooleanAttribute(line, entry, "SCOPE", "PROPERTY", false, false))
1927 kumpf    1.63 	scope.addScope (CIMScope::PROPERTY);
1928 mike     1.23 
1929                   if (getCimBooleanAttribute(line, entry, "SCOPE", "METHOD", false, false))
1930 kumpf    1.63 	scope.addScope (CIMScope::METHOD);
1931 mike     1.23 
1932                   if (getCimBooleanAttribute(line, entry, "SCOPE", "PARAMETER", false, false))
1933 kumpf    1.63 	scope.addScope (CIMScope::PARAMETER);
1934 mike     1.23 
1935                   if (getCimBooleanAttribute(line, entry, "SCOPE", "INDICATION",false, false))
1936 kumpf    1.63 	scope.addScope (CIMScope::INDICATION);
1937 mike     1.23 
1938                   if (!isEmptyTag)
1939               	expectEndTag(parser, "SCOPE");
1940               
1941                   return scope;
1942               }
1943               
1944               //------------------------------------------------------------------------------
1945               //
1946               // getQualifierElement()
1947               //
1948 kumpf    1.52 //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)?>
1949 mike     1.23 //     <!ATTLIST QUALIFIER
1950               //         %CIMName;
1951               //         %CIMType; #REQUIRED
1952               //         %Propagated;
1953               //         %QualifierFlavor;>
1954               //
1955               //------------------------------------------------------------------------------
1956               
1957               Boolean XmlReader::getQualifierElement(
1958                   XmlParser& parser, 
1959                   CIMQualifier& qualifier)
1960               {
1961                   // Get QUALIFIER element:
1962               
1963                   XmlEntry entry;
1964                   if (!testStartTag(parser, entry, "QUALIFIER"))
1965               	return false;
1966               
1967                   // Get QUALIFIER.NAME attribute:
1968               
1969 kumpf    1.74     CIMName name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");
1970 mike     1.23 
1971                   // Get QUALIFIER.TYPE attribute:
1972               
1973 kumpf    1.67     CIMType type;
1974                   getCimTypeAttribute(parser.getLine(), entry, type, "QUALIFIER");
1975 mike     1.23 
1976                   // Get QUALIFIER.PROPAGATED
1977               
1978                   Boolean propagated = getCimBooleanAttribute(
1979               	parser.getLine(), entry, "QUALIFIER", "PROPAGATED", false, false);
1980               
1981                   // Get flavor oriented attributes:
1982               
1983 kumpf    1.64     CIMFlavor flavor = getFlavor(entry, parser.getLine(), "QUALIFIER");
1984 mike     1.23 
1985                   // Get VALUE or VALUE.ARRAY element:
1986               
1987                   CIMValue value;
1988               
1989                   if (!getValueElement(parser, type, value) &&
1990               	!getValueArrayElement(parser, type, value))
1991                   {
1992 kumpf    1.52         value.setNullValue(type, false);
1993 mike     1.23     }
1994               
1995                   // Expect </QUALIFIER>:
1996               
1997                   expectEndTag(parser, "QUALIFIER");
1998               
1999                   // Build qualifier:
2000               
2001                   qualifier = CIMQualifier(name, value, flavor, propagated);
2002                   return true;
2003               }
2004               
2005               //------------------------------------------------------------------------------
2006               //
2007               // getQualifierElements()
2008               //
2009               //------------------------------------------------------------------------------
2010               
2011               template<class CONTAINER>
2012               void getQualifierElements(XmlParser& parser, CONTAINER& container)
2013               {
2014 mike     1.23     CIMQualifier qualifier;
2015               
2016                   while (XmlReader::getQualifierElement(parser, qualifier))
2017                   {
2018               	try
2019               	{
2020               	    container.addQualifier(qualifier);
2021               	}
2022 kumpf    1.66 	catch (AlreadyExistsException&)
2023 mike     1.23 	{
2024 humberto 1.85 
2025               	  // l10n
2026               	  
2027               	  // throw XmlSemanticError(parser.getLine(), "duplicate qualifier");
2028               
2029 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.DUPLICATE_QUALIFIER",
2030               				     "duplicate qualifier");
2031 humberto 1.85 	  
2032               	  throw XmlSemanticError(parser.getLine(), mlParms);
2033 mike     1.23 	}
2034                   }
2035               }
2036               
2037               //------------------------------------------------------------------------------
2038               //
2039               // getPropertyElement()
2040               //
2041               //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
2042               //     <!ATTLIST PROPERTY
2043               //         %CIMName;
2044               //         %ClassOrigin;
2045               //         %Propagated;
2046               //         %CIMType; #REQUIRED>
2047               //
2048               //------------------------------------------------------------------------------
2049               
2050               Boolean XmlReader::getPropertyElement(XmlParser& parser, CIMProperty& property)
2051               {
2052                   XmlEntry entry;
2053               
2054 mike     1.23     if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY"))
2055               	return false;
2056               
2057                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2058               
2059                   // Get PROPERTY.NAME attribute:
2060               
2061 kumpf    1.74     CIMName name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
2062 mike     1.23 
2063                   // Get PROPERTY.CLASSORIGIN attribute:
2064               
2065 kumpf    1.62     CIMName classOrigin = 
2066 mike     1.23 	getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
2067               
2068                   // Get PROPERTY.PROPAGATED
2069               
2070                   Boolean propagated = getCimBooleanAttribute(
2071               	parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
2072               
2073                   // Get PROPERTY.TYPE attribute:
2074               
2075 kumpf    1.67     CIMType type;
2076                   getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY");
2077 mike     1.23 
2078 karl     1.35     // Create property: Sets type and !isarray
2079 mike     1.23 
2080 kumpf    1.56     CIMValue value(type, false);
2081 kumpf    1.62     property = CIMProperty(name, value, 0, CIMName(), classOrigin, propagated);
2082 mike     1.23 
2083                   if (!empty)
2084                   {
2085               	// Get qualifiers:
2086               
2087               	getQualifierElements(parser, property);
2088               
2089 karl     1.35 	// Get value:  Insert value if getValueElement exists (returns True)
2090 mike     1.23 
2091               	if (getValueElement(parser, type, value))
2092               	    property.setValue(value);
2093               
2094               	expectEndTag(parser, "PROPERTY");
2095                   }
2096               
2097                   return true;
2098               }
2099               
2100               //------------------------------------------------------------------------------
2101               //
2102               // getArraySizeAttribute()
2103               //
2104               //     Returns true if able to get array-size. Note that array size will
2105               //     always be a positive integer.
2106               //
2107               //     <!ENTITY % ArraySize "ARRAYSIZE CDATA #IMPLIED">
2108               //
2109               //------------------------------------------------------------------------------
2110               
2111 mike     1.23 Boolean XmlReader::getArraySizeAttribute(
2112                   Uint32 lineNumber,
2113                   const XmlEntry& entry,
2114                   const char* tagName,
2115                   Uint32& value)
2116               {
2117                   const char* tmp;
2118               
2119                   if (!entry.getAttributeValue("ARRAYSIZE", tmp))
2120               	return false;
2121               
2122                   Uint64 arraySize;
2123               
2124                   if (!stringToUnsignedInteger(tmp, arraySize) || arraySize == 0)
2125                   {
2126 humberto 1.85       // l10n
2127                     
2128                     // char message[128];
2129                     // sprintf(message, "Illegal value for %s.%s", tagName, "ARRAYSIZE");
2130                     // throw XmlSemanticError(lineNumber, message);
2131               
2132                     char message[128];
2133                     sprintf(message, "%s.%s", tagName, "ARRAYSIZE");
2134                     
2135                     MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE",
2136               				 "Illegal value for $0",
2137               				 message);
2138                     
2139                     throw XmlSemanticError(lineNumber, mlParms);
2140 mike     1.23     }
2141               
2142                   value = Uint32(arraySize);
2143                   return true;
2144               }
2145               
2146               //------------------------------------------------------------------------------
2147               //
2148               // getPropertyArrayElement()
2149               //
2150               //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
2151               //     <!ATTLIST PROPERTY.ARRAY
2152               //             %CIMName;
2153               //             %CIMType; #REQUIRED
2154               //             %ArraySize;
2155               //             %ClassOrigin;
2156               //             %Propagated;>
2157               //
2158               //------------------------------------------------------------------------------
2159               
2160               Boolean XmlReader::getPropertyArrayElement(
2161 mike     1.23     XmlParser& parser, 
2162                   CIMProperty& property)
2163               {
2164                   // Get PROPERTY element:
2165               
2166                   XmlEntry entry;
2167               
2168                   if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.ARRAY"))
2169               	return false;
2170               
2171                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2172               
2173                   // Get PROPERTY.NAME attribute:
2174               
2175 kumpf    1.74     CIMName name = 
2176 mike     1.23 	getCimNameAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
2177               
2178                   // Get PROPERTY.TYPE attribute:
2179               
2180 kumpf    1.67     CIMType type;
2181                   getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY.ARRAY");
2182 mike     1.23 
2183                   // Get PROPERTY.ARRAYSIZE attribute:
2184               
2185                   Uint32 arraySize = 0;
2186                   getArraySizeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY", arraySize);
2187               
2188                   // Get PROPERTY.CLASSORIGIN attribute:
2189               
2190 kumpf    1.62     CIMName classOrigin 
2191 mike     1.23 	= getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
2192               
2193                   // Get PROPERTY.ARRAY.PROPAGATED
2194               
2195                   Boolean propagated = getCimBooleanAttribute(
2196               	parser.getLine(), entry, "PROPERTY.ARRAY", "PROPAGATED", false, false);
2197               
2198                   // Create property:
2199               
2200 kumpf    1.56     CIMValue value(type, true, arraySize);
2201 mike     1.23     property = CIMProperty(
2202 kumpf    1.62 	name, value, arraySize, CIMName(), classOrigin, propagated);
2203 mike     1.23 
2204                   if (!empty)
2205                   {
2206               	// Get qualifiers:
2207               
2208               	getQualifierElements(parser, property);
2209               
2210               	// Get value:
2211               
2212               	if (getValueArrayElement(parser, type, value))
2213               	{
2214               	    if (arraySize && arraySize != value.getArraySize())
2215               	    {
2216 humberto 1.85 
2217               	      // l10n
2218               
2219               	      // throw XmlSemanticError(parser.getLine(),
2220               	      //   "ARRAYSIZE attribute and value-array size are different");
2221               
2222               	      MessageLoaderParms mlParms("Common.XmlReader.ARRAY_SIZE_DIFFERENT",
2223 humberto 1.87 					 "ARRAYSIZE attribute and value-array size are different");
2224 humberto 1.85 	      
2225               	      throw XmlSemanticError(parser.getLine(), mlParms);
2226 mike     1.23 	    }
2227               
2228               	    property.setValue(value);
2229               	}
2230               
2231               	expectEndTag(parser, "PROPERTY.ARRAY");
2232                   }
2233               
2234                   return true;
2235               }
2236               
2237               //------------------------------------------------------------------------------
2238               //
2239               // getHostElement()
2240               //
2241               //     <!ELEMENT HOST (#PCDATA)>
2242               //
2243               //------------------------------------------------------------------------------
2244               
2245               Boolean XmlReader::getHostElement(
2246                   XmlParser& parser,
2247 mike     1.23     String& host)
2248               {
2249                   XmlEntry entry;
2250               
2251                   if (!testStartTag(parser, entry, "HOST"))
2252               	return false;
2253 karl     1.78 #ifdef PEGASUS_SNIA_INTEROP_TEST
2254                   // Temp code to allow empty HOST field.
2255                   // SNIA CIMOMs return empty field particularly on enumerateinstance.
2256                   // Simply substitute a string for the empty.
2257               	if (!parser.next(entry))
2258               	    throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2259               
2260               	if (entry.type == XmlEntry::CONTENT)
2261 david    1.86 	    host = String(entry.text,STRING_FLAG_UTF8);
2262 karl     1.78 	else
2263                   {
2264               	    parser.putBack(entry);
2265                       host = "HOSTNAMEINSERTEDBYPEGASUSCLIENT";
2266                   }
2267               
2268               #else
2269 mike     1.23 
2270                   if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)
2271                   {
2272 humberto 1.85 
2273                     // l10n
2274               
2275                     // throw XmlValidationError(parser.getLine(),
2276                     //	       "expected content of HOST element");
2277               
2278                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CONTENT_ELEMENT",
2279 humberto 1.87 				 "expected content of HOST element");
2280 humberto 1.85       
2281                     throw XmlValidationError(parser.getLine(), mlParms);
2282               	
2283 mike     1.23     }
2284               
2285 david    1.86     host = String(entry.text,STRING_FLAG_UTF8);
2286 karl     1.78 #endif
2287 mike     1.23     expectEndTag(parser, "HOST");
2288                   return true;
2289               }
2290               
2291               //------------------------------------------------------------------------------
2292               //
2293               // getNameSpaceElement()
2294               //     
2295               //     <!ELEMENT NAMESPACE EMPTY>
2296               //     <!ATTLIST NAMESPACE %CIMName;>
2297               //
2298               //------------------------------------------------------------------------------
2299               
2300               Boolean XmlReader::getNameSpaceElement(
2301                   XmlParser& parser,
2302 kumpf    1.74     CIMName& nameSpaceComponent)
2303 mike     1.23 {
2304                   XmlEntry entry;
2305               
2306                   if (!testStartTagOrEmptyTag(parser, entry, "NAMESPACE"))
2307               	return false;
2308               
2309                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2310               
2311                   nameSpaceComponent = getCimNameAttribute(
2312               	parser.getLine(), entry, "NAMESPACE");
2313               
2314                   if (!empty)
2315               	expectEndTag(parser, "NAMESPACE");
2316               
2317                   return true;
2318               }
2319               
2320               //------------------------------------------------------------------------------
2321               //
2322               // getLocalNameSpacePathElement()
2323               //     
2324 mike     1.23 //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
2325               //
2326               //------------------------------------------------------------------------------
2327               
2328               Boolean XmlReader::getLocalNameSpacePathElement(
2329                   XmlParser& parser,
2330                   String& nameSpace)
2331               {
2332                   XmlEntry entry;
2333               
2334                   if (!testStartTag(parser, entry, "LOCALNAMESPACEPATH"))
2335               	return false;
2336               
2337 kumpf    1.74     CIMName nameSpaceComponent;
2338 mike     1.23 
2339                   while (getNameSpaceElement(parser, nameSpaceComponent))
2340                   {
2341               	if (nameSpace.size())
2342 kumpf    1.71 	    nameSpace.append('/');
2343 mike     1.23 
2344 kumpf    1.74 	nameSpace.append(nameSpaceComponent.getString());
2345 mike     1.23     }
2346               
2347                   if (!nameSpace.size())
2348                   {
2349 humberto 1.85 
2350                     // l10n
2351               
2352                     // throw XmlValidationError(parser.getLine(),
2353                     //   "Expected one or more NAMESPACE elements within "
2354                     //   "LOCALNAMESPACEPATH element");
2355               
2356                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_NAMESPACE_ELEMENTS",
2357 humberto 1.87 				 "Expected one or more NAMESPACE elements within LOCALNAMESPACEPATH element");
2358 humberto 1.85       
2359                     throw XmlValidationError(parser.getLine(), mlParms);
2360               	
2361               
2362 mike     1.23     }
2363               
2364                   expectEndTag(parser, "LOCALNAMESPACEPATH");
2365                   return true;
2366               }
2367               
2368               //------------------------------------------------------------------------------
2369               //
2370               // getNameSpacePathElement()
2371               //
2372               //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
2373               //
2374               //------------------------------------------------------------------------------
2375               
2376               Boolean XmlReader::getNameSpacePathElement(
2377                   XmlParser& parser,
2378                   String& host,
2379                   String& nameSpace)
2380               {
2381                   host.clear();
2382                   nameSpace.clear();
2383 mike     1.23 
2384                   XmlEntry entry;
2385               
2386                   if (!testStartTag(parser, entry, "NAMESPACEPATH"))
2387               	return false;
2388               
2389 humberto 1.85     if (!getHostElement(parser, host)) {
2390               
2391                     // l10n
2392               
2393                     // throw XmlValidationError(parser.getLine(), "expected HOST element");
2394               
2395 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_HOST_ELEMENT",
2396               				 "expected HOST element");
2397 humberto 1.85       
2398                     throw XmlValidationError(parser.getLine(), mlParms);
2399                   }
2400 mike     1.23 
2401                   if (!getLocalNameSpacePathElement(parser, nameSpace))
2402                   {
2403 humberto 1.85 
2404                     // l10n
2405               
2406                     // throw XmlValidationError(parser.getLine(), 
2407                     //   "expected LOCALNAMESPACEPATH element");
2408               
2409 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
2410               				 "expected LOCALNAMESPACEPATH element");
2411 humberto 1.85       
2412                     throw XmlValidationError(parser.getLine(), mlParms);
2413 mike     1.23     }
2414               
2415                   expectEndTag(parser, "NAMESPACEPATH");
2416               
2417                   return true;
2418               }
2419               
2420               //------------------------------------------------------------------------------
2421               //
2422               // getClassNameElement()
2423               //
2424               //     <!ELEMENT CLASSNAME EMPTY>
2425               //     <!ATTLIST CLASSNAME %CIMName;>
2426               //
2427               //------------------------------------------------------------------------------
2428               
2429               Boolean XmlReader::getClassNameElement(
2430                   XmlParser& parser,
2431 kumpf    1.74     CIMName& className,
2432 mike     1.23     Boolean required)
2433               {
2434                   XmlEntry entry;
2435               
2436                   if (!testStartTagOrEmptyTag(parser, entry, "CLASSNAME"))
2437                   {
2438               	if (required)
2439               	{
2440 humberto 1.85 
2441               	  // l10n
2442               
2443               	  // throw XmlValidationError(parser.getLine(),
2444               	  // "expected CLASSNAME element");
2445               
2446 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
2447               				     "expected CLASSNAME element");
2448 humberto 1.85 	  
2449               	  throw XmlValidationError(parser.getLine(), mlParms);
2450 mike     1.23 	}
2451               	else
2452               	    return false;
2453                   }
2454                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2455               
2456                   className = getCimNameAttribute(
2457 kumpf    1.81 	parser.getLine(), entry, "CLASSNAME", false);
2458 mike     1.23 
2459                   if (!empty)
2460               	expectEndTag(parser, "CLASSNAME");
2461               
2462                   return true;
2463               }
2464               
2465               //------------------------------------------------------------------------------
2466               //
2467               // getValueTypeAttribute()
2468               //
2469               //     VALUETYPE (string|boolean|numeric) 'string'
2470               //
2471               //------------------------------------------------------------------------------
2472               
2473 kumpf    1.73 CIMKeyBinding::Type XmlReader::getValueTypeAttribute(
2474 mike     1.23     Uint32 lineNumber, 
2475                   const XmlEntry& entry,
2476                   const char* elementName)
2477               {
2478                   String tmp;
2479               
2480                   if (!entry.getAttributeValue("VALUETYPE", tmp))
2481 kumpf    1.73 	return CIMKeyBinding::STRING;
2482 mike     1.23 
2483                   if (String::equal(tmp, "string"))
2484 kumpf    1.73 	return CIMKeyBinding::STRING;
2485 mike     1.23     else if (String::equal(tmp, "boolean"))
2486 kumpf    1.73 	return CIMKeyBinding::BOOLEAN;
2487 mike     1.23     else if (String::equal(tmp, "numeric"))
2488 kumpf    1.73 	return CIMKeyBinding::NUMERIC;
2489 mike     1.23 
2490 humberto 1.85     // char buffer[MESSAGE_SIZE];
2491               
2492                   // sprintf(buffer, 
2493                   // "Illegal value for %s.VALUETYPE attribute; "
2494                   // "CIMValue must be one of \"string\", \"boolean\", or \"numeric\"",
2495                   // elementName);
2496               
2497                   // throw XmlSemanticError(lineNumber, buffer);
2498               
2499               
2500 mike     1.23     char buffer[MESSAGE_SIZE];
2501 humberto 1.85     sprintf(buffer, "%s.VALUETYPE", elementName);
2502                   
2503                   MessageLoaderParms mlParms("Common.XmlReader.ILLEGAL_VALUE_FOR_CIMVALUE_ATTRIBUTE",
2504 humberto 1.87 			       "Illegal value for $0 attribute; CIMValue must be one of \"string\", \"boolean\", or \"numeric\"", buffer);
2505 humberto 1.85     
2506                   throw XmlSemanticError(lineNumber, mlParms);
2507 mike     1.23 
2508 kumpf    1.73     return CIMKeyBinding::BOOLEAN;
2509 mike     1.23 }
2510               
2511               //------------------------------------------------------------------------------
2512               //
2513               // getKeyValueElement()
2514               //
2515               //     <!ELEMENT KEYVALUE (#PCDATA)>
2516               //     <!ATTLIST KEYVALUE
2517               //         VALUETYPE (string|boolean|numeric)  'string'>
2518               //
2519               //------------------------------------------------------------------------------
2520               
2521               Boolean XmlReader::getKeyValueElement(
2522                   XmlParser& parser,
2523 kumpf    1.73     CIMKeyBinding::Type& type,
2524 mike     1.23     String& value)
2525               {
2526                   XmlEntry entry;
2527               
2528                   if (!testStartTagOrEmptyTag(parser, entry, "KEYVALUE"))
2529               	return false;
2530               
2531                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2532               
2533                   type = getValueTypeAttribute(parser.getLine(), entry, "KEYVALUE");
2534               
2535                   value.clear();
2536               
2537                   if (!empty)
2538                   {
2539               	if (!parser.next(entry))
2540               	    throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2541               
2542               	if (entry.type == XmlEntry::CONTENT)
2543 david    1.86 	    value = String(entry.text,STRING_FLAG_UTF8);
2544 mike     1.23 	else
2545               	    parser.putBack(entry);
2546               
2547               	expectEndTag(parser, "KEYVALUE");
2548                   }
2549               
2550                   return true;
2551               }
2552               
2553               //------------------------------------------------------------------------------
2554               //
2555               // getKeyBindingElement()
2556               //
2557               //     <!ELEMENT KEYBINDING (KEYVALUE|VALUE.REFERENCE)>
2558               //     <!ATTLIST KEYBINDING
2559               //         %CIMName;>
2560               //
2561               //------------------------------------------------------------------------------
2562               
2563               Boolean XmlReader::getKeyBindingElement(
2564                   XmlParser& parser,
2565 kumpf    1.74     CIMName& name,
2566 mike     1.23     String& value,
2567 kumpf    1.73     CIMKeyBinding::Type& type)
2568 mike     1.23 {
2569                   XmlEntry entry;
2570               
2571                   if (!testStartTag(parser, entry, "KEYBINDING"))
2572               	return false;
2573               
2574                   name = getCimNameAttribute(parser.getLine(), entry, "KEYBINDING");
2575               
2576                   if (!getKeyValueElement(parser, type, value))
2577 mike     1.25     {
2578 kumpf    1.54         CIMObjectPath reference;
2579 mike     1.25 
2580                       if (!getValueReferenceElement(parser, reference))
2581                       {
2582 humberto 1.85 
2583               	  // l10n
2584               
2585               	  // throw XmlValidationError(parser.getLine(),
2586               	  //          "Expected KEYVALUE or VALUE.REFERENCE element");
2587               
2588 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_KEYVALUE_OR_REFERENCE_ELEMENT",
2589               				     "Expected KEYVALUE or VALUE.REFERENCE element");
2590 humberto 1.85 	  
2591               	  throw XmlValidationError(parser.getLine(), mlParms);
2592 mike     1.25         }
2593               
2594 kumpf    1.73         type = CIMKeyBinding::REFERENCE;
2595 mike     1.25         value = reference.toString();
2596                   }
2597 mike     1.23 
2598                   expectEndTag(parser, "KEYBINDING");
2599                   return true;
2600               }
2601               
2602               //------------------------------------------------------------------------------
2603               //
2604               // getInstanceNameElement()
2605               //
2606               //     <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
2607               //     <!ATTLIST INSTANCENAME
2608               //         %ClassName;>
2609               //
2610 mike     1.25 // Note: An empty key name is used in the keyBinding when the INSTANCENAME is
2611               // specified using a KEYVALUE or a VALUE.REFERENCE.
2612 mike     1.23 //
2613               //------------------------------------------------------------------------------
2614               
2615               Boolean XmlReader::getInstanceNameElement(
2616                   XmlParser& parser,
2617                   String& className,
2618 kumpf    1.73     Array<CIMKeyBinding>& keyBindings)
2619 mike     1.23 {
2620                   className.clear();
2621                   keyBindings.clear();
2622               
2623                   XmlEntry entry;
2624               
2625                   if (!testStartTagOrEmptyTag(parser, entry, "INSTANCENAME"))
2626               	return false;
2627               
2628                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2629               
2630                   className = getClassNameAttribute(parser.getLine(), entry, "INSTANCENAME");
2631               
2632 mike     1.25     if (empty)
2633 mike     1.23     {
2634 mike     1.25         return true;
2635                   }
2636 mike     1.23 
2637 kumpf    1.74     CIMName name;
2638 kumpf    1.73     CIMKeyBinding::Type type;
2639 mike     1.25     String value;
2640 kumpf    1.54     CIMObjectPath reference;
2641 mike     1.25 
2642                   if (getKeyValueElement(parser, type, value))
2643                   {
2644                       // Use empty key name because none was specified
2645 kumpf    1.73         keyBindings.append(CIMKeyBinding(name, value, type));
2646 mike     1.25     }
2647                   else if (getValueReferenceElement(parser, reference))
2648                   {
2649                       // Use empty key name because none was specified
2650 kumpf    1.73         type = CIMKeyBinding::REFERENCE;
2651 mike     1.25         value = reference.toString();
2652 kumpf    1.73         keyBindings.append(CIMKeyBinding(name, value, type));
2653 mike     1.25     }
2654                   else
2655                   {
2656 mike     1.23 	while (getKeyBindingElement(parser, name, value, type))
2657 kumpf    1.73 	    keyBindings.append(CIMKeyBinding(name, value, type));
2658 mike     1.25     }
2659 mike     1.23 
2660 mike     1.25     expectEndTag(parser, "INSTANCENAME");
2661 mike     1.23 
2662                   return true;
2663               }
2664               
2665               Boolean XmlReader::getInstanceNameElement(
2666                   XmlParser& parser,
2667 kumpf    1.54     CIMObjectPath& instanceName)
2668 mike     1.23 {
2669                   String className;
2670 kumpf    1.73     Array<CIMKeyBinding> keyBindings;
2671 mike     1.23 
2672                   if (!XmlReader::getInstanceNameElement(parser, className, keyBindings))
2673               	return false;
2674               
2675 kumpf    1.62     instanceName.set(String(), CIMNamespaceName(), className, keyBindings);
2676 mike     1.23     return true;
2677               }
2678               
2679               //------------------------------------------------------------------------------
2680               //
2681               // getInstancePathElement()
2682               //
2683               //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
2684               //
2685               //------------------------------------------------------------------------------
2686               
2687               Boolean XmlReader::getInstancePathElement(
2688                   XmlParser& parser,
2689 kumpf    1.54     CIMObjectPath& reference)
2690 mike     1.23 {
2691                   XmlEntry entry;
2692               
2693                   if (!testStartTag(parser, entry, "INSTANCEPATH"))
2694               	return false;
2695               
2696                   String host;
2697                   String nameSpace;
2698               
2699                   if (!getNameSpacePathElement(parser, host, nameSpace))
2700                   {
2701 humberto 1.85 
2702                     // l10n
2703               
2704                     // throw XmlValidationError(parser.getLine(),
2705                     //   "expected NAMESPACEPATH element");
2706               
2707 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_NAMESPACEPATH_ELEMENT",
2708               				 "expected NAMESPACEPATH element");
2709 humberto 1.85       
2710                     throw XmlValidationError(parser.getLine(), mlParms);
2711               
2712 mike     1.23     }
2713               
2714                   String className;
2715 kumpf    1.73     Array<CIMKeyBinding> keyBindings;
2716 mike     1.23 
2717                   if (!getInstanceNameElement(parser, className, keyBindings))
2718                   {
2719 humberto 1.85 
2720                     // l10n
2721               
2722                     // throw XmlValidationError(parser.getLine(), 
2723                     //   "expected INSTANCENAME element");
2724               
2725               
2726 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
2727               				 "expected INSTANCENAME element");
2728 humberto 1.85       
2729                     throw XmlValidationError(parser.getLine(), mlParms);
2730               
2731 mike     1.23     }
2732               
2733                   reference.set(host, nameSpace, className, keyBindings);
2734               
2735                   expectEndTag(parser, "INSTANCEPATH");
2736                   return true;
2737               }
2738               
2739               //------------------------------------------------------------------------------
2740               //
2741               // getLocalInstancePathElement()
2742               //
2743               //     <!ELEMENT LOCALINSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
2744               //
2745               //------------------------------------------------------------------------------
2746               
2747               Boolean XmlReader::getLocalInstancePathElement(
2748                   XmlParser& parser,
2749 kumpf    1.54     CIMObjectPath& reference)
2750 mike     1.23 {
2751                   XmlEntry entry;
2752               
2753                   if (!testStartTag(parser, entry, "LOCALINSTANCEPATH"))
2754               	return false;
2755               
2756                   String nameSpace;
2757               
2758                   if (!getLocalNameSpacePathElement(parser, nameSpace))
2759                   {
2760 humberto 1.85 
2761                     // l10n
2762               
2763                     // throw XmlValidationError(parser.getLine(),
2764                     //   "expected LOCALNAMESPACEPATH element");
2765               
2766 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
2767               				 "expected LOCALNAMESPACEPATH element");
2768 humberto 1.85       
2769                     throw XmlValidationError(parser.getLine(), mlParms);
2770               
2771 mike     1.23     }
2772               
2773                   String className;
2774 kumpf    1.73     Array<CIMKeyBinding> keyBindings;
2775 mike     1.23 
2776                   if (!getInstanceNameElement(parser, className, keyBindings))
2777                   {
2778 humberto 1.85 
2779                     // l10n
2780               
2781                     // throw XmlValidationError(parser.getLine(), 
2782                     //   "expected INSTANCENAME element");
2783               
2784 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
2785               				 "expected INSTANCENAME element");
2786 humberto 1.85       
2787                     throw XmlValidationError(parser.getLine(), mlParms);
2788               
2789 mike     1.23     }
2790               
2791                   reference.set(String(), nameSpace, className, keyBindings);
2792               
2793                   expectEndTag(parser, "LOCALINSTANCEPATH");
2794                   return true;
2795               }
2796               
2797               //------------------------------------------------------------------------------
2798               //
2799               // getClassPathElement()
2800               //
2801               //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
2802               //
2803               //------------------------------------------------------------------------------
2804               
2805               Boolean XmlReader::getClassPathElement(
2806                   XmlParser& parser,
2807 kumpf    1.54     CIMObjectPath& reference)
2808 mike     1.23 {
2809                   XmlEntry entry;
2810               
2811                   if (!testStartTag(parser, entry, "CLASSPATH"))
2812               	return false;
2813               
2814                   String host;
2815                   String nameSpace;
2816               
2817                   if (!getNameSpacePathElement(parser, host, nameSpace))
2818                   {
2819 humberto 1.85 
2820                     // l10n
2821               
2822                     // throw XmlValidationError(parser.getLine(),
2823                     //    "expected NAMESPACEPATH element");
2824               
2825 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_NAMESPACEPATH_ELEMENT",
2826               				 "expected NAMESPACEPATH element");
2827 humberto 1.85       
2828                     throw XmlValidationError(parser.getLine(), mlParms);
2829               
2830 mike     1.23     }
2831               
2832 kumpf    1.74     CIMName className;
2833 mike     1.23 
2834                   if (!getClassNameElement(parser, className))
2835                   {
2836 humberto 1.85 
2837                     // l10n
2838               
2839                     // throw XmlValidationError(parser.getLine(), 
2840                     //   "expected CLASSNAME element");
2841               
2842 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
2843               				 "expected CLASSNAME element");
2844 humberto 1.85       
2845                     throw XmlValidationError(parser.getLine(), mlParms);
2846               
2847 mike     1.23     }
2848               
2849                   reference.set(host, nameSpace, className);
2850               
2851                   expectEndTag(parser, "CLASSPATH");
2852                   return true;
2853               }
2854               
2855               //------------------------------------------------------------------------------
2856               //
2857               // getLocalClassPathElement()
2858               //
2859               //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH,CLASSNAME)>
2860               //
2861               //------------------------------------------------------------------------------
2862               
2863               Boolean XmlReader::getLocalClassPathElement(
2864                   XmlParser& parser,
2865 kumpf    1.54     CIMObjectPath& reference)
2866 mike     1.23 {
2867                   XmlEntry entry;
2868               
2869                   if (!testStartTag(parser, entry, "LOCALCLASSPATH"))
2870               	return false;
2871               
2872                   String nameSpace;
2873               
2874                   if (!getLocalNameSpacePathElement(parser, nameSpace))
2875                   {
2876 humberto 1.85 
2877                     // l10n
2878               
2879                     // throw XmlValidationError(parser.getLine(),
2880                     //    "expected LOCALNAMESPACEPATH element");
2881               
2882 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
2883               				 "expected LOCALNAMESPACEPATH element");
2884 humberto 1.85       
2885                     throw XmlValidationError(parser.getLine(), mlParms);
2886               
2887 mike     1.23     }
2888               
2889 kumpf    1.74     CIMName className;
2890 mike     1.23 
2891                   if (!getClassNameElement(parser, className))
2892                   {
2893 humberto 1.85 
2894                     // l10n
2895               
2896                     // throw XmlValidationError(parser.getLine(), 
2897                     //   "expected CLASSNAME element");
2898               
2899 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_ELEMENT",
2900               				 "expected CLASSNAME element");
2901 humberto 1.85       
2902                     throw XmlValidationError(parser.getLine(), mlParms);
2903               
2904 mike     1.23     }
2905               
2906                   reference.set(String(), nameSpace, className);
2907               
2908                   expectEndTag(parser, "LOCALCLASSPATH");
2909               
2910                   return true;
2911               }
2912               
2913               //------------------------------------------------------------------------------
2914               //
2915               // getValueReferenceElement()
2916               //
2917               //     <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
2918               //         INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
2919               //
2920               //
2921               //------------------------------------------------------------------------------
2922               
2923               Boolean XmlReader::getValueReferenceElement(
2924                   XmlParser& parser,
2925 kumpf    1.54     CIMObjectPath& reference)
2926 mike     1.23 {
2927                   XmlEntry entry;
2928               
2929                   if (!testStartTag(parser, entry, "VALUE.REFERENCE"))
2930               	return false;
2931               
2932                   if (!parser.next(entry))
2933               	throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2934               
2935                   if (entry.type != XmlEntry::START_TAG && 
2936               	entry.type != XmlEntry::EMPTY_TAG)
2937                   {
2938 humberto 1.85 
2939                     // l10n
2940               
2941                     // throw XmlValidationError(parser.getLine(), 
2942                     //   "Expected one of the following start tags: "
2943                     //    "CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, "
2944                     //    "LOCALINSTANCEPATH, INSTANCENAME");
2945               
2946                     MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_START_TAGS",
2947 humberto 1.87 				 "Expected one of the following start tags: CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, LOCALINSTANCEPATH, INSTANCENAME");
2948 humberto 1.85       
2949                     throw XmlValidationError(parser.getLine(), mlParms);
2950               
2951 mike     1.23     }
2952               
2953                   if (strcmp(entry.text, "CLASSPATH") == 0)
2954                   {
2955               	parser.putBack(entry);
2956               	getClassPathElement(parser, reference);
2957                   }
2958                   else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
2959                   {
2960               	parser.putBack(entry);
2961               	getLocalClassPathElement(parser, reference);
2962                   }
2963                   else if (strcmp(entry.text, "CLASSNAME") == 0)
2964                   {
2965               	parser.putBack(entry);
2966 kumpf    1.74 	CIMName className;
2967 mike     1.23 	getClassNameElement(parser, className);
2968 kumpf    1.62 	reference.set(String(), CIMNamespaceName(), className);
2969 mike     1.23     }
2970                   else if (strcmp(entry.text, "INSTANCEPATH") == 0)
2971                   {
2972               	parser.putBack(entry);
2973               	getInstancePathElement(parser, reference);
2974                   }
2975                   else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
2976                   {
2977               	parser.putBack(entry);
2978               	getLocalInstancePathElement(parser, reference);
2979                   }
2980                   else if (strcmp(entry.text, "INSTANCENAME") == 0)
2981                   {
2982               	parser.putBack(entry);
2983               	String className;
2984 kumpf    1.73 	Array<CIMKeyBinding> keyBindings;
2985 mike     1.23 	getInstanceNameElement(parser, className, keyBindings);
2986 kumpf    1.62 	reference.set(String(), CIMNamespaceName(), className, keyBindings);
2987 mike     1.23     }
2988               
2989                   expectEndTag(parser, "VALUE.REFERENCE");
2990                   return true;
2991               }
2992               
2993               //------------------------------------------------------------------------------
2994               //
2995 kumpf    1.28 // getValueReferenceArrayElement()
2996               //
2997               //     <!ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)>
2998               //
2999               //------------------------------------------------------------------------------
3000               
3001               Boolean XmlReader::getValueReferenceArrayElement(
3002                   XmlParser& parser, 
3003                   CIMValue& value)
3004               {
3005                   XmlEntry entry;
3006 kumpf    1.54     Array<CIMObjectPath> referenceArray;
3007                   CIMObjectPath reference;
3008 kumpf    1.28 
3009                   value.clear();
3010               
3011                   // Get VALUE.REFARRAY open tag:
3012               
3013                   if (!testStartTagOrEmptyTag(parser, entry, "VALUE.REFARRAY"))
3014               	return false;
3015               
3016 kumpf    1.32     if (entry.type != XmlEntry::EMPTY_TAG)
3017                   {
3018                       // For each VALUE.REFERENCE element:
3019 kumpf    1.28 
3020 kumpf    1.32         while (getValueReferenceElement(parser, reference))
3021                       {
3022               	    referenceArray.append(reference);
3023                       }
3024 kumpf    1.28 
3025 kumpf    1.32         expectEndTag(parser, "VALUE.REFARRAY");
3026 kumpf    1.28     }
3027               
3028                   value.set(referenceArray);
3029                   return true;
3030               }
3031               
3032               //------------------------------------------------------------------------------
3033               //
3034 mike     1.23 // getPropertyReferenceElement()
3035               //
3036               //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,(VALUE.REFERENCE)?)>
3037               //     <!ATTLIST PROPERTY.REFERENCE
3038               //         %CIMName;
3039               //         %ReferenceClass;
3040               //         %ClassOrigin;
3041               //         %Propagated;>
3042               //
3043               //------------------------------------------------------------------------------
3044               
3045               Boolean XmlReader::getPropertyReferenceElement(
3046                   XmlParser& parser, 
3047                   CIMProperty& property)
3048               {
3049                   XmlEntry entry;
3050               
3051                   if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.REFERENCE"))
3052               	return false;
3053               
3054                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3055 mike     1.23 
3056                   // Get PROPERTY.NAME attribute:
3057               
3058 kumpf    1.74     CIMName name = getCimNameAttribute(
3059 mike     1.23 	parser.getLine(), entry, "PROPERTY.REFERENCE");
3060               
3061                   // Get PROPERTY.REFERENCECLASS attribute:
3062               
3063 kumpf    1.62     CIMName referenceClass = getReferenceClassAttribute(
3064 mike     1.23 	parser.getLine(), entry, "PROPERTY.REFERENCE");
3065               
3066                   // Get PROPERTY.CLASSORIGIN attribute:
3067               
3068 kumpf    1.62     CIMName classOrigin = 
3069 mike     1.23 	getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.REFERENCE");
3070               
3071                   // Get PROPERTY.PROPAGATED
3072               
3073                   Boolean propagated = getCimBooleanAttribute(parser.getLine(), entry, 
3074               	"PROPERTY.REFERENCE", "PROPAGATED", false, false);
3075               
3076                   // Create property:
3077               
3078 kumpf    1.61     CIMValue value = CIMValue(CIMTYPE_REFERENCE, false, 0);
3079 kumpf    1.54 //    value.set(CIMObjectPath());
3080 mike     1.23     property = CIMProperty(
3081               	name, value, 0, referenceClass, classOrigin, propagated);
3082               
3083                   if (!empty)
3084                   {
3085               	getQualifierElements(parser, property);
3086               
3087 kumpf    1.54 	CIMObjectPath reference;
3088 mike     1.23 
3089               	if (getValueReferenceElement(parser, reference))
3090               	    property.setValue(reference);
3091               
3092               	expectEndTag(parser, "PROPERTY.REFERENCE");
3093                   }
3094               
3095                   return true;
3096               }
3097               
3098               //------------------------------------------------------------------------------
3099               //
3100               // GetPropertyElements()
3101               //
3102               //------------------------------------------------------------------------------
3103               
3104               template<class CONTAINER>
3105               void GetPropertyElements(XmlParser& parser, CONTAINER& container)
3106               {
3107                   CIMProperty property;
3108               
3109 mike     1.23     while (XmlReader::getPropertyElement(parser, property) ||
3110               	XmlReader::getPropertyArrayElement(parser, property) ||
3111               	XmlReader::getPropertyReferenceElement(parser, property))
3112                   {
3113               	try
3114               	{
3115               	    container.addProperty(property);
3116               	}
3117 kumpf    1.66 	catch (AlreadyExistsException&)
3118 mike     1.23 	{
3119 humberto 1.85 
3120               	  // l10n
3121               
3122               	  // throw XmlSemanticError(parser.getLine(), "duplicate property");
3123               
3124 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.DUPLICATE_PROPERTY",
3125               				     "duplicate property");
3126 humberto 1.85 	  
3127               	  throw XmlSemanticError(parser.getLine(), mlParms);
3128 mike     1.23 	}
3129                   }
3130               }
3131               
3132               //------------------------------------------------------------------------------
3133               //
3134               // getParameterElement()
3135               //
3136               //     <!ELEMENT PARAMETER (QUALIFIER*)>
3137               //     <!ATTLIST PARAMETER
3138               //         %CIMName;
3139               //         %CIMType; #REQUIRED>
3140               //
3141               //------------------------------------------------------------------------------
3142               
3143               Boolean XmlReader::getParameterElement(
3144                   XmlParser& parser, 
3145                   CIMParameter& parameter)
3146               {
3147                   XmlEntry entry;
3148               
3149 mike     1.23     if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER"))
3150               	return false;
3151               
3152                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3153               
3154                   // Get PARAMETER.NAME attribute:
3155               
3156 kumpf    1.74     CIMName name = getCimNameAttribute(parser.getLine(), entry, "PARAMETER");
3157 mike     1.23 
3158                   // Get PARAMETER.TYPE attribute:
3159               
3160 kumpf    1.67     CIMType type;
3161                   getCimTypeAttribute(parser.getLine(), entry, type, "PARAMETER");
3162 mike     1.23 
3163                   // Create parameter:
3164               
3165                   parameter = CIMParameter(name, type);
3166               
3167                   if (!empty)
3168                   {
3169               	getQualifierElements(parser, parameter);
3170               
3171               	expectEndTag(parser, "PARAMETER");
3172                   }
3173               
3174                   return true;
3175               }
3176               
3177               //------------------------------------------------------------------------------
3178               //
3179               // getParameterArrayElement()
3180               //
3181               //     <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
3182               //     <!ATTLIST PARAMETER.ARRAY
3183 mike     1.23 //         %CIMName;
3184               //         %CIMType; #REQUIRED
3185               //         %ArraySize;>
3186               //
3187               //------------------------------------------------------------------------------
3188               
3189               Boolean XmlReader::getParameterArrayElement(
3190                   XmlParser& parser, 
3191                   CIMParameter& parameter)
3192               {
3193                   XmlEntry entry;
3194               
3195                   if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.ARRAY"))
3196               	return false;
3197               
3198                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3199               
3200                   // Get PARAMETER.ARRAY.NAME attribute:
3201               
3202 kumpf    1.74     CIMName name = getCimNameAttribute(
3203 mike     1.23 	parser.getLine(), entry, "PARAMETER.ARRAY");
3204               
3205                   // Get PARAMETER.ARRAY.TYPE attribute:
3206               
3207 kumpf    1.67     CIMType type;
3208                   getCimTypeAttribute(parser.getLine(), entry, type, "PARAMETER.ARRAY");
3209 mike     1.23 
3210                   // Get PARAMETER.ARRAYSIZE attribute:
3211               
3212                   Uint32 arraySize = 0;
3213                   getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY",arraySize);
3214               
3215                   // Create parameter:
3216               
3217                   parameter = CIMParameter(name, type, true, arraySize);
3218               
3219                   if (!empty)
3220                   {
3221               	getQualifierElements(parser, parameter);
3222               
3223               	expectEndTag(parser, "PARAMETER.ARRAY");
3224                   }
3225               
3226                   return true;
3227               }
3228               
3229               //------------------------------------------------------------------------------
3230 mike     1.23 //
3231               // getParameterReferenceElement()
3232               //
3233               //     <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
3234               //     <!ATTLIST PARAMETER.REFERENCE
3235               //         %CIMName;
3236               //         %ReferenceClass;>
3237               //
3238               //------------------------------------------------------------------------------
3239               
3240               Boolean XmlReader::getParameterReferenceElement(
3241                   XmlParser& parser, 
3242                   CIMParameter& parameter)
3243               {
3244                   XmlEntry entry;
3245               
3246                   if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFERENCE"))
3247               	return false;
3248               
3249                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3250               
3251 mike     1.23     // Get PARAMETER.NAME attribute:
3252               
3253 kumpf    1.74     CIMName name = getCimNameAttribute(
3254 mike     1.23 	parser.getLine(), entry, "PARAMETER.REFERENCE");
3255               
3256                   // Get PARAMETER.REFERENCECLASS attribute:
3257               
3258 kumpf    1.62     CIMName referenceClass = getReferenceClassAttribute(
3259 mike     1.23 	parser.getLine(), entry, "PARAMETER.REFERENCE");
3260               
3261                   // Create parameter:
3262               
3263 kumpf    1.61     parameter = CIMParameter(name, CIMTYPE_REFERENCE, false, 0, referenceClass);
3264 mike     1.23 
3265                   if (!empty)
3266                   {
3267               	getQualifierElements(parser, parameter);
3268               	expectEndTag(parser, "PARAMETER.REFERENCE");
3269                   }
3270               
3271                   return true;
3272               }
3273               
3274               //------------------------------------------------------------------------------
3275               //
3276 kumpf    1.26 // getParameterReferenceArrayElement()
3277               //
3278               //     <!ELEMENT PARAMETER.REFARRAY (QUALIFIER*)>
3279               //     <!ATTLIST PARAMETER.REFARRAY
3280               //         %CIMName;
3281               //         %ReferenceClass;
3282               //         %ArraySize;>
3283               //
3284               //------------------------------------------------------------------------------
3285               
3286               Boolean XmlReader::getParameterReferenceArrayElement(
3287                   XmlParser& parser, 
3288                   CIMParameter& parameter)
3289               {
3290                   XmlEntry entry;
3291               
3292                   if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFARRAY"))
3293               	return false;
3294               
3295                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3296               
3297 kumpf    1.26     // Get PARAMETER.NAME attribute:
3298               
3299 kumpf    1.74     CIMName name = getCimNameAttribute(
3300 kumpf    1.26 	parser.getLine(), entry, "PARAMETER.REFARRAY");
3301               
3302                   // Get PARAMETER.REFERENCECLASS attribute:
3303               
3304 kumpf    1.62     CIMName referenceClass = getReferenceClassAttribute(
3305 kumpf    1.26 	parser.getLine(), entry, "PARAMETER.REFARRAY");
3306               
3307                   // Get PARAMETER.ARRAYSIZE attribute:
3308               
3309                   Uint32 arraySize = 0;
3310                   getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.REFARRAY",
3311               			  arraySize);
3312               
3313                   // Create parameter:
3314               
3315 kumpf    1.61     parameter = CIMParameter(name, CIMTYPE_REFERENCE, true, arraySize,
3316 kumpf    1.26 			     referenceClass);
3317               
3318                   if (!empty)
3319                   {
3320               	getQualifierElements(parser, parameter);
3321               	expectEndTag(parser, "PARAMETER.REFARRAY");
3322                   }
3323               
3324                   return true;
3325               }
3326               
3327               //------------------------------------------------------------------------------
3328               //
3329 mike     1.23 // GetParameterElements()
3330               //
3331               //------------------------------------------------------------------------------
3332               
3333               template<class CONTAINER>
3334               void GetParameterElements(XmlParser& parser, CONTAINER& container)
3335               {
3336                   CIMParameter parameter;
3337               
3338                   while (XmlReader::getParameterElement(parser, parameter) ||
3339               	XmlReader::getParameterArrayElement(parser, parameter) ||
3340 kumpf    1.26 	XmlReader::getParameterReferenceElement(parser, parameter) ||
3341               	XmlReader::getParameterReferenceArrayElement(parser, parameter))
3342 mike     1.23     {
3343               	try
3344               	{
3345               	    container.addParameter(parameter);
3346               	}
3347 kumpf    1.66 	catch (AlreadyExistsException&)
3348 mike     1.23 	{
3349 humberto 1.85 
3350               	  // l10n
3351               
3352               	  // throw XmlSemanticError(parser.getLine(), "duplicate parameter");
3353               
3354 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.DUPLICATE_PARAMETER",
3355               				     "duplicate parameter");
3356 humberto 1.85 	  
3357               	  throw XmlSemanticError(parser.getLine(), mlParms);
3358 mike     1.23 	}
3359                   }
3360               }
3361               
3362               //------------------------------------------------------------------------------
3363               //
3364               // getQualifierDeclElement()
3365               //
3366               //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
3367               //     <!ATTLIST QUALIFIER.DECLARATION 
3368               //         %CIMName;               
3369               //         %CIMType; #REQUIRED
3370               //         ISARRAY (true|false) #IMPLIED
3371               //         %ArraySize;
3372               //         %QualifierFlavor;>
3373               //         
3374               //------------------------------------------------------------------------------
3375               
3376               Boolean XmlReader::getQualifierDeclElement(
3377                   XmlParser& parser, 
3378                   CIMQualifierDecl& qualifierDecl)
3379 mike     1.23 {
3380                   XmlEntry entry;
3381               
3382                   if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER.DECLARATION"))
3383               	return false;
3384               
3385                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3386               
3387                   // Get NAME attribute:
3388               
3389 kumpf    1.74     CIMName name = getCimNameAttribute(
3390 mike     1.23 	parser.getLine(), entry, "QUALIFIER.DECLARATION");
3391               
3392                   // Get TYPE attribute:
3393               
3394 kumpf    1.67     CIMType type;
3395                   getCimTypeAttribute(parser.getLine(), entry, type, "QUALIFIER.DECLARATION");
3396 mike     1.23 
3397                   // Get ISARRAY attribute:
3398               
3399 mike     1.25     Boolean isArray = getCimBooleanAttribute(
3400                       parser.getLine(), entry, "QUALIFIER.DECLARATION", "ISARRAY",
3401                       false, false); 
3402 mike     1.23 
3403                   // Get ARRAYSIZE attribute:
3404               
3405                   Uint32 arraySize = 0;
3406                   Boolean gotArraySize = getArraySizeAttribute(parser.getLine(),
3407               	entry, "QUALIFIER.DECLARATION", arraySize);
3408               
3409                   // Get flavor oriented attributes:
3410               
3411 kumpf    1.64     CIMFlavor flavor = getFlavor (entry, parser.getLine (), 
3412                       "QUALIFIER.DECLARATION");
3413 mike     1.23 
3414                   // No need to look for interior elements if empty tag:
3415               
3416 kumpf    1.63     CIMScope scope = CIMScope ();
3417 mike     1.23     CIMValue value;
3418 kumpf    1.67     Boolean gotValue = false;
3419 mike     1.23 
3420                   if (!empty)
3421                   {
3422               	// Get the option SCOPE element:
3423               
3424               	scope = getOptionalScope(parser);
3425               
3426               	// Get VALUE or VALUE.ARRAY element:
3427               
3428               	if (getValueArrayElement(parser, type, value))
3429               	{
3430               	    if (!isArray)
3431               	    {
3432 humberto 1.85 
3433               	      // l10n
3434               
3435               	      // throw XmlSemanticError(parser.getLine(),
3436               	      //    "VALUE.ARRAY element encountered without "
3437               	      //    "ISARRAY attribute");
3438               
3439               	      MessageLoaderParms mlParms("Common.XmlReader.ARRAY_WITHOUT_ISARRAY",
3440 humberto 1.87 					 "VALUE.ARRAY element encountered without ISARRAY attribute");
3441 humberto 1.85 	      
3442               	      throw XmlSemanticError(parser.getLine(), mlParms);
3443 mike     1.23 	    }
3444               
3445               	    if (arraySize && arraySize != value.getArraySize())
3446               	    {
3447 humberto 1.85 
3448               	      // l10n
3449               
3450               	      // throw XmlSemanticError(parser.getLine(),
3451               	      //   "VALUE.ARRAY size is not the same as "
3452               	      //    "ARRAYSIZE attribute");
3453               
3454               	      MessageLoaderParms mlParms("Common.XmlReader.ARRAY_SIZE_NOT_SAME",
3455 humberto 1.87 					 "VALUE.ARRAY size is not the same as ARRAYSIZE attribute");
3456 humberto 1.85 	      
3457               	      throw XmlSemanticError(parser.getLine(), mlParms);
3458 mike     1.23 	    }
3459 kumpf    1.67 
3460                           gotValue = true;
3461 mike     1.23 	}
3462               	else if (getValueElement(parser, type, value))
3463               	{
3464               	    if (isArray)
3465               	    {
3466 humberto 1.85 
3467               	      // l10n
3468               
3469               	      // throw XmlSemanticError(parser.getLine(),
3470               	      //    "ISARRAY attribute used but VALUE element encountered");
3471               
3472               	      MessageLoaderParms mlParms("Common.XmlReader.ARRAY_ATTRIBUTE_DIFFERENT",
3473 humberto 1.87 					 "ISARRAY attribute used but VALUE element encountered");
3474 humberto 1.85 	      
3475               	      throw XmlSemanticError(parser.getLine(), mlParms);
3476 mike     1.23 	    }
3477 kumpf    1.67 
3478                           gotValue = true;
3479 mike     1.23 	}
3480               
3481               	// Now get the closing tag:
3482               
3483               	expectEndTag(parser, "QUALIFIER.DECLARATION");
3484                   }
3485               
3486 kumpf    1.67     if (!gotValue)
3487 mike     1.23     {
3488               	if (isArray)
3489               	    value.setNullValue(type, true, arraySize);
3490               	else
3491               	    value.setNullValue(type, false);
3492                   }
3493               
3494                   CIMQualifierDecl tmp(name, value, scope, flavor, arraySize);
3495                   qualifierDecl = CIMQualifierDecl(name, value, scope, flavor, arraySize);
3496                   return true;
3497               }
3498               
3499               //------------------------------------------------------------------------------
3500               // getMethodElement()
3501               //
3502               //     <!ELEMENT METHOD (QUALIFIER*,(PARAMETER|PARAMETER.REFERENCE|
3503               //         PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
3504               //     <!ATTLIST METHOD
3505               //         %CIMName;
3506               //         %CIMType; #IMPLIED
3507               //         %ClassOrigin;
3508 mike     1.23 //         %Propagated;>
3509               //
3510               //------------------------------------------------------------------------------
3511               
3512               Boolean XmlReader::getMethodElement(XmlParser& parser, CIMMethod& method)
3513               {
3514                   XmlEntry entry;
3515               
3516                   if (!testStartTagOrEmptyTag(parser, entry, "METHOD"))
3517               	return false;
3518               
3519                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3520               
3521 kumpf    1.74     CIMName name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
3522 mike     1.23 
3523 kumpf    1.67     CIMType type;
3524                   getCimTypeAttribute(parser.getLine(), entry, type, "PROPERTY");
3525 mike     1.23 
3526 kumpf    1.62     CIMName classOrigin = 
3527 mike     1.23 	getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
3528               
3529                   Boolean propagated = getCimBooleanAttribute(
3530               	parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
3531               
3532                   method = CIMMethod(name, type, classOrigin, propagated);
3533               
3534                   if (!empty)
3535                   {
3536 kumpf    1.26         // ATTN-RK-P2-20020219: Decoding algorithm must not depend on the
3537                       // ordering of qualifiers and parameters.
3538 mike     1.23 	getQualifierElements(parser, method);
3539               
3540               	GetParameterElements(parser, method);
3541               
3542               	expectEndTag(parser, "METHOD");
3543                   }
3544               
3545                   return true;
3546               }
3547               
3548               //------------------------------------------------------------------------------
3549               // getClassElement()
3550               //
3551               //     <!ELEMENT CLASS (QUALIFIER*,
3552               //         (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
3553               //     <!ATTLIST CLASS %CIMName; %SuperClass;>
3554               //
3555               //------------------------------------------------------------------------------
3556               
3557               Boolean XmlReader::getClassElement(XmlParser& parser, CIMClass& cimClass)
3558               {
3559 mike     1.23     XmlEntry entry;
3560               
3561                   if (!testStartTag(parser, entry, "CLASS"))
3562               	return false;
3563               
3564 kumpf    1.74     CIMName name = getCimNameAttribute(parser.getLine(), entry, "CLASS");
3565 mike     1.23 
3566 kumpf    1.62     CIMName superClass = getSuperClassAttribute(parser.getLine(), entry,"CLASS");
3567 mike     1.23 
3568                   cimClass = CIMClass(name, superClass);
3569               
3570                   // Get QUALIFIER elements:
3571               
3572                   getQualifierElements(parser, cimClass);
3573               
3574                   // Get PROPERTY elements:
3575               
3576                   GetPropertyElements(parser, cimClass);
3577               
3578                   // Get METHOD elements:
3579               
3580                   CIMMethod method;
3581               
3582                   while (getMethodElement(parser, method))
3583               	cimClass.addMethod(method);	
3584               
3585                   // Get CLASS end tag:
3586               
3587                   expectEndTag(parser, "CLASS");
3588 mike     1.23 
3589                   return true;
3590               }
3591               
3592               //------------------------------------------------------------------------------
3593               // getInstanceElement()
3594               //
3595               //     <!ELEMENT INSTANCE (QUALIFIER*,
3596               //         (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*) >
3597               //     <!ATTLIST INSTANCE
3598               //         %ClassName;>
3599               //
3600               //------------------------------------------------------------------------------
3601               
3602               Boolean XmlReader::getInstanceElement(
3603                   XmlParser& parser, 
3604                   CIMInstance& cimInstance)
3605               {
3606                   XmlEntry entry;
3607               
3608 kumpf    1.89     if (!testStartTagOrEmptyTag(parser, entry, "INSTANCE"))
3609 mike     1.23 	return false;
3610               
3611 kumpf    1.89     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
3612               
3613 mike     1.23     String className = getClassNameAttribute(
3614               	parser.getLine(), entry, "INSTANCE");
3615               
3616                   cimInstance = CIMInstance(className);
3617               
3618 kumpf    1.89     if (!empty)
3619                   {
3620                       // Get QUALIFIER elements:
3621                       getQualifierElements(parser, cimInstance);
3622               
3623                       // Get PROPERTY elements:
3624                       GetPropertyElements(parser, cimInstance);
3625               
3626                       // Get INSTANCE end tag:
3627                       expectEndTag(parser, "INSTANCE");
3628                   }
3629 mike     1.23 
3630                   return true;
3631               }
3632               
3633               //------------------------------------------------------------------------------
3634 mike     1.25 // getNamedInstanceElement()
3635               //
3636               //     <!ELEMENT VALUE.NAMEDINSTANCE (INSTANCENAME,INSTANCE)>
3637               //
3638               //------------------------------------------------------------------------------
3639               
3640               Boolean XmlReader::getNamedInstanceElement(
3641                   XmlParser& parser, 
3642 kumpf    1.55     CIMInstance& namedInstance)
3643 mike     1.25 {
3644                   XmlEntry entry;
3645               
3646                   if (!testStartTag(parser, entry, "VALUE.NAMEDINSTANCE"))
3647               	return false;
3648               
3649 kumpf    1.54     CIMObjectPath instanceName;
3650 mike     1.25 
3651                   // Get INSTANCENAME elements:
3652               
3653                   if (!getInstanceNameElement(parser, instanceName))
3654                   {
3655 humberto 1.85 
3656                     // l10n
3657               
3658                     // throw XmlValidationError(parser.getLine(), 
3659                     //    "expected INSTANCENAME element");
3660               
3661 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCENAME_ELEMENT",
3662               				 "expected INSTANCENAME element");
3663 humberto 1.85       
3664                     throw XmlValidationError(parser.getLine(), mlParms);
3665 mike     1.25     }
3666               
3667                   // Get INSTANCE elements:
3668               
3669 kumpf    1.55     if (!getInstanceElement(parser, namedInstance))
3670 mike     1.25     {
3671 humberto 1.85 
3672                     // l10n
3673               
3674                     // throw XmlValidationError(parser.getLine(),
3675                     //   "expected INSTANCE element");
3676               
3677               
3678 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
3679               				 "expected INSTANCE element");
3680 humberto 1.85       
3681                     throw XmlValidationError(parser.getLine(), mlParms);
3682 mike     1.25     }
3683               
3684                   // Get VALUE.NAMEDINSTANCE end tag:
3685               
3686                   expectEndTag(parser, "VALUE.NAMEDINSTANCE");
3687               
3688 kumpf    1.55     namedInstance.setPath (instanceName);
3689 mike     1.25 
3690                   return true;
3691               }
3692               
3693               //------------------------------------------------------------------------------
3694 mike     1.23 //
3695               // getObject()
3696               //
3697               //------------------------------------------------------------------------------
3698               
3699               void XmlReader::getObject(XmlParser& parser, CIMClass& x)
3700               {
3701                   if (!getClassElement(parser, x))
3702                   {
3703 humberto 1.85 
3704                     // l10n
3705               
3706                     // throw XmlValidationError(parser.getLine(),
3707                     //   "expected CLASS element");
3708               
3709 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASS_ELEMENT",
3710               				 "expected CLASS element");
3711 humberto 1.85       
3712                     throw XmlValidationError(parser.getLine(), mlParms);
3713 mike     1.23     }
3714               }
3715               
3716               //------------------------------------------------------------------------------
3717               //
3718               // getObject()
3719               //
3720               //------------------------------------------------------------------------------
3721               
3722               void XmlReader::getObject(XmlParser& parser, CIMInstance& x)
3723               {
3724                   if (!getInstanceElement(parser, x))
3725                   {
3726 humberto 1.85 
3727                     // l10n
3728                     
3729                     // throw XmlValidationError(parser.getLine(),
3730                     //   "expected INSTANCE element");
3731               
3732 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
3733               				 "expected INSTANCE element");
3734 humberto 1.85       
3735                     throw XmlValidationError(parser.getLine(), mlParms);
3736 mike     1.23     }
3737               }
3738               
3739               //------------------------------------------------------------------------------
3740               //
3741               // getObject()
3742               //
3743               //------------------------------------------------------------------------------
3744               
3745               void XmlReader::getObject(XmlParser& parser, CIMQualifierDecl& x)
3746               {
3747                   if (!getQualifierDeclElement(parser, x))
3748                   {
3749 humberto 1.85 
3750                     // l10n
3751               
3752                     // throw XmlValidationError(parser.getLine(),
3753                     //   "expected QUALIFIER.DECLARATION element");
3754               
3755 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_QUALIFIER_DECLARATION_ELEMENT",
3756               				 "expected QUALIFIER.DECLARATION element");
3757 humberto 1.85       
3758                     throw XmlValidationError(parser.getLine(), mlParms);
3759 mike     1.23     }
3760               }
3761               
3762               //------------------------------------------------------------------------------
3763               //
3764               // getMessageStartTag()
3765               //
3766               //------------------------------------------------------------------------------
3767               
3768               Boolean XmlReader::getMessageStartTag(
3769                   XmlParser& parser, 
3770                   String& id,
3771 kumpf    1.34     String& protocolVersion)
3772 mike     1.23 {
3773                   XmlEntry entry;
3774               
3775                   if (!testStartTag(parser, entry, "MESSAGE"))
3776               	return false;
3777               
3778                   // Get MESSAGE.ID:
3779               
3780 humberto 1.85     if (!entry.getAttributeValue("ID", id)) {
3781               
3782                     // l10n
3783               
3784                     // throw XmlValidationError(parser.getLine(), 
3785                     //   "Invalid or missing MESSAGE.ID attribute");
3786               
3787 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.INVALID_MISSING_MESSAGE_ID_ATTRIBUTE",
3788               				 "Invalid or missing MESSAGE.ID attribute");
3789 humberto 1.85       
3790                     throw XmlValidationError(parser.getLine(), mlParms);
3791                   }      
3792               
3793 mike     1.23 
3794                   // Get MESSAGE.PROTOCOLVERSION:
3795               
3796 humberto 1.85     if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion)) {
3797               
3798                     // l10n
3799 mike     1.23 
3800 humberto 1.85       // throw XmlValidationError(parser.getLine(),
3801                     //   "Invalid or missing MESSAGE.PROTOCOLVERSION attribute");
3802               
3803 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.INVALID_MISSING_PROTOCOLVERSION_ATTRIBUTE",
3804               				 "Invalid or missing MESSAGE.PROTOCOLVERSION attribute");
3805 humberto 1.85       
3806                     throw XmlValidationError(parser.getLine(), mlParms);
3807                   }
3808                   
3809 mike     1.23     return true;
3810               }
3811               
3812               //------------------------------------------------------------------------------
3813               //
3814               // getIMethodCallStartTag()
3815               //
3816               //------------------------------------------------------------------------------
3817               
3818               Boolean XmlReader::getIMethodCallStartTag(
3819                   XmlParser& parser, 
3820                   const char*& name)
3821               {
3822                   XmlEntry entry;
3823               
3824                   if (!testStartTag(parser, entry, "IMETHODCALL"))
3825               	return false;
3826               
3827                   // Get IMETHODCALL.NAME attribute:
3828               
3829 humberto 1.85 
3830                   if (!entry.getAttributeValue("NAME", name)) {
3831               
3832                     // l10n
3833               
3834                     // throw XmlValidationError(parser.getLine(),
3835                     //   "Missing IMETHODCALL.NAME attribute");
3836               
3837 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_IMETHODCALL_ATTRIBUTE",
3838               				 "Missing IMETHODCALL.NAME attribute");
3839 humberto 1.85 
3840                     throw XmlValidationError(parser.getLine(), mlParms);
3841                   }
3842               
3843 mike     1.23 
3844                   return true;
3845               }
3846               
3847               //------------------------------------------------------------------------------
3848               //
3849               // getIMethodResponseStartTag()
3850               //
3851               //------------------------------------------------------------------------------
3852               
3853               Boolean XmlReader::getIMethodResponseStartTag(
3854                   XmlParser& parser, 
3855                   const char*& name)
3856               {
3857                   XmlEntry entry;
3858               
3859                   if (!testStartTag(parser, entry, "IMETHODRESPONSE"))
3860               	return false;
3861               
3862                   // Get IMETHODRESPONSE.NAME attribute:
3863               
3864 humberto 1.85     if (!entry.getAttributeValue("NAME", name)) {
3865               
3866                     // l10n
3867               
3868                     // throw XmlValidationError(parser.getLine(),
3869                     //   "Missing IMETHODRESPONSE.NAME attribute");
3870               
3871 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_IMETHODRESPONSE_ATTRIBUTE",
3872               				 "Missing IMETHODRESPONSE.NAME attribute");
3873 humberto 1.85 
3874                     throw XmlValidationError(parser.getLine(), mlParms);
3875                   }
3876               
3877 mike     1.23 
3878                   return true;
3879               }
3880               
3881               //------------------------------------------------------------------------------
3882               //
3883               // getIParamValueTag()
3884               //
3885               //------------------------------------------------------------------------------
3886               
3887               Boolean XmlReader::getIParamValueTag(
3888                   XmlParser& parser, 
3889                   const char*& name)
3890               {
3891                   XmlEntry entry;
3892               
3893                   if (!testStartTag(parser, entry, "IPARAMVALUE"))
3894               	return false;
3895               
3896                   // Get IPARAMVALUE.NAME attribute:
3897               
3898 humberto 1.85     if (!entry.getAttributeValue("NAME", name)) {
3899               
3900                     // l10n
3901               
3902                     // throw XmlValidationError(parser.getLine(),
3903                     //   "Missing IPARAMVALUE.NAME attribute");
3904               
3905 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_IPARAMVALUE_ATTRIBUTE",
3906               				 "Missing IPARAMVALUE.NAME attribute");
3907 humberto 1.85 
3908                     throw XmlValidationError(parser.getLine(), mlParms);
3909                   }
3910 mike     1.23 
3911                   return true;
3912               }
3913               
3914               //------------------------------------------------------------------------------
3915               //
3916               // getBooleanValueElement()
3917               //
3918               //     Get an elements like: "<VALUE>FALSE</VALUE>"
3919               //
3920               //------------------------------------------------------------------------------
3921               
3922               Boolean XmlReader::getBooleanValueElement(
3923                   XmlParser& parser, 
3924                   Boolean& result,
3925                   Boolean required)
3926               {
3927                   XmlEntry entry;
3928               
3929                   if (!testStartTag(parser, entry, "VALUE"))
3930                   {
3931 mike     1.23 	if (required)
3932               	{
3933 humberto 1.85 
3934               	  // l10n
3935               
3936               	  // throw XmlValidationError(parser.getLine(),
3937               	  // "Expected VALUE element");
3938               
3939 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_ELEMENT",
3940               				     "Expected VALUE element");
3941 humberto 1.85 	  
3942               	  throw XmlValidationError(parser.getLine(), mlParms);
3943 mike     1.23 	}
3944               	return false;
3945                   }
3946               
3947                   expectContentOrCData(parser, entry);
3948               
3949 kumpf    1.72     if (System::strcasecmp(entry.text, "TRUE") == 0)
3950 mike     1.23 	result = true;
3951 kumpf    1.72     else if (System::strcasecmp(entry.text, "FALSE") == 0)
3952 mike     1.23 	result = false;
3953 humberto 1.85     else {
3954               
3955                     // l10n
3956               
3957                     // throw XmlSemanticError(parser.getLine(), 
3958                     //   "Invalid value for VALUE element: must be \"TRUE\" or \"FALSE\"");
3959               
3960                     MessageLoaderParms mlParms("Common.XmlReader.INVALID_VALUE_FOR_VALUE_ELEMENT",
3961 humberto 1.87 				 "Invalid value for VALUE element: must be \"TRUE\" or \"FALSE\"");
3962 humberto 1.85       
3963                     throw XmlSemanticError(parser.getLine(), mlParms);
3964                   }
3965 mike     1.23 
3966                   expectEndTag(parser, "VALUE");
3967               
3968                   return true;
3969               }
3970               
3971               //------------------------------------------------------------------------------
3972               //
3973               // getErrorElement()
3974               //
3975               //     <!ELEMENT ERROR EMPTY>
3976               //     <!ATTLIST ERROR 
3977               //         CODE CDATA #REQUIRED
3978               //         DESCRIPTION CDATA #IMPLIED>
3979               //
3980               //------------------------------------------------------------------------------
3981               
3982               Boolean XmlReader::getErrorElement(
3983                   XmlParser& parser, 
3984 kumpf    1.50     CIMException& cimException,
3985 mike     1.23     Boolean required)
3986               {
3987                   XmlEntry entry;
3988               
3989                   if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))
3990                   {
3991 humberto 1.85       if (required) {
3992               
3993               	// l10n
3994               
3995               	// throw XmlValidationError(parser.getLine(),"Expected ERROR element");
3996               	
3997 humberto 1.87 	MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_ERROR_ELEMENT",
3998               				   "Expected ERROR element");
3999 humberto 1.85 	
4000               	throw XmlValidationError(parser.getLine(), mlParms);
4001               	
4002                     }
4003                     return false;
4004 mike     1.23     }
4005               
4006                   Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
4007               
4008                   // Get ERROR.CODE
4009               
4010                   Uint32 tmpCode;
4011               
4012 humberto 1.85     if (!entry.getAttributeValue("CODE", tmpCode)) {
4013               
4014               
4015                     // l10n
4016               
4017                     // throw XmlValidationError(
4018                     //       parser.getLine(), "missing ERROR.CODE attribute");
4019               
4020 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_ERROR_CODE_ATTRIBUTE",
4021               				 "missing ERROR.CODE attribute");
4022 humberto 1.85       
4023                     throw XmlValidationError(parser.getLine(), mlParms);
4024               
4025                   }
4026 mike     1.23 
4027 kumpf    1.50     // Get ERROR.DESCRIPTION:
4028 mike     1.23 
4029 kumpf    1.50     String tmpDescription;
4030 mike     1.23 
4031 kumpf    1.50     entry.getAttributeValue("DESCRIPTION", tmpDescription);
4032 mike     1.23 
4033                   if (!empty)
4034               	expectEndTag(parser, "ERROR");
4035               
4036 kumpf    1.50     cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(tmpCode), tmpDescription);
4037 mike     1.23     return true;
4038               }
4039               
4040               
4041               //------------------------------------------------------------------------------
4042 kumpf    1.48 // getValueObjectElement()
4043               //
4044               // <!ELEMENT VALUE.OBJECT (CLASS|INSTANCE)>
4045               //
4046               //------------------------------------------------------------------------------
4047               
4048               Boolean XmlReader::getValueObjectElement(
4049                   XmlParser& parser, 
4050                   CIMObject& object)
4051               {
4052                   XmlEntry entry;
4053               
4054                   if (!testStartTag(parser, entry, "VALUE.OBJECT"))
4055               	return false;
4056               
4057                   CIMInstance cimInstance;
4058                   CIMClass cimClass;
4059               
4060                   if (XmlReader::getInstanceElement(parser, cimInstance))
4061                   {
4062               	object = CIMObject(cimInstance);
4063 kumpf    1.48     }
4064                   else if (!XmlReader::getClassElement(parser, cimClass))
4065                   {
4066               	object = CIMObject(cimClass);
4067                   }
4068                   else
4069                   {
4070 humberto 1.85 
4071                     // l10n
4072               
4073                     // throw XmlValidationError(parser.getLine(),
4074                     //   "Expected INSTANCE or CLASS element");
4075               
4076 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_OR_CLASS_ELEMENT",
4077               				 "Expected INSTANCE or CLASS element");
4078 humberto 1.85       
4079                     throw XmlValidationError(parser.getLine(), mlParms);
4080               
4081 kumpf    1.48     }
4082               
4083                   expectEndTag(parser, "VALUE.OBJECT");
4084               
4085                   return true;
4086               }
4087               
4088               //------------------------------------------------------------------------------
4089               // getValueObjectWithPathElement()
4090 mike     1.23 //
4091               // <!ELEMENT VALUE.OBJECTWITHPATH ((CLASSPATH,CLASS)|(INSTANCEPATH,INSTANCE))>
4092               //
4093               //------------------------------------------------------------------------------
4094               
4095 kumpf    1.48 Boolean XmlReader::getValueObjectWithPathElement(
4096 mike     1.23     XmlParser& parser, 
4097 kumpf    1.57     CIMObject& objectWithPath)
4098 mike     1.23 {
4099                   XmlEntry entry;
4100               
4101                   if (!testStartTag(parser, entry, "VALUE.OBJECTWITHPATH"))
4102               	return false;
4103               
4104 kumpf    1.54     CIMObjectPath reference;
4105 mike     1.23     Boolean isInstance = false;
4106               
4107                   if (XmlReader::getInstancePathElement(parser, reference))
4108               	isInstance = true;
4109                   else if (!XmlReader::getClassPathElement(parser, reference))
4110                   {
4111 humberto 1.85 
4112 humberto 1.90       // l10n 485
4113 humberto 1.85       
4114                     // throw XmlValidationError(parser.getLine(),
4115                     //    "Expected INSTANCEPATH or CLASSPATH element");
4116               
4117 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCEPATH_OR_CLASSPATH_ELEMENT",
4118 humberto 1.90 				 "Expected INSTANCEPATH or CLASSPATH element");
4119 humberto 1.85       
4120                     throw XmlValidationError(parser.getLine(), mlParms);
4121 mike     1.23     }
4122               
4123                   if (isInstance)
4124                   {
4125               	CIMInstance cimInstance;
4126               
4127               	if (!XmlReader::getInstanceElement(parser, cimInstance))
4128               	{
4129 humberto 1.85 
4130               	  // l10n
4131               
4132               	  // throw XmlValidationError(parser.getLine(),
4133               	  //		   "Expected INSTANCE element");
4134               
4135 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
4136               				     "Expected INSTANCE element");
4137 humberto 1.85 	  
4138               	  throw XmlValidationError(parser.getLine(), mlParms);
4139 mike     1.23 	}
4140 kumpf    1.57 	objectWithPath = CIMObject (cimInstance);
4141                       objectWithPath.setPath (reference);
4142 mike     1.23     }
4143                   else
4144                   {
4145               	CIMClass cimClass;
4146               
4147               	if (!XmlReader::getClassElement(parser, cimClass))
4148               	{
4149 humberto 1.85 
4150               	  // l10n
4151               
4152               	  // throw XmlValidationError(parser.getLine(),
4153               	  // "Expected CLASS element");
4154               
4155 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASS_ELEMENT",
4156               				     "Expected CLASS element");
4157 humberto 1.85 	  
4158               	  throw XmlValidationError(parser.getLine(), mlParms);
4159 mike     1.23 	}
4160 kumpf    1.57 	objectWithPath = CIMObject (cimClass);
4161                       objectWithPath.setPath (reference);
4162 mike     1.23     }
4163               
4164                   expectEndTag(parser, "VALUE.OBJECTWITHPATH");
4165               
4166                   return true;
4167 kumpf    1.48 }
4168               
4169               //------------------------------------------------------------------------------
4170               // getValueObjectWithLocalPathElement()
4171               //
4172               // <!ELEMENT VALUE.OBJECTWITHLOCALPATH
4173               //     ((LOCALCLASSPATH,CLASS)|(LOCALINSTANCEPATH,INSTANCE))>
4174               //
4175               //------------------------------------------------------------------------------
4176               
4177               Boolean XmlReader::getValueObjectWithLocalPathElement(
4178                   XmlParser& parser, 
4179 kumpf    1.57     CIMObject& objectWithPath)
4180 kumpf    1.48 {
4181                   XmlEntry entry;
4182               
4183                   if (!testStartTag(parser, entry, "VALUE.OBJECTWITHLOCALPATH"))
4184               	return false;
4185               
4186 kumpf    1.54     CIMObjectPath reference;
4187 kumpf    1.48     Boolean isInstance = false;
4188               
4189                   if (XmlReader::getLocalInstancePathElement(parser, reference))
4190               	isInstance = true;
4191                   else if (!XmlReader::getLocalClassPathElement(parser, reference))
4192                   {
4193 humberto 1.85 
4194                     // l10n
4195               
4196                     // throw XmlValidationError(parser.getLine(),
4197                     //   "Expected LOCALINSTANCEPATH or LOCALCLASSPATH element");
4198               
4199 humberto 1.91       //l10n updated
4200                     MessageLoaderParms mlParms("Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
4201                     														MISSING_ELEMENT_LOCALPATH);
4202 humberto 1.85       
4203                     throw XmlValidationError(parser.getLine(), mlParms);
4204               
4205 kumpf    1.48     }
4206               
4207                   if (isInstance)
4208                   {
4209               	CIMInstance cimInstance;
4210               
4211               	if (!XmlReader::getInstanceElement(parser, cimInstance))
4212               	{
4213 humberto 1.85 
4214               	  // l10n
4215               
4216               	  // throw XmlValidationError(parser.getLine(),
4217               	  //		   "Expected INSTANCE element");
4218               
4219 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCE_ELEMENT",
4220               				     "Expected INSTANCE element");
4221 humberto 1.85 	  
4222               	  throw XmlValidationError(parser.getLine(), mlParms);
4223               
4224 kumpf    1.48 	}
4225 kumpf    1.57 	objectWithPath = CIMObject (cimInstance);
4226               	objectWithPath.setPath (reference);
4227 kumpf    1.48     }
4228                   else
4229                   {
4230               	CIMClass cimClass;
4231               
4232               	if (!XmlReader::getClassElement(parser, cimClass))
4233               	{
4234 humberto 1.85 
4235               	  // l10n
4236               
4237               	  // throw XmlValidationError(parser.getLine(),
4238               	  // "Expected CLASS element");
4239               
4240 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASS_ELEMENT",
4241               				     "Expected CLASS element");
4242 humberto 1.85 	  
4243               	  throw XmlValidationError(parser.getLine(), mlParms);
4244               
4245               
4246 kumpf    1.48 	}
4247 kumpf    1.57 	objectWithPath = CIMObject (cimClass);
4248               	objectWithPath.setPath (reference);
4249 kumpf    1.48     }
4250               
4251                   expectEndTag(parser, "VALUE.OBJECTWITHLOCALPATH");
4252               
4253                   return true;
4254               }
4255               
4256               //------------------------------------------------------------------------------
4257               // getObjectArray()
4258               //
4259               // <object>
4260               //     (VALUE.OBJECT|VALUE.OBJECTWITHLOCALPATH|VALUE.OBJECTWITHPATH)
4261               //
4262               //------------------------------------------------------------------------------
4263               
4264               void XmlReader::getObjectArray(
4265                   XmlParser& parser, 
4266 kumpf    1.57     Array<CIMObject>& objectArray)
4267 kumpf    1.48 {
4268                   CIMObject object;
4269 kumpf    1.57     CIMObject objectWithPath;
4270 kumpf    1.48 
4271                   objectArray.clear();
4272               
4273                   if (getValueObjectElement(parser, object))
4274                   {
4275 kumpf    1.57         objectArray.append(object);
4276 kumpf    1.48         while (getValueObjectElement(parser, object))
4277 kumpf    1.57             objectArray.append(object);
4278 kumpf    1.48     }
4279                   else if (getValueObjectWithPathElement(parser, objectWithPath))
4280                   {
4281                       objectArray.append(objectWithPath);
4282                       while (getValueObjectWithPathElement(parser, objectWithPath))
4283                           objectArray.append(objectWithPath);
4284                   }
4285                   else if (getValueObjectWithLocalPathElement(parser, objectWithPath))
4286                   {
4287                       objectArray.append(objectWithPath);
4288                       while (getValueObjectWithLocalPathElement(parser, objectWithPath))
4289                           objectArray.append(objectWithPath);
4290                   }
4291 mike     1.23 }
4292               
4293               //------------------------------------------------------------------------------
4294               //
4295               // <objectName>: (CLASSNAME|INSTANCENAME)
4296               //
4297               //------------------------------------------------------------------------------
4298               
4299               Boolean XmlReader::getObjectNameElement(
4300                   XmlParser& parser, 
4301 kumpf    1.54     CIMObjectPath& objectName)
4302 mike     1.23 {
4303 kumpf    1.74     CIMName className;
4304 mike     1.23 
4305                   if (getClassNameElement(parser, className, false))
4306                   {
4307 kumpf    1.62 	objectName.set(String(), CIMNamespaceName(), className);
4308 mike     1.23 	return true;
4309                   }
4310                   else if (getInstanceNameElement(parser, objectName))
4311               	return true;
4312                   else
4313                   {
4314 humberto 1.85 
4315                     // l10n
4316               
4317                     // throw XmlValidationError(parser.getLine(),
4318                     //   "expected CLASSNAME or INSTANCENAME element");
4319               
4320 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_CLASSNAME_OR_INSTANCENAME_ELEMENT",
4321               				 "Expected CLASSNAME or INSTANCENAME element");
4322 humberto 1.85       
4323                     throw XmlValidationError(parser.getLine(), mlParms);
4324                     
4325 mike     1.23     }
4326               
4327                   return false;
4328               }
4329               
4330               //------------------------------------------------------------------------------
4331               //
4332               // <!ELEMENT OBJECTPATH (INSTANCEPATH|CLASSPATH)>
4333               //
4334               //------------------------------------------------------------------------------
4335               
4336               Boolean XmlReader::getObjectPathElement(
4337                   XmlParser& parser, 
4338 kumpf    1.54     CIMObjectPath& objectPath)
4339 mike     1.23 {
4340                   XmlEntry entry;
4341               
4342                   if (!testStartTag(parser, entry, "OBJECTPATH"))
4343               	return false;
4344               
4345                   if (getClassPathElement(parser, objectPath))
4346                   {
4347               	expectEndTag(parser, "OBJECTPATH");
4348               	return true;
4349                   }
4350                   else if (getInstancePathElement(parser, objectPath))
4351                   {
4352               	expectEndTag(parser, "OBJECTPATH");
4353               	return true;
4354                   }
4355                   else
4356                   {
4357 humberto 1.85 
4358                     // l10n
4359               
4360                     // throw XmlValidationError(parser.getLine(),
4361                     //   "expected INSTANCEPATH or CLASSPATH element");
4362               
4363 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_INSTANCEPATH_OR_CLASSPATH_ELEMENT",
4364               				 "expected INSTANCEPATH or CLASSPATH element");
4365 humberto 1.85       
4366                     throw XmlValidationError(parser.getLine(), mlParms);
4367 mike     1.23     }
4368               
4369 mike     1.24     PEGASUS_UNREACHABLE ( return false; )
4370 mike     1.25 }
4371               
4372               //------------------------------------------------------------------------------
4373               //
4374               // getEMethodCallStartTag()
4375               //
4376               //------------------------------------------------------------------------------
4377               
4378               Boolean XmlReader::getEMethodCallStartTag(
4379                   XmlParser& parser, 
4380                   const char*& name)
4381               {
4382                   XmlEntry entry;
4383               
4384                   if (!testStartTag(parser, entry, "EXPMETHODCALL"))
4385               	return false;
4386               
4387                   // Get EXPMETHODCALL.NAME attribute:
4388               
4389 humberto 1.85 
4390                     if (!entry.getAttributeValue("NAME", name)) {
4391               
4392               	// l10n
4393               
4394               	// throw XmlValidationError(parser.getLine(),
4395               	// "Missing EXPMETHODCALL.NAME attribute");
4396               
4397 humberto 1.87 	MessageLoaderParms mlParms("Common.XmlReader.MISSING_EXPMETHODCALL_ATTRIBUTE",
4398               				   "Missing EXPMETHODCALL.NAME attribute");
4399 humberto 1.85 	
4400               	throw XmlValidationError(parser.getLine(), mlParms);
4401                     }
4402 mike     1.25 
4403                   return true;
4404               }
4405               
4406               //------------------------------------------------------------------------------
4407               //
4408               // getEMethodResponseStartTag()
4409               //
4410               //------------------------------------------------------------------------------
4411               
4412               Boolean XmlReader::getEMethodResponseStartTag(
4413                   XmlParser& parser, 
4414                   const char*& name)
4415               {
4416                   XmlEntry entry;
4417               
4418                   if (!testStartTag(parser, entry, "EXPMETHODRESPONSE"))
4419               	return false;
4420               
4421                   // Get EXPMETHODRESPONSE.NAME attribute:
4422               
4423 humberto 1.85 
4424                     if (!entry.getAttributeValue("NAME", name)) {
4425               	// l10n
4426               	
4427               	// throw XmlValidationError(
4428               	//   parser.getLine(), "Missing EXPMETHODRESPONSE.NAME attribute");
4429               	
4430 humberto 1.87 	MessageLoaderParms mlParms("Common.XmlReader.MISSING_EXPMETHODRESPONSE_ATTRIBUTE",
4431               				   "Missing EXPMETHODRESPONSE.NAME attribute");
4432 humberto 1.85 	
4433               	throw XmlValidationError(parser.getLine(), mlParms);
4434                     }
4435 mike     1.25 
4436                   return true;
4437               }
4438               
4439               //------------------------------------------------------------------------------
4440               //
4441 kumpf    1.83 // getEParamValueTag()
4442               //
4443               //------------------------------------------------------------------------------
4444               
4445               Boolean XmlReader::getEParamValueTag(
4446                   XmlParser& parser, 
4447                   const char*& name)
4448               {
4449                   XmlEntry entry;
4450               
4451                   if (!testStartTag(parser, entry, "EXPPARAMVALUE"))
4452               	return false;
4453               
4454                   // Get EXPPARAMVALUE.NAME attribute:
4455               
4456 humberto 1.85 
4457                   if (!entry.getAttributeValue("NAME", name)) {
4458               
4459                     // l10n
4460               
4461                     // throw XmlValidationError(parser.getLine(),
4462                     //   "Missing EXPPARAMVALUE.NAME attribute");
4463               
4464 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_EXPPARAMVALUE_ATTRIBUTE",
4465               				 "Missing EXPPARAMVALUE.NAME attribute");
4466 humberto 1.85 
4467                     throw XmlValidationError(parser.getLine(), mlParms);
4468                   }
4469               
4470               
4471 kumpf    1.83 
4472                   return true;
4473               }
4474               
4475               //------------------------------------------------------------------------------
4476               //
4477 mike     1.25 // getMethodCallStartTag()
4478               //
4479               //------------------------------------------------------------------------------
4480               
4481               Boolean XmlReader::getMethodCallStartTag(
4482                   XmlParser& parser, 
4483                   const char*& name)
4484               {
4485                   XmlEntry entry;
4486               
4487                   if (!testStartTag(parser, entry, "METHODCALL"))
4488               	return false;
4489               
4490                   // Get METHODCALL.NAME attribute:
4491               
4492 humberto 1.85 
4493                   if (!entry.getAttributeValue("NAME", name)) {
4494               
4495                     // l10n
4496               
4497                     // throw XmlValidationError(parser.getLine(),
4498                     //	       "Missing METHODCALL.NAME attribute");
4499               
4500 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_METHODCALL_ATTRIBUTE",
4501               				 "Missing METHODCALL.NAME attribute");
4502 humberto 1.85 
4503                     throw XmlValidationError(parser.getLine(), mlParms);
4504                   }
4505               
4506 mike     1.25 
4507                   return true;
4508               }
4509               
4510               //------------------------------------------------------------------------------
4511               //
4512               // getMethodResponseStartTag()
4513               //
4514               //------------------------------------------------------------------------------
4515               
4516               Boolean XmlReader::getMethodResponseStartTag(
4517                   XmlParser& parser, 
4518                   const char*& name)
4519               {
4520                   XmlEntry entry;
4521               
4522                   if (!testStartTag(parser, entry, "METHODRESPONSE"))
4523               	return false;
4524               
4525                   // Get METHODRESPONSE.NAME attribute:
4526               
4527 humberto 1.85 
4528                   if (!entry.getAttributeValue("NAME", name)) {
4529               
4530                     // l10n
4531               
4532                     // throw XmlValidationError(parser.getLine(),
4533                     //   "Missing METHODRESPONSE.NAME attribute");
4534               
4535 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_METHODRESPONSE_ATTRIBUTE",
4536               				 "Missing METHODRESPONSE.NAME attribute");
4537 humberto 1.85 
4538                     throw XmlValidationError(parser.getLine(), mlParms);
4539                   }
4540 mike     1.25 
4541                   return true;
4542               }
4543               
4544               //------------------------------------------------------------------------------
4545               //
4546 kumpf    1.26 // getParamValueElement()
4547               //
4548               // <!ELEMENT PARAMVALUE (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY)?>
4549               // <!ATTLIST PARAMVALUE
4550               //      %CIMName;
4551               //      %ParamType;>
4552 mike     1.25 //
4553               //------------------------------------------------------------------------------
4554               
4555 kumpf    1.26 Boolean XmlReader::getParamValueElement(
4556 mike     1.25     XmlParser& parser, 
4557 kumpf    1.26     CIMParamValue& paramValue)
4558 mike     1.25 {
4559                   XmlEntry entry;
4560 kumpf    1.26     const char* name;
4561                   CIMType type;
4562                   CIMValue value;
4563 mike     1.25 
4564 kumpf    1.26     if (!testStartTagOrEmptyTag(parser, entry, "PARAMVALUE"))
4565 mike     1.25 	return false;
4566               
4567 kumpf    1.26     Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
4568               
4569                   // Get PARAMVALUE.NAME attribute:
4570 mike     1.25 
4571 humberto 1.85     if (!entry.getAttributeValue("NAME", name)) {
4572               
4573                     // l10n
4574               
4575                     // throw XmlValidationError(parser.getLine(),
4576                     //   "Missing PARAMVALUE.NAME attribute");
4577               
4578 humberto 1.87       MessageLoaderParms mlParms("Common.XmlReader.MISSING_PARAMVALUE_ATTRIBUTE",
4579               				 "Missing PARAMVALUE.NAME attribute");
4580 humberto 1.85 
4581                     throw XmlValidationError(parser.getLine(), mlParms);
4582                   }
4583               
4584 kumpf    1.26 
4585                   // Get PARAMVALUE.PARAMTYPE attribute:
4586               
4587 kumpf    1.67     Boolean gotType = getCimTypeAttribute(parser.getLine(), entry, type,
4588                                                         "PARAMVALUE", "PARAMTYPE", false);
4589 kumpf    1.26 
4590                   if (!empty)
4591                   {
4592                       // Parse VALUE.REFERENCE and VALUE.REFARRAY type
4593 kumpf    1.67         if ( (type == CIMTYPE_REFERENCE) || !gotType )
4594 kumpf    1.26         {
4595 kumpf    1.54 	    CIMObjectPath reference;
4596 kumpf    1.26 	    if (XmlReader::getValueReferenceElement(parser, reference))
4597               	    {
4598               	        value.set(reference);
4599 kumpf    1.61 	        type = CIMTYPE_REFERENCE;
4600 kumpf    1.67                 gotType = true;
4601 kumpf    1.26 	    }
4602 kumpf    1.28             else if (XmlReader::getValueReferenceArrayElement(parser, value))
4603               	    {
4604 kumpf    1.61 	        type = CIMTYPE_REFERENCE;
4605 kumpf    1.67                 gotType = true;
4606 kumpf    1.28 	    }
4607 kumpf    1.27             // If type==reference but no VALUE.REFERENCE found, use null value
4608 kumpf    1.26         }
4609               
4610                       // Parse non-reference value
4611 kumpf    1.61         if ( type != CIMTYPE_REFERENCE )
4612 kumpf    1.26         {
4613 kumpf    1.67             CIMType effectiveType;
4614                           if (!gotType)
4615 kumpf    1.26 	    {
4616 kumpf    1.67 	        // If we don't know what type the value is, read it as a String
4617 kumpf    1.61 		effectiveType = CIMTYPE_STRING;
4618 kumpf    1.26 	    }
4619 kumpf    1.67             else
4620               	    {
4621               		effectiveType = type;
4622               	    }
4623 kumpf    1.26 
4624                           if ( !XmlReader::getValueArrayElement(parser, effectiveType, value) &&
4625               	         !XmlReader::getValueElement(parser, effectiveType, value) )
4626               	    {
4627               	        value.clear();    // Isn't necessary; should already be cleared
4628               	    }
4629                       }
4630               
4631                       expectEndTag(parser, "PARAMVALUE");
4632                   }
4633               
4634 kumpf    1.67     paramValue = CIMParamValue(name, value, gotType);
4635 kumpf    1.27 
4636                   return true;
4637               }
4638               
4639               //------------------------------------------------------------------------------
4640               //
4641               // getReturnValueElement()
4642               //
4643               // <!ELEMENT RETURNVALUE (VALUE|VALUE.REFERENCE)>
4644               // <!ATTLIST RETURNVALUE
4645               //      %ParamType;>
4646               //
4647               //------------------------------------------------------------------------------
4648               
4649               Boolean XmlReader::getReturnValueElement(
4650                   XmlParser& parser, 
4651                   CIMValue& returnValue)
4652               {
4653                   XmlEntry entry;
4654                   CIMType type;
4655                   CIMValue value;
4656 kumpf    1.27 
4657                   if (!testStartTag(parser, entry, "RETURNVALUE"))
4658               	return false;
4659               
4660                   // Get RETURNVALUE.PARAMTYPE attribute:
4661                   // NOTE: Array type return values are not allowed (2/20/02)
4662               
4663 kumpf    1.67     Boolean gotType = getCimTypeAttribute(parser.getLine(), entry, type,
4664                                                         "RETURNVALUE", "PARAMTYPE", false);
4665 kumpf    1.27 
4666                   // Parse VALUE.REFERENCE type
4667 kumpf    1.67     if ( (type == CIMTYPE_REFERENCE) || !gotType )
4668 kumpf    1.27     {
4669 kumpf    1.54         CIMObjectPath reference;
4670 kumpf    1.27         if (XmlReader::getValueReferenceElement(parser, reference))
4671                       {
4672                           returnValue.set(reference);
4673 kumpf    1.61             type = CIMTYPE_REFERENCE;
4674 kumpf    1.67             gotType = true;
4675 kumpf    1.27         }
4676 kumpf    1.61         else if (type == CIMTYPE_REFERENCE)
4677 kumpf    1.27         {
4678 humberto 1.85 
4679               	  // l10n
4680               
4681               	  // throw XmlValidationError(parser.getLine(),
4682               	  //   "expected VALUE.REFERENCE element");
4683               
4684 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_REFERENCE_ELEMENT",
4685               				     "expected VALUE.REFERENCE element");
4686 humberto 1.85 	  
4687               	  throw XmlValidationError(parser.getLine(), mlParms);
4688 kumpf    1.27         }
4689                   }
4690               
4691                   // Parse non-reference return value
4692 kumpf    1.61     if ( type != CIMTYPE_REFERENCE )
4693 kumpf    1.27     {
4694 kumpf    1.67         if (!gotType)
4695 kumpf    1.27         {
4696 kumpf    1.67             // If we don't know what type the value is, read it as a String
4697 kumpf    1.61             type = CIMTYPE_STRING;
4698 kumpf    1.27         }
4699               
4700                       if ( !XmlReader::getValueElement(parser, type, returnValue) )
4701                       {
4702 humberto 1.85 
4703               	  // l10n
4704               
4705               	  // throw XmlValidationError(parser.getLine(),
4706               	  //   "expected VALUE element");
4707               
4708 humberto 1.87 	  MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_VALUE_ELEMENT",
4709               				     "expected VALUE element");
4710 humberto 1.85 	  
4711               	  throw XmlValidationError(parser.getLine(), mlParms);
4712 kumpf    1.27         }
4713                   }
4714               
4715                   expectEndTag(parser, "RETURNVALUE");
4716 mike     1.25 
4717                   return true;
4718 mike     1.23 }
4719               
4720               PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2