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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2