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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2