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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2