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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2