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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2