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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2