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

   1 mike  1.2 //%/////////////////////////////////////////////////////////////////////////////
   2           //
   3 kumpf 1.25 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
   4 mike  1.2  // 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 kumpf 1.25 // 
  13 mike  1.2  // 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            //==============================================================================
  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 kumpf 1.23 //              Carol Ann Krug Graves, Hewlett-Packard Company
  31            //                  (carolann_graves@hp.com)
  32 mike  1.2  //
  33            //%/////////////////////////////////////////////////////////////////////////////
  34            
  35            #include <Pegasus/Common/Config.h>
  36            #include <iostream>
  37 kumpf 1.15 #include <Pegasus/Common/Constants.h>
  38 mike  1.2  #include <Pegasus/Common/XmlParser.h>
  39            #include <Pegasus/Common/XmlReader.h>
  40            #include <Pegasus/Common/System.h>
  41            #include <Pegasus/Common/XmlWriter.h>
  42            #include <Pegasus/Common/HTTPMessage.h>
  43            #include <Pegasus/Common/CIMMessage.h>
  44            #include "CIMOperationResponseDecoder.h"
  45            
  46            PEGASUS_USING_STD;
  47            
  48            PEGASUS_NAMESPACE_BEGIN
  49            
  50            CIMOperationResponseDecoder::CIMOperationResponseDecoder(
  51                MessageQueue* outputQueue,
  52                MessageQueue* encoderQueue,
  53                ClientAuthenticator* authenticator)
  54                :
  55 kumpf 1.16     MessageQueue(PEGASUS_QUEUENAME_OPRESPDECODER),
  56 mike  1.2      _outputQueue(outputQueue),
  57                _encoderQueue(encoderQueue),
  58                _authenticator(authenticator)
  59            {
  60            
  61            }
  62            
  63            CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
  64            {
  65            
  66            }
  67            
  68            void  CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
  69            {
  70                _encoderQueue = encoderQueue;
  71            }
  72            
  73            void CIMOperationResponseDecoder::handleEnqueue()
  74            {
  75                Message* message = dequeue();
  76            
  77 mike  1.2      if (!message)
  78            	return;
  79            
  80                switch (message->getType())
  81                {
  82            	case HTTP_MESSAGE:
  83            	{
  84 mday  1.3  
  85 mike  1.2  	    HTTPMessage* httpMessage = (HTTPMessage*)message;
  86            	    _handleHTTPMessage(httpMessage);
  87            	    break;
  88            	}
  89            
  90            	default:
  91 kumpf 1.17             PEGASUS_ASSERT(0);
  92 mike  1.2  	    break;
  93                }
  94            
  95                delete message;
  96            }
  97            
  98            void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
  99            {
 100                //
 101                // Parse the HTTP message:
 102                //
 103            
 104                String startLine;
 105                Array<HTTPHeader> headers;
 106                Sint8* content;
 107                Uint32 contentLength;
 108            
 109 kumpf 1.19     if (httpMessage->message.size() == 0)
 110                {
 111 kumpf 1.20         CIMClientMalformedHTTPException* malformedHTTPException =
 112                        new CIMClientMalformedHTTPException("Empty HTTP response message.");
 113 kumpf 1.19         ClientExceptionMessage * response =
 114                        new ClientExceptionMessage(malformedHTTPException);
 115            
 116                    _outputQueue->enqueue(response);
 117                    return;
 118                }
 119            
 120 mike  1.2      httpMessage->parse(startLine, headers, contentLength);
 121            
 122 kumpf 1.19     //
 123                // Get the status line info
 124                //
 125            
 126                String httpVersion;
 127                Uint32 statusCode;
 128                String reasonPhrase;
 129            
 130                Boolean parsableMessage = HTTPMessage::parseStatusLine(
 131                    startLine, httpVersion, statusCode, reasonPhrase);
 132                if (!parsableMessage)
 133                {
 134 kumpf 1.20         CIMClientMalformedHTTPException* malformedHTTPException = new
 135                        CIMClientMalformedHTTPException("Malformed HTTP response message.");
 136 kumpf 1.19         ClientExceptionMessage * response =
 137                        new ClientExceptionMessage(malformedHTTPException);
 138            
 139                    _outputQueue->enqueue(response);
 140                    return;
 141                }
 142            
 143 kumpf 1.8      try
 144 mike  1.2      {
 145 kumpf 1.8          if (_authenticator->checkResponseHeaderForChallenge(headers))
 146                    {
 147                        //
 148                        // Get the original request, put that in the encoder's queue for
 149                        // re-sending with authentication challenge response.
 150                        //
 151                        Message* reqMessage = _authenticator->getRequestMessage();
 152                        _encoderQueue->enqueue(reqMessage);
 153 mike  1.2  
 154 kumpf 1.8              return;
 155                    }
 156                    else
 157                    {
 158                        //
 159                        // Received a valid/error response from the server.
 160                        // We do not need the original request message anymore, hence delete
 161                        // the request message by getting the handle from the ClientAuthenticator.
 162                        //
 163                        Message* reqMessage = _authenticator->getRequestMessage();
 164                        _authenticator->clearRequest();
 165                        if (reqMessage)
 166                        {
 167                            delete reqMessage;
 168                        }
 169                    }
 170 mike  1.2      }
 171 kumpf 1.8      catch(InvalidAuthHeader& e)
 172 mike  1.2      {
 173 kumpf 1.20         CIMClientMalformedHTTPException* malformedHTTPException =
 174                        new CIMClientMalformedHTTPException(e.getMessage());
 175 kumpf 1.17         ClientExceptionMessage * response =
 176                        new ClientExceptionMessage(malformedHTTPException);
 177 mike  1.2  
 178 kumpf 1.17         _outputQueue->enqueue(response);
 179 kumpf 1.15         return;
 180                }
 181 kumpf 1.22     catch(UnauthorizedAccess& e)
 182                {
 183                     CIMClientCannotConnectException* cannotConnectHTTPException =
 184                        new  CIMClientCannotConnectException(e.getMessage());
 185            	 ClientExceptionMessage * response =
 186                        new ClientExceptionMessage(cannotConnectHTTPException);
 187            
 188                    _outputQueue->enqueue(response);
 189                    return;
 190                }
 191 kumpf 1.15 
 192                //
 193                // Check for a success (200 OK) response
 194                //
 195 kumpf 1.19 
 196 kumpf 1.17     if (statusCode != HTTP_STATUSCODE_OK)
 197 kumpf 1.15     {
 198                    String cimError;
 199                    String pegasusError;
 200            
 201                    HTTPMessage::lookupHeader(headers, "CIMError", cimError);
 202                    HTTPMessage::lookupHeader(headers, PEGASUS_HTTPHEADERTAG_ERRORDETAIL, pegasusError);
 203            
 204 kumpf 1.20         CIMClientHTTPError* httpError =
 205                        new CIMClientHTTPError(statusCode, cimError, pegasusError);
 206 kumpf 1.17         ClientExceptionMessage * response =
 207                        new ClientExceptionMessage(httpError);
 208 kumpf 1.15 
 209                    _outputQueue->enqueue(response);
 210 kumpf 1.8          return;
 211 mike  1.2      }
 212            
 213                //
 214                // Search for "CIMOperation" header:
 215                //
 216            
 217                String cimOperation;
 218            
 219                if (!HTTPMessage::lookupHeader(
 220 kumpf 1.18 	headers, "CIMOperation", cimOperation, true))
 221 mike  1.2      {
 222 kumpf 1.20         CIMClientMalformedHTTPException* malformedHTTPException = new
 223                        CIMClientMalformedHTTPException("Missing CIMOperation HTTP header");
 224 kumpf 1.17         ClientExceptionMessage * response =
 225                        new ClientExceptionMessage(malformedHTTPException);
 226            
 227                    _outputQueue->enqueue(response);
 228                    return;
 229 mike  1.2      }
 230            
 231                //
 232                // Zero-terminate the message:
 233                //
 234            
 235                httpMessage->message.append('\0');
 236            
 237                // Calculate the beginning of the content from the message size and
 238                // the content length.  Subtract 1 to take into account the null
 239                // character we just added to the end of the message.
 240            
 241                content = (Sint8*) httpMessage->message.getData() +
 242            	httpMessage->message.size() - contentLength - 1;
 243            
 244                //
 245                // If it is a method response, then dispatch it to be handled:
 246                //
 247            
 248                if (!String::equalNoCase(cimOperation, "MethodResponse"))
 249                {
 250 kumpf 1.20         CIMClientMalformedHTTPException* malformedHTTPException =
 251                        new CIMClientMalformedHTTPException(
 252                            String("Received CIMOperation HTTP header value \"") +
 253 kumpf 1.17                 cimOperation + "\", expected \"MethodResponse\"");
 254                    ClientExceptionMessage * response =
 255                        new ClientExceptionMessage(malformedHTTPException);
 256            
 257                    _outputQueue->enqueue(response);
 258                    return;
 259 mike  1.2      }
 260            
 261                _handleMethodResponse(content);
 262            }
 263            
 264            void CIMOperationResponseDecoder::_handleMethodResponse(char* content)
 265            {
 266                Message* response = 0;
 267            
 268                //
 269                // Create and initialize XML parser:
 270                //
 271            
 272                XmlParser parser((char*)content);
 273                XmlEntry entry;
 274            
 275                try
 276                {
 277            	//
 278            	// Process <?xml ... >
 279            	//
 280 mike  1.2  
 281 kumpf 1.11         const char* xmlVersion = 0;
 282                    const char* xmlEncoding = 0;
 283            
 284            	XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
 285 mike  1.2  
 286            	//
 287            	// Process <CIM ... >
 288            	//
 289            
 290 kumpf 1.9          const char* cimVersion = 0;
 291                    const char* dtdVersion = 0;
 292            
 293 kumpf 1.17         // ATTN-RK-P3-20020416: Need to validate these versions?
 294 kumpf 1.9  	XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
 295 mike  1.2  
 296            	//
 297            	// Expect <MESSAGE ... >
 298            	//
 299            
 300            	String messageId;
 301 kumpf 1.9  	String protocolVersion;
 302 mike  1.2  
 303            	if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
 304            	    throw XmlValidationError(
 305            		parser.getLine(), "expected MESSAGE element");
 306            
 307 kumpf 1.9          if (!String::equalNoCase(protocolVersion, "1.0"))
 308 mike  1.2  	{
 309 kumpf 1.20             CIMClientResponseException* responseException =
 310                            new CIMClientResponseException(
 311                                String("Received unsupported protocol version \"") +
 312 kumpf 1.17                     protocolVersion + "\", expected \"1.0\"");
 313                        ClientExceptionMessage * response =
 314                            new ClientExceptionMessage(responseException);
 315 mike  1.2  
 316 kumpf 1.17             _outputQueue->enqueue(response);
 317                        return;
 318 mike  1.2  	}
 319            
 320            	//
 321            	// Expect <SIMPLERSP ... >
 322            	//
 323            
 324            	XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
 325            
 326            	//
 327            	// Expect <IMETHODRESPONSE ... >
 328            	//
 329            
 330            	const char* iMethodResponseName = 0;
 331            
 332            	if (XmlReader::getIMethodResponseStartTag(parser, iMethodResponseName))
 333            	{
 334            	    //
 335            	    // Dispatch the method:
 336            	    //
 337            
 338            	    if (EqualNoCase(iMethodResponseName, "GetClass"))
 339 mike  1.2  		response = _decodeGetClassResponse(parser, messageId);
 340            	    else if (EqualNoCase(iMethodResponseName, "GetInstance"))
 341            		response = _decodeGetInstanceResponse(parser, messageId);
 342            	    else if (EqualNoCase(iMethodResponseName, "EnumerateClassNames"))
 343            		response = _decodeEnumerateClassNamesResponse(parser,messageId);
 344            	    else if (EqualNoCase(iMethodResponseName, "References"))
 345            		response = _decodeReferencesResponse(parser, messageId);
 346            	    else if (EqualNoCase(iMethodResponseName, "ReferenceNames"))
 347            		response = _decodeReferenceNamesResponse(parser, messageId);
 348            	    else if (EqualNoCase(iMethodResponseName, "AssociatorNames"))
 349            		response = _decodeAssociatorNamesResponse(parser, messageId);
 350            	    else if (EqualNoCase(iMethodResponseName, "Associators"))
 351            		response = _decodeAssociatorsResponse(parser, messageId);
 352            	    else if (EqualNoCase(iMethodResponseName, "CreateInstance"))
 353            		response = _decodeCreateInstanceResponse(parser, messageId);
 354            	    else if (EqualNoCase(iMethodResponseName,"EnumerateInstanceNames"))
 355            		response = _decodeEnumerateInstanceNamesResponse(
 356                              parser, messageId);
 357            	    else if (EqualNoCase(iMethodResponseName,"EnumerateInstances"))
 358            		response = _decodeEnumerateInstancesResponse(parser, messageId);
 359            	    else if (EqualNoCase(iMethodResponseName, "GetProperty"))
 360 mike  1.2  		response = _decodeGetPropertyResponse(parser, messageId);
 361            	    else if (EqualNoCase(iMethodResponseName, "SetProperty"))
 362            		response = _decodeSetPropertyResponse(parser, messageId);
 363            	    else if (EqualNoCase(iMethodResponseName, "DeleteQualifier"))
 364            		response = _decodeDeleteQualifierResponse(parser, messageId);
 365            	    else if (EqualNoCase(iMethodResponseName, "GetQualifier"))
 366            		response = _decodeGetQualifierResponse(parser, messageId);
 367            	    else if (EqualNoCase(iMethodResponseName, "SetQualifier"))
 368            		response = _decodeSetQualifierResponse(parser, messageId);
 369            	    else if (EqualNoCase(iMethodResponseName, "EnumerateQualifiers"))
 370            		response = _decodeEnumerateQualifiersResponse(parser,messageId);
 371            	    else if (EqualNoCase(iMethodResponseName, "EnumerateClasses"))
 372            		response = _decodeEnumerateClassesResponse(parser, messageId);
 373            	    else if (EqualNoCase(iMethodResponseName, "CreateClass"))
 374            		response = _decodeCreateClassResponse(parser, messageId);
 375            	    else if (EqualNoCase(iMethodResponseName, "ModifyClass"))
 376            		response = _decodeModifyClassResponse(parser, messageId);
 377            	    else if (EqualNoCase(iMethodResponseName, "ModifyInstance"))
 378            		response = _decodeModifyInstanceResponse(parser, messageId);
 379            	    else if (EqualNoCase(iMethodResponseName, "DeleteClass"))
 380            		response = _decodeDeleteClassResponse(parser, messageId);
 381 mike  1.2  	    else if (EqualNoCase(iMethodResponseName, "DeleteInstance"))
 382            		response = _decodeDeleteInstanceResponse(parser, messageId);
 383 kumpf 1.10 	    else if (EqualNoCase(iMethodResponseName, "ExecQuery"))
 384            		response = _decodeExecQueryResponse(parser, messageId);
 385 mike  1.2  	    else
 386            	    {
 387                            // Unrecognized IMethodResponse name attribute
 388            	        throw XmlValidationError(parser.getLine(),
 389            	            String("Unrecognized IMethodResponse name \"") +
 390                                    iMethodResponseName + "\"");
 391            	    }
 392            	
 393            	    //
 394            	    // Handle end tag:
 395            	    //
 396            
 397            	    XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
 398            	}
 399            	else if (XmlReader::getMethodResponseStartTag(parser, 
 400            	    iMethodResponseName))
 401            	{
 402            	    response = _decodeInvokeMethodResponse(
 403                          parser, messageId, iMethodResponseName);
 404            
 405            	    //
 406 mike  1.2  	    // Handle end tag:
 407            	    //
 408            	    XmlReader::expectEndTag(parser, "METHODRESPONSE");
 409            	}
 410            	else
 411            	{
 412            	    throw XmlValidationError(parser.getLine(),
 413            	        "expected METHODRESPONSE or IMETHODRESPONSE element");
 414            	}
 415            
 416                    //
 417                    // Handle end tags:
 418                    //
 419            	XmlReader::expectEndTag(parser, "SIMPLERSP");
 420            	XmlReader::expectEndTag(parser, "MESSAGE");
 421            	XmlReader::expectEndTag(parser, "CIM");
 422                }
 423 kumpf 1.17     catch (XmlException& x)
 424                {
 425                    if (response)
 426                    {
 427                        delete response;
 428                    }
 429            
 430                    response = new ClientExceptionMessage(
 431 kumpf 1.20             new CIMClientXmlException(x.getMessage()));
 432 kumpf 1.17     }
 433 mike  1.2      catch (Exception& x)
 434                {
 435 kumpf 1.17         // Shouldn't ever get exceptions other than XmlExceptions.
 436                    PEGASUS_ASSERT(0);
 437            
 438                    if (response)
 439                    {
 440                        delete response;
 441                    }
 442 mike  1.2  
 443 kumpf 1.17         response = new ClientExceptionMessage(
 444 kumpf 1.20             new CIMClientException(x.getMessage()));
 445 mike  1.2      }
 446            
 447                _outputQueue->enqueue(response);
 448            }
 449            
 450            CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
 451                XmlParser& parser, 
 452                const String& messageId)
 453            {
 454                XmlEntry entry;
 455 kumpf 1.12     CIMException cimException;
 456 mike  1.2  
 457 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 458 mike  1.2      {
 459            	return(new CIMCreateClassResponseMessage(
 460            	    messageId,
 461 kumpf 1.12 	    cimException,
 462 mike  1.2  	    QueueIdStack()));
 463            
 464                }
 465 kumpf 1.14     else
 466 mike  1.2      {
 467 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 468            	{
 469            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 470            	}
 471 mike  1.2  
 472            	return(new CIMCreateClassResponseMessage(
 473            	    messageId,
 474 kumpf 1.12 	    cimException,
 475 mike  1.2  	    QueueIdStack()));
 476                }
 477            }
 478            
 479            CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
 480                XmlParser& parser, const String& messageId)
 481            {
 482                XmlEntry entry;
 483 kumpf 1.12     CIMException cimException;
 484 mike  1.2  
 485 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 486 mike  1.2      {
 487            	return(new CIMGetClassResponseMessage(
 488            	    messageId,
 489 kumpf 1.12 	    cimException,
 490 mike  1.2  	    QueueIdStack(),
 491            	    CIMClass()));
 492                }
 493                else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 494                {
 495            	CIMClass cimClass;
 496            
 497            	if (!XmlReader::getClassElement(parser, cimClass))
 498            	    throw XmlValidationError(parser.getLine(),"expected CLASS element");
 499            
 500            	XmlReader::testEndTag(parser, "IRETURNVALUE");
 501            
 502            	return(new CIMGetClassResponseMessage(
 503            	    messageId,
 504 kumpf 1.12 	    cimException,
 505 mike  1.2  	    QueueIdStack(),
 506            	    cimClass));
 507                }
 508                else
 509                {
 510            	throw XmlValidationError(parser.getLine(),
 511            	    "expected ERROR or IRETURNVALUE element");
 512                }
 513            }
 514            
 515            CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
 516                XmlParser& parser, const String& messageId)
 517            {
 518                XmlEntry entry;
 519 kumpf 1.12     CIMException cimException;
 520 mike  1.2  
 521 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 522 mike  1.2      {
 523            	return(new CIMModifyClassResponseMessage(
 524            	    messageId,
 525 kumpf 1.12 	    cimException,
 526 mike  1.2  	    QueueIdStack()));
 527                }
 528 kumpf 1.14     else
 529 mike  1.2      {
 530 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 531            	{
 532            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 533            	}
 534 mike  1.2  
 535            	return(new CIMModifyClassResponseMessage(
 536            	    messageId,
 537 kumpf 1.12 	    cimException,
 538 mike  1.2  	    QueueIdStack()));
 539                }
 540            }
 541            
 542            CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
 543                XmlParser& parser, const String& messageId)
 544            {
 545                XmlEntry entry;
 546 kumpf 1.12     CIMException cimException;
 547 mike  1.2  
 548 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 549 mike  1.2      {
 550            	return(new CIMEnumerateClassNamesResponseMessage(
 551            	    messageId,
 552 kumpf 1.12 	    cimException,
 553 mike  1.2  	    QueueIdStack(),
 554            	    Array<String>()));
 555                }
 556 kumpf 1.14     else
 557 mike  1.2      {
 558            	Array<String> classNames;
 559            
 560 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 561            	{
 562            	    String className;
 563            
 564            	    while (XmlReader::getClassNameElement(parser, className, false))
 565            	        classNames.append(className);
 566 mike  1.2  
 567 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 568            	}
 569 mike  1.2  
 570            	return(new CIMEnumerateClassNamesResponseMessage(
 571            	    messageId,
 572 kumpf 1.12 	    cimException,
 573 mike  1.2  	    QueueIdStack(),
 574            	    classNames));
 575                }
 576            }
 577            
 578            CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
 579                XmlParser& parser, const String& messageId)
 580            {
 581                XmlEntry entry;
 582 kumpf 1.12     CIMException cimException;
 583 mike  1.2  
 584 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 585 mike  1.2      {
 586            	return(new CIMEnumerateClassesResponseMessage(
 587            	    messageId,
 588 kumpf 1.12 	    cimException,
 589 mike  1.2  	    QueueIdStack(),
 590            	    Array<CIMClass>()));
 591                }
 592 kumpf 1.14     else
 593 mike  1.2      {
 594            	Array<CIMClass> cimClasses;
 595            
 596 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 597            	{
 598            	    CIMClass cimClass;
 599            
 600            	    while (XmlReader::getClassElement(parser, cimClass))
 601            	        cimClasses.append(cimClass);
 602 mike  1.2  
 603 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 604            	}
 605 mike  1.2  
 606            	return(new CIMEnumerateClassesResponseMessage(
 607            	    messageId,
 608 kumpf 1.12 	    cimException,
 609 mike  1.2  	    QueueIdStack(),
 610            	    cimClasses));
 611                }
 612            }
 613            
 614            CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
 615                XmlParser& parser, const String& messageId)
 616            {
 617                XmlEntry entry;
 618 kumpf 1.12     CIMException cimException;
 619 mike  1.2  
 620 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 621 mike  1.2      {
 622            	return(new CIMDeleteClassResponseMessage(
 623            	    messageId,
 624 kumpf 1.12 	    cimException,
 625 mike  1.2  	    QueueIdStack()));
 626                }
 627 kumpf 1.14     else
 628 mike  1.2      {
 629 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 630            	{
 631            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 632            	}
 633 mike  1.2  
 634            	return(new CIMDeleteClassResponseMessage(
 635            	    messageId,
 636 kumpf 1.12 	    cimException,
 637 mike  1.2  	    QueueIdStack()));
 638                }
 639            }
 640            
 641            CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
 642                XmlParser& parser, const String& messageId)
 643            {
 644                XmlEntry entry;
 645 kumpf 1.12     CIMException cimException;
 646 mike  1.2  
 647 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 648 mike  1.2      {
 649            	return(new CIMCreateInstanceResponseMessage(
 650            	    messageId,
 651 kumpf 1.12 	    cimException,
 652 mike  1.2  	    QueueIdStack(),
 653 kumpf 1.21 	    CIMObjectPath()));
 654 mike  1.2      }
 655                else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 656                {
 657 kumpf 1.21 	CIMObjectPath instanceName;
 658 mike  1.2  	XmlReader::getInstanceNameElement(parser, instanceName);
 659            
 660            	XmlReader::testEndTag(parser, "IRETURNVALUE");
 661            
 662            	return(new CIMCreateInstanceResponseMessage(
 663            	    messageId,
 664 kumpf 1.12 	    cimException,
 665 mike  1.2  	    QueueIdStack(),
 666            	    instanceName));
 667                }
 668                else
 669                {
 670            	throw XmlValidationError(parser.getLine(),
 671            	    "expected ERROR or IRETURNVALUE element");
 672                }
 673            }
 674            
 675            CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
 676                XmlParser& parser, const String& messageId)
 677            {
 678                XmlEntry entry;
 679 kumpf 1.12     CIMException cimException;
 680 mike  1.2  
 681 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 682 mike  1.2      {
 683            	return(new CIMGetInstanceResponseMessage(
 684            	    messageId,
 685 kumpf 1.12 	    cimException,
 686 mike  1.2  	    QueueIdStack(),
 687            	    CIMInstance()));
 688                }
 689                else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 690                {
 691            	CIMInstance cimInstance;
 692            
 693            	if (!XmlReader::getInstanceElement(parser, cimInstance))
 694            	{
 695            	    throw XmlValidationError(
 696            		parser.getLine(), "expected INSTANCE element");
 697            	}
 698            
 699            	XmlReader::testEndTag(parser, "IRETURNVALUE");
 700            
 701            	return(new CIMGetInstanceResponseMessage(
 702            	    messageId,
 703 kumpf 1.12 	    cimException,
 704 mike  1.2  	    QueueIdStack(),
 705            	    cimInstance));
 706                }
 707                else
 708                {
 709            	throw XmlValidationError(parser.getLine(),
 710            	    "expected ERROR or IRETURNVALUE element");
 711                }
 712            }
 713            
 714            CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
 715                XmlParser& parser, const String& messageId)
 716            {
 717                XmlEntry entry;
 718 kumpf 1.12     CIMException cimException;
 719 mike  1.2  
 720 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 721 mike  1.2      {
 722            	return(new CIMModifyInstanceResponseMessage(
 723            	    messageId,
 724 kumpf 1.12 	    cimException,
 725 mike  1.2  	    QueueIdStack()));
 726                }
 727 kumpf 1.14     else
 728 mike  1.2      {
 729 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 730            	{
 731            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 732            	}
 733 mike  1.2  
 734            	return(new CIMModifyInstanceResponseMessage(
 735            	    messageId,
 736 kumpf 1.12 	    cimException,
 737 mike  1.2  	    QueueIdStack()));
 738                }
 739            }
 740            
 741            CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
 742                XmlParser& parser, const String& messageId)
 743            {
 744                XmlEntry entry;
 745 kumpf 1.12     CIMException cimException;
 746 mike  1.2  
 747 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 748 mike  1.2      {
 749            	return(new CIMEnumerateInstanceNamesResponseMessage(
 750            	    messageId,
 751 kumpf 1.12 	    cimException,
 752 mike  1.2  	    QueueIdStack(),
 753 kumpf 1.21 	    Array<CIMObjectPath>()));
 754 mike  1.2      }
 755 kumpf 1.14     else
 756 mike  1.2      {
 757 kumpf 1.21 	Array<CIMObjectPath> instanceNames;
 758 mike  1.2  
 759 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 760 mike  1.2  	{
 761 kumpf 1.14 	    String className;
 762            	    Array<KeyBinding> keyBindings;
 763            
 764            	    while (XmlReader::getInstanceNameElement(
 765            	        parser, className, keyBindings))
 766            	    {
 767 kumpf 1.21 	        CIMObjectPath r(
 768 kumpf 1.14 		    String::EMPTY,
 769            		    String::EMPTY,
 770            		    className,
 771            		    keyBindings);
 772            	        instanceNames.append(r);
 773            	    }
 774            
 775            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 776 mike  1.2  	}
 777            
 778            	return(new CIMEnumerateInstanceNamesResponseMessage(
 779            	    messageId,
 780 kumpf 1.12 	    cimException,
 781 mike  1.2  	    QueueIdStack(),
 782            	    instanceNames));
 783                }
 784            }
 785            
 786            CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
 787                XmlParser& parser, const String& messageId)
 788            {
 789                XmlEntry entry;
 790 kumpf 1.12     CIMException cimException;
 791 mike  1.2  
 792 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 793 mike  1.2      {
 794            	return(new CIMEnumerateInstancesResponseMessage(
 795            	    messageId,
 796 kumpf 1.12 	    cimException,
 797 mike  1.2  	    QueueIdStack(),
 798 kumpf 1.23 	    Array<CIMInstance>()));
 799 mike  1.2      }
 800 kumpf 1.14     else
 801 mike  1.2      {
 802 kumpf 1.23 	Array<CIMInstance> namedInstances;
 803 mike  1.2  
 804 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 805            	{
 806 kumpf 1.23 	    CIMInstance namedInstance;
 807 mike  1.2  
 808 kumpf 1.14 	    while (XmlReader::getNamedInstanceElement(parser, namedInstance))
 809            	        namedInstances.append(namedInstance);
 810            
 811            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 812            	}
 813 mike  1.2  
 814            	return(new CIMEnumerateInstancesResponseMessage(
 815            	    messageId,
 816 kumpf 1.12 	    cimException,
 817 mike  1.2  	    QueueIdStack(),
 818            	    namedInstances));
 819                }
 820            }
 821            
 822            CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
 823                XmlParser& parser, const String& messageId)
 824            {
 825                XmlEntry entry;
 826 kumpf 1.12     CIMException cimException;
 827 mike  1.2  
 828 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 829 mike  1.2      {
 830            	return(new CIMDeleteInstanceResponseMessage(
 831            	    messageId,
 832 kumpf 1.12 	    cimException,
 833 mike  1.2  	    QueueIdStack()));
 834                }
 835 kumpf 1.14     else
 836 mike  1.2      {
 837 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 838            	{
 839            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 840            	}
 841 mike  1.2  
 842            	return(new CIMDeleteInstanceResponseMessage(
 843            	    messageId,
 844 kumpf 1.12 	    cimException,
 845 mike  1.2  	    QueueIdStack()));
 846                }
 847            }
 848            
 849            CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
 850                XmlParser& parser, const String& messageId)
 851            {
 852                XmlEntry entry;
 853 kumpf 1.12     CIMException cimException;
 854 mike  1.2  
 855 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 856 mike  1.2      {
 857            	return(new CIMGetPropertyResponseMessage(
 858            	    messageId,
 859 kumpf 1.12 	    cimException,
 860 mike  1.2  	    QueueIdStack(),
 861            	    CIMValue()));
 862                }
 863 kumpf 1.14     else
 864 mike  1.2      {
 865 kumpf 1.26 	CIMValue cimValue(CIMTYPE_STRING, false);
 866 kumpf 1.14 
 867            	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 868            	{
 869            	    if (!XmlReader::getPropertyValue(parser, cimValue))
 870            	    {
 871                            // No value given; just return a null String value
 872            	    }
 873            
 874            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 875            	}
 876            	else
 877 mike  1.2  	{
 878 kumpf 1.14             // No value given; just return a null String value
 879 mike  1.2  	}
 880            
 881            	return(new CIMGetPropertyResponseMessage(
 882            	    messageId,
 883 kumpf 1.12 	    cimException,
 884 mike  1.2  	    QueueIdStack(),
 885            	    cimValue));
 886                }
 887            }
 888            
 889            CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
 890                XmlParser& parser, const String& messageId)
 891            {
 892                XmlEntry entry;
 893 kumpf 1.12     CIMException cimException;
 894 mike  1.2  
 895 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 896 mike  1.2      {
 897            	return(new CIMSetPropertyResponseMessage(
 898            	    messageId,
 899 kumpf 1.12 	    cimException,
 900 mike  1.2  	    QueueIdStack()));
 901                }
 902 kumpf 1.14     else
 903 mike  1.2      {
 904 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 905            	{
 906            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 907            	}
 908 mike  1.2  
 909            	return(new CIMSetPropertyResponseMessage(
 910            	    messageId,
 911 kumpf 1.12 	    cimException,
 912 mike  1.2  	    QueueIdStack()));
 913                }
 914            }
 915            
 916            CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
 917                XmlParser& parser, const String& messageId)
 918            {
 919                XmlEntry entry;
 920 kumpf 1.12     CIMException cimException;
 921 mike  1.2  
 922 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 923 mike  1.2      {
 924            	return(new CIMSetQualifierResponseMessage(
 925            	    messageId,
 926 kumpf 1.12 	    cimException,
 927 mike  1.2  	    QueueIdStack()));
 928                }
 929 kumpf 1.14     else
 930 mike  1.2      {
 931 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 932            	{
 933            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
 934            	}
 935 mike  1.2  
 936            	return(new CIMSetQualifierResponseMessage(
 937            	    messageId,
 938 kumpf 1.12 	    cimException,
 939 mike  1.2  	    QueueIdStack()));
 940                }
 941            }
 942            
 943            CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
 944                XmlParser& parser, const String& messageId)
 945            {
 946                XmlEntry entry;
 947 kumpf 1.12     CIMException cimException;
 948 mike  1.2  
 949 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 950 mike  1.2      {
 951            	return(new CIMGetQualifierResponseMessage(
 952            	    messageId,
 953 kumpf 1.12 	    cimException,
 954 mike  1.2  	    QueueIdStack(),
 955            	    CIMQualifierDecl()));
 956                }
 957                else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 958                {
 959            	CIMQualifierDecl qualifierDecl;
 960            	XmlReader::getQualifierDeclElement(parser, qualifierDecl);
 961            
 962            	XmlReader::testEndTag(parser, "IRETURNVALUE");
 963            
 964            	return(new CIMGetQualifierResponseMessage(
 965            	    messageId,
 966 kumpf 1.12 	    cimException,
 967 mike  1.2  	    QueueIdStack(),
 968            	    qualifierDecl));
 969                }
 970                else
 971                {
 972            	throw XmlValidationError(parser.getLine(),
 973            	    "expected ERROR or IRETURNVALUE element");
 974                }
 975            }
 976            
 977            CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
 978                XmlParser& parser, const String& messageId)
 979            {
 980                XmlEntry entry;
 981 kumpf 1.12     CIMException cimException;
 982 mike  1.2  
 983 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
 984 mike  1.2      {
 985            	return(new CIMEnumerateQualifiersResponseMessage(
 986            	    messageId,
 987 kumpf 1.12 	    cimException,
 988 mike  1.2  	    QueueIdStack(),
 989            	    Array<CIMQualifierDecl>()));
 990                }
 991 kumpf 1.14     else
 992 mike  1.2      {
 993            	Array<CIMQualifierDecl> qualifierDecls;
 994            
 995 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 996            	{
 997            	    CIMQualifierDecl qualifierDecl;
 998            
 999            	    while (XmlReader::getQualifierDeclElement(parser, qualifierDecl))
1000            	        qualifierDecls.append(qualifierDecl);
1001 mike  1.2  
1002 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1003            	}
1004 mike  1.2  
1005            	return(new CIMEnumerateQualifiersResponseMessage(
1006            	    messageId,
1007 kumpf 1.12 	    cimException,
1008 mike  1.2  	    QueueIdStack(),
1009            	    qualifierDecls));
1010                }
1011            }
1012            
1013            CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
1014                XmlParser& parser, const String& messageId)
1015            {
1016                XmlEntry entry;
1017 kumpf 1.12     CIMException cimException;
1018 mike  1.2  
1019 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1020 mike  1.2      {
1021            	return(new CIMDeleteQualifierResponseMessage(
1022            	    messageId,
1023 kumpf 1.12 	    cimException,
1024 mike  1.2  	    QueueIdStack()));
1025                }
1026 kumpf 1.14     else
1027 mike  1.2      {
1028 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1029            	{
1030            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1031            	}
1032 mike  1.2  
1033            	return(new CIMDeleteQualifierResponseMessage(
1034            	    messageId,
1035 kumpf 1.12 	    cimException,
1036 mike  1.2  	    QueueIdStack()));
1037                }
1038            }
1039            
1040            //MEB:
1041            
1042            CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
1043                XmlParser& parser, const String& messageId)
1044            {
1045                XmlEntry entry;
1046 kumpf 1.12     CIMException cimException;
1047 mike  1.2  
1048 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1049 mike  1.2      {
1050            	return(new CIMReferenceNamesResponseMessage(
1051            	    messageId,
1052 kumpf 1.12 	    cimException,
1053 mike  1.2  	    QueueIdStack(),
1054 kumpf 1.21 	    Array<CIMObjectPath>()));
1055 mike  1.2      }
1056 kumpf 1.14     else
1057 mike  1.2      {
1058 kumpf 1.21 	Array<CIMObjectPath> objectPaths;
1059 mike  1.2  
1060 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1061            	{
1062 kumpf 1.21 	    CIMObjectPath objectPath;
1063 kumpf 1.14 
1064            	    while (XmlReader::getObjectPathElement(parser, objectPath))
1065            	        objectPaths.append(objectPath);
1066 mike  1.2  
1067 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1068            	}
1069 mike  1.2  
1070            	return(new CIMReferenceNamesResponseMessage(
1071            	    messageId,
1072 kumpf 1.12 	    cimException,
1073 mike  1.2  	    QueueIdStack(),
1074            	    objectPaths));
1075                }
1076            }
1077            
1078            CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
1079                XmlParser& parser, const String& messageId)
1080            {
1081                XmlEntry entry;
1082 kumpf 1.12     CIMException cimException;
1083 mike  1.2  
1084 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1085 mike  1.2      {
1086            	return(new CIMReferencesResponseMessage(
1087            	    messageId,
1088 kumpf 1.12 	    cimException,
1089 mike  1.2  	    QueueIdStack(),
1090 kumpf 1.24 	    Array<CIMObject>()));
1091 mike  1.2      }
1092 kumpf 1.14     else
1093 mike  1.2      {
1094 kumpf 1.24 	Array<CIMObject> objectWithPathArray;
1095 mike  1.2  
1096 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1097            	{
1098 kumpf 1.24 	    CIMObject objectWithPath;
1099 kumpf 1.14 
1100            	    while (XmlReader::getValueObjectWithPathElement(parser, objectWithPath))
1101            	        objectWithPathArray.append(objectWithPath);
1102 mike  1.2  
1103 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1104            	}
1105 mike  1.2  
1106            	return(new CIMReferencesResponseMessage(
1107            	    messageId,
1108 kumpf 1.12 	    cimException,
1109 mike  1.2  	    QueueIdStack(),
1110            	    objectWithPathArray));
1111                }
1112            }
1113            
1114            CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
1115                XmlParser& parser, const String& messageId)
1116            {
1117                XmlEntry entry;
1118 kumpf 1.12     CIMException cimException;
1119 mike  1.2  
1120 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1121 mike  1.2      {
1122            	return(new CIMAssociatorNamesResponseMessage(
1123            	    messageId,
1124 kumpf 1.12 	    cimException,
1125 mike  1.2  	    QueueIdStack(),
1126 kumpf 1.21 	    Array<CIMObjectPath>()));
1127 mike  1.2      }
1128 kumpf 1.14     else
1129 mike  1.2      {
1130 kumpf 1.21 	Array<CIMObjectPath> objectPaths;
1131 mike  1.2  
1132 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1133            	{
1134 kumpf 1.21 	    CIMObjectPath objectPath;
1135 kumpf 1.14 
1136            	    while (XmlReader::getObjectPathElement(parser, objectPath))
1137            	        objectPaths.append(objectPath);
1138 mike  1.2  
1139 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1140            	}
1141 mike  1.2  
1142            	return(new CIMAssociatorNamesResponseMessage(
1143            	    messageId,
1144 kumpf 1.12 	    cimException,
1145 mike  1.2  	    QueueIdStack(),
1146            	    objectPaths));
1147                }
1148            }
1149            
1150            CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
1151                XmlParser& parser, const String& messageId)
1152            {
1153                XmlEntry entry;
1154 kumpf 1.12     CIMException cimException;
1155 mike  1.2  
1156 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1157 mike  1.2      {
1158            	return(new CIMAssociatorsResponseMessage(
1159            	    messageId,
1160 kumpf 1.12 	    cimException,
1161 mike  1.2  	    QueueIdStack(),
1162 kumpf 1.24 	    Array<CIMObject>()));
1163 mike  1.2      }
1164 kumpf 1.14     else
1165 mike  1.2      {
1166 kumpf 1.24 	Array<CIMObject> objectWithPathArray;
1167 mike  1.2  
1168 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1169            	{
1170 kumpf 1.24 	    CIMObject objectWithPath;
1171 mike  1.2  
1172 kumpf 1.14 	    while (XmlReader::getValueObjectWithPathElement(parser, objectWithPath))
1173            	        objectWithPathArray.append(objectWithPath);
1174            
1175            	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1176            	}
1177 mike  1.2  
1178            	return(new CIMAssociatorsResponseMessage(
1179 kumpf 1.10 	    messageId,
1180 kumpf 1.12 	    cimException,
1181 kumpf 1.10 	    QueueIdStack(),
1182            	    objectWithPathArray));
1183                }
1184            }
1185            
1186            CIMExecQueryResponseMessage* CIMOperationResponseDecoder::_decodeExecQueryResponse(
1187                XmlParser& parser, const String& messageId)
1188            {
1189                XmlEntry entry;
1190 kumpf 1.12     CIMException cimException;
1191 kumpf 1.10 
1192 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1193 kumpf 1.10     {
1194            	return(new CIMExecQueryResponseMessage(
1195            	    messageId,
1196 kumpf 1.12 	    cimException,
1197 kumpf 1.10 	    QueueIdStack(),
1198 kumpf 1.24 	    Array<CIMObject>()));
1199 kumpf 1.10     }
1200 kumpf 1.14     else
1201 kumpf 1.10     {
1202 kumpf 1.24 	Array<CIMObject> objectWithPathArray;
1203 kumpf 1.10 
1204 kumpf 1.14 	if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1205            	{
1206                        XmlReader::getObjectArray(parser, objectWithPathArray);
1207 kumpf 1.10 
1208 kumpf 1.14 	    XmlReader::expectEndTag(parser, "IRETURNVALUE");
1209            	}
1210 kumpf 1.10 
1211            	return(new CIMExecQueryResponseMessage(
1212 mike  1.2  	    messageId,
1213 kumpf 1.12 	    cimException,
1214 mike  1.2  	    QueueIdStack(),
1215            	    objectWithPathArray));
1216                }
1217            }
1218            
1219            CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
1220                XmlParser& parser, const String& messageId, const String& methodName)
1221            {
1222                XmlEntry entry;
1223 kumpf 1.12     CIMException cimException;
1224 mike  1.2  
1225 kumpf 1.5      CIMParamValue paramValue;
1226                Array<CIMParamValue> outParameters;
1227 kumpf 1.6      CIMValue returnValue;
1228 mike  1.2      const char* paramName;
1229                String inValue;
1230            
1231 kumpf 1.12     if (XmlReader::getErrorElement(parser, cimException))
1232 mike  1.2      {
1233            	return(new CIMInvokeMethodResponseMessage(
1234            	    messageId,
1235 kumpf 1.12 	    cimException,
1236 mike  1.2  	    QueueIdStack(),
1237 kumpf 1.6  	    returnValue,
1238 mike  1.2  	    outParameters,
1239            	    methodName));
1240                }
1241 kumpf 1.4      else
1242 mike  1.2      {
1243 kumpf 1.4          Boolean isReturnValue = false;
1244                    Boolean isParamValue = false;
1245                    Boolean gotReturnValue = false;
1246            
1247                    while ((isReturnValue =
1248 kumpf 1.6                      XmlReader::getReturnValueElement(parser, returnValue)) ||
1249 kumpf 1.5                 (isParamValue =
1250            		    XmlReader::getParamValueElement(parser, paramValue)))
1251 kumpf 1.4          {
1252                        if (isReturnValue)
1253                        {
1254                            if (gotReturnValue)
1255                            {
1256            	            throw XmlValidationError(parser.getLine(),
1257            	                "unexpected RETURNVALUE element");
1258                            }
1259                            gotReturnValue = true;
1260                        }
1261                        else    // isParamValue == true
1262                        {
1263 kumpf 1.5  	        outParameters.append(paramValue);
1264 kumpf 1.4              }
1265            
1266                        isReturnValue = false;
1267                        isParamValue = false;
1268                    }
1269            
1270 mike  1.2  	return(new CIMInvokeMethodResponseMessage(
1271            	    messageId,
1272 kumpf 1.12 	    cimException,
1273 mike  1.2  	    QueueIdStack(),
1274 kumpf 1.6  	    returnValue,
1275 mike  1.2  	    outParameters,
1276            	    methodName));
1277                }
1278            }
1279            
1280            PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2