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

   1 mike  1.9 //%/////////////////////////////////////////////////////////////////////////////
   2 mike  1.1 //
   3           // Copyright (c) 2000 The Open Group, BMC Software, Tivoli Systems, IBM
   4           //
   5           // Permission is hereby granted, free of charge, to any person obtaining a
   6           // copy of this software and associated documentation files (the "Software"),
   7           // to deal in the Software without restriction, including without limitation
   8           // the rights to use, copy, modify, merge, publish, distribute, sublicense,
   9           // and/or sell copies of the Software, and to permit persons to whom the
  10           // Software is furnished to do so, subject to the following conditions:
  11           //
  12           // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  13           // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  14           // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  15           // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  16           // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  17           // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  18           // DEALINGS IN THE SOFTWARE.
  19           //
  20 mike  1.9 //==============================================================================
  21 mike  1.1 //
  22 mike  1.9 // Author: Mike Brasher (mbrasher@bmc.com)
  23 mike  1.1 //
  24 mike  1.9 // Modified By:
  25 karl  1.8 //
  26 mike  1.9 //%/////////////////////////////////////////////////////////////////////////////
  27 mike  1.1 
  28           #include <cassert>
  29           #include <cctype>
  30           #include <cstdio>
  31           #include <cstdlib>
  32 mike  1.2 #include "CIMName.h"
  33 mike  1.1 #include "XmlReader.h"
  34           #include "XmlWriter.h"
  35 mike  1.2 #include "CIMQualifier.h"
  36           #include "CIMQualifierDecl.h"
  37           #include "CIMClass.h"
  38           #include "CIMInstance.h"
  39 mike  1.1 
  40           PEGASUS_NAMESPACE_BEGIN
  41           
  42           static const Uint32 MESSAGE_SIZE = 128;
  43           
  44           //------------------------------------------------------------------------------
  45           //
  46           // expectXmlDeclaration()
  47           //
  48           //------------------------------------------------------------------------------
  49           
  50           void XmlReader::expectXmlDeclaration(
  51               XmlParser& parser, 
  52               XmlEntry& entry)
  53           {
  54               if (!parser.next(entry) ||
  55           	entry.type != XmlEntry::XML_DECLARATION ||
  56           	strcmp(entry.text, "xml") != 0)
  57               {
  58           	throw XmlValidationError(parser.getLine(),
  59           	    "Expected <?xml ... ?> style declaration");
  60 mike  1.1     }
  61           }
  62           
  63           //------------------------------------------------------------------------------
  64           //
  65           // expectStartTag()
  66           //
  67           //------------------------------------------------------------------------------
  68           
  69           void XmlReader::expectStartTag(
  70               XmlParser& parser, 
  71               XmlEntry& entry,
  72               const char* tagName)
  73           {
  74               if (!parser.next(entry) ||
  75           	entry.type != XmlEntry::START_TAG ||
  76           	strcmp(entry.text, tagName) != 0)
  77               {
  78           	char message[MESSAGE_SIZE];
  79           	sprintf(message, "Expected open of %s element", tagName);
  80           	throw XmlValidationError(parser.getLine(), message);
  81 mike  1.1     }
  82           }
  83           
  84           //------------------------------------------------------------------------------
  85           //
  86           // expectEndTag()
  87           //
  88           //------------------------------------------------------------------------------
  89           
  90           void XmlReader::expectEndTag(XmlParser& parser, const char* tagName)
  91           {
  92               XmlEntry entry;
  93           
  94               if (!parser.next(entry) ||
  95           	entry.type != XmlEntry::END_TAG ||
  96           	strcmp(entry.text, tagName) != 0)
  97               {
  98           	char message[MESSAGE_SIZE];
  99 sage  1.12 	sprintf(message, "Expected close of %s element, got %s instead",
 100                          tagName,entry.text);
 101 mike  1.1  	throw XmlValidationError(parser.getLine(), message);
 102                }
 103            }
 104            
 105            //------------------------------------------------------------------------------
 106            //
 107            // expectStartTagOrEmptyTag()
 108            //
 109            //------------------------------------------------------------------------------
 110            
 111            void XmlReader::expectStartTagOrEmptyTag(
 112                XmlParser& parser, 
 113                XmlEntry& entry,
 114                const char* tagName)
 115            {
 116                if (!parser.next(entry) ||
 117            	(entry.type != XmlEntry::START_TAG &&
 118            	entry.type != XmlEntry::EMPTY_TAG) ||
 119            	strcmp(entry.text, tagName) != 0)
 120                {
 121            	char message[MESSAGE_SIZE];
 122 mike  1.1  	sprintf(message, 
 123            	    "Expected either open or open/close %s element", tagName);
 124            	throw XmlValidationError(parser.getLine(), message);
 125                }
 126            }
 127            
 128            //------------------------------------------------------------------------------
 129            //
 130            // expectContentOrCData()
 131            //
 132            //------------------------------------------------------------------------------
 133            
 134            Boolean XmlReader::expectContentOrCData(
 135                XmlParser& parser, 
 136                XmlEntry& entry)
 137            {
 138                if (!parser.next(entry) ||
 139            	(entry.type != XmlEntry::CONTENT &&
 140            	entry.type != XmlEntry::CDATA))
 141                {
 142            	throw XmlValidationError(parser.getLine(),
 143 mike  1.1  	    "Expected content of CDATA");
 144                }
 145            
 146                return true;
 147            }
 148            
 149            //------------------------------------------------------------------------------
 150            //
 151            // testStartTag()
 152            //
 153            //------------------------------------------------------------------------------
 154            
 155            Boolean XmlReader::testStartTag(
 156                XmlParser& parser, 
 157                XmlEntry& entry,
 158                const char* tagName)
 159            {
 160                if (!parser.next(entry) ||
 161            	entry.type != XmlEntry::START_TAG ||
 162            	strcmp(entry.text, tagName) != 0)
 163                {
 164 mike  1.1  	parser.putBack(entry);
 165            	return false;
 166                }
 167            
 168                return true;
 169            }
 170            
 171            //------------------------------------------------------------------------------
 172            //
 173            // testEndTag>()
 174            //
 175            //------------------------------------------------------------------------------
 176            
 177            Boolean XmlReader::testEndTag(XmlParser& parser, const char* tagName)
 178            {
 179                XmlEntry entry;
 180            
 181                if (!parser.next(entry) ||
 182            	entry.type != XmlEntry::END_TAG ||
 183            	strcmp(entry.text, tagName) != 0)
 184                {
 185 mike  1.1  	parser.putBack(entry);
 186            	return false;
 187                }
 188            
 189                return true;
 190            }
 191            
 192            //------------------------------------------------------------------------------
 193            //
 194            // testStartTagOrEmptyTag()
 195            //
 196            //------------------------------------------------------------------------------
 197            
 198            Boolean XmlReader::testStartTagOrEmptyTag(
 199                XmlParser& parser, 
 200                XmlEntry& entry,
 201                const char* tagName)
 202            {
 203                if (!parser.next(entry) ||
 204            	(entry.type != XmlEntry::START_TAG &&
 205            	entry.type != XmlEntry::EMPTY_TAG) ||
 206 mike  1.1  	strcmp(entry.text, tagName) != 0)
 207                {
 208            	parser.putBack(entry);
 209            	return false;
 210                }
 211            
 212                return true;
 213            }
 214            
 215            //------------------------------------------------------------------------------
 216            //
 217            // testContentOrCData()
 218            //
 219            //------------------------------------------------------------------------------
 220            
 221            Boolean XmlReader::testContentOrCData(
 222                XmlParser& parser, 
 223                XmlEntry& entry)
 224            {
 225                if (!parser.next(entry) ||
 226            	(entry.type != XmlEntry::CONTENT &&
 227 mike  1.1  	entry.type != XmlEntry::CDATA))
 228                {
 229            	parser.putBack(entry);
 230            	return false;
 231                }
 232            
 233                return true;
 234            }
 235            
 236            //------------------------------------------------------------------------------
 237            //
 238            // testCimStartTag()
 239            //
 240            //     <!ELEMENT CIM (MESSAGE|DECLARATION)>
 241            //     <!ATTRLIST CIM 
 242            //         CIMVERSION CDATA #REQUIRED
 243            //         DTDVERSION CDATA #REQUIRED>
 244            //
 245            //------------------------------------------------------------------------------
 246            
 247            void XmlReader::testCimStartTag(XmlParser& parser)
 248 mike  1.1  {
 249                XmlEntry entry;
 250                XmlReader::expectStartTag(parser, entry, "CIM");
 251            
 252                const char* cimVersion;
 253            
 254                if (!entry.getAttributeValue("CIMVERSION", cimVersion))
 255            	throw XmlValidationError(
 256            	    parser.getLine(), "missing CIM.CIMVERSION attribute");
 257            
 258                if (strcmp(cimVersion, "2.0") != 0)
 259            	throw XmlValidationError(parser.getLine(), 
 260            	    "CIM.CIMVERSION attribute must be \"2.0\"");
 261            
 262                const char* dtdVersion;
 263            
 264                if (!entry.getAttributeValue("DTDVERSION", dtdVersion))
 265            	throw XmlValidationError(
 266            	    parser.getLine(), "missing CIM.DTDVERSION attribute");
 267            
 268                if (strcmp(dtdVersion, "2.0") != 0)
 269 mike  1.1  	throw XmlValidationError(parser.getLine(), 
 270            	    "CIM.DTDVERSION attribute must be \"2.0\"");
 271            }
 272            
 273            //------------------------------------------------------------------------------
 274            //
 275            // getIsArrayAttribute()
 276            //
 277            //------------------------------------------------------------------------------
 278            
 279            Boolean XmlReader::getIsArrayAttribute(
 280                Uint32 lineNumber,
 281                const XmlEntry& entry,
 282                const char* tagName,
 283                Boolean& value)
 284            {
 285                const char* tmp;
 286            
 287                if (!entry.getAttributeValue("ISARRAY", tmp))
 288            	return false;
 289            
 290 mike  1.1      if (strcmp(tmp, "true") == 0)
 291                {
 292            	value = true;
 293            	return true;
 294                }
 295                else if (strcmp(tmp, "false") == 0)
 296                {
 297            	value = false;
 298            	return true;
 299                }
 300            
 301                char buffer[62];
 302                sprintf(buffer, "Bad %s.%s attribute value", "ISARRAY", tagName);
 303                throw XmlSemanticError(lineNumber, buffer);
 304                return false;
 305            }
 306            
 307            //------------------------------------------------------------------------------
 308            //
 309            // getCimNameAttribute()
 310            //
 311 mike  1.1  //     <!ENTITY % CIMName "NAME CDATA #REQUIRED">
 312            //
 313            //------------------------------------------------------------------------------
 314            
 315            String XmlReader::getCimNameAttribute(
 316                Uint32 lineNumber, 
 317                const XmlEntry& entry,
 318                const char* elementName,
 319                Boolean acceptNull)
 320            {
 321                String name;
 322            
 323                if (!entry.getAttributeValue("NAME", name))
 324                {
 325            	char buffer[MESSAGE_SIZE];
 326            	sprintf(buffer, "missing %s.NAME attribute", elementName);
 327            	throw XmlValidationError(lineNumber, buffer);
 328                }
 329            
 330 mike  1.11     if (acceptNull && name.size() == 0)
 331 mike  1.1  	return name;
 332            
 333 mike  1.2      if (!CIMName::legal(name))
 334 mike  1.1      {
 335            	char buffer[MESSAGE_SIZE];
 336            	sprintf(buffer, "Illegal value for %s.NAME attribute", elementName);
 337            	throw XmlSemanticError(lineNumber, buffer);
 338                }
 339            
 340                return name;
 341            }
 342            
 343            //------------------------------------------------------------------------------
 344            //
 345            // getClassNameAttribute()
 346            //
 347            //     <!ENTITY % CIMName "CLASSNAME CDATA #REQUIRED">
 348            //
 349            //------------------------------------------------------------------------------
 350            
 351            String XmlReader::getClassNameAttribute(
 352                Uint32 lineNumber, 
 353                const XmlEntry& entry,
 354                const char* elementName)
 355 mike  1.1  {
 356                String name;
 357            
 358                if (!entry.getAttributeValue("CLASSNAME", name))
 359                {
 360            	char buffer[MESSAGE_SIZE];
 361            	sprintf(buffer, "missing %s.CLASSNAME attribute", elementName);
 362            	throw XmlValidationError(lineNumber, buffer);
 363                }
 364            
 365 mike  1.2      if (!CIMName::legal(name))
 366 mike  1.1      {
 367            	char buffer[MESSAGE_SIZE];
 368            	sprintf(buffer, 
 369            	    "Illegal value for %s.CLASSNAME attribute", elementName);
 370            	throw XmlSemanticError(lineNumber, buffer);
 371                }
 372            
 373                return name;
 374            }
 375            
 376            //------------------------------------------------------------------------------
 377            //
 378            // getClassOriginAttribute()
 379            //
 380            //     <!ENTITY % ClassOrigin "CLASSORIGIN CDATA #IMPLIED">
 381            //
 382            //------------------------------------------------------------------------------
 383            
 384            String XmlReader::getClassOriginAttribute(
 385                Uint32 lineNumber, 
 386                const XmlEntry& entry,
 387 mike  1.1      const char* tagName)
 388            {
 389                String name;
 390            
 391                if (!entry.getAttributeValue("CLASSORIGIN", name))
 392            	return String();
 393            
 394 mike  1.2      if (!CIMName::legal(name))
 395 mike  1.1      {
 396            	char buffer[MESSAGE_SIZE];
 397            	sprintf(buffer, 
 398            	    "Illegal value for %s.CLASSORIGIN attribute", tagName);
 399            	throw XmlSemanticError(lineNumber, buffer);
 400                }
 401            
 402                return name;
 403            }
 404            
 405            //------------------------------------------------------------------------------
 406            //
 407            // getReferenceClassAttribute()
 408            //
 409            //     <!ENTITY % ReferenceClass "REFERENCECLASS CDATA #IMPLIED">
 410            //
 411            //------------------------------------------------------------------------------
 412            
 413            String XmlReader::getReferenceClassAttribute(
 414                Uint32 lineNumber, 
 415                const XmlEntry& entry,
 416 mike  1.1      const char* elementName)
 417            {
 418                String name;
 419            
 420                if (!entry.getAttributeValue("REFERENCECLASS", name))
 421            	return String();
 422            
 423 mike  1.2      if (!CIMName::legal(name))
 424 mike  1.1      {
 425            	char buffer[MESSAGE_SIZE];
 426            	sprintf(buffer, 
 427            	    "Illegal value for %s.REFERENCECLASS attribute", elementName);
 428            	throw XmlSemanticError(lineNumber, buffer);
 429                }
 430            
 431                return name;
 432            }
 433            
 434            //------------------------------------------------------------------------------
 435            //
 436            // getSuperClassAttribute()
 437            //
 438            //     <!ENTITY % SuperClass "SUPERCLASS CDATA #IMPLIED">
 439            //
 440            //------------------------------------------------------------------------------
 441            
 442            String XmlReader::getSuperClassAttribute(
 443                Uint32 lineNumber, 
 444                const XmlEntry& entry,
 445 mike  1.1      const char* tagName)
 446            {
 447                String superClass;
 448            
 449                if (!entry.getAttributeValue("SUPERCLASS", superClass))
 450            	return String();
 451            
 452 mike  1.2      if (!CIMName::legal(superClass))
 453 mike  1.1      {
 454            	char buffer[MESSAGE_SIZE];
 455            	sprintf(
 456            	    buffer, "Illegal value for %s.SUPERCLASS attribute", tagName);
 457            	throw XmlSemanticError(lineNumber, buffer);
 458                }
 459            
 460                return superClass;
 461            }
 462            
 463            //------------------------------------------------------------------------------
 464            //
 465            // getCimTypeAttribute()
 466            //
 467            //     <!ENTITY % CIMType "TYPE (boolean|string|char16|uint8|sint8|uint16
 468            //         |sint16|uint32|sint32|uint64|sint64|datetime|real32|real64)">
 469            //
 470            //------------------------------------------------------------------------------
 471            
 472 mike  1.2  CIMType XmlReader::getCimTypeAttribute(
 473 mike  1.1      Uint32 lineNumber, 
 474                const XmlEntry& entry, 
 475                const char* tagName)
 476            {
 477                const char* typeName;
 478            
 479                if (!entry.getAttributeValue("TYPE", typeName))
 480                {
 481            	char message[MESSAGE_SIZE];
 482            	sprintf(message, "missing %s.TYPE attribute", tagName);
 483            	throw XmlValidationError(lineNumber, message);
 484                }
 485            
 486 mike  1.2      CIMType type = CIMType::NONE;
 487 mike  1.1  
 488                if (strcmp(typeName, "boolean") == 0)
 489 mike  1.2  	type = CIMType::BOOLEAN;
 490 mike  1.1      else if (strcmp(typeName, "string") == 0)
 491 mike  1.2  	type = CIMType::STRING;
 492 mike  1.1      else if (strcmp(typeName, "char16") == 0)
 493 mike  1.2  	type = CIMType::CHAR16;
 494 mike  1.1      else if (strcmp(typeName, "uint8") == 0)
 495 mike  1.2  	type = CIMType::UINT8;
 496 mike  1.1      else if (strcmp(typeName, "sint8") == 0)
 497 mike  1.2  	type = CIMType::SINT8;
 498 mike  1.1      else if (strcmp(typeName, "uint16") == 0)
 499 mike  1.2  	type = CIMType::UINT16;
 500 mike  1.1      else if (strcmp(typeName, "sint16") == 0)
 501 mike  1.2  	type = CIMType::SINT16;
 502 mike  1.1      else if (strcmp(typeName, "uint32") == 0)
 503 mike  1.2  	type = CIMType::UINT32;
 504 mike  1.1      else if (strcmp(typeName, "sint32") == 0)
 505 mike  1.2  	type = CIMType::SINT32;
 506 mike  1.1      else if (strcmp(typeName, "uint64") == 0)
 507 mike  1.2  	type = CIMType::UINT64;
 508 mike  1.1      else if (strcmp(typeName, "sint64") == 0)
 509 mike  1.2  	type = CIMType::SINT64;
 510 mike  1.1      else if (strcmp(typeName, "datetime") == 0)
 511 mike  1.2  	type = CIMType::DATETIME;
 512 mike  1.1      else if (strcmp(typeName, "real32") == 0)
 513 mike  1.2  	type = CIMType::REAL32;
 514 mike  1.1      else if (strcmp(typeName, "real64") == 0)
 515 mike  1.2  	type = CIMType::REAL64;
 516 mike  1.1      else if (strcmp(typeName, "reference") == 0)
 517 mike  1.2  	type = CIMType::REFERENCE;
 518 mike  1.1  
 519                // ATTN: "reference" is not legal according to the DTD; however, it is
 520                // used by the XML version of the CIM schema.
 521            
 522 mike  1.2      if (type == CIMType::NONE)
 523 mike  1.1      {
 524            	char message[MESSAGE_SIZE];
 525            	sprintf(message, "Illegal value for %s.TYPE attribute", tagName);
 526            	throw XmlSemanticError(lineNumber, message);
 527                }
 528            
 529                return type;
 530            }
 531            
 532            //------------------------------------------------------------------------------
 533            //
 534            // getCimBooleanAttribute()
 535            //
 536            //------------------------------------------------------------------------------
 537            
 538            Boolean XmlReader::getCimBooleanAttribute(
 539                Uint32 lineNumber,
 540                const XmlEntry& entry,
 541                const char* tagName,
 542                const char* attributeName,
 543                Boolean defaultValue,
 544 mike  1.1      Boolean required)
 545            {
 546                const char* tmp;
 547            
 548                if (!entry.getAttributeValue(attributeName, tmp))
 549                {
 550            	if (!required)
 551            	    return defaultValue;
 552            
 553            	char buffer[62];
 554            	sprintf(buffer, "missing required %s.%s attribute", 
 555            	    attributeName, tagName);
 556            
 557            	throw XmlValidationError(lineNumber, buffer);
 558                }
 559            
 560                if (strcmp(tmp, "true") == 0)
 561            	return true;
 562                else if (strcmp(tmp, "false") == 0)
 563            	return false;
 564            
 565 mike  1.1      char buffer[62];
 566                sprintf(buffer, "Bad %s.%s attribute value", attributeName, tagName);
 567                throw XmlSemanticError(lineNumber, buffer);
 568                return false;
 569            }
 570            
 571            //------------------------------------------------------------------------------
 572            //
 573            // SringToReal()
 574            //
 575            //	[ "+" | "-" ] *decimalDigit "." 1*decimalDigit 
 576            //	    [ ( "e" | "E" ) [ "+" | "-" ] 1*decimalDigit ]
 577            //
 578            //------------------------------------------------------------------------------
 579            
 580            Boolean XmlReader::stringToReal(const char* stringValue, Real64& x)
 581            {
 582                const char* p = stringValue;
 583            
 584                if (!*p)
 585            	return false;
 586 mike  1.1  
 587                // Skip optional sign:
 588            
 589                if (*p == '+' || *p  == '-')
 590            	p++;
 591            
 592                // Skip optional first set of digits:
 593            
 594                while (isdigit(*p))
 595            	p++;
 596            
 597                // Test required dot:
 598            
 599                if (*p++ != '.')
 600            	return false;
 601            
 602                // One or more digits required:
 603            
 604                if (!isdigit(*p++))
 605            	return false;
 606            
 607 mike  1.1      while (isdigit(*p))
 608            	p++;
 609            
 610                // If there is an exponent now:
 611            
 612                if (*p)
 613                {
 614            	// Test exponent:
 615            
 616            	if (*p != 'e' && *p != 'E')
 617            	    return false;
 618            
 619            	p++;
 620            
 621            	// Skip optional sign:
 622            
 623            	if (*p == '+' || *p  == '-')
 624            	    p++;
 625            
 626            	// One or more digits required:
 627            
 628 mike  1.1  	if (!isdigit(*p++))
 629            	    return false;
 630            
 631            	while (isdigit(*p))
 632            	    p++;
 633                }
 634            
 635                if (*p)
 636            	return false;
 637            
 638                char* end;
 639                x = strtod(stringValue, &end);
 640                return true;
 641            }
 642            
 643            //------------------------------------------------------------------------------
 644            //
 645            // stringToSignedInteger
 646            //
 647            //	[ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
 648            //
 649 mike  1.1  // ATTN-B: handle conversion from hexadecimal.
 650            //------------------------------------------------------------------------------
 651            
 652            Boolean XmlReader::stringToSignedInteger(
 653                const char* stringValue, 
 654                Sint64& x)
 655            {
 656                x = 0;
 657                const char* p = stringValue;
 658            
 659                if (!*p)
 660            	return false;
 661            
 662                // Skip optional sign:
 663            
 664                Boolean negative = *p == '-';
 665            
 666                if (negative || *p == '+')
 667            	p++;
 668            
 669                // If the next thing is a zero, then it must be the last:
 670 mike  1.1  
 671                if (*p == '0')
 672            	return p[1] == '\0';
 673            
 674                // Expect a positive decimal digit:
 675            
 676                const char* first = p;
 677            
 678                if (!isdigit(*p) || *p == '0')
 679            	return false;
 680            
 681                p++;
 682            
 683                // Expect zero or more digits:
 684            
 685                while (isdigit(*p))
 686            	p++;
 687            
 688                if (*p)
 689            	return false;
 690            
 691 mike  1.1      const char* last = p;
 692            
 693                while (first != last)
 694            	x = 10 * x + (*first++ - '0');
 695            
 696                if (negative)
 697            	x = -x;
 698            
 699                return true;
 700            }
 701            
 702            //------------------------------------------------------------------------------
 703            //
 704            // stringToUnsignedInteger
 705            //
 706            //	[ "+" | "-" ] ( positiveDecimalDigit *decimalDigit | "0" )
 707            //
 708            // ATTN-B: handle conversion from hexadecimal.
 709            //------------------------------------------------------------------------------
 710            
 711            Boolean XmlReader::stringToUnsignedInteger(
 712 mike  1.1      const char* stringValue, 
 713                Uint64& x)
 714            {
 715                x = 0;
 716                const char* p = stringValue;
 717            
 718                if (!*p)
 719            	return false;
 720            
 721                // Skip optional sign:
 722            
 723                if (*p == '-')
 724            	return false;
 725            
 726                if (*p == '+')
 727            	p++;
 728            
 729                // If the next thing is a zero, then it must be the last:
 730            
 731                if (*p == '0')
 732            	return p[1] == '\0';
 733 mike  1.1  
 734                // Expect a positive decimal digit:
 735            
 736                const char* first = p;
 737            
 738                if (!isdigit(*p) || *p == '0')
 739            	return false;
 740            
 741                p++;
 742            
 743                // Expect zero or more digits:
 744            
 745                while (isdigit(*p))
 746            	p++;
 747            
 748                if (*p)
 749            	return false;
 750            
 751                const char* last = p;
 752            
 753                while (first != last)
 754 mike  1.1  	x = 10 * x + (*first++ - '0');
 755            
 756                return true;
 757            }
 758            
 759            //------------------------------------------------------------------------------
 760            //
 761            // stringToValue()
 762            //
 763            // ATTN-C: note that integers are truncated without warning. What should be 
 764            // done in this case? In C they are truncated without warning by design.
 765            //
 766            //------------------------------------------------------------------------------
 767            
 768 mike  1.2  CIMValue XmlReader::stringToValue(
 769 mike  1.1      Uint32 lineNumber, 
 770                const char* valueString, 
 771 mike  1.2      CIMType type)
 772 mike  1.1  {
 773                // ATTN-B: accepting only UTF-8 for now! (affects string and char16):
 774            
 775 sage  1.12 //SNIA
 776                if (strlen(valueString)==0) {
 777                    switch (type) {
 778                        case CIMType::BOOLEAN: return CIMValue(false);
 779                       case CIMType::STRING: return CIMValue(valueString);
 780                       case CIMType::CHAR16: return CIMValue(Char16('\0'));
 781                       case CIMType::UINT8: return CIMValue(Uint8(0));
 782                       case CIMType::UINT16: return CIMValue(Uint16(0));
 783                       case CIMType::UINT32: return CIMValue(Uint32(0));
 784                       case CIMType::UINT64: return CIMValue(Uint64(0));
 785                        case CIMType::SINT8: return CIMValue(Sint8(0));
 786                        case CIMType::SINT16: return CIMValue(Sint16(0));
 787                        case CIMType::SINT32: return CIMValue(Sint32(0));
 788                        case CIMType::SINT64: return CIMValue(Sint64(0));
 789                       case CIMType::REAL32: return CIMValue(Real32(0));
 790                       case CIMType::REAL64: return CIMValue(Real64(0));
 791                    }
 792                }
 793            // end of SNIA
 794            
 795 mike  1.1      switch (type)
 796                {
 797 mike  1.2  	case CIMType::BOOLEAN:
 798 mike  1.1  	{
 799 mike  1.13 	    if (CompareNoCase(valueString, "TRUE") == 0)
 800 mike  1.2  		return CIMValue(true);
 801 mike  1.13 	    else if (CompareNoCase(valueString, "FALSE") == 0)
 802 mike  1.2  		return CIMValue(false);
 803 mike  1.1  	    else
 804            		throw XmlSemanticError(
 805            		    lineNumber, "Bad boolean value");
 806            	}
 807            
 808 mike  1.2  	case CIMType::STRING:
 809 mike  1.1  	{
 810 mike  1.2  	    return CIMValue(valueString);
 811 mike  1.1  	}
 812            
 813 mike  1.2  	case CIMType::CHAR16:
 814 mike  1.1  	{
 815            	    if (strlen(valueString) != 1)
 816            		throw XmlSemanticError(lineNumber, "Bad char16 value");
 817            
 818 mike  1.2  	    return CIMValue(Char16(valueString[0]));
 819 mike  1.1  	}
 820            
 821 mike  1.2  	case CIMType::UINT8:
 822            	case CIMType::UINT16:
 823            	case CIMType::UINT32:
 824            	case CIMType::UINT64:
 825 mike  1.1  	{
 826            	    Uint64 x;
 827            
 828            	    if (!stringToUnsignedInteger(valueString, x))
 829            	    {
 830            		throw XmlSemanticError(
 831            		    lineNumber, "Bad unsigned integer value");
 832            	    }
 833            
 834            	    switch (type)
 835            	    {
 836 mike  1.2  		case CIMType::UINT8: return CIMValue(Uint8(x));
 837            		case CIMType::UINT16: return CIMValue(Uint16(x));
 838            		case CIMType::UINT32: return CIMValue(Uint32(x));
 839            		case CIMType::UINT64: return CIMValue(Uint64(x));
 840 mike  1.1  		default: break;
 841            	    }
 842            	}
 843            
 844 mike  1.2  	case CIMType::SINT8:
 845            	case CIMType::SINT16:
 846            	case CIMType::SINT32:
 847            	case CIMType::SINT64:
 848 mike  1.1  	{
 849            	    Sint64 x;
 850            
 851            	    if (!stringToSignedInteger(valueString, x))
 852            	    {
 853            		throw XmlSemanticError(
 854            		    lineNumber, "Bad signed integer value");
 855            	    }
 856            
 857            	    switch (type)
 858            	    {
 859 mike  1.2  		case CIMType::SINT8: return CIMValue(Sint8(x));
 860            		case CIMType::SINT16: return CIMValue(Sint16(x));
 861            		case CIMType::SINT32: return CIMValue(Sint32(x));
 862            		case CIMType::SINT64: return CIMValue(Sint64(x));
 863 mike  1.1  		default: break;
 864            	    }
 865            	}
 866            
 867 mike  1.2  	case CIMType::DATETIME:
 868 mike  1.1  	{
 869 mike  1.2  	    CIMDateTime tmp;
 870 mike  1.1  
 871            	    try
 872            	    {
 873            		tmp.set(valueString);
 874            	    }
 875            	    catch (BadDateTimeFormat&)
 876            	    {
 877            		throw XmlSemanticError(lineNumber, "Bad datetime value");
 878            	    }
 879            
 880 mike  1.2  	    return CIMValue(tmp);
 881 mike  1.1  	}
 882            
 883 mike  1.2  	case CIMType::REAL32:
 884 mike  1.1  	{
 885            	    Real64 x;
 886            
 887            	    if (!stringToReal(valueString, x))
 888            		throw XmlSemanticError(lineNumber, "Bad real value");
 889            
 890 mike  1.2  	    return CIMValue(Real32(x));
 891 mike  1.1  	}
 892            
 893 mike  1.2  	case CIMType::REAL64:
 894 mike  1.1  	{
 895            	    Real64 x;
 896            
 897            	    if (!stringToReal(valueString, x))
 898            		throw XmlSemanticError(lineNumber, "Bad real value");
 899            
 900 mike  1.2  	    return CIMValue(x);
 901 mike  1.1  	}
 902            
 903            	default:
 904            	    break;
 905                }
 906            
 907                throw XmlSemanticError(lineNumber, "malformed XML");
 908                return false;
 909            }
 910            
 911            //------------------------------------------------------------------------------
 912            //
 913            // getValueElement()
 914            //
 915            //     <!ELEMENT VALUE (#PCDATA)>
 916            //
 917            //------------------------------------------------------------------------------
 918            
 919            Boolean XmlReader::getValueElement(
 920                XmlParser& parser, 
 921 mike  1.2      CIMType type, 
 922                CIMValue& value)
 923 mike  1.1  {
 924                // Get VALUE start tag:
 925            
 926                XmlEntry entry;
 927                if (!testStartTagOrEmptyTag(parser, entry, "VALUE"))
 928            	return false;
 929            
 930                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
 931            
 932                // Get VALUE content:
 933            
 934                const char* valueString = "";
 935 karl  1.8      // cout << "DEBUG XMLReader:getValueElement " << __LINE__ ;
 936 mike  1.1  
 937                if (!empty)
 938                {
 939            	if (testContentOrCData(parser, entry))
 940            	    valueString = entry.text;
 941 karl  1.8  	//cout << "DEBUG XMLReader:getValueElement " << __LINE__
 942            	//    <<  " valueString " << valueString ;
 943 mike  1.1  
 944            	expectEndTag(parser, "VALUE");
 945                }
 946            
 947                value = stringToValue(parser.getLine(), valueString,type);
 948 karl  1.8      //cout << "DEBUG XMLReader:getValueElement " << __LINE__
 949                //	<< " value " << value;
 950 mike  1.1      return true;
 951 karl  1.7  }
 952            
 953 karl  1.8  
 954 karl  1.7  //----------------------------------------------------------------------------
 955            //
 956            // getPropertyValue
 957 karl  1.8  //     Use: Decode property value from getPropertyResponse
 958 karl  1.7  //     Expect (ERROR|IRETURNVALUE).!ELEMENT VALUE (#PCDATA)>
 959            //
 960            //	PropertyValue:
 961            //	<!ELEMENT VALUE>
 962            //
 963            //	<!ELEMENT VALUE.ARRAY (VALUE*)>
 964            //
 965            //	<!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
 966            //                           INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
 967            //
 968            //----------------------------------------------------------------------------
 969            Boolean XmlReader::getPropertyValue(
 970                XmlParser& parser, 
 971                CIMValue& cimValue)
 972            {
 973                //Test for Element value type
 974                CIMType type = CIMType::STRING;
 975 karl  1.8  
 976 karl  1.7      if (XmlReader::getValueElement(parser, type, cimValue))
 977 karl  1.8      {
 978            	//cout << "DEBUG xmlReader::getPropertyValue " << __LINE__
 979            	//    << " CimValue = " << cimValue.toString << endl;
 980 karl  1.7  	return true;
 981 karl  1.8      }
 982 karl  1.7  
 983                //Test for Element.array value
 984                if(XmlReader::getValueArrayElement(parser, type, cimValue))
 985                   return true;
 986            
 987                // Test for Value.reference type
 988                // ATTN:This returns a different type (CIMReference)
 989                // ATTN: Possibly change to simply return result after
 990                // we figure out the type differences.
 991            
 992               CIMReference reference;
 993               if(XmlReader::getValueReferenceElement(parser, reference))
 994                  return true;
 995            
 996               return false;
 997 mike  1.1  }
 998            
 999            //------------------------------------------------------------------------------
1000            //
1001            // stringArrayToValue()
1002            //
1003            //------------------------------------------------------------------------------
1004            
1005            template<class T>
1006 mike  1.2  CIMValue StringArrayToValueAux(
1007 mike  1.1      Uint32 lineNumber, 
1008                const Array<const char*>& stringArray,
1009 mike  1.2      CIMType type,
1010 mike  1.1      T*)
1011            {
1012                Array<T> array;
1013            
1014 mike  1.11     for (Uint32 i = 0, n = stringArray.size(); i < n; i++)
1015 mike  1.1      {
1016 mike  1.2  	CIMValue value = XmlReader::stringToValue(
1017 mike  1.1  	    lineNumber, stringArray[i], type);
1018            
1019            	T x;
1020            	value.get(x);
1021            	array.append(x);
1022                }
1023            
1024 mike  1.2      return CIMValue(array);
1025 mike  1.1  }
1026            
1027 mike  1.2  CIMValue XmlReader::stringArrayToValue(
1028 mike  1.1      Uint32 lineNumber, 
1029                const Array<const char*>& array, 
1030 mike  1.2      CIMType type)
1031 mike  1.1  {
1032                switch (type)
1033                {
1034 mike  1.2  	case CIMType::BOOLEAN: 
1035 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Boolean*)0);
1036            
1037 mike  1.2  	case CIMType::STRING:
1038 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (String*)0);
1039            
1040 mike  1.2  	case CIMType::CHAR16:
1041 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Char16*)0);
1042            
1043 mike  1.2  	case CIMType::UINT8:
1044 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Uint8*)0);
1045            
1046 mike  1.2  	case CIMType::UINT16:
1047 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Uint16*)0);
1048            
1049 mike  1.2  	case CIMType::UINT32:
1050 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Uint32*)0);
1051            
1052 mike  1.2  	case CIMType::UINT64:
1053 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Uint64*)0);
1054            
1055 mike  1.2  	case CIMType::SINT8:
1056 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Sint8*)0);
1057            
1058 mike  1.2  	case CIMType::SINT16:
1059 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Sint16*)0);
1060            
1061 mike  1.2  	case CIMType::SINT32:
1062 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Sint32*)0);
1063            
1064 mike  1.2  	case CIMType::SINT64:
1065 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Sint64*)0);
1066            
1067 mike  1.2  	case CIMType::DATETIME:
1068            	    return StringArrayToValueAux(lineNumber, array, type, (CIMDateTime*)0);
1069 mike  1.1  
1070 mike  1.2  	case CIMType::REAL32:
1071 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Real32*)0);
1072            
1073 mike  1.2  	case CIMType::REAL64:
1074 mike  1.1  	    return StringArrayToValueAux(lineNumber, array, type, (Real64*)0);
1075            
1076            	default:
1077            	    break;
1078                }
1079            
1080                // Unreachable:
1081 mike  1.2      return CIMValue();
1082 mike  1.1  }
1083            
1084            //------------------------------------------------------------------------------
1085            //
1086            // getValueArrayElement()
1087            //
1088            //     <!ELEMENT VALUE.ARRAY (VALUE*)>
1089            //
1090            //------------------------------------------------------------------------------
1091            
1092            Boolean XmlReader::getValueArrayElement(
1093                XmlParser& parser, 
1094 mike  1.2      CIMType type, 
1095                CIMValue& value)
1096 mike  1.1  {
1097                value.clear();
1098            
1099                // Get VALUE.ARRAY open tag:
1100            
1101                XmlEntry entry;
1102            
1103                if (!testStartTagOrEmptyTag(parser, entry, "VALUE.ARRAY"))
1104            	return false;
1105            
1106                if (entry.type == XmlEntry::EMPTY_TAG)
1107            	return true;
1108            
1109                // For each VALUE element:
1110            
1111                Array<const char*> stringArray;
1112            
1113                while (testStartTagOrEmptyTag(parser, entry, "VALUE"))
1114                {
1115            	if (entry.type == XmlEntry::EMPTY_TAG)
1116            	{
1117 mike  1.1  	    stringArray.append("");
1118            	    continue;
1119            	}
1120            
1121            	if (testContentOrCData(parser, entry))
1122            	    stringArray.append(entry.text);
1123            	else
1124            	    stringArray.append("");
1125            
1126            	expectEndTag(parser, "VALUE");
1127                }
1128            
1129                expectEndTag(parser, "VALUE.ARRAY");
1130            
1131                value = stringArrayToValue(parser.getLine(), stringArray, type);
1132                return true;
1133            }
1134            
1135            //------------------------------------------------------------------------------
1136            //
1137            // getFlavor()
1138 mike  1.1  //
1139            //     <!ENTITY % QualifierFlavor 
1140            //         "OVERRIDABLE (true|false) 'true'
1141            //         TOSUBCLASS (true|false) 'true'
1142            //         TOINSTANCE (true|false)  'false'
1143            //         TRANSLATABLE (true|false)  'false'">
1144            //
1145            //------------------------------------------------------------------------------
1146            
1147            Uint32 XmlReader::getFlavor(
1148                XmlEntry& entry, 
1149                Uint32 lineNumber, 
1150                const char* tagName)
1151            {
1152                // Get QUALIFIER.OVERRIDABLE
1153            
1154                Boolean overridable = getCimBooleanAttribute(
1155            	lineNumber, entry, tagName, "OVERRIDABLE", true, false);
1156            
1157                // Get QUALIFIER.TOSUBCLASS
1158            
1159 mike  1.1      Boolean toSubClass = getCimBooleanAttribute(
1160            	lineNumber, entry, tagName, "TOSUBCLASS", true, false);
1161            
1162                // Get QUALIFIER.TOINSTANCE
1163            
1164                Boolean toInstance = getCimBooleanAttribute(
1165            	lineNumber, entry, tagName, "TOINSTANCE", false, false);
1166            
1167                // Get QUALIFIER.TRANSLATABLE
1168            
1169                Boolean translatable = getCimBooleanAttribute(
1170            	lineNumber, entry, tagName, "TRANSLATABLE", false, false);
1171            
1172                Uint32 flavor = 0;
1173            
1174                if (overridable)
1175 mike  1.2  	flavor |= CIMFlavor::OVERRIDABLE;
1176 mike  1.1  
1177                if (toSubClass)
1178 mike  1.2  	flavor |= CIMFlavor::TOSUBCLASS;
1179 mike  1.1  
1180                if (toInstance)
1181 mike  1.2  	flavor |= CIMFlavor::TOINSTANCE;
1182 mike  1.1  
1183                if (translatable)
1184 mike  1.2  	flavor |= CIMFlavor::TRANSLATABLE;
1185 mike  1.1  
1186                return flavor;
1187            }
1188            
1189            //------------------------------------------------------------------------------
1190            //
1191            // getOptionalScope()
1192            //
1193            //     DTD:
1194            //         <!ELEMENT SCOPE EMPTY>
1195            //         <!ATTLIST SCOPE 
1196            //              CLASS (true|false) 'false'
1197            //              ASSOCIATION (true|false) 'false'
1198            //              REFERENCE (true|false) 'false'
1199            //              PROPERTY (true|false) 'false'
1200            //              METHOD (true|false) 'false'
1201            //              PARAMETER (true|false) 'false'
1202            //              INDICATION (true|false) 'false'>
1203            //
1204            //------------------------------------------------------------------------------
1205            
1206 mike  1.1  Uint32 XmlReader::getOptionalScope(XmlParser& parser)
1207            {
1208                XmlEntry entry;
1209            
1210                if (!parser.next(entry))
1211            	return false;
1212            
1213                Boolean isEmptyTag = entry.type == XmlEntry::EMPTY_TAG;
1214            
1215                if ((!isEmptyTag && 
1216            	entry.type != XmlEntry::START_TAG) ||
1217            	strcmp(entry.text, "SCOPE") != 0)
1218                {
1219            	parser.putBack(entry);
1220            	return 0;
1221                }
1222            
1223                Uint32 line = parser.getLine();
1224                Uint32 scope = 0;
1225            
1226                if (getCimBooleanAttribute(line, entry, "SCOPE", "CLASS", false, false))
1227 mike  1.2  	scope |= CIMScope::CLASS;
1228 mike  1.1  
1229                if (getCimBooleanAttribute(
1230            	line, entry, "SCOPE", "ASSOCIATION", false, false))
1231 mike  1.2  	scope |= CIMScope::ASSOCIATION;
1232 mike  1.1  
1233                if (getCimBooleanAttribute(
1234            	line, entry, "SCOPE", "REFERENCE", false, false))
1235 mike  1.2  	scope |= CIMScope::REFERENCE;
1236 mike  1.1  
1237                if (getCimBooleanAttribute(line, entry, "SCOPE", "PROPERTY", false, false))
1238 mike  1.2  	scope |= CIMScope::PROPERTY;
1239 mike  1.1  
1240                if (getCimBooleanAttribute(line, entry, "SCOPE", "METHOD", false, false))
1241 mike  1.2  	scope |= CIMScope::METHOD;
1242 mike  1.1  
1243                if (getCimBooleanAttribute(line, entry, "SCOPE", "PARAMETER", false, false))
1244 mike  1.2  	scope |= CIMScope::PARAMETER;
1245 mike  1.1  
1246                if (getCimBooleanAttribute(line, entry, "SCOPE", "INDICATION",false, false))
1247 mike  1.2  	scope |= CIMScope::INDICATION;
1248 mike  1.1  
1249                if (!isEmptyTag)
1250            	expectEndTag(parser, "SCOPE");
1251            
1252                return scope;
1253            }
1254            
1255            //------------------------------------------------------------------------------
1256            //
1257            // getQualifierElement()
1258            //
1259            //     <!ELEMENT QUALIFIER (VALUE|VALUE.ARRAY)>
1260            //     <!ATTLIST QUALIFIER
1261            //         %CIMName;
1262            //         %CIMType; #REQUIRED
1263            //         %Propagated;
1264            //         %QualifierFlavor;>
1265            //
1266            //------------------------------------------------------------------------------
1267            
1268            Boolean XmlReader::getQualifierElement(
1269 mike  1.1      XmlParser& parser, 
1270 mike  1.2      CIMQualifier& qualifier)
1271 mike  1.1  {
1272                // Get QUALIFIER element:
1273            
1274                XmlEntry entry;
1275                if (!testStartTag(parser, entry, "QUALIFIER"))
1276            	return false;
1277            
1278                // Get QUALIFIER.NAME attribute:
1279            
1280                String name = getCimNameAttribute(parser.getLine(), entry, "QUALIFIER");
1281            
1282                // Get QUALIFIER.TYPE attribute:
1283            
1284 mike  1.2      CIMType type = getCimTypeAttribute(parser.getLine(), entry, "QUALIFIER");
1285 mike  1.1  
1286                // Get QUALIFIER.PROPAGATED
1287            
1288                Boolean propagated = getCimBooleanAttribute(
1289            	parser.getLine(), entry, "QUALIFIER", "PROPAGATED", false, false);
1290            
1291                // Get flavor oriented attributes:
1292            
1293                Uint32 flavor = getFlavor(entry, parser.getLine(), "QUALIFIER");
1294            
1295                // Get VALUE or VALUE.ARRAY element:
1296            
1297 mike  1.2      CIMValue value;
1298 mike  1.1  
1299                if (!getValueElement(parser, type, value) &&
1300            	!getValueArrayElement(parser, type, value))
1301                {
1302            	throw XmlSemanticError(parser.getLine(),
1303            	    "Expected VALUE or VALUE.ARRAY element");
1304                }
1305            
1306                // Expect </QUALIFIER>:
1307            
1308                expectEndTag(parser, "QUALIFIER");
1309            
1310                // Build qualifier:
1311            
1312 mike  1.2      qualifier = CIMQualifier(name, value, flavor, propagated);
1313 mike  1.1      return true;
1314            }
1315            
1316            //------------------------------------------------------------------------------
1317            //
1318            // getQualifierElements()
1319            //
1320            //------------------------------------------------------------------------------
1321            
1322            template<class CONTAINER>
1323            void getQualifierElements(XmlParser& parser, CONTAINER& container)
1324            {
1325 mike  1.2      CIMQualifier qualifier;
1326 mike  1.1  
1327                while (XmlReader::getQualifierElement(parser, qualifier))
1328                {
1329            	try
1330            	{
1331            	    container.addQualifier(qualifier);
1332            	}
1333            	catch (AlreadyExists&)
1334            	{
1335            	    throw XmlSemanticError(parser.getLine(), "duplicate qualifier");
1336            	}
1337                }
1338            }
1339            
1340            //------------------------------------------------------------------------------
1341            //
1342            // getPropertyElement()
1343            //
1344            //     <!ELEMENT PROPERTY (QUALIFIER*,VALUE?)>
1345            //     <!ATTLIST PROPERTY
1346            //         %CIMName;
1347 mike  1.1  //         %ClassOrigin;
1348            //         %Propagated;
1349            //         %CIMType; #REQUIRED>
1350            //
1351            //------------------------------------------------------------------------------
1352            
1353 mike  1.2  Boolean XmlReader::getPropertyElement(XmlParser& parser, CIMProperty& property)
1354 mike  1.1  {
1355                XmlEntry entry;
1356            
1357                if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY"))
1358            	return false;
1359            
1360                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1361            
1362                // Get PROPERTY.NAME attribute:
1363            
1364                String name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
1365            
1366                // Get PROPERTY.CLASSORIGIN attribute:
1367            
1368                String classOrigin = 
1369            	getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
1370            
1371                // Get PROPERTY.PROPAGATED
1372            
1373                Boolean propagated = getCimBooleanAttribute(
1374            	parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
1375 mike  1.1  
1376                // Get PROPERTY.TYPE attribute:
1377            
1378 mike  1.2      CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY");
1379 mike  1.1  
1380                // Create property:
1381            
1382 mike  1.2      CIMValue value;
1383 mike  1.1      value.setNullValue(type, false);
1384 mike  1.2      property = CIMProperty(
1385 mike  1.1  	name, value, 0, String(), classOrigin, propagated);
1386            
1387                if (!empty)
1388                {
1389            	// Get qualifiers:
1390            
1391            	getQualifierElements(parser, property);
1392            
1393            	// Get value:
1394            
1395            	if (getValueElement(parser, type, value))
1396            	    property.setValue(value);
1397            
1398            	expectEndTag(parser, "PROPERTY");
1399                }
1400            
1401                return true;
1402            }
1403            
1404            //------------------------------------------------------------------------------
1405            //
1406 mike  1.1  // getArraySizeAttribute()
1407            //
1408            //     Returns true if able to get array-size. Note that array size will
1409            //     always be a positive integer.
1410            //
1411            //     <!ENTITY % ArraySize "ARRAYSIZE CDATA #IMPLIED">
1412            //
1413            //------------------------------------------------------------------------------
1414            
1415            Boolean XmlReader::getArraySizeAttribute(
1416                Uint32 lineNumber,
1417                const XmlEntry& entry,
1418                const char* tagName,
1419                Uint32& value)
1420            {
1421                const char* tmp;
1422            
1423                if (!entry.getAttributeValue("ARRAYSIZE", tmp))
1424            	return false;
1425            
1426                Uint64 arraySize;
1427 mike  1.1  
1428                if (!stringToUnsignedInteger(tmp, arraySize) || arraySize == 0)
1429                {
1430            	char message[128];
1431            	sprintf(message, "Illegal value for %s.%s", tagName, "ARRAYSIZE");
1432            	throw XmlSemanticError(lineNumber, message);
1433                }
1434            
1435                value = Uint32(arraySize);
1436                return true;
1437            }
1438            
1439            //------------------------------------------------------------------------------
1440            //
1441            // getPropertyArrayElement()
1442            //
1443            //     <!ELEMENT PROPERTY.ARRAY (QUALIFIER*,VALUE.ARRAY?)>
1444            //     <!ATTLIST PROPERTY.ARRAY
1445            //             %CIMName;
1446            //             %CIMType; #REQUIRED
1447            //             %ArraySize;
1448 mike  1.1  //             %ClassOrigin;
1449            //             %Propagated;>
1450            //
1451            //------------------------------------------------------------------------------
1452            
1453            Boolean XmlReader::getPropertyArrayElement(
1454                XmlParser& parser, 
1455 mike  1.2      CIMProperty& property)
1456 mike  1.1  {
1457                // Get PROPERTY element:
1458            
1459                XmlEntry entry;
1460            
1461                if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.ARRAY"))
1462            	return false;
1463            
1464                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1465            
1466                // Get PROPERTY.NAME attribute:
1467            
1468                String name = 
1469            	getCimNameAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1470            
1471                // Get PROPERTY.TYPE attribute:
1472            
1473 mike  1.2      CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1474 mike  1.1  
1475                // Get PROPERTY.ARRAYSIZE attribute:
1476            
1477                Uint32 arraySize = 0;
1478                getArraySizeAttribute(parser.getLine(), entry, "PROPERTY.ARRAY", arraySize);
1479            
1480                // Get PROPERTY.CLASSORIGIN attribute:
1481            
1482                String classOrigin 
1483            	= getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.ARRAY");
1484            
1485                // Get PROPERTY.ARRAY.PROPAGATED
1486            
1487                Boolean propagated = getCimBooleanAttribute(
1488            	parser.getLine(), entry, "PROPERTY.ARRAY", "PROPAGATED", false, false);
1489            
1490                // Create property:
1491            
1492 mike  1.2      CIMValue nullValue;
1493 mike  1.1      nullValue.setNullValue(type, true, arraySize);
1494 mike  1.2      property = CIMProperty(
1495 mike  1.1  	name, nullValue, arraySize, String(), classOrigin, propagated);
1496            
1497                if (!empty)
1498                {
1499            	// Get qualifiers:
1500            
1501            	getQualifierElements(parser, property);
1502            
1503            	// Get value:
1504            
1505 mike  1.2  	CIMValue value;
1506 mike  1.1  
1507            	if (getValueArrayElement(parser, type, value))
1508            	{
1509            	    if (arraySize && arraySize != value.getArraySize())
1510            	    {
1511            		throw XmlSemanticError(parser.getLine(),
1512            		    "ARRAYSIZE attribute and value-array size are different");
1513            	    }
1514            
1515            	    property.setValue(value);
1516            	}
1517            
1518            	expectEndTag(parser, "PROPERTY.ARRAY");
1519                }
1520            
1521                return true;
1522            }
1523            
1524            //------------------------------------------------------------------------------
1525            //
1526            // getHostElement()
1527 mike  1.1  //
1528            //     <!ELEMENT HOST (#PCDATA)>
1529            //
1530            //------------------------------------------------------------------------------
1531            
1532            Boolean XmlReader::getHostElement(
1533                XmlParser& parser,
1534                String& host)
1535            {
1536                XmlEntry entry;
1537            
1538                if (!testStartTag(parser, entry, "HOST"))
1539            	return false;
1540            
1541                if (!parser.next(entry) || entry.type != XmlEntry::CONTENT)
1542                {
1543            	throw XmlValidationError(parser.getLine(),
1544            	    "expected content of HOST element");
1545                }
1546            
1547                host = entry.text;
1548 mike  1.1  
1549                expectEndTag(parser, "HOST");
1550                return true;
1551            }
1552            
1553            //------------------------------------------------------------------------------
1554            //
1555            // getNameSpaceElement()
1556            //     
1557            //     <!ELEMENT NAMESPACE EMPTY>
1558            //     <!ATTLIST NAMESPACE %CIMName;>
1559            //
1560            //------------------------------------------------------------------------------
1561            
1562            Boolean XmlReader::getNameSpaceElement(
1563                XmlParser& parser,
1564                String& nameSpaceComponent)
1565            {
1566                XmlEntry entry;
1567            
1568                if (!testStartTagOrEmptyTag(parser, entry, "NAMESPACE"))
1569 mike  1.1  	return false;
1570            
1571                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1572            
1573                nameSpaceComponent = getCimNameAttribute(
1574            	parser.getLine(), entry, "NAMESPACE");
1575            
1576                if (!empty)
1577            	expectEndTag(parser, "NAMESPACE");
1578            
1579                return true;
1580            }
1581            
1582            //------------------------------------------------------------------------------
1583            //
1584            // getLocalNameSpacePathElement()
1585            //     
1586            //     <!ELEMENT LOCALNAMESPACEPATH (NAMESPACE+)>
1587            //
1588            //------------------------------------------------------------------------------
1589            
1590 mike  1.1  Boolean XmlReader::getLocalNameSpacePathElement(
1591                XmlParser& parser,
1592                String& nameSpace)
1593            {
1594                XmlEntry entry;
1595            
1596                if (!testStartTag(parser, entry, "LOCALNAMESPACEPATH"))
1597            	return false;
1598            
1599                String nameSpaceComponent;
1600            
1601                while (getNameSpaceElement(parser, nameSpaceComponent))
1602                {
1603 mike  1.11 	if (nameSpace.size())
1604 mike  1.1  	    nameSpace += '/';
1605            
1606            	nameSpace += nameSpaceComponent;
1607                }
1608            
1609 mike  1.11     if (!nameSpace.size())
1610 mike  1.1      {
1611            	throw XmlValidationError(parser.getLine(),
1612            	    "Expected one or more NAMESPACE elements within "
1613            	    "LOCALNAMESPACEPATH element");
1614                }
1615            
1616                expectEndTag(parser, "LOCALNAMESPACEPATH");
1617                return true;
1618            }
1619            
1620            //------------------------------------------------------------------------------
1621            //
1622            // getNameSpacePathElement()
1623            //
1624            //     <!ELEMENT NAMESPACEPATH (HOST,LOCALNAMESPACEPATH)>
1625            //
1626            //------------------------------------------------------------------------------
1627            
1628            Boolean XmlReader::getNameSpacePathElement(
1629                XmlParser& parser,
1630                String& host,
1631 mike  1.1      String& nameSpace)
1632            {
1633                host.clear();
1634                nameSpace.clear();
1635            
1636                XmlEntry entry;
1637            
1638                if (!testStartTag(parser, entry, "NAMESPACEPATH"))
1639            	return false;
1640            
1641                if (!getHostElement(parser, host))
1642            	throw XmlValidationError(parser.getLine(), "expected HOST element");
1643            
1644                if (!getLocalNameSpacePathElement(parser, nameSpace))
1645                {
1646            	throw XmlValidationError(parser.getLine(), 
1647            	    "expected LOCALNAMESPACEPATH element");
1648                }
1649            
1650                expectEndTag(parser, "NAMESPACEPATH");
1651            
1652 mike  1.1      return true;
1653            }
1654            
1655            //------------------------------------------------------------------------------
1656            //
1657            // getClassNameElement()
1658            //
1659            //     <!ELEMENT CLASSNAME EMPTY>
1660            //     <!ATTLIST CLASSNAME %CIMName;>
1661            //
1662            //------------------------------------------------------------------------------
1663            
1664            Boolean XmlReader::getClassNameElement(
1665                XmlParser& parser,
1666                String& className,
1667                Boolean required)
1668            {
1669                XmlEntry entry;
1670            
1671                if (!testStartTagOrEmptyTag(parser, entry, "CLASSNAME"))
1672                {
1673 mike  1.1  	if (required)
1674            	{
1675            	    throw XmlValidationError(parser.getLine(),
1676            		"expected CLASSNAME element");
1677            	}
1678            	else
1679            	    return false;
1680                }
1681            
1682                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1683            
1684                className = getCimNameAttribute(
1685            	parser.getLine(), entry, "CLASSNAME", true);
1686            
1687                if (!empty)
1688            	expectEndTag(parser, "CLASSNAME");
1689            
1690                return true;
1691            }
1692            
1693            //------------------------------------------------------------------------------
1694 mike  1.1  //
1695            // getValueTypeAttribute()
1696            //
1697            //     VALUETYPE (string|boolean|numeric) 'string'
1698            //
1699            //------------------------------------------------------------------------------
1700            
1701 mike  1.10 KeyBinding::Type XmlReader::getValueTypeAttribute(
1702 mike  1.1      Uint32 lineNumber, 
1703                const XmlEntry& entry,
1704                const char* elementName)
1705            {
1706                String tmp;
1707            
1708                if (!entry.getAttributeValue("VALUETYPE", tmp))
1709            	return KeyBinding::STRING;
1710            
1711 mike  1.4      if (String::equal(tmp, "string"))
1712 mike  1.1  	return KeyBinding::STRING;
1713 mike  1.4      else if (String::equal(tmp, "boolean"))
1714 mike  1.1  	return KeyBinding::BOOLEAN;
1715 mike  1.4      else if (String::equal(tmp, "numeric"))
1716 mike  1.1  	return KeyBinding::NUMERIC;
1717            
1718                char buffer[MESSAGE_SIZE];
1719            
1720                sprintf(buffer, 
1721            	"Illegal value for %s.VALUETYPE attribute; "
1722 mike  1.2  	"CIMValue must be one of \"string\", \"boolean\", or \"numeric\"",
1723 mike  1.1  	elementName);
1724            
1725                throw XmlSemanticError(lineNumber, buffer);
1726                return KeyBinding::BOOLEAN;
1727            }
1728            
1729            //------------------------------------------------------------------------------
1730            //
1731            // getKeyValueElement()
1732            //
1733            //     <!ELEMENT KEYVALUE (#PCDATA)>
1734            //     <!ATTLIST KEYVALUE
1735            //         VALUETYPE (string|boolean|numeric)  'string'>
1736            //
1737            // ATTN-B: VALUE.REFERENCE ignored above; can't understand why it is needed!
1738            //
1739            //------------------------------------------------------------------------------
1740            
1741            Boolean XmlReader::getKeyValueElement(
1742                XmlParser& parser,
1743 mike  1.10     KeyBinding::Type& type,
1744 mike  1.1      String& value)
1745            {
1746                XmlEntry entry;
1747            
1748                if (!testStartTagOrEmptyTag(parser, entry, "KEYVALUE"))
1749            	return false;
1750            
1751                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1752            
1753                type = getValueTypeAttribute(parser.getLine(), entry, "KEYVALUE");
1754            
1755                value.clear();
1756            
1757                if (!empty)
1758                {
1759            	if (!parser.next(entry))
1760            	    throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
1761            
1762            	if (entry.type == XmlEntry::CONTENT)
1763            	    value = entry.text;
1764            	else
1765 mike  1.1  	    parser.putBack(entry);
1766            
1767            	expectEndTag(parser, "KEYVALUE");
1768                }
1769            
1770                return true;
1771            }
1772            
1773            //------------------------------------------------------------------------------
1774            //
1775            // getKeyBindingElement()
1776            //
1777            //     <!ELEMENT KEYBINDING (KEYVALUE|VALUE.REFERENCE)>
1778            //     <!ATTLIST KEYBINDING
1779            //         %CIMName;>
1780            //
1781            // ATTN-B: VALUE.REFERENCE ignored above; can't understand why it is needed!
1782            //
1783            //------------------------------------------------------------------------------
1784            
1785            Boolean XmlReader::getKeyBindingElement(
1786 mike  1.1      XmlParser& parser,
1787                String& name,
1788                String& value,
1789 mike  1.10     KeyBinding::Type& type)
1790 mike  1.1  {
1791                XmlEntry entry;
1792            
1793                if (!testStartTag(parser, entry, "KEYBINDING"))
1794            	return false;
1795            
1796                name = getCimNameAttribute(parser.getLine(), entry, "KEYBINDING");
1797            
1798                if (!getKeyValueElement(parser, type, value))
1799            	throw XmlValidationError(parser.getLine(), "Expected KEYVALUE element");
1800            
1801                expectEndTag(parser, "KEYBINDING");
1802                return true;
1803            }
1804            
1805            //------------------------------------------------------------------------------
1806            //
1807            // getInstanceNameElement()
1808            //
1809            //     <!ELEMENT INSTANCENAME (KEYBINDING*|KEYVALUE?|VALUE.REFERENCE?)>
1810            //     <!ATTLIST INSTANCENAME
1811 mike  1.1  //         %ClassName;>
1812            //
1813            // ATTN-B: VALUE.REFERENCE sub-element not accepted yet.
1814            // ATTN-B: KEYVALUE sub-element nothandled yet.
1815            //
1816            //------------------------------------------------------------------------------
1817            
1818            Boolean XmlReader::getInstanceNameElement(
1819                XmlParser& parser,
1820                String& className,
1821                Array<KeyBinding>& keyBindings)
1822            {
1823                className.clear();
1824                keyBindings.clear();
1825            
1826                XmlEntry entry;
1827            
1828                if (!testStartTagOrEmptyTag(parser, entry, "INSTANCENAME"))
1829            	return false;
1830            
1831                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
1832 mike  1.1  
1833                className = getClassNameAttribute(parser.getLine(), entry, "INSTANCENAME");
1834            
1835                if (!empty)
1836                {
1837            	String name;
1838 mike  1.10 	KeyBinding::Type type;
1839 mike  1.1  	String value;
1840            
1841            	while (getKeyBindingElement(parser, name, value, type))
1842            	    keyBindings.append(KeyBinding(name, value, type));
1843            
1844            	if (!empty)
1845            	    expectEndTag(parser, "INSTANCENAME");
1846                }
1847            
1848                return true;
1849            }
1850            
1851            //------------------------------------------------------------------------------
1852            //
1853            // getInstancePathElement()
1854            //
1855            //     <!ELEMENT INSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
1856            //
1857            //------------------------------------------------------------------------------
1858            
1859            Boolean XmlReader::getInstancePathElement(
1860 mike  1.1      XmlParser& parser,
1861 mike  1.2      CIMReference& reference)
1862 mike  1.1  {
1863                XmlEntry entry;
1864            
1865                if (!testStartTag(parser, entry, "INSTANCEPATH"))
1866            	return false;
1867            
1868                String host;
1869                String nameSpace;
1870            
1871                if (!getNameSpacePathElement(parser, host, nameSpace))
1872                {
1873            	throw XmlValidationError(parser.getLine(),
1874            	    "expected NAMESPACEPATH element");
1875                }
1876            
1877                String className;
1878                Array<KeyBinding> keyBindings;
1879            
1880                if (!getInstanceNameElement(parser, className, keyBindings))
1881                {
1882            	throw XmlValidationError(parser.getLine(), 
1883 mike  1.1  	    "expected INSTANCENAME element");
1884                }
1885            
1886                reference.set(host, nameSpace, className, keyBindings);
1887            
1888                expectEndTag(parser, "INSTANCEPATH");
1889                return true;
1890            }
1891            
1892            //------------------------------------------------------------------------------
1893            //
1894            // getLocalInstancePathElement()
1895            //
1896            //     <!ELEMENT LOCALINSTANCEPATH (NAMESPACEPATH,INSTANCENAME)>
1897            //
1898            //------------------------------------------------------------------------------
1899            
1900            Boolean XmlReader::getLocalInstancePathElement(
1901                XmlParser& parser,
1902 mike  1.2      CIMReference& reference)
1903 mike  1.1  {
1904                XmlEntry entry;
1905            
1906                if (!testStartTag(parser, entry, "LOCALINSTANCEPATH"))
1907            	return false;
1908            
1909                String nameSpace;
1910            
1911                if (!getLocalNameSpacePathElement(parser, nameSpace))
1912                {
1913            	throw XmlValidationError(parser.getLine(),
1914            	    "expected LOCALNAMESPACEPATH element");
1915                }
1916            
1917                String className;
1918                Array<KeyBinding> keyBindings;
1919            
1920                if (!getInstanceNameElement(parser, className, keyBindings))
1921                {
1922            	throw XmlValidationError(parser.getLine(), 
1923            	    "expected INSTANCENAME element");
1924 mike  1.1      }
1925            
1926                reference.set(String(), nameSpace, className, keyBindings);
1927            
1928                expectEndTag(parser, "LOCALINSTANCEPATH");
1929                return true;
1930            }
1931            
1932            //------------------------------------------------------------------------------
1933            //
1934            // getClassPathElement()
1935            //
1936            //     <!ELEMENT CLASSPATH (NAMESPACEPATH,CLASSNAME)>
1937            //
1938            //------------------------------------------------------------------------------
1939            
1940            Boolean XmlReader::getClassPathElement(
1941                XmlParser& parser,
1942 mike  1.2      CIMReference& reference)
1943 mike  1.1  {
1944                XmlEntry entry;
1945            
1946                if (!testStartTag(parser, entry, "CLASSPATH"))
1947            	return false;
1948            
1949                String host;
1950                String nameSpace;
1951            
1952                if (!getNameSpacePathElement(parser, host, nameSpace))
1953                {
1954            	throw XmlValidationError(parser.getLine(),
1955            	    "expected NAMESPACEPATH element");
1956                }
1957            
1958                String className;
1959            
1960                if (!getClassNameElement(parser, className))
1961                {
1962            	throw XmlValidationError(parser.getLine(), 
1963            	    "expected CLASSNAME element");
1964 mike  1.1      }
1965            
1966                reference.set(host, nameSpace, className);
1967            
1968                expectEndTag(parser, "CLASSPATH");
1969                return true;
1970            }
1971            
1972            //------------------------------------------------------------------------------
1973            //
1974            // getLocalClassPathElement()
1975            //
1976            //     <!ELEMENT LOCALCLASSPATH (LOCALNAMESPACEPATH,CLASSNAME)>
1977            //
1978            //------------------------------------------------------------------------------
1979            
1980            Boolean XmlReader::getLocalClassPathElement(
1981                XmlParser& parser,
1982 mike  1.2      CIMReference& reference)
1983 mike  1.1  {
1984                XmlEntry entry;
1985            
1986                if (!testStartTag(parser, entry, "LOCALCLASSPATH"))
1987            	return false;
1988            
1989                String nameSpace;
1990            
1991                if (!getLocalNameSpacePathElement(parser, nameSpace))
1992                {
1993            	throw XmlValidationError(parser.getLine(),
1994            	    "expected LOCALNAMESPACEPATH element");
1995                }
1996            
1997                String className;
1998            
1999                if (!getClassNameElement(parser, className))
2000                {
2001            	throw XmlValidationError(parser.getLine(), 
2002            	    "expected CLASSNAME element");
2003                }
2004 mike  1.1  
2005                reference.set(String(), nameSpace, className);
2006            
2007                expectEndTag(parser, "LOCALCLASSPATH");
2008            
2009                return true;
2010            }
2011            
2012            //------------------------------------------------------------------------------
2013            //
2014            // getValueReferenceElement()
2015            //
2016            //     <!ELEMENT VALUE.REFERENCE (CLASSPATH|LOCALCLASSPATH|CLASSNAME|
2017            //         INSTANCEPATH|LOCALINSTANCEPATH|INSTANCENAME)>
2018            //
2019            //
2020            //------------------------------------------------------------------------------
2021            
2022            Boolean XmlReader::getValueReferenceElement(
2023                XmlParser& parser,
2024 mike  1.2      CIMReference& reference)
2025 mike  1.1  {
2026                XmlEntry entry;
2027            
2028                if (!testStartTag(parser, entry, "VALUE.REFERENCE"))
2029            	return false;
2030            
2031                if (!parser.next(entry))
2032            	throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
2033            
2034                if (entry.type != XmlEntry::START_TAG && 
2035            	entry.type != XmlEntry::EMPTY_TAG)
2036                {
2037            	throw XmlValidationError(parser.getLine(), 
2038            	    "Expected one of the following start tags: "
2039            	    "CLASSPATH, LOCALCLASSPATH, CLASSNAME, INSTANCEPATH, "
2040            	    "LOCALINSTANCEPATH, INSTANCENAME");
2041                }
2042            
2043                if (strcmp(entry.text, "CLASSPATH") == 0)
2044                {
2045            	parser.putBack(entry);
2046 mike  1.1  	getClassPathElement(parser, reference);
2047                }
2048                else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
2049                {
2050            	parser.putBack(entry);
2051            	getLocalClassPathElement(parser, reference);
2052                }
2053                else if (strcmp(entry.text, "CLASSNAME") == 0)
2054                {
2055            	parser.putBack(entry);
2056            	String className;
2057            	getClassNameElement(parser, className);
2058            	reference.set(String(), String(), className);
2059                }
2060                else if (strcmp(entry.text, "INSTANCEPATH") == 0)
2061                {
2062            	parser.putBack(entry);
2063            	getInstancePathElement(parser, reference);
2064                }
2065                else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
2066                {
2067 mike  1.1  	parser.putBack(entry);
2068            	getLocalInstancePathElement(parser, reference);
2069                }
2070                else if (strcmp(entry.text, "INSTANCENAME") == 0)
2071                {
2072            	parser.putBack(entry);
2073            	String className;
2074            	Array<KeyBinding> keyBindings;
2075            	getInstanceNameElement(parser, className, keyBindings);
2076            	reference.set(String(), String(), className, keyBindings);
2077                }
2078            
2079                expectEndTag(parser, "VALUE.REFERENCE");
2080                return true;
2081            }
2082            
2083            //------------------------------------------------------------------------------
2084            //
2085            // getPropertyReferenceElement()
2086            //
2087            //     <!ELEMENT PROPERTY.REFERENCE (QUALIFIER*,(VALUE.REFERENCE)?)>
2088 mike  1.1  //     <!ATTLIST PROPERTY.REFERENCE
2089            //         %CIMName;
2090            //         %ReferenceClass;
2091            //         %ClassOrigin;
2092            //         %Propagated;>
2093            //
2094            //------------------------------------------------------------------------------
2095            
2096            Boolean XmlReader::getPropertyReferenceElement(
2097                XmlParser& parser, 
2098 mike  1.2      CIMProperty& property)
2099 mike  1.1  {
2100                XmlEntry entry;
2101            
2102                if (!testStartTagOrEmptyTag(parser, entry, "PROPERTY.REFERENCE"))
2103            	return false;
2104            
2105                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2106            
2107                // Get PROPERTY.NAME attribute:
2108            
2109                String name = getCimNameAttribute(
2110            	parser.getLine(), entry, "PROPERTY.REFERENCE");
2111            
2112                // Get PROPERTY.REFERENCECLASS attribute:
2113            
2114                String referenceClass = getReferenceClassAttribute(
2115            	parser.getLine(), entry, "PROPERTY.REFERENCE");
2116            
2117                // Get PROPERTY.CLASSORIGIN attribute:
2118            
2119                String classOrigin = 
2120 mike  1.1  	getClassOriginAttribute(parser.getLine(), entry, "PROPERTY.REFERENCE");
2121            
2122                // Get PROPERTY.PROPAGATED
2123            
2124                Boolean propagated = getCimBooleanAttribute(parser.getLine(), entry, 
2125            	"PROPERTY.REFERENCE", "PROPAGATED", false, false);
2126            
2127                // Create property:
2128            
2129 mike  1.2      CIMValue value;
2130                value.set(CIMReference());
2131                property = CIMProperty(
2132 mike  1.1  	name, value, 0, referenceClass, classOrigin, propagated);
2133            
2134                if (!empty)
2135                {
2136            	getQualifierElements(parser, property);
2137            
2138 mike  1.2  	CIMReference reference;
2139 mike  1.1  
2140            	if (getValueReferenceElement(parser, reference))
2141            	    property.setValue(reference);
2142            
2143            	expectEndTag(parser, "PROPERTY.REFERENCE");
2144                }
2145            
2146                return true;
2147            }
2148            
2149            //------------------------------------------------------------------------------
2150            //
2151            // GetPropertyElements()
2152            //
2153            //------------------------------------------------------------------------------
2154            
2155            template<class CONTAINER>
2156            void GetPropertyElements(XmlParser& parser, CONTAINER& container)
2157            {
2158 mike  1.2      CIMProperty property;
2159 mike  1.1  
2160                while (XmlReader::getPropertyElement(parser, property) ||
2161            	XmlReader::getPropertyArrayElement(parser, property) ||
2162            	XmlReader::getPropertyReferenceElement(parser, property))
2163                {
2164            	try
2165            	{
2166            	    container.addProperty(property);
2167            	}
2168            	catch (AlreadyExists&)
2169            	{
2170            	    throw XmlSemanticError(parser.getLine(), "duplicate property");
2171            	}
2172                }
2173            }
2174            
2175            //------------------------------------------------------------------------------
2176            //
2177            // getParameterElement()
2178            //
2179            //     <!ELEMENT PARAMETER (QUALIFIER*)>
2180 mike  1.1  //     <!ATTLIST PARAMETER
2181            //         %CIMName;
2182            //         %CIMType; #REQUIRED>
2183            //
2184            //------------------------------------------------------------------------------
2185            
2186            Boolean XmlReader::getParameterElement(
2187                XmlParser& parser, 
2188 mike  1.2      CIMParameter& parameter)
2189 mike  1.1  {
2190                XmlEntry entry;
2191            
2192                if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER"))
2193            	return false;
2194            
2195                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2196            
2197                // Get PARAMETER.NAME attribute:
2198            
2199                String name = getCimNameAttribute(parser.getLine(), entry, "PARAMETER");
2200            
2201                // Get PARAMETER.TYPE attribute:
2202            
2203 mike  1.2      CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PARAMETER");
2204 mike  1.1  
2205                // Create parameter:
2206            
2207 mike  1.2      parameter = CIMParameter(name, type);
2208 mike  1.1  
2209                if (!empty)
2210                {
2211            	getQualifierElements(parser, parameter);
2212            
2213            	expectEndTag(parser, "PARAMETER");
2214                }
2215            
2216                return true;
2217            }
2218            
2219            //------------------------------------------------------------------------------
2220            //
2221            // getParameterArrayElement()
2222            //
2223            //     <!ELEMENT PARAMETER.ARRAY (QUALIFIER*)>
2224            //     <!ATTLIST PARAMETER.ARRAY
2225            //         %CIMName;
2226            //         %CIMType; #REQUIRED
2227            //         %ArraySize;>
2228            //
2229 mike  1.1  //------------------------------------------------------------------------------
2230            
2231            Boolean XmlReader::getParameterArrayElement(
2232                XmlParser& parser, 
2233 mike  1.2      CIMParameter& parameter)
2234 mike  1.1  {
2235                XmlEntry entry;
2236            
2237                if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.ARRAY"))
2238            	return false;
2239            
2240                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2241            
2242                // Get PARAMETER.ARRAY.NAME attribute:
2243            
2244                String name = getCimNameAttribute(
2245            	parser.getLine(), entry, "PARAMETER.ARRAY");
2246            
2247                // Get PARAMETER.ARRAY.TYPE attribute:
2248            
2249 mike  1.2      CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY");
2250 mike  1.1  
2251                // Get PARAMETER.ARRAYSIZE attribute:
2252            
2253                Uint32 arraySize = 0;
2254                getArraySizeAttribute(parser.getLine(), entry, "PARAMETER.ARRAY",arraySize);
2255            
2256                // Create parameter:
2257            
2258 mike  1.2      parameter = CIMParameter(name, type, true, arraySize);
2259 mike  1.1  
2260                if (!empty)
2261                {
2262            	getQualifierElements(parser, parameter);
2263            
2264            	expectEndTag(parser, "PARAMETER.ARRAY");
2265                }
2266            
2267                return true;
2268            }
2269            
2270            //------------------------------------------------------------------------------
2271            //
2272            // getParameterReferenceElement()
2273            //
2274            //     <!ELEMENT PARAMETER.REFERENCE (QUALIFIER*)>
2275            //     <!ATTLIST PARAMETER.REFERENCE
2276            //         %CIMName;
2277            //         %ReferenceClass;>
2278            //
2279            //------------------------------------------------------------------------------
2280 mike  1.1  
2281            Boolean XmlReader::getParameterReferenceElement(
2282                XmlParser& parser, 
2283 mike  1.2      CIMParameter& parameter)
2284 mike  1.1  {
2285                XmlEntry entry;
2286            
2287                if (!testStartTagOrEmptyTag(parser, entry, "PARAMETER.REFERENCE"))
2288            	return false;
2289            
2290                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2291            
2292                // Get PARAMETER.NAME attribute:
2293            
2294                String name = getCimNameAttribute(
2295            	parser.getLine(), entry, "PARAMETER.REFERENCE");
2296            
2297                // Get PARAMETER.REFERENCECLASS attribute:
2298            
2299                String referenceClass = getReferenceClassAttribute(
2300            	parser.getLine(), entry, "PARAMETER.REFERENCE");
2301            
2302                // Create parameter:
2303            
2304 mike  1.2      parameter = CIMParameter(name, CIMType::REFERENCE, false, 0, referenceClass);
2305 mike  1.1  
2306                if (!empty)
2307                {
2308            	getQualifierElements(parser, parameter);
2309            	expectEndTag(parser, "PARAMETER.REFERENCE");
2310                }
2311            
2312                return true;
2313            }
2314            
2315            //------------------------------------------------------------------------------
2316            //
2317            // GetParameterElements()
2318            //
2319            //------------------------------------------------------------------------------
2320            
2321            template<class CONTAINER>
2322            void GetParameterElements(XmlParser& parser, CONTAINER& container)
2323            {
2324 mike  1.2      CIMParameter parameter;
2325 mike  1.1  
2326                while (XmlReader::getParameterElement(parser, parameter) ||
2327            	XmlReader::getParameterArrayElement(parser, parameter) ||
2328            	XmlReader::getParameterReferenceElement(parser, parameter))
2329                {
2330            	try
2331            	{
2332            	    container.addParameter(parameter);
2333            	}
2334            	catch (AlreadyExists&)
2335            	{
2336            	    throw XmlSemanticError(parser.getLine(), "duplicate parameter");
2337            	}
2338                }
2339            }
2340            
2341            //------------------------------------------------------------------------------
2342            //
2343            // getQualifierDeclElement()
2344            //
2345            //     <!ELEMENT QUALIFIER.DECLARATION (SCOPE?,(VALUE|VALUE.ARRAY)?)>
2346 mike  1.1  //     <!ATTLIST QUALIFIER.DECLARATION 
2347            //         %CIMName;               
2348            //         %CIMType; #REQUIRED
2349            //         ISARRAY (true|false) #IMPLIED
2350            //         %ArraySize;
2351            //         %QualifierFlavor;>
2352            //         
2353            //------------------------------------------------------------------------------
2354            
2355            Boolean XmlReader::getQualifierDeclElement(
2356                XmlParser& parser, 
2357 mike  1.2      CIMQualifierDecl& qualifierDecl)
2358 mike  1.1  {
2359                XmlEntry entry;
2360            
2361                if (!testStartTagOrEmptyTag(parser, entry, "QUALIFIER.DECLARATION"))
2362            	return false;
2363            
2364                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2365            
2366                // Get NAME attribute:
2367            
2368                String name = getCimNameAttribute(
2369            	parser.getLine(), entry, "QUALIFIER.DECLARATION");
2370            
2371                // Get TYPE attribute:
2372            
2373 mike  1.2      CIMType type = getCimTypeAttribute(
2374 mike  1.1  	parser.getLine(), entry, "QUALIFIER.DECLARATION");
2375            
2376                // Get ISARRAY attribute:
2377            
2378                Boolean isArray = false;
2379                getIsArrayAttribute(
2380            	parser.getLine(), entry, "QUALIFIER.DECLARATION", isArray); 
2381            
2382                // Get ARRAYSIZE attribute:
2383            
2384                Uint32 arraySize = 0;
2385                Boolean gotArraySize = getArraySizeAttribute(parser.getLine(),
2386            	entry, "QUALIFIER.DECLARATION", arraySize);
2387            
2388                // Get flavor oriented attributes:
2389            
2390                Uint32 flavor = getFlavor(entry,parser.getLine(), "QUALIFIER.DECLARATION");
2391            
2392                // No need to look for interior elements if empty tag:
2393            
2394 mike  1.2      Uint32 scope = CIMScope::NONE;
2395                CIMValue value;
2396 mike  1.1  
2397                if (!empty)
2398                {
2399            	// Get the option SCOPE element:
2400            
2401            	scope = getOptionalScope(parser);
2402            
2403            	// Get VALUE or VALUE.ARRAY element:
2404            
2405            	if (getValueArrayElement(parser, type, value))
2406            	{
2407            	    if (!isArray)
2408            	    {
2409            		throw XmlSemanticError(parser.getLine(),
2410            		    "VALUE.ARRAY element encountered without "
2411            		    "ISARRAY attribute");
2412            	    }
2413            
2414            	    if (arraySize && arraySize != value.getArraySize())
2415            	    {
2416            		throw XmlSemanticError(parser.getLine(),
2417 mike  1.1  		    "VALUE.ARRAY size is not the same as "
2418            		    "ARRAYSIZE attribute");
2419            	    }
2420            	}
2421            	else if (getValueElement(parser, type, value))
2422            	{
2423            	    if (isArray)
2424            	    {
2425            		throw XmlSemanticError(parser.getLine(),
2426            		    "ISARRAY attribute used but VALUE element encountered");
2427            	    }
2428            	}
2429            
2430            	// Now get the closing tag:
2431            
2432            	expectEndTag(parser, "QUALIFIER.DECLARATION");
2433                }
2434            
2435 mike  1.2      if (value.getType() == CIMType::NONE)
2436 mike  1.1      {
2437            	if (isArray)
2438            	    value.setNullValue(type, true, arraySize);
2439            	else
2440            	    value.setNullValue(type, false);
2441                }
2442            
2443 mike  1.2      CIMQualifierDecl tmp(name, value, scope, flavor, arraySize);
2444                qualifierDecl = CIMQualifierDecl(name, value, scope, flavor, arraySize);
2445 mike  1.1      return true;
2446            }
2447            
2448            //------------------------------------------------------------------------------
2449            // getMethodElement()
2450            //
2451            //     <!ELEMENT METHOD (QUALIFIER*,(PARAMETER|PARAMETER.REFERENCE|
2452            //         PARAMETER.ARRAY|PARAMETER.REFARRAY)*)>
2453            //     <!ATTLIST METHOD
2454            //         %CIMName;
2455            //         %CIMType; #IMPLIED
2456            //         %ClassOrigin;
2457            //         %Propagated;>
2458            //
2459            //------------------------------------------------------------------------------
2460            
2461 mike  1.2  Boolean XmlReader::getMethodElement(XmlParser& parser, CIMMethod& method)
2462 mike  1.1  {
2463                XmlEntry entry;
2464            
2465                if (!testStartTagOrEmptyTag(parser, entry, "METHOD"))
2466            	return false;
2467            
2468                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2469            
2470                String name = getCimNameAttribute(parser.getLine(), entry, "PROPERTY");
2471            
2472 mike  1.2      CIMType type = getCimTypeAttribute(parser.getLine(), entry, "PROPERTY");
2473 mike  1.1  
2474                String classOrigin = 
2475            	getClassOriginAttribute(parser.getLine(), entry, "PROPERTY");
2476            
2477                Boolean propagated = getCimBooleanAttribute(
2478            	parser.getLine(), entry, "PROPERTY", "PROPAGATED", false, false);
2479            
2480 mike  1.2      method = CIMMethod(name, type, classOrigin, propagated);
2481 mike  1.1  
2482                if (!empty)
2483                {
2484            	getQualifierElements(parser, method);
2485            
2486            	GetParameterElements(parser, method);
2487            
2488            	expectEndTag(parser, "METHOD");
2489                }
2490            
2491                return true;
2492            }
2493            
2494            //------------------------------------------------------------------------------
2495            // getClassElement()
2496            //
2497            //     <!ELEMENT CLASS (QUALIFIER*,
2498            //         (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*,METHOD*)>
2499            //     <!ATTLIST CLASS %CIMName; %SuperClass;>
2500            //
2501            //------------------------------------------------------------------------------
2502 mike  1.1  
2503 mike  1.3  Boolean XmlReader::getClassElement(XmlParser& parser, CIMClass& cimClass)
2504 mike  1.1  {
2505                XmlEntry entry;
2506            
2507                if (!testStartTag(parser, entry, "CLASS"))
2508            	return false;
2509            
2510                String name = getCimNameAttribute(parser.getLine(), entry, "CLASS");
2511            
2512                String superClass = getSuperClassAttribute(parser.getLine(), entry,"CLASS");
2513            
2514 mike  1.3      cimClass = CIMClass(name, superClass);
2515 mike  1.1  
2516                // Get QUALIFIER elements:
2517            
2518 mike  1.3      getQualifierElements(parser, cimClass);
2519 mike  1.1  
2520                // Get PROPERTY elements:
2521            
2522 mike  1.3      GetPropertyElements(parser, cimClass);
2523 mike  1.1  
2524                // Get METHOD elements:
2525            
2526 mike  1.2      CIMMethod method;
2527 mike  1.1  
2528                while (getMethodElement(parser, method))
2529 mike  1.3  	cimClass.addMethod(method);	
2530 mike  1.1  
2531                // Get CLASS end tag:
2532            
2533                expectEndTag(parser, "CLASS");
2534            
2535                return true;
2536            }
2537            
2538            //------------------------------------------------------------------------------
2539            // getInstanceElement()
2540            //
2541            //     <!ELEMENT INSTANCE (QUALIFIER*,
2542            //         (PROPERTY|PROPERTY.ARRAY|PROPERTY.REFERENCE)*) >
2543            //     <!ATTLIST INSTANCE
2544            //         %ClassName;>
2545            //
2546            //------------------------------------------------------------------------------
2547            
2548            Boolean XmlReader::getInstanceElement(
2549                XmlParser& parser, 
2550 mike  1.3      CIMInstance& cimInstance)
2551 mike  1.1  {
2552                XmlEntry entry;
2553            
2554                if (!testStartTag(parser, entry, "INSTANCE"))
2555            	return false;
2556            
2557                String className = getClassNameAttribute(
2558            	parser.getLine(), entry, "INSTANCE");
2559            
2560 mike  1.3      cimInstance = CIMInstance(className);
2561 mike  1.1  
2562                // Get QUALIFIER elements:
2563            
2564 mike  1.3      getQualifierElements(parser, cimInstance);
2565 mike  1.1  
2566                // Get PROPERTY elements:
2567            
2568 mike  1.3      GetPropertyElements(parser, cimInstance);
2569 mike  1.1  
2570                // Get INSTANCE end tag:
2571            
2572                expectEndTag(parser, "INSTANCE");
2573            
2574                return true;
2575 mike  1.13 }
2576            
2577            //------------------------------------------------------------------------------
2578            //
2579            // getObject()
2580            //
2581            //------------------------------------------------------------------------------
2582            
2583            void XmlReader::getObject(XmlParser& parser, CIMClass& x)
2584            {
2585                if (!getClassElement(parser, x))
2586                {
2587            	throw XmlValidationError(parser.getLine(),
2588            	    "expected CLASS element");
2589                }
2590            }
2591            
2592            //------------------------------------------------------------------------------
2593            //
2594            // getObject()
2595            //
2596 mike  1.13 //------------------------------------------------------------------------------
2597            
2598            void XmlReader::getObject(XmlParser& parser, CIMInstance& x)
2599            {
2600                if (!getInstanceElement(parser, x))
2601                {
2602            	throw XmlValidationError(parser.getLine(),
2603            	    "expected INSTANCE element");
2604                }
2605            }
2606            
2607            //------------------------------------------------------------------------------
2608            //
2609            // getObject()
2610            //
2611            //------------------------------------------------------------------------------
2612            
2613            void XmlReader::getObject(XmlParser& parser, CIMQualifierDecl& x)
2614            {
2615                if (!getQualifierDeclElement(parser, x))
2616                {
2617 mike  1.13 	throw XmlValidationError(parser.getLine(),
2618            	    "expected QUALIFIER.DECLARATION element");
2619                }
2620 mike  1.1  }
2621            
2622            //------------------------------------------------------------------------------
2623            //
2624            // getMessageStartTag()
2625            //
2626            //------------------------------------------------------------------------------
2627            
2628            Boolean XmlReader::getMessageStartTag(
2629                XmlParser& parser, 
2630 mike  1.15     String& id,
2631 mike  1.1      const char*& protocolVersion)
2632            {
2633                XmlEntry entry;
2634            
2635                if (!testStartTag(parser, entry, "MESSAGE"))
2636            	return false;
2637            
2638                // Get MESSAGE.ID:
2639            
2640                if (!entry.getAttributeValue("ID", id))
2641            	throw XmlValidationError(parser.getLine(), 
2642            	    "Bad or missing MESSAGE.ID attribute");
2643            
2644                // Get MESSAGE.PROTOCOLVERSION:
2645            
2646                if (!entry.getAttributeValue("PROTOCOLVERSION", protocolVersion))
2647            	throw XmlValidationError(parser.getLine(),
2648 mike  1.15 	    "Bad or missing MESSAGE.PROTOCOLVERSION attribute");
2649 mike  1.1  
2650                return true;
2651            }
2652            
2653            //------------------------------------------------------------------------------
2654            //
2655            // getIMethodCallStartTag()
2656            //
2657            //------------------------------------------------------------------------------
2658            
2659            Boolean XmlReader::getIMethodCallStartTag(
2660                XmlParser& parser, 
2661                const char*& name)
2662            {
2663                XmlEntry entry;
2664            
2665                if (!testStartTag(parser, entry, "IMETHODCALL"))
2666            	return false;
2667            
2668                // Get IMETHODCALL.NAME attribute:
2669            
2670 mike  1.1      if (!entry.getAttributeValue("NAME", name))
2671            	throw XmlValidationError(parser.getLine(),
2672            	    "Missing IMETHODCALL.NAME attribute");
2673            
2674                return true;
2675            }
2676            
2677            //------------------------------------------------------------------------------
2678            //
2679            // getIMethodResponseStartTag()
2680            //
2681            //------------------------------------------------------------------------------
2682            
2683            Boolean XmlReader::getIMethodResponseStartTag(
2684                XmlParser& parser, 
2685                const char*& name)
2686            {
2687                XmlEntry entry;
2688            
2689                if (!testStartTag(parser, entry, "IMETHODRESPONSE"))
2690            	return false;
2691 mike  1.1  
2692                // Get IMETHODRESPONSE.NAME attribute:
2693            
2694                if (!entry.getAttributeValue("NAME", name))
2695            	throw XmlValidationError(parser.getLine(),
2696            	    "Missing IMETHODRESPONSE.NAME attribute");
2697            
2698                return true;
2699            }
2700            
2701            //------------------------------------------------------------------------------
2702            //
2703            // getIParamValueTag()
2704            //
2705            //------------------------------------------------------------------------------
2706            
2707            Boolean XmlReader::getIParamValueTag(
2708                XmlParser& parser, 
2709                const char*& name)
2710            {
2711                XmlEntry entry;
2712 mike  1.1  
2713                if (!testStartTag(parser, entry, "IPARAMVALUE"))
2714            	return false;
2715            
2716                // Get IPARAMVALUE.NAME attribute:
2717            
2718                if (!entry.getAttributeValue("NAME", name))
2719            	throw XmlValidationError(parser.getLine(),
2720            	    "Missing IPARAMVALUE.NAME attribute");
2721            
2722                return true;
2723            }
2724            
2725            //------------------------------------------------------------------------------
2726            //
2727            // getBooleanValueElement()
2728            //
2729            //     Get an elements like: "<VALUE>FALSE</VALUE>"
2730            //
2731            //------------------------------------------------------------------------------
2732            
2733 mike  1.1  Boolean XmlReader::getBooleanValueElement(
2734                XmlParser& parser, 
2735                Boolean& result,
2736                Boolean required)
2737            {
2738                XmlEntry entry;
2739            
2740                if (!testStartTag(parser, entry, "VALUE"))
2741                {
2742            	if (required)
2743            	{
2744            	    throw XmlValidationError(parser.getLine(),
2745            		"Expected VALUE element");
2746            	}
2747            	return false;
2748                }
2749            
2750                expectContentOrCData(parser, entry);
2751            
2752                if (strcmp(entry.text, "TRUE") == 0)
2753            	result = true;
2754 mike  1.1      else if (strcmp(entry.text, "FALSE") == 0)
2755            	result = false;
2756                else
2757            	throw XmlSemanticError(parser.getLine(), 
2758            	    "Bad value for VALUE element: must be \"TRUE\" or \"FALSE\"");
2759            
2760                expectEndTag(parser, "VALUE");
2761            
2762                return true;
2763            }
2764 karl  1.8  
2765            
2766            
2767            
2768            
2769 mike  1.1  
2770            //------------------------------------------------------------------------------
2771            //
2772            // getErrorElement()
2773            //
2774            //     <!ELEMENT ERROR EMPTY>
2775            //     <!ATTLIST ERROR 
2776            //         CODE CDATA #REQUIRED
2777            //         DESCRIPTION CDATA #IMPLIED>
2778            //
2779            //------------------------------------------------------------------------------
2780            
2781            Boolean XmlReader::getErrorElement(
2782                XmlParser& parser, 
2783 mike  1.5      CIMException::Code& code,
2784 mike  1.1      const char*& description,
2785                Boolean required)
2786            {
2787                XmlEntry entry;
2788            
2789                if (!testStartTagOrEmptyTag(parser, entry, "ERROR"))
2790                {
2791            	if (required)
2792            	    throw XmlValidationError(parser.getLine(),"Expected ERROR element");
2793            	return false;
2794                }
2795            
2796                Boolean empty = entry.type == XmlEntry::EMPTY_TAG;
2797            
2798                // Get ERROR.CODE
2799            
2800                Uint32 tmpCode;
2801            
2802                if (!entry.getAttributeValue("CODE", tmpCode))
2803            	throw XmlValidationError(
2804            	    parser.getLine(), "missing ERROR.CODE attribute");
2805 mike  1.1  
2806 mike  1.5      code = CIMException::Code(tmpCode);
2807 mike  1.1  
2808                // Get ERROR.DESCRIPTION:
2809            
2810                description = "";
2811                entry.getAttributeValue("DESCRIPTION", description);
2812            
2813                if (!empty)
2814            	expectEndTag(parser, "ERROR");
2815            
2816                return true;
2817            }
2818            
2819            PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2