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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2