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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2