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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2