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

   1 karl  1.1 //%/////////////////////////////////////////////////////////////////////////////
   2           //
   3           // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
   4           // The Open Group, Tivoli Systems
   5           //
   6           // Permission is hereby granted, free of charge, to any person obtaining a copy
   7           // of this software and associated documentation files (the "Software"), to
   8           // deal in the Software without restriction, including without limitation the
   9           // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  10           // sell copies of the Software, and to permit persons to whom the Software is
  11           // furnished to do so, subject to the following conditions:
  12           // 
  13           // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  14           // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  15           // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  16           // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  17           // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18           // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  19           // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20           // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21           //
  22 karl  1.1 //==============================================================================
  23           //
  24           // Author: Mike Brasher (mbrasher@bmc.com)
  25           //
  26           // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
  27           //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
  28           //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
  29           //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
  30           //              Carol Ann Krug Graves, Hewlett-Packard Company
  31           //                  (carolann_graves@hp.com)
  32 karl  1.3 //              Karl Schopmeyer (k.schopmeyer@opengroup.org)
  33 karl  1.1 //
  34           //%/////////////////////////////////////////////////////////////////////////////
  35           
  36           #include <Pegasus/Common/Config.h>
  37           #include <iostream>
  38           #include <Pegasus/Common/Constants.h>
  39           #include <Pegasus/Common/XmlParser.h>
  40           #include <Pegasus/Common/XmlReader.h>
  41           #include <Pegasus/Common/System.h>
  42           #include <Pegasus/Common/XmlWriter.h>
  43           #include <Pegasus/Common/HTTPMessage.h>
  44           #include <Pegasus/Common/CIMMessage.h>
  45           #include <Pegasus/Common/Exception.h> 
  46           #include "CIMOperationResponseDecoder.h"
  47           
  48           PEGASUS_USING_STD;
  49           
  50           PEGASUS_NAMESPACE_BEGIN
  51           
  52           CIMOperationResponseDecoder::CIMOperationResponseDecoder(
  53               MessageQueue* outputQueue,
  54 karl  1.1     MessageQueue* encoderQueue,
  55               ClientAuthenticator* authenticator)
  56               :
  57               MessageQueue(PEGASUS_QUEUENAME_OPRESPDECODER),
  58               _outputQueue(outputQueue),
  59               _encoderQueue(encoderQueue),
  60               _authenticator(authenticator)
  61           {
  62           
  63           }
  64           
  65           CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
  66           {
  67           
  68           }
  69           
  70           void  CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
  71           {
  72               _encoderQueue = encoderQueue;
  73           }
  74           
  75 karl  1.1 void CIMOperationResponseDecoder::handleEnqueue()
  76           {
  77               Message* message = dequeue();
  78           
  79               if (!message)
  80           	return;
  81           
  82               switch (message->getType())
  83               {
  84           	case HTTP_MESSAGE:
  85           	{
  86           
  87           	    HTTPMessage* httpMessage = (HTTPMessage*)message;
  88           	    _handleHTTPMessage(httpMessage);
  89           	    break;
  90           	}
  91           
  92           	default:
  93                       PEGASUS_ASSERT(0);
  94           	    break;
  95               }
  96 karl  1.1 
  97               delete message;
  98           }
  99           
 100           void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
 101           {
 102               //
 103               // Parse the HTTP message:
 104               //
 105           
 106               String startLine;
 107               Array<HTTPHeader> headers;
 108               Sint8* content;
 109               Uint32 contentLength;
 110           
 111               if (httpMessage->message.size() == 0)
 112               {
 113                   CIMClientMalformedHTTPException* malformedHTTPException =
 114                       new CIMClientMalformedHTTPException("Empty HTTP response message.");
 115                   ClientExceptionMessage * response =
 116                       new ClientExceptionMessage(malformedHTTPException);
 117 karl  1.1 
 118                   _outputQueue->enqueue(response);
 119                   return;
 120               }
 121           
 122               httpMessage->parse(startLine, headers, contentLength);
 123           
 124               //
 125               // Get the status line info
 126               //
 127           
 128               String httpVersion;
 129               Uint32 statusCode;
 130               String reasonPhrase;
 131           
 132               Boolean parsableMessage = HTTPMessage::parseStatusLine(
 133                   startLine, httpVersion, statusCode, reasonPhrase);
 134               if (!parsableMessage)
 135               {
 136                   CIMClientMalformedHTTPException* malformedHTTPException = new
 137                       CIMClientMalformedHTTPException("Malformed HTTP response message.");
 138 karl  1.1         ClientExceptionMessage * response =
 139                       new ClientExceptionMessage(malformedHTTPException);
 140           
 141                   _outputQueue->enqueue(response);
 142                   return;
 143               }
 144           
 145               try
 146               {
 147                   if (_authenticator->checkResponseHeaderForChallenge(headers))
 148                   {
 149                       //
 150                       // Get the original request, put that in the encoder's queue for
 151                       // re-sending with authentication challenge response.
 152                       //
 153                       Message* reqMessage = _authenticator->getRequestMessage();
 154                       _encoderQueue->enqueue(reqMessage);
 155           
 156                       return;
 157                   }
 158                   else
 159 karl  1.1         {
 160                       //
 161                       // Received a valid/error response from the server.
 162                       // We do not need the original request message anymore, hence delete
 163                       // the request message by getting the handle from the ClientAuthenticator.
 164                       //
 165                       Message* reqMessage = _authenticator->getRequestMessage();
 166                       _authenticator->clearRequest();
 167                       if (reqMessage)
 168                       {
 169                           delete reqMessage;
 170                       }
 171                   }
 172               }
 173               catch(InvalidAuthHeader& e)
 174               {
 175                   CIMClientMalformedHTTPException* malformedHTTPException =
 176                       new CIMClientMalformedHTTPException(e.getMessage());
 177                   ClientExceptionMessage * response =
 178                       new ClientExceptionMessage(malformedHTTPException);
 179           
 180 karl  1.1         _outputQueue->enqueue(response);
 181                   return;
 182               }
 183               catch(UnauthorizedAccess& e)
 184               {
 185                    CannotConnectException* cannotConnectException =
 186                       new CannotConnectException(e.getMessage());
 187           	 ClientExceptionMessage * response =
 188                       new ClientExceptionMessage(cannotConnectException);
 189           
 190                   _outputQueue->enqueue(response);
 191                   return;
 192               }
 193           
 194               //
 195               // Check for a success (200 OK) response
 196               //
 197 karl  1.4     httpMessage->message.append('\0');
 198           
 199               // Display of received packet.  Displays the complete received packet
 200               // For now, this is conditionally compiled.
 201               if (getenv("PEGASUS_CLIENT_TRACE"))
 202                   XmlWriter::indentedPrint(cout, httpMessage->message.getData());
 203 karl  1.1 
 204               if (statusCode != HTTP_STATUSCODE_OK)
 205               {
 206                   String cimError;
 207                   String pegasusError;
 208           
 209                   HTTPMessage::lookupHeader(headers, "CIMError", cimError);
 210                   HTTPMessage::lookupHeader(headers, PEGASUS_HTTPHEADERTAG_ERRORDETAIL, pegasusError);
 211           
 212                   CIMClientHTTPErrorException* httpError =
 213                       new CIMClientHTTPErrorException(statusCode, cimError, pegasusError);
 214                   ClientExceptionMessage * response =
 215                       new ClientExceptionMessage(httpError);
 216           
 217                   _outputQueue->enqueue(response);
 218                   return;
 219               }
 220           
 221               //
 222               // Search for "CIMOperation" header:
 223               //
 224 karl  1.1 
 225               String cimOperation;
 226           
 227               if (!HTTPMessage::lookupHeader(
 228           	headers, "CIMOperation", cimOperation, true))
 229               {
 230                   CIMClientMalformedHTTPException* malformedHTTPException = new
 231                       CIMClientMalformedHTTPException("Missing CIMOperation HTTP header");
 232                   ClientExceptionMessage * response =
 233                       new ClientExceptionMessage(malformedHTTPException);
 234           
 235                   _outputQueue->enqueue(response);
 236                   return;
 237               }
 238           
 239               //
 240               // Zero-terminate the message:
 241               //
 242           
 243 karl  1.4     //httpMessage->message.append('\0');
 244 karl  1.1 
 245               // Display of received packet.  Displays the complete received packet
 246               // For now, this is conditionally compiled.
 247 karl  1.4     //if (getenv("PEGASUS_CLIENT_TRACE"))
 248               //    XmlWriter::indentedPrint(cout, httpMessage->message.getData());
 249 karl  1.1     
 250               // Calculate the beginning of the content from the message size and
 251               // the content length.  Subtract 1 to take into account the null
 252               // character we just added to the end of the message.
 253           
 254               content = (Sint8*) httpMessage->message.getData() +
 255           	httpMessage->message.size() - contentLength - 1;
 256           
 257               //
 258               // If it is a method response, then dispatch it to be handled:
 259               //
 260           
 261               if (!String::equalNoCase(cimOperation, "MethodResponse"))
 262               {
 263                   CIMClientMalformedHTTPException* malformedHTTPException =
 264                       new CIMClientMalformedHTTPException(
 265                           String("Received CIMOperation HTTP header value \"") +
 266                           cimOperation + "\", expected \"MethodResponse\"");
 267                   ClientExceptionMessage * response =
 268                       new ClientExceptionMessage(malformedHTTPException);
 269           
 270 karl  1.1         _outputQueue->enqueue(response);
 271                   return;
 272               }
 273           
 274               _handleMethodResponse(content);
 275           }
 276           
 277           void CIMOperationResponseDecoder::_handleMethodResponse(char* content)
 278           {
 279               Message* response = 0;
 280           
 281               //
 282               // Create and initialize XML parser:
 283               //
 284           
 285               XmlParser parser((char*)content);
 286               XmlEntry entry;
 287           
 288               try
 289               {
 290           	//
 291 karl  1.1 	// Process <?xml ... >
 292           	//
 293           
 294                   const char* xmlVersion = 0;
 295                   const char* xmlEncoding = 0;
 296           
 297           	XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
 298           
 299           	//
 300           	// Process <CIM ... >
 301           	//
 302           
 303                   const char* cimVersion = 0;
 304                   const char* dtdVersion = 0;
 305           
 306                   // ATTN-RK-P3-20020416: Need to validate these versions?
 307           	XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
 308           
 309           	//
 310           	// Expect <MESSAGE ... >
 311           	//
 312 karl  1.1 
 313           	String messageId;
 314           	String protocolVersion;
 315           
 316           	if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
 317           	    throw XmlValidationError(
 318           		parser.getLine(), "expected MESSAGE element");
 319           
 320                   if (!String::equalNoCase(protocolVersion, "1.0"))
 321           	{
 322                       CIMClientResponseException* responseException =
 323                           new CIMClientResponseException(
 324                               String("Received unsupported protocol version \"") +
 325                               protocolVersion + "\", expected \"1.0\"");
 326                       ClientExceptionMessage * response =
 327                           new ClientExceptionMessage(responseException);
 328           
 329                       _outputQueue->enqueue(response);
 330                       return;
 331           	}
 332           
 333 karl  1.1 	//
 334           	// Expect <SIMPLERSP ... >
 335           	//
 336           
 337           	XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
 338           
 339           	//
 340           	// Expect <IMETHODRESPONSE ... >
 341           	//
 342           
 343           	const char* iMethodResponseName = 0;
 344           
 345           	if (XmlReader::getIMethodResponseStartTag(parser, iMethodResponseName))
 346           	{
 347           	    //
 348           	    // Dispatch the method:
 349           	    //
 350           
 351           	    if (System::strcasecmp(iMethodResponseName, "GetClass") == 0)
 352           		response = _decodeGetClassResponse(parser, messageId);
 353           	    else if (System::strcasecmp(iMethodResponseName, "GetInstance") == 0)
 354 karl  1.1 		response = _decodeGetInstanceResponse(parser, messageId);
 355           	    else if (System::strcasecmp(iMethodResponseName, "EnumerateClassNames") == 0)
 356           		response = _decodeEnumerateClassNamesResponse(parser,messageId);
 357           	    else if (System::strcasecmp(iMethodResponseName, "References") == 0)
 358           		response = _decodeReferencesResponse(parser, messageId);
 359           	    else if (System::strcasecmp(iMethodResponseName, "ReferenceNames") == 0)
 360           		response = _decodeReferenceNamesResponse(parser, messageId);
 361           	    else if (System::strcasecmp(iMethodResponseName, "AssociatorNames") == 0)
 362           		response = _decodeAssociatorNamesResponse(parser, messageId);
 363           	    else if (System::strcasecmp(iMethodResponseName, "Associators") == 0)
 364           		response = _decodeAssociatorsResponse(parser, messageId);
 365           	    else if (System::strcasecmp(iMethodResponseName, "CreateInstance") == 0)
 366           		response = _decodeCreateInstanceResponse(parser, messageId);
 367           	    else if (System::strcasecmp(iMethodResponseName,"EnumerateInstanceNames") == 0)
 368           		response = _decodeEnumerateInstanceNamesResponse(
 369                             parser, messageId);
 370           	    else if (System::strcasecmp(iMethodResponseName,"EnumerateInstances") == 0)
 371           		response = _decodeEnumerateInstancesResponse(parser, messageId);
 372           	    else if (System::strcasecmp(iMethodResponseName, "GetProperty") == 0)
 373           		response = _decodeGetPropertyResponse(parser, messageId);
 374           	    else if (System::strcasecmp(iMethodResponseName, "SetProperty") == 0)
 375 karl  1.1 		response = _decodeSetPropertyResponse(parser, messageId);
 376           	    else if (System::strcasecmp(iMethodResponseName, "DeleteQualifier") == 0)
 377           		response = _decodeDeleteQualifierResponse(parser, messageId);
 378           	    else if (System::strcasecmp(iMethodResponseName, "GetQualifier") == 0)
 379           		response = _decodeGetQualifierResponse(parser, messageId);
 380           	    else if (System::strcasecmp(iMethodResponseName, "SetQualifier") == 0)
 381           		response = _decodeSetQualifierResponse(parser, messageId);
 382           	    else if (System::strcasecmp(iMethodResponseName, "EnumerateQualifiers") == 0)
 383           		response = _decodeEnumerateQualifiersResponse(parser,messageId);
 384           	    else if (System::strcasecmp(iMethodResponseName, "EnumerateClasses") == 0)
 385           		response = _decodeEnumerateClassesResponse(parser, messageId);
 386           	    else if (System::strcasecmp(iMethodResponseName, "CreateClass") == 0)
 387           		response = _decodeCreateClassResponse(parser, messageId);
 388           	    else if (System::strcasecmp(iMethodResponseName, "ModifyClass") == 0)
 389           		response = _decodeModifyClassResponse(parser, messageId);
 390           	    else if (System::strcasecmp(iMethodResponseName, "ModifyInstance") == 0)
 391           		response = _decodeModifyInstanceResponse(parser, messageId);
 392           	    else if (System::strcasecmp(iMethodResponseName, "DeleteClass") == 0)
 393           		response = _decodeDeleteClassResponse(parser, messageId);
 394           	    else if (System::strcasecmp(iMethodResponseName, "DeleteInstance") == 0)
 395           		response = _decodeDeleteInstanceResponse(parser, messageId);
 396 karl  1.1 	    else if (System::strcasecmp(iMethodResponseName, "ExecQuery") == 0)
 397           		response = _decodeExecQueryResponse(parser, messageId);
 398           	    else
 399           	    {
 400                           // Unrecognized IMethodResponse name attribute
 401           	        throw XmlValidationError(parser.getLine(),
 402           	            String("Unrecognized IMethodResponse name \"") +
 403                                   iMethodResponseName + "\"");
 404           	    }
 405           	
 406           	    //
 407           	    // Handle end tag:
 408           	    //
 409           
 410           	    XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
 411           	}
 412           	else if (XmlReader::getMethodResponseStartTag(parser, 
 413           	    iMethodResponseName))
 414           	{
 415           	    response = _decodeInvokeMethodResponse(
 416                         parser, messageId, iMethodResponseName);
 417 karl  1.1 
 418           	    //
 419           	    // Handle end tag:
 420           	    //
 421           	    XmlReader::expectEndTag(parser, "METHODRESPONSE");
 422           	}
 423           	else
 424           	{
 425           	    throw XmlValidationError(parser.getLine(),
 426           	        "expected METHODRESPONSE or IMETHODRESPONSE element");
 427           	}
 428           
 429                   //
 430                   // Handle end tags:
 431                   //
 432           	XmlReader::expectEndTag(parser, "SIMPLERSP");
 433           	XmlReader::expectEndTag(parser, "MESSAGE");
 434           	XmlReader::expectEndTag(parser, "CIM");
 435               }
 436               catch (XmlException& x)
 437               {
 438 karl  1.1         if (response)
 439                   {
 440                       delete response;
 441                   }
 442           
 443                   response = new ClientExceptionMessage(
 444                       new CIMClientXmlException(x.getMessage()));
 445               }
 446               catch (Exception& x)
 447               {
 448                   // Shouldn't ever get exceptions other than XmlExceptions.
 449                   PEGASUS_ASSERT(0);
 450           
 451                   if (response)
 452                   {
 453                       delete response;
 454                   }
 455           
 456                   response = new ClientExceptionMessage(
 457                       new Exception(x.getMessage()));
 458               }
 459 karl  1.1 
 460               _outputQueue->enqueue(response);
 461           }
 462           
 463           CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
 464               XmlParser& parser, 
 465               const String& messageId)
 466           {
 467               XmlEntry entry;
 468               CIMException cimException;
 469           
 470               if (XmlReader::getErrorElement(parser, cimException))
 471               {
 472           	return(new CIMCreateClassResponseMessage(
 473           	    messageId,
 474           	    cimException,
 475           	    QueueIdStack()));
 476           
 477               }
 478               else
 479               {
 480 karl  1.1 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 481           	{
 482           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 483           	}
 484           
 485           	return(new CIMCreateClassResponseMessage(
 486           	    messageId,
 487           	    cimException,
 488           	    QueueIdStack()));
 489               }
 490           }
 491           
 492           CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
 493               XmlParser& parser, const String& messageId)
 494           {
 495               XmlEntry entry;
 496               CIMException cimException;
 497           
 498               if (XmlReader::getErrorElement(parser, cimException))
 499               {
 500           	return(new CIMGetClassResponseMessage(
 501 karl  1.1 	    messageId,
 502           	    cimException,
 503           	    QueueIdStack(),
 504           	    CIMClass()));
 505               }
 506               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 507               {
 508           	CIMClass cimClass;
 509           
 510           	if (!XmlReader::getClassElement(parser, cimClass))
 511           	    throw XmlValidationError(parser.getLine(),"expected CLASS element");
 512           
 513           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 514           
 515           	return(new CIMGetClassResponseMessage(
 516           	    messageId,
 517           	    cimException,
 518           	    QueueIdStack(),
 519           	    cimClass));
 520               }
 521               else
 522 karl  1.1     {
 523           	throw XmlValidationError(parser.getLine(),
 524           	    "expected ERROR or IRETURNVALUE element");
 525               }
 526           }
 527           
 528           CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
 529               XmlParser& parser, const String& messageId)
 530           {
 531               XmlEntry entry;
 532               CIMException cimException;
 533           
 534               if (XmlReader::getErrorElement(parser, cimException))
 535               {
 536           	return(new CIMModifyClassResponseMessage(
 537           	    messageId,
 538           	    cimException,
 539           	    QueueIdStack()));
 540               }
 541               else
 542               {
 543 karl  1.1 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 544           	{
 545           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 546           	}
 547           
 548           	return(new CIMModifyClassResponseMessage(
 549           	    messageId,
 550           	    cimException,
 551           	    QueueIdStack()));
 552               }
 553           }
 554           
 555           CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
 556               XmlParser& parser, const String& messageId)
 557           {
 558               XmlEntry entry;
 559               CIMException cimException;
 560           
 561               if (XmlReader::getErrorElement(parser, cimException))
 562               {
 563           	return(new CIMEnumerateClassNamesResponseMessage(
 564 karl  1.1 	    messageId,
 565           	    cimException,
 566           	    QueueIdStack(),
 567           	    Array<CIMName>()));
 568               }
 569               else
 570               {
 571           	Array<CIMName> classNames;
 572           
 573 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
 574 karl  1.3     // WBEMServices returns this tag wneh no instances exist.
 575               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 576           	    if (entry.type != XmlEntry::EMPTY_TAG)
 577               	{
 578               	    CIMName className;
 579               
 580               	    while (XmlReader::getClassNameElement(parser, className, false))
 581               	        classNames.append(className);
 582               
 583               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 584               	}
 585 karl  1.1 
 586           	return(new CIMEnumerateClassNamesResponseMessage(
 587           	    messageId,
 588           	    cimException,
 589           	    QueueIdStack(),
 590           	    classNames));
 591               }
 592           }
 593           
 594           CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
 595               XmlParser& parser, const String& messageId)
 596           {
 597               XmlEntry entry;
 598               CIMException cimException;
 599           
 600               if (XmlReader::getErrorElement(parser, cimException))
 601               {
 602           	return(new CIMEnumerateClassesResponseMessage(
 603           	    messageId,
 604           	    cimException,
 605           	    QueueIdStack(),
 606 karl  1.1 	    Array<CIMClass>()));
 607               }
 608               else
 609               {
 610           	Array<CIMClass> cimClasses;
 611           
 612 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
 613 karl  1.3     // WBEMServices returns this tag wneh no instances exist.
 614               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 615           	    if (entry.type != XmlEntry::EMPTY_TAG)
 616               	{
 617               	    CIMClass cimClass;
 618               
 619               	    while (XmlReader::getClassElement(parser, cimClass))
 620               	        cimClasses.append(cimClass);
 621               
 622               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 623               	}
 624 karl  1.1 
 625           	return(new CIMEnumerateClassesResponseMessage(
 626           	    messageId,
 627           	    cimException,
 628           	    QueueIdStack(),
 629           	    cimClasses));
 630               }
 631           }
 632           
 633           CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
 634               XmlParser& parser, const String& messageId)
 635           {
 636               XmlEntry entry;
 637               CIMException cimException;
 638           
 639               if (XmlReader::getErrorElement(parser, cimException))
 640               {
 641           	return(new CIMDeleteClassResponseMessage(
 642           	    messageId,
 643           	    cimException,
 644           	    QueueIdStack()));
 645 karl  1.1     }
 646               else
 647               {
 648           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 649           	{
 650           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 651           	}
 652           
 653           	return(new CIMDeleteClassResponseMessage(
 654           	    messageId,
 655           	    cimException,
 656           	    QueueIdStack()));
 657               }
 658           }
 659           
 660           CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
 661               XmlParser& parser, const String& messageId)
 662           {
 663               XmlEntry entry;
 664               CIMException cimException;
 665           
 666 karl  1.1     if (XmlReader::getErrorElement(parser, cimException))
 667               {
 668           	return(new CIMCreateInstanceResponseMessage(
 669           	    messageId,
 670           	    cimException,
 671           	    QueueIdStack(),
 672           	    CIMObjectPath()));
 673               }
 674               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 675               {
 676           	CIMObjectPath instanceName;
 677           	XmlReader::getInstanceNameElement(parser, instanceName);
 678           
 679           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 680           
 681           	return(new CIMCreateInstanceResponseMessage(
 682           	    messageId,
 683           	    cimException,
 684           	    QueueIdStack(),
 685           	    instanceName));
 686               }
 687 karl  1.1     else
 688               {
 689           	throw XmlValidationError(parser.getLine(),
 690           	    "expected ERROR or IRETURNVALUE element");
 691               }
 692           }
 693           
 694           CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
 695               XmlParser& parser, const String& messageId)
 696           {
 697               XmlEntry entry;
 698               CIMException cimException;
 699           
 700               if (XmlReader::getErrorElement(parser, cimException))
 701               {
 702           	return(new CIMGetInstanceResponseMessage(
 703           	    messageId,
 704           	    cimException,
 705           	    QueueIdStack(),
 706           	    CIMInstance()));
 707               }
 708 karl  1.1     else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 709               {
 710           	CIMInstance cimInstance;
 711           
 712           	if (!XmlReader::getInstanceElement(parser, cimInstance))
 713           	{
 714           	    throw XmlValidationError(
 715           		parser.getLine(), "expected INSTANCE element");
 716           	}
 717           
 718           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 719           
 720           	return(new CIMGetInstanceResponseMessage(
 721           	    messageId,
 722           	    cimException,
 723           	    QueueIdStack(),
 724           	    cimInstance));
 725               }
 726               else
 727               {
 728           	throw XmlValidationError(parser.getLine(),
 729 karl  1.1 	    "expected ERROR or IRETURNVALUE element");
 730               }
 731           }
 732           
 733           CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
 734               XmlParser& parser, const String& messageId)
 735           {
 736               XmlEntry entry;
 737               CIMException cimException;
 738           
 739               if (XmlReader::getErrorElement(parser, cimException))
 740               {
 741           	return(new CIMModifyInstanceResponseMessage(
 742           	    messageId,
 743           	    cimException,
 744           	    QueueIdStack()));
 745               }
 746               else
 747               {
 748           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 749           	{
 750 karl  1.1 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 751           	}
 752           
 753           	return(new CIMModifyInstanceResponseMessage(
 754           	    messageId,
 755           	    cimException,
 756           	    QueueIdStack()));
 757               }
 758           }
 759           
 760           CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
 761               XmlParser& parser, const String& messageId)
 762           {
 763               XmlEntry entry;
 764               CIMException cimException;
 765           
 766               if (XmlReader::getErrorElement(parser, cimException))
 767               {
 768           	return(new CIMEnumerateInstanceNamesResponseMessage(
 769           	    messageId,
 770           	    cimException,
 771 karl  1.1 	    QueueIdStack(),
 772           	    Array<CIMObjectPath>()));
 773               }
 774               else
 775               {
 776           	Array<CIMObjectPath> instanceNames;
 777           
 778 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
 779 karl  1.3     // WBEMServices returns this tag wneh no instances exist.
 780           	if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 781           	    if (entry.type != XmlEntry::EMPTY_TAG)
 782               	{
 783               	    String className;
 784               	    Array<CIMKeyBinding> keyBindings;
 785               
 786               	    while (XmlReader::getInstanceNameElement(
 787               	        parser, className, keyBindings))
 788               	    {
 789               	        CIMObjectPath r(
 790               		    String::EMPTY,
 791               		    String::EMPTY,
 792               		    className,
 793               		    keyBindings);
 794               	        instanceNames.append(r);
 795               	    }
 796               
 797               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 798               	}
 799 karl  1.1 
 800           	return(new CIMEnumerateInstanceNamesResponseMessage(
 801           	    messageId,
 802           	    cimException,
 803           	    QueueIdStack(),
 804           	    instanceNames));
 805               }
 806           }
 807           
 808           CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
 809               XmlParser& parser, const String& messageId)
 810           {
 811               XmlEntry entry;
 812               CIMException cimException;
 813           
 814               if (XmlReader::getErrorElement(parser, cimException))
 815               {
 816           	return(new CIMEnumerateInstancesResponseMessage(
 817           	    messageId,
 818           	    cimException,
 819           	    QueueIdStack(),
 820 karl  1.1 	    Array<CIMInstance>()));
 821               }
 822               else
 823               {
 824           	Array<CIMInstance> namedInstances;
 825 karl  1.3     
 826 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
 827 karl  1.3     // WBEMServices returns this tag wneh no instances exist.
 828               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 829 karl  1.2 	    if (entry.type != XmlEntry::EMPTY_TAG)
 830                   {
 831               	    CIMInstance namedInstance;
 832               
 833               	    while (XmlReader::getNamedInstanceElement(parser, namedInstance))
 834               	        namedInstances.append(namedInstance);
 835               
 836               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 837                   }
 838 karl  1.1 
 839           	return(new CIMEnumerateInstancesResponseMessage(
 840           	    messageId,
 841           	    cimException,
 842           	    QueueIdStack(),
 843           	    namedInstances));
 844               }
 845           }
 846           
 847           CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
 848               XmlParser& parser, const String& messageId)
 849           {
 850               XmlEntry entry;
 851               CIMException cimException;
 852           
 853               if (XmlReader::getErrorElement(parser, cimException))
 854               {
 855           	return(new CIMDeleteInstanceResponseMessage(
 856           	    messageId,
 857           	    cimException,
 858           	    QueueIdStack()));
 859 karl  1.1     }
 860               else
 861               {
 862           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 863           	{
 864           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 865           	}
 866           
 867           	return(new CIMDeleteInstanceResponseMessage(
 868           	    messageId,
 869           	    cimException,
 870           	    QueueIdStack()));
 871               }
 872           }
 873           
 874           CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
 875               XmlParser& parser, const String& messageId)
 876           {
 877               XmlEntry entry;
 878               CIMException cimException;
 879           
 880 karl  1.1     if (XmlReader::getErrorElement(parser, cimException))
 881               {
 882           	return(new CIMGetPropertyResponseMessage(
 883           	    messageId,
 884           	    cimException,
 885           	    QueueIdStack(),
 886           	    CIMValue()));
 887               }
 888               else
 889               {
 890           	CIMValue cimValue(CIMTYPE_STRING, false);
 891           
 892           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 893           	{
 894           	    if (!XmlReader::getPropertyValue(parser, cimValue))
 895           	    {
 896                           // No value given; just return a null String value
 897           	    }
 898           
 899           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 900           	}
 901 karl  1.1 	else
 902           	{
 903                       // No value given; just return a null String value
 904           	}
 905           
 906           	return(new CIMGetPropertyResponseMessage(
 907           	    messageId,
 908           	    cimException,
 909           	    QueueIdStack(),
 910           	    cimValue));
 911               }
 912           }
 913           
 914           CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
 915               XmlParser& parser, const String& messageId)
 916           {
 917               XmlEntry entry;
 918               CIMException cimException;
 919           
 920               if (XmlReader::getErrorElement(parser, cimException))
 921               {
 922 karl  1.1 	return(new CIMSetPropertyResponseMessage(
 923           	    messageId,
 924           	    cimException,
 925           	    QueueIdStack()));
 926               }
 927               else
 928               {
 929           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 930           	{
 931           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 932           	}
 933           
 934           	return(new CIMSetPropertyResponseMessage(
 935           	    messageId,
 936           	    cimException,
 937           	    QueueIdStack()));
 938               }
 939           }
 940           
 941           CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
 942               XmlParser& parser, const String& messageId)
 943 karl  1.1 {
 944               XmlEntry entry;
 945               CIMException cimException;
 946           
 947               if (XmlReader::getErrorElement(parser, cimException))
 948               {
 949           	return(new CIMSetQualifierResponseMessage(
 950           	    messageId,
 951           	    cimException,
 952           	    QueueIdStack()));
 953               }
 954               else
 955               {
 956           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 957           	{
 958           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 959           	}
 960           
 961           	return(new CIMSetQualifierResponseMessage(
 962           	    messageId,
 963           	    cimException,
 964 karl  1.1 	    QueueIdStack()));
 965               }
 966           }
 967           
 968           CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
 969               XmlParser& parser, const String& messageId)
 970           {
 971               XmlEntry entry;
 972               CIMException cimException;
 973           
 974               if (XmlReader::getErrorElement(parser, cimException))
 975               {
 976           	return(new CIMGetQualifierResponseMessage(
 977           	    messageId,
 978           	    cimException,
 979           	    QueueIdStack(),
 980           	    CIMQualifierDecl()));
 981               }
 982               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 983               {
 984           	CIMQualifierDecl qualifierDecl;
 985 karl  1.1 	XmlReader::getQualifierDeclElement(parser, qualifierDecl);
 986           
 987           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 988           
 989           	return(new CIMGetQualifierResponseMessage(
 990           	    messageId,
 991           	    cimException,
 992           	    QueueIdStack(),
 993           	    qualifierDecl));
 994               }
 995               else
 996               {
 997           	throw XmlValidationError(parser.getLine(),
 998           	    "expected ERROR or IRETURNVALUE element");
 999               }
1000           }
1001           
1002           CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
1003               XmlParser& parser, const String& messageId)
1004           {
1005               XmlEntry entry;
1006 karl  1.1     CIMException cimException;
1007           
1008               if (XmlReader::getErrorElement(parser, cimException))
1009               {
1010           	return(new CIMEnumerateQualifiersResponseMessage(
1011           	    messageId,
1012           	    cimException,
1013           	    QueueIdStack(),
1014           	    Array<CIMQualifierDecl>()));
1015               }
1016               else
1017               {
1018           	Array<CIMQualifierDecl> qualifierDecls;
1019           
1020 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
1021 karl  1.3     // WBEMServices returns this tag wneh no instances exist.
1022               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1023           	    if (entry.type != XmlEntry::EMPTY_TAG)
1024               	{
1025               	    CIMQualifierDecl qualifierDecl;
1026               
1027               	    while (XmlReader::getQualifierDeclElement(parser, qualifierDecl))
1028               	        qualifierDecls.append(qualifierDecl);
1029               
1030               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1031               	}
1032 karl  1.1 
1033           	return(new CIMEnumerateQualifiersResponseMessage(
1034           	    messageId,
1035           	    cimException,
1036           	    QueueIdStack(),
1037           	    qualifierDecls));
1038               }
1039           }
1040           
1041           CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
1042               XmlParser& parser, const String& messageId)
1043           {
1044               XmlEntry entry;
1045               CIMException cimException;
1046           
1047               if (XmlReader::getErrorElement(parser, cimException))
1048               {
1049           	return(new CIMDeleteQualifierResponseMessage(
1050           	    messageId,
1051           	    cimException,
1052           	    QueueIdStack()));
1053 karl  1.1     }
1054               else
1055               {
1056           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1057           	{
1058           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1059           	}
1060           
1061           	return(new CIMDeleteQualifierResponseMessage(
1062           	    messageId,
1063           	    cimException,
1064           	    QueueIdStack()));
1065               }
1066           }
1067           
1068           
1069 karl  1.5 //********************Temporary code insertion**********************
1070 karl  1.4 // KS 20021001 - Added this duplicate from xmlreader to test changes
1071 karl  1.5 // BUGZILLA 136
1072 karl  1.4 // for wbemservices problem where it does not return objectpath element
1073           // Tests for ObjectPath OR InstancePathelemen or classpath element
1074           Boolean _getObjectPathElement(
1075               XmlParser& parser, 
1076               CIMObjectPath& objectPath)
1077           {
1078               XmlEntry entry;
1079           
1080               if (!XmlReader::testStartTag(parser, entry, "OBJECTPATH"))
1081               {               // loop for the interop test
1082                   //See getValueReferenceElement for good code.
1083                   if (!parser.next(entry))
1084                       throw XmlException(XmlException::UNCLOSED_TAGS, parser.getLine());
1085                   if (entry.type != XmlEntry::START_TAG && 
1086                   entry.type != XmlEntry::EMPTY_TAG)
1087                   {
1088                       parser.putBack(entry);
1089                       return false;
1090                   }
1091                   if (strcmp(entry.text, "CLASSPATH") == 0)
1092                   {
1093 karl  1.4             parser.putBack(entry);
1094                       XmlReader::getClassPathElement(parser, objectPath);
1095                       return true;
1096                   }
1097                   else if (strcmp(entry.text, "LOCALCLASSPATH") == 0)
1098                   {
1099                       parser.putBack(entry);
1100                       XmlReader::getLocalClassPathElement(parser, objectPath);
1101                       return true;
1102                   }
1103                   else if (strcmp(entry.text, "CLASSNAME") == 0)
1104                   {
1105                       parser.putBack(entry);
1106                       CIMName className;
1107                       XmlReader::getClassNameElement(parser, className);
1108                       objectPath.set(String(), CIMNamespaceName(), className);
1109                       return true;
1110                   }
1111                   else if (strcmp(entry.text, "INSTANCEPATH") == 0)
1112                   {
1113                       parser.putBack(entry);
1114 karl  1.4             XmlReader::getInstancePathElement(parser, objectPath);
1115                       return true;
1116                   }
1117                   else if (strcmp(entry.text, "LOCALINSTANCEPATH") == 0)
1118                   {
1119                       parser.putBack(entry);
1120                       XmlReader::getLocalInstancePathElement(parser, objectPath);
1121                       return true;
1122                   }
1123                   else if (strcmp(entry.text, "INSTANCENAME") == 0)
1124                   {
1125                       parser.putBack(entry);
1126                       String className;
1127                       Array<CIMKeyBinding> keyBindings;
1128                       XmlReader::getInstanceNameElement(parser, className, keyBindings);
1129                       objectPath.set(String(), CIMNamespaceName(), className, keyBindings);
1130                       return true;
1131                   }
1132                   return false;
1133               }
1134               
1135 karl  1.4     if (XmlReader::getClassPathElement(parser, objectPath))
1136               {
1137           	XmlReader::expectEndTag(parser, "OBJECTPATH");
1138           	return true;
1139               }
1140               else if (XmlReader::getInstancePathElement(parser, objectPath))
1141               {
1142           	XmlReader::expectEndTag(parser, "OBJECTPATH");
1143           	return true;
1144               }
1145               else
1146               {
1147           	throw XmlValidationError(parser.getLine(),
1148           	    "expected INSTANCEPATH or CLASSPATH element");
1149               }
1150           
1151               PEGASUS_UNREACHABLE ( return false; )
1152           }
1153 karl  1.5 //*******************END of Temporary code insertion******
1154           
1155           
1156           CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
1157               XmlParser& parser, const String& messageId)
1158           {
1159               XmlEntry entry;
1160               CIMException cimException;
1161           
1162               if (XmlReader::getErrorElement(parser, cimException))
1163               {
1164           	return(new CIMReferenceNamesResponseMessage(
1165           	    messageId,
1166           	    cimException,
1167           	    QueueIdStack(),
1168           	    Array<CIMObjectPath>()));
1169               }
1170               else
1171               {
1172           	Array<CIMObjectPath> objectPaths;
1173           
1174 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
1175               // WBEMServices returns this tag wneh no instances exist.
1176               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1177           	    if (entry.type != XmlEntry::EMPTY_TAG)
1178               	{
1179               	    CIMObjectPath objectPath;
1180               
1181                       // KS 20021001 - Call local version of getobjectpath for
1182                       // client responses.  BUGZILLA 136. This added to correct
1183                       // for Wbemservices problem (treats objectpath and instancepath
1184                       // tags as optional) and should be removed when these problems
1185                       // are corrected permanently.
1186                       
1187               	    //while (XmlReader::getObjectPathElement(parser, objectPath))
1188               	    //    objectPaths.append(objectPath);
1189               
1190               	    while (_getObjectPathElement(parser, objectPath))
1191               	        objectPaths.append(objectPath);
1192                       
1193                       // End of BUGZILLA 136 fix
1194                       
1195 karl  1.5     	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1196               	}
1197           
1198           	return(new CIMReferenceNamesResponseMessage(
1199           	    messageId,
1200           	    cimException,
1201           	    QueueIdStack(),
1202           	    objectPaths));
1203               }
1204           }
1205 karl  1.4 
1206 karl  1.5 CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
1207               XmlParser& parser, const String& messageId)
1208           {
1209               XmlEntry entry;
1210               CIMException cimException;
1211           
1212               if (XmlReader::getErrorElement(parser, cimException))
1213               {
1214           	return(new CIMReferencesResponseMessage(
1215           	    messageId,
1216           	    cimException,
1217           	    QueueIdStack(),
1218           	    Array<CIMObject>()));
1219               }
1220               else
1221               {
1222           	Array<CIMObject> objectWithPathArray;
1223           
1224               
1225               // KS 20020931 - Addition to allow empty tag return. BUGZILLA135
1226               // WBEMServices returns this tag wneh no instances exist.
1227 karl  1.5     if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1228           	    if (entry.type != XmlEntry::EMPTY_TAG)
1229               	{
1230               	    CIMObject objectWithPath;
1231               
1232               	    while (XmlReader::getValueObjectWithPathElement(parser, objectWithPath))
1233               	        objectWithPathArray.append(objectWithPath);
1234               
1235               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1236               	}
1237           
1238           	return(new CIMReferencesResponseMessage(
1239           	    messageId,
1240           	    cimException,
1241           	    QueueIdStack(),
1242           	    objectWithPathArray));
1243               }
1244           }
1245 karl  1.4 
1246 karl  1.1 CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
1247               XmlParser& parser, const String& messageId)
1248           {
1249               XmlEntry entry;
1250               CIMException cimException;
1251           
1252               if (XmlReader::getErrorElement(parser, cimException))
1253               {
1254           	return(new CIMAssociatorNamesResponseMessage(
1255           	    messageId,
1256           	    cimException,
1257           	    QueueIdStack(),
1258           	    Array<CIMObjectPath>()));
1259               }
1260               else
1261               {
1262           	Array<CIMObjectPath> objectPaths;
1263 karl  1.4     
1264 karl  1.5     // KS 20020931 - Addition to allow empty tag return. BUGZILLA 135
1265 karl  1.3     // WBEMServices returns this tag wneh no instances exist.
1266               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1267           	    if (entry.type != XmlEntry::EMPTY_TAG)
1268               	{
1269               	    CIMObjectPath objectPath;
1270               
1271 karl  1.5             // KS 20021001 - Call local version of getobjectpath for
1272                       // client responses.  BUGZILLA 136. This added to correct
1273                       // for Wbemservices problem (treats objectpath and instancepath
1274                       // tags as optional) and should be removed when these problems
1275                       // are corrected permanently.
1276                       
1277 karl  1.4     	    //while (XmlReader::getObjectPathElement(parser, objectPath))
1278               	    //    objectPaths.append(objectPath);
1279               
1280               	    while (_getObjectPathElement(parser, objectPath))
1281 karl  1.3     	        objectPaths.append(objectPath);
1282 karl  1.5             // End of BUGZILLA 136 fix
1283 karl  1.4             
1284 karl  1.3     	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1285               	}
1286 karl  1.1 
1287           	return(new CIMAssociatorNamesResponseMessage(
1288           	    messageId,
1289           	    cimException,
1290           	    QueueIdStack(),
1291           	    objectPaths));
1292               }
1293           }
1294           
1295           CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
1296               XmlParser& parser, const String& messageId)
1297           {
1298               XmlEntry entry;
1299               CIMException cimException;
1300           
1301               if (XmlReader::getErrorElement(parser, cimException))
1302               {
1303           	return(new CIMAssociatorsResponseMessage(
1304           	    messageId,
1305           	    cimException,
1306           	    QueueIdStack(),
1307 karl  1.1 	    Array<CIMObject>()));
1308               }
1309               else
1310               {
1311           	Array<CIMObject> objectWithPathArray;
1312           
1313 karl  1.3     // KS 20020931 - Addition to allow empty tag return.
1314               // WBEMServices returns this tag wneh no instances exist.
1315               if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1316           	    if (entry.type != XmlEntry::EMPTY_TAG)
1317               	{
1318               	    CIMObject objectWithPath;
1319               
1320               	    while (XmlReader::getValueObjectWithPathElement(parser, objectWithPath))
1321               	        objectWithPathArray.append(objectWithPath);
1322               
1323               	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1324               	}
1325 karl  1.1 
1326           	return(new CIMAssociatorsResponseMessage(
1327           	    messageId,
1328           	    cimException,
1329           	    QueueIdStack(),
1330           	    objectWithPathArray));
1331               }
1332           }
1333           
1334           CIMExecQueryResponseMessage* CIMOperationResponseDecoder::_decodeExecQueryResponse(
1335               XmlParser& parser, const String& messageId)
1336           {
1337               XmlEntry entry;
1338               CIMException cimException;
1339           
1340               if (XmlReader::getErrorElement(parser, cimException))
1341               {
1342           	return(new CIMExecQueryResponseMessage(
1343           	    messageId,
1344           	    cimException,
1345           	    QueueIdStack(),
1346 karl  1.1 	    Array<CIMObject>()));
1347               }
1348               else
1349               {
1350           	Array<CIMObject> objectWithPathArray;
1351           
1352           	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1353           	{
1354                       XmlReader::getObjectArray(parser, objectWithPathArray);
1355           
1356           	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1357           	}
1358           
1359           	return(new CIMExecQueryResponseMessage(
1360           	    messageId,
1361           	    cimException,
1362           	    QueueIdStack(),
1363           	    objectWithPathArray));
1364               }
1365           }
1366           
1367 karl  1.1 CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
1368               XmlParser& parser, const String& messageId, const String& methodName)
1369           {
1370               XmlEntry entry;
1371               CIMException cimException;
1372           
1373               CIMParamValue paramValue;
1374               Array<CIMParamValue> outParameters;
1375               CIMValue returnValue;
1376               const char* paramName;
1377               String inValue;
1378           
1379               if (XmlReader::getErrorElement(parser, cimException))
1380               {
1381           	return(new CIMInvokeMethodResponseMessage(
1382           	    messageId,
1383           	    cimException,
1384           	    QueueIdStack(),
1385           	    returnValue,
1386           	    outParameters,
1387           	    methodName));
1388 karl  1.1     }
1389               else
1390               {
1391                   Boolean isReturnValue = false;
1392                   Boolean isParamValue = false;
1393                   Boolean gotReturnValue = false;
1394           
1395                   while ((isReturnValue =
1396                               XmlReader::getReturnValueElement(parser, returnValue)) ||
1397                          (isParamValue =
1398           		    XmlReader::getParamValueElement(parser, paramValue)))
1399                   {
1400                       if (isReturnValue)
1401                       {
1402                           if (gotReturnValue)
1403                           {
1404           	            throw XmlValidationError(parser.getLine(),
1405           	                "unexpected RETURNVALUE element");
1406                           }
1407                           gotReturnValue = true;
1408                       }
1409 karl  1.1             else    // isParamValue == true
1410                       {
1411           	        outParameters.append(paramValue);
1412                       }
1413           
1414                       isReturnValue = false;
1415                       isParamValue = false;
1416                   }
1417           
1418           	return(new CIMInvokeMethodResponseMessage(
1419           	    messageId,
1420           	    cimException,
1421           	    QueueIdStack(),
1422           	    returnValue,
1423           	    outParameters,
1424           	    methodName));
1425               }
1426           }
1427           
1428           PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2