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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2