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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2