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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2