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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2