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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2