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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2