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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2