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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2