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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2