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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2