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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2