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

   1 karl  1.65 //%2005////////////////////////////////////////////////////////////////////////
   2 mike  1.2  //
   3 karl  1.61 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   4            // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   6 karl  1.51 // IBM Corp.; EMC Corporation, The Open Group.
   7 karl  1.61 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9 karl  1.65 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11 mike  1.2  //
  12            // Permission is hereby granted, free of charge, to any person obtaining a copy
  13            // of this software and associated documentation files (the "Software"), to
  14            // deal in the Software without restriction, including without limitation the
  15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  16            // sell copies of the Software, and to permit persons to whom the Software is
  17            // furnished to do so, subject to the following conditions:
  18 kumpf 1.25 // 
  19 mike  1.2  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  20            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  21            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  22            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  23            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  24            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  25            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27            //
  28            //==============================================================================
  29            //
  30            // Author: Mike Brasher (mbrasher@bmc.com)
  31            //
  32            // Modified By: Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
  33            //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
  34            //              Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
  35            //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
  36 kumpf 1.23 //              Carol Ann Krug Graves, Hewlett-Packard Company
  37            //                  (carolann_graves@hp.com)
  38 kumpf 1.36 //              Sushma Fernandes, Hewlett-Packard Company
  39            //                  (sushma_fernandes@hp.com)
  40 david 1.38 //              Dave Rosckes (rosckes@us.ibm.com)
  41 kumpf 1.60 //              Seema Gupta (gseema@in.ibm.com) for PEP135
  42            //              Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase1
  43 w.white 1.64 //              Willis White, IBM (whiwill@us.ibm.com)
  44 j.alex  1.68 //              John Alex, IBM (johnalex@us.ibm.com) - Bug#2290
  45 mike    1.2  //
  46              //%/////////////////////////////////////////////////////////////////////////////
  47              
  48              #include <Pegasus/Common/Config.h>
  49              #include <iostream>
  50 kumpf   1.15 #include <Pegasus/Common/Constants.h>
  51 mike    1.2  #include <Pegasus/Common/XmlParser.h>
  52              #include <Pegasus/Common/XmlReader.h>
  53              #include <Pegasus/Common/System.h>
  54              #include <Pegasus/Common/XmlWriter.h>
  55              #include <Pegasus/Common/HTTPMessage.h>
  56              #include <Pegasus/Common/CIMMessage.h>
  57 kumpf   1.60 #include <Pegasus/Common/Exception.h>
  58 mike    1.2  #include "CIMOperationResponseDecoder.h"
  59              
  60 w.white 1.64 
  61 humberto 1.43 // l10n
  62 w.white  1.64 #include <Pegasus/Common/MessageLoader.h> 
  63               
  64               
  65 humberto 1.43 
  66 mike     1.2  PEGASUS_USING_STD;
  67               
  68               PEGASUS_NAMESPACE_BEGIN
  69               
  70               CIMOperationResponseDecoder::CIMOperationResponseDecoder(
  71                   MessageQueue* outputQueue,
  72                   MessageQueue* encoderQueue,
  73 karl     1.41     ClientAuthenticator* authenticator,
  74                   Uint32 showInput)
  75 mike     1.2      :
  76 kumpf    1.16     MessageQueue(PEGASUS_QUEUENAME_OPRESPDECODER),
  77 mike     1.2      _outputQueue(outputQueue),
  78                   _encoderQueue(encoderQueue),
  79 karl     1.41     _authenticator(authenticator),
  80                   _showInput(showInput)
  81 mike     1.2  {
  82 j.alex   1.68 
  83 mike     1.2  }
  84               
  85               CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
  86               {
  87               
  88               }
  89               
  90               void  CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
  91               {
  92                   _encoderQueue = encoderQueue;
  93               }
  94               
  95               void CIMOperationResponseDecoder::handleEnqueue()
  96               {
  97                   Message* message = dequeue();
  98               
  99                   if (!message)
 100 kumpf    1.60         return;
 101 mike     1.2  
 102                   switch (message->getType())
 103                   {
 104 kumpf    1.60         case HTTP_MESSAGE:
 105                       {
 106                           HTTPMessage* httpMessage = (HTTPMessage*)message;
 107                           _handleHTTPMessage(httpMessage);
 108                           break;
 109                       }
 110 mike     1.2  
 111 kumpf    1.60         default:
 112 kumpf    1.17             PEGASUS_ASSERT(0);
 113 kumpf    1.60             break;
 114 mike     1.2      }
 115               
 116                   delete message;
 117               }
 118               
 119 a.dunfey 1.73 void CIMOperationResponseDecoder::setDataStorePointer(
 120                   ClientPerfDataStore* perfDataStore_ptr)
 121               {   dataStore = perfDataStore_ptr;
 122               }
 123               
 124 mike     1.2  void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
 125               {
 126                   //
 127                   // Parse the HTTP message:
 128                   //
 129 w.white  1.67     TimeValue networkEndTime = TimeValue::getCurrentTime();
 130 w.white  1.64 
 131 j.alex   1.68     String  connectClose;
 132                   String  startLine;
 133 mike     1.2      Array<HTTPHeader> headers;
 134 j.alex   1.68     char*   content;
 135                   Uint32  contentLength;
 136                   Boolean cimReconnect=false;
 137 mike     1.2  
 138 kumpf    1.19     if (httpMessage->message.size() == 0)
 139 kumpf    1.60     {
 140                       // l10n
 141               
 142                       // CIMClientMalformedHTTPException* malformedHTTPException =
 143                       //   new CIMClientMalformedHTTPException("Empty HTTP response message.");
 144               
 145                       MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EMPTY_RESPONSE", "Empty HTTP response message.");
 146                       String mlString(MessageLoader::getMessage(mlParms));
 147               
 148                       CIMClientMalformedHTTPException* malformedHTTPException =
 149                           new CIMClientMalformedHTTPException(mlString);
 150               
 151                       ClientExceptionMessage * response =
 152                           new ClientExceptionMessage(malformedHTTPException);
 153               
 154                       _outputQueue->enqueue(response);
 155                       return;
 156                   }
 157 kumpf    1.19 
 158 j.alex   1.68 
 159 mike     1.2      httpMessage->parse(startLine, headers, contentLength);
 160               
 161 kumpf    1.19     //
 162 j.alex   1.68     // Check for Connection: Close 
 163                   //
 164 j.alex   1.69     if (HTTPMessage::lookupHeader(headers, "Connection", connectClose, false))
 165 j.alex   1.68     {
 166                       if (String::equalNoCase(connectClose, "Close"))
 167                       {
 168                           //reconnect and then resend next request.
 169                           cimReconnect=true;
 170                       }
 171                   }
 172                   //
 173 kumpf    1.19     // Get the status line info
 174                   //
 175                   String httpVersion;
 176                   Uint32 statusCode;
 177                   String reasonPhrase;
 178               
 179                   Boolean parsableMessage = HTTPMessage::parseStatusLine(
 180                       startLine, httpVersion, statusCode, reasonPhrase);
 181                   if (!parsableMessage)
 182                   {
 183 kumpf    1.60         // l10n
 184               
 185                       // CIMClientMalformedHTTPException* malformedHTTPException = new
 186                       //   CIMClientMalformedHTTPException("Malformed HTTP response message.");
 187               
 188                       MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.MALFORMED_RESPONSE", "Malformed HTTP response message.");
 189                       String mlString(MessageLoader::getMessage(mlParms));
 190               
 191                       CIMClientMalformedHTTPException* malformedHTTPException =
 192                           new CIMClientMalformedHTTPException(mlString);
 193 kumpf    1.19 
 194 kumpf    1.60         ClientExceptionMessage * response =
 195                           new ClientExceptionMessage(malformedHTTPException);
 196 j.alex   1.68       
 197                       response->setCloseConnect(cimReconnect);
 198 humberto 1.43 
 199 kumpf    1.60         _outputQueue->enqueue(response);
 200                       return;
 201 kumpf    1.19     }
 202               
 203 karl     1.41 #ifdef PEGASUS_CLIENT_TRACE_ENABLE
 204                   if (_showInput & 1)
 205                   {
 206                       cout << "CIMOperatonResponseDecoder";
 207                       httpMessage->printAll(cout);
 208                   }
 209                   if (_showInput & 2)
 210                   {
 211                       Uint32 size = httpMessage->message.size();
 212                       char* tmpBuf = new char[size+1];
 213               
 214                       strncpy( tmpBuf, httpMessage->message.getData(), size );
 215                       tmpBuf[size] = '\0';
 216                       Logger::put(Logger::STANDARD_LOG,
 217 kumpf    1.60             "CIMCLIENT",
 218                           Logger::TRACE,
 219                           "CIMOperationRequestDecoder::Response, XML content: $1",
 220                           tmpBuf);
 221 karl     1.41         delete []tmpBuf;
 222                   }
 223               #endif
 224               
 225 kumpf    1.8      try
 226 mike     1.2      {
 227 kumpf    1.8          if (_authenticator->checkResponseHeaderForChallenge(headers))
 228                       {
 229                           //
 230                           // Get the original request, put that in the encoder's queue for
 231                           // re-sending with authentication challenge response.
 232                           //
 233 kumpf    1.70             Message* reqMessage = _authenticator->releaseRequestMessage();
 234               
 235 j.alex   1.69             if (cimReconnect == true)
 236                           {
 237 kumpf    1.70                 reqMessage->setCloseConnect(cimReconnect);
 238 j.alex   1.69                 _outputQueue->enqueue(reqMessage);
 239                           } 
 240                           else 
 241                           {
 242                               _encoderQueue->enqueue(reqMessage);
 243                           }
 244 mike     1.2  
 245 kumpf    1.8              return;
 246                       }
 247                       else
 248                       {
 249                           //
 250                           // Received a valid/error response from the server.
 251                           // We do not need the original request message anymore, hence delete
 252                           // the request message by getting the handle from the ClientAuthenticator.
 253                           //
 254 kumpf    1.70             Message* reqMessage = _authenticator->releaseRequestMessage();
 255                           delete reqMessage;
 256 kumpf    1.8          }
 257 mike     1.2      }
 258 kumpf    1.8      catch(InvalidAuthHeader& e)
 259 mike     1.2      {
 260 kumpf    1.20         CIMClientMalformedHTTPException* malformedHTTPException =
 261                           new CIMClientMalformedHTTPException(e.getMessage());
 262 kumpf    1.17         ClientExceptionMessage * response =
 263                           new ClientExceptionMessage(malformedHTTPException);
 264 mike     1.2  
 265 j.alex   1.68         response->setCloseConnect(cimReconnect);
 266 kumpf    1.17         _outputQueue->enqueue(response);
 267 kumpf    1.15         return;
 268                   }
 269 kumpf    1.36 
 270 kumpf    1.52     // We have the response.  If authentication failed, we will generate a
 271                   // CIMClientHTTPErrorException below with the "401 Unauthorized" status
 272                   // in the (re-challenge) response.
 273 kumpf    1.15 
 274                   //
 275                   // Check for a success (200 OK) response
 276                   //
 277 kumpf    1.17     if (statusCode != HTTP_STATUSCODE_OK)
 278 kumpf    1.15     {
 279                       String cimError;
 280                       String pegasusError;
 281               
 282 brian.campbell 1.57         HTTPMessage::lookupHeader(headers, "CIMError", cimError, true);
 283 kumpf          1.15         HTTPMessage::lookupHeader(headers, PEGASUS_HTTPHEADERTAG_ERRORDETAIL, pegasusError);
 284 kumpf          1.35         try
 285                             {
 286                                 pegasusError = XmlReader::decodeURICharacters(pegasusError);
 287                             }
 288 brian.campbell 1.57         catch (ParseError&)
 289 kumpf          1.35         {
 290                                 // Ignore this exception.  We're more interested in having the
 291                                 // message in encoded form than knowing that the format is invalid.
 292                             }
 293 kumpf          1.15 
 294 kumpf          1.32         CIMClientHTTPErrorException* httpError =
 295 kumpf          1.54             new CIMClientHTTPErrorException(statusCode, reasonPhrase,
 296                                                                 cimError, pegasusError);
 297 kumpf          1.17         ClientExceptionMessage * response =
 298                                 new ClientExceptionMessage(httpError);
 299 kumpf          1.15 
 300 j.alex         1.68         response->setCloseConnect(cimReconnect);
 301 kumpf          1.15         _outputQueue->enqueue(response);
 302 kumpf          1.8          return;
 303 mike           1.2      }
 304                     
 305                         //
 306                         // Search for "CIMOperation" header:
 307                         //
 308                         String cimOperation;
 309                     
 310                         if (!HTTPMessage::lookupHeader(
 311 kumpf          1.60         headers, "CIMOperation", cimOperation, true))
 312 mike           1.2      {
 313 humberto       1.43       // l10n
 314                     
 315                           // CIMClientMalformedHTTPException* malformedHTTPException = new
 316                           //   CIMClientMalformedHTTPException("Missing CIMOperation HTTP header");
 317                     
 318 humberto       1.44       MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.MISSING_CIMOP_HEADER", "Missing CIMOperation HTTP header");
 319 humberto       1.43       String mlString(MessageLoader::getMessage(mlParms));
 320 kumpf          1.60 
 321 humberto       1.43       CIMClientMalformedHTTPException* malformedHTTPException = new
 322 kumpf          1.60         CIMClientMalformedHTTPException(mlString);
 323                     
 324 kumpf          1.17         ClientExceptionMessage * response =
 325                                 new ClientExceptionMessage(malformedHTTPException);
 326                     
 327 j.alex         1.68         response->setCloseConnect(cimReconnect);
 328                     
 329 kumpf          1.17         _outputQueue->enqueue(response);
 330                             return;
 331 mike           1.2      }
 332                     
 333 chuck          1.39 
 334 brian.campbell 1.62 		// l10n start
 335 kumpf          1.60 // l10n end
 336 david          1.42     //
 337                         // Search for "Content-Type" header:
 338                         //
 339 kumpf          1.60 
 340                         // BUG 572, Use of Content-Type header and change error msg.
 341                         // If header exists, test type.  If not, ignore. We will find
 342                         // content type errors in text analysis.
 343                         // content-type header  value format:
 344                         //              type "/" subtype *( ";" parameter )
 345                         // ex. text/xml;Charset="utf8"
 346                         String cimContentType;
 347                     
 348                         if (HTTPMessage::lookupHeader(
 349                                 headers, "Content-Type", cimContentType, true))
 350                         {
 351                             Uint32 len;
 352                             String contentTypeValue;
 353                             if ((len = cimContentType.find(';')) != PEG_NOT_FOUND)
 354                                 contentTypeValue = cimContentType.subString(0,len);
 355                             else
 356                                 contentTypeValue = cimContentType;
 357                     
 358                             if (!String::equalNoCase(contentTypeValue, "text/xml") &&
 359                                 !String::equalNoCase(contentTypeValue, "application/xml"))
 360 kumpf          1.60         {
 361                                 CIMClientMalformedHTTPException* malformedHTTPException = new
 362                                     CIMClientMalformedHTTPException
 363                                         ("Bad Content-Type HTTP header; " + contentTypeValue);
 364                                 ClientExceptionMessage * response =
 365                                     new ClientExceptionMessage(malformedHTTPException);
 366                     
 367 j.alex         1.68             response->setCloseConnect(cimReconnect);
 368                     
 369 kumpf          1.60             _outputQueue->enqueue(response);
 370                                 return;
 371                             }
 372                         }
 373                         // comment out the error rejection code if the content-type header does
 374                         //    not exist
 375 karl           1.48 #ifdef PEGASUS_REJECT_ON_MISSING_CONTENTTYPE_HEADER
 376 kumpf          1.60     else
 377                         {
 378                             CIMClientMalformedHTTPException* malformedHTTPException = new
 379                                 CIMClientMalformedHTTPException
 380                                     ("Missing Content-Type HTTP header; ");
 381                             ClientExceptionMessage * response =
 382                                 new ClientExceptionMessage(malformedHTTPException);
 383                     
 384 j.alex         1.68         response->setCloseConnect(cimReconnect);
 385                     
 386 kumpf          1.60         _outputQueue->enqueue(response);
 387                             return;
 388                         }
 389 karl           1.48 #endif
 390 kumpf          1.60 
 391                         // look for any cim status codes. The HTTPConnection level would have
 392                         // added them here.
 393                     
 394                         String cimStatusCodeValue;
 395                         Boolean found = HTTPMessage::lookupHeader(headers, "CIMStatusCode",
 396                             cimStatusCodeValue, true);
 397                         CIMStatusCode cimStatusCodeNumber = CIM_ERR_SUCCESS;
 398                     
 399                         if (found == true &&
 400                             (cimStatusCodeNumber = (CIMStatusCode)
 401                              atoi(cimStatusCodeValue.getCString())) != CIM_ERR_SUCCESS)
 402                         {
 403                             String cimStatusCodeDescription;
 404                             found = HTTPMessage::lookupHeader(headers, "CIMStatusCodeDescription",
 405                                 cimStatusCodeDescription, true);
 406                             if (found == true && cimStatusCodeDescription.size() > 0)
 407                             {
 408                                 try
 409                                 {
 410                                     cimStatusCodeDescription =
 411 kumpf          1.60                     XmlReader::decodeURICharacters(cimStatusCodeDescription);
 412                                 }
 413                                 catch (ParseError&)
 414                                 {
 415                                 }
 416                             } // if there is a description with the code
 417                     
 418                             CIMException* cimStatusException =
 419                                 new CIMException(cimStatusCodeNumber,cimStatusCodeDescription);
 420 brian.campbell 1.62         cimStatusException->setContentLanguages(httpMessage->contentLanguages);
 421 kumpf          1.60         ClientExceptionMessage * response =
 422                                 new ClientExceptionMessage(cimStatusException);
 423 j.alex         1.68   
 424                             response->setCloseConnect(cimReconnect);
 425                     
 426 kumpf          1.60         _outputQueue->enqueue(response);
 427                             return;
 428                         }
 429 w.white        1.64     String serverTime;
 430                         if(HTTPMessage::lookupHeader(headers, "WBEMServerResponseTime", serverTime, true))
 431                         {
 432                             Uint32 sTime = (Uint32) atol(serverTime.getCString());
 433                             dataStore->setServerTime(sTime);
 434                         }
 435                     
 436 brian.campbell 1.59 
 437 mike           1.2      //
 438                         // Zero-terminate the message:
 439                         //
 440                         httpMessage->message.append('\0');
 441 keith.petley   1.40 
 442 mike           1.2      // Calculate the beginning of the content from the message size and
 443                         // the content length.  Subtract 1 to take into account the null
 444                         // character we just added to the end of the message.
 445                     
 446 david.dillard  1.63     content = (char *) httpMessage->message.getData() +
 447 karl           1.41         httpMessage->message.size() - contentLength - 1;
 448 mike           1.2  
 449                         //
 450                         // If it is a method response, then dispatch it to be handled:
 451                         //
 452                     
 453                         if (!String::equalNoCase(cimOperation, "MethodResponse"))
 454                         {
 455 kumpf          1.60         // l10n
 456 humberto       1.43 
 457 kumpf          1.60         // CIMClientMalformedHTTPException* malformedHTTPException =
 458                             //   new CIMClientMalformedHTTPException(
 459                             //        String("Received CIMOperation HTTP header value \"") +
 460                             //        cimOperation + "\", expected \"MethodResponse\"");
 461 humberto       1.43 
 462 kumpf          1.60         MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_METHODRESPONSE", "Received CIMOperation HTTP header value \"$1\", expected \"MethodResponse\"", cimOperation);
 463                             String mlString(MessageLoader::getMessage(mlParms));
 464 humberto       1.43 
 465 kumpf          1.60         CIMClientMalformedHTTPException* malformedHTTPException =
 466                                 new CIMClientMalformedHTTPException(mlString);
 467 humberto       1.43 
 468 kumpf          1.60         ClientExceptionMessage * response =
 469                                 new ClientExceptionMessage(malformedHTTPException);
 470 kumpf          1.17 
 471 j.alex         1.68         response->setCloseConnect(cimReconnect);
 472                     
 473 kumpf          1.17         _outputQueue->enqueue(response);
 474                             return;
 475 mike           1.2      }
 476                     
 477 w.white        1.64     dataStore->setResponseSize(contentLength);
 478                         dataStore->setEndNetworkTime(networkEndTime);
 479                         //dataStore->print();
 480 j.alex         1.68     _handleMethodResponse(content, httpMessage->contentLanguages,cimReconnect);  // l10n
 481 mike           1.2  }
 482                     
 483 j.alex         1.68 void CIMOperationResponseDecoder::_handleMethodResponse(
 484                         char* content,
 485 kumpf          1.72     const ContentLanguageList& contentLanguages,
 486 j.alex         1.68     Boolean cimReconnect) //l10n
 487 mike           1.2  {
 488                         Message* response = 0;
 489                     
 490                         //
 491                         // Create and initialize XML parser:
 492                         //
 493                     
 494                         XmlParser parser((char*)content);
 495                         XmlEntry entry;
 496                     
 497                         try
 498                         {
 499 kumpf          1.60         //
 500                             // Process <?xml ... >
 501                             //
 502 mike           1.2  
 503 kumpf          1.11         const char* xmlVersion = 0;
 504                             const char* xmlEncoding = 0;
 505                     
 506 kumpf          1.60         XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
 507 mike           1.2  
 508 kumpf          1.60         //
 509                             // Process <CIM ... >
 510                             //
 511 mike           1.2  
 512 kumpf          1.9          const char* cimVersion = 0;
 513                             const char* dtdVersion = 0;
 514                     
 515 kumpf          1.17         // ATTN-RK-P3-20020416: Need to validate these versions?
 516 kumpf          1.60         XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
 517 mike           1.2  
 518 kumpf          1.60         //
 519                             // Expect <MESSAGE ... >
 520                             //
 521 mike           1.2  
 522 kumpf          1.60         String messageId;
 523                             String protocolVersion;
 524 mike           1.2  
 525 kumpf          1.60         if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
 526                             {
 527                                 // l10n
 528 humberto       1.43 
 529 kumpf          1.60             // throw XmlValidationError(
 530                                 // parser.getLine(), "expected MESSAGE element");
 531 humberto       1.43 
 532 kumpf          1.60             MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_MESSAGE_ELEMENT",
 533                                     "expected MESSAGE element");
 534 humberto       1.43 
 535 kumpf          1.60             throw XmlValidationError(parser.getLine(), mlParms);
 536                             }
 537 humberto       1.43 
 538 mike           1.2  
 539 david.dillard  1.71         //
 540                             // This code for checking the protocol version was taken from the server code.
 541                             //
 542                             Boolean protocolVersionAccepted = false;
 543                     
 544                             if ((protocolVersion.size() >= 3) &&
 545                                (protocolVersion[0] == '1') &&
 546                                (protocolVersion[1] == '.'))
 547                             {
 548                                // Verify that all characters after the '.' are digits
 549                                Uint32 index = 2;
 550                                while ((index < protocolVersion.size()) &&
 551                                       (protocolVersion[index] >= '0') &&
 552                                       (protocolVersion[index] <= '9'))
 553                                {
 554                                   index++;
 555                                }
 556                     
 557                                if (index == protocolVersion.size())
 558                                {
 559                                   protocolVersionAccepted = true;
 560 david.dillard  1.71            }
 561                             }
 562 humberto       1.43 
 563 david.dillard  1.71         if (!protocolVersionAccepted)
 564                             {
 565                                 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.UNSUPPORTED_PROTOCOL", "Received unsupported protocol version \"$0\", expected \"$1\"", protocolVersion, "1.[0-9]+");
 566 kumpf          1.60             String mlString(MessageLoader::getMessage(mlParms));
 567 humberto       1.43 
 568 kumpf          1.60             CIMClientResponseException* responseException =
 569                                     new CIMClientResponseException(mlString);
 570 humberto       1.43 
 571 kumpf          1.17             ClientExceptionMessage * response =
 572                                     new ClientExceptionMessage(responseException);
 573 mike           1.2  
 574 j.alex         1.68             response->setCloseConnect(cimReconnect);
 575                     
 576 kumpf          1.17             _outputQueue->enqueue(response);
 577                                 return;
 578 kumpf          1.60         }
 579                     
 580                             //
 581                             // Expect <SIMPLERSP ... >
 582                             //
 583                     
 584                             XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
 585                     
 586                             //
 587                             // Expect <IMETHODRESPONSE ... >
 588                             //
 589 mike           1.2  
 590 kumpf          1.60         const char* iMethodResponseName = 0;
 591                             Boolean isEmptyTag = false;
 592 humberto       1.43 
 593 kumpf          1.60         if (XmlReader::getIMethodResponseStartTag(
 594                                     parser, iMethodResponseName, isEmptyTag))
 595                             {
 596                                 //
 597                                 // Dispatch the method:
 598                                 //
 599                     
 600                                 if (System::strcasecmp(iMethodResponseName, "GetClass") == 0)
 601                                     response = _decodeGetClassResponse(
 602                                         parser, messageId, isEmptyTag);
 603                                 else if (System::strcasecmp(iMethodResponseName, "GetInstance") == 0)
 604                                     response = _decodeGetInstanceResponse(
 605                                         parser, messageId, isEmptyTag);
 606                                 else if (System::strcasecmp(iMethodResponseName, "EnumerateClassNames") == 0)
 607                                     response = _decodeEnumerateClassNamesResponse(
 608                                         parser, messageId, isEmptyTag);
 609                                 else if (System::strcasecmp(iMethodResponseName, "References") == 0)
 610                                     response = _decodeReferencesResponse(
 611                                         parser, messageId, isEmptyTag);
 612                                 else if (System::strcasecmp(iMethodResponseName, "ReferenceNames") == 0)
 613                                     response = _decodeReferenceNamesResponse(
 614 kumpf          1.60                     parser, messageId, isEmptyTag);
 615                                 else if (System::strcasecmp(iMethodResponseName, "AssociatorNames") == 0)
 616                                     response = _decodeAssociatorNamesResponse(
 617                                         parser, messageId, isEmptyTag);
 618                                 else if (System::strcasecmp(iMethodResponseName, "Associators") == 0)
 619                                     response = _decodeAssociatorsResponse(
 620                                         parser, messageId, isEmptyTag);
 621                                 else if (System::strcasecmp(iMethodResponseName, "CreateInstance") == 0)
 622                                     response = _decodeCreateInstanceResponse(
 623                                         parser, messageId, isEmptyTag);
 624                                 else if (System::strcasecmp(iMethodResponseName,"EnumerateInstanceNames") == 0)
 625                                     response = _decodeEnumerateInstanceNamesResponse(
 626                                         parser, messageId, isEmptyTag);
 627                                 else if (System::strcasecmp(iMethodResponseName,"EnumerateInstances") == 0)
 628                                     response = _decodeEnumerateInstancesResponse(
 629                                         parser, messageId, isEmptyTag);
 630                                 else if (System::strcasecmp(iMethodResponseName, "GetProperty") == 0)
 631                                     response = _decodeGetPropertyResponse(
 632                                         parser, messageId, isEmptyTag);
 633                                 else if (System::strcasecmp(iMethodResponseName, "SetProperty") == 0)
 634                                     response = _decodeSetPropertyResponse(
 635 kumpf          1.60                     parser, messageId, isEmptyTag);
 636                                 else if (System::strcasecmp(iMethodResponseName, "DeleteQualifier") == 0)
 637                                     response = _decodeDeleteQualifierResponse(
 638                                         parser, messageId, isEmptyTag);
 639                                 else if (System::strcasecmp(iMethodResponseName, "GetQualifier") == 0)
 640                                     response = _decodeGetQualifierResponse(
 641                                         parser, messageId, isEmptyTag);
 642                                 else if (System::strcasecmp(iMethodResponseName, "SetQualifier") == 0)
 643                                     response = _decodeSetQualifierResponse(
 644                                         parser, messageId, isEmptyTag);
 645                                 else if (System::strcasecmp(iMethodResponseName, "EnumerateQualifiers") == 0)
 646                                     response = _decodeEnumerateQualifiersResponse(
 647                                         parser, messageId, isEmptyTag);
 648                                 else if (System::strcasecmp(iMethodResponseName, "EnumerateClasses") == 0)
 649                                     response = _decodeEnumerateClassesResponse(
 650                                         parser, messageId, isEmptyTag);
 651                                 else if (System::strcasecmp(iMethodResponseName, "CreateClass") == 0)
 652                                     response = _decodeCreateClassResponse(
 653                                         parser, messageId, isEmptyTag);
 654                                 else if (System::strcasecmp(iMethodResponseName, "ModifyClass") == 0)
 655                                     response = _decodeModifyClassResponse(
 656 kumpf          1.60                     parser, messageId, isEmptyTag);
 657                                 else if (System::strcasecmp(iMethodResponseName, "ModifyInstance") == 0)
 658                                     response = _decodeModifyInstanceResponse(
 659                                         parser, messageId, isEmptyTag);
 660                                 else if (System::strcasecmp(iMethodResponseName, "DeleteClass") == 0)
 661                                     response = _decodeDeleteClassResponse(
 662                                         parser, messageId, isEmptyTag);
 663                                 else if (System::strcasecmp(iMethodResponseName, "DeleteInstance") == 0)
 664                                     response = _decodeDeleteInstanceResponse(
 665                                         parser, messageId, isEmptyTag);
 666                                 else if (System::strcasecmp(iMethodResponseName, "ExecQuery") == 0)
 667                                     response = _decodeExecQueryResponse(
 668                                         parser, messageId, isEmptyTag);
 669                                 else
 670                                 {
 671                                     // l10n
 672 humberto       1.43 
 673 mike           1.2                  // Unrecognized IMethodResponse name attribute
 674 kumpf          1.60                 // throw XmlValidationError(parser.getLine(),
 675                                     //   String("Unrecognized IMethodResponse name \"") +
 676                                     //        iMethodResponseName + "\"");
 677                     
 678                                     MessageLoaderParms mlParms(
 679                                         "Client.CIMOperationResponseDecoder.UNRECOGNIZED_NAME",
 680                                         "Unrecognized IMethodResponse name \"$0\"",
 681                                         iMethodResponseName);
 682                                     throw XmlValidationError(parser.getLine(), mlParms);
 683                                 }
 684 humberto       1.43 
 685 kumpf          1.60             //
 686                                 // Handle end tag:
 687                                 //
 688 humberto       1.43 
 689 kumpf          1.60             if (!isEmptyTag)
 690                                 {
 691                                     XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
 692                                 }
 693                             }
 694                             else if (XmlReader::getMethodResponseStartTag(
 695                                          parser, iMethodResponseName, isEmptyTag))
 696                             {
 697                                 response = _decodeInvokeMethodResponse(
 698                                     parser, messageId, iMethodResponseName, isEmptyTag);
 699                     
 700 j.alex         1.68 
 701 kumpf          1.60             //
 702                                 // Handle end tag:
 703                                 //
 704                                 if (!isEmptyTag)
 705                                 {
 706                                     XmlReader::expectEndTag(parser, "METHODRESPONSE");
 707                                 }
 708                             }
 709                             else
 710                             {
 711                                 // l10n
 712 humberto       1.43 
 713 kumpf          1.60             // throw XmlValidationError(parser.getLine(),
 714                                 //   "expected METHODRESPONSE or IMETHODRESPONSE element");
 715                     
 716                                 MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_METHODRESPONSE_OR_IMETHODRESPONSE_ELEMENT",
 717                                     "expected METHODRESPONSE or IMETHODRESPONSE element");
 718                     
 719                                 throw XmlValidationError(parser.getLine(), mlParms);
 720                             }
 721 mike           1.2  
 722                             //
 723                             // Handle end tags:
 724                             //
 725 kumpf          1.60         XmlReader::expectEndTag(parser, "SIMPLERSP");
 726                             XmlReader::expectEndTag(parser, "MESSAGE");
 727                             XmlReader::expectEndTag(parser, "CIM");
 728 mike           1.2      }
 729 kumpf          1.17     catch (XmlException& x)
 730                         {
 731 kumpf          1.60         Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
 732                                 "CIMOperationResponseDecoder::_handleMethodResponse - XmlException has occurred. Message: $0",x.getMessage());
 733 david          1.38 
 734 kumpf          1.17         if (response)
 735                             {
 736 karl           1.41 //#ifdef PEGASUS_SNIA_INTEROP_TEST
 737                     //         httpMessage->printAll(cout);
 738                     //#endif
 739 kumpf          1.60 
 740 kumpf          1.17             delete response;
 741                             }
 742                     
 743                             response = new ClientExceptionMessage(
 744 kumpf          1.20             new CIMClientXmlException(x.getMessage()));
 745 kumpf          1.17     }
 746 mike           1.2      catch (Exception& x)
 747                         {
 748 kumpf          1.50         // Might get MalformedObjectNameException, InvalidNameException, etc.
 749 kumpf          1.17 
 750                             if (response)
 751                             {
 752                                 delete response;
 753                             }
 754 mike           1.2  
 755 kumpf          1.17         response = new ClientExceptionMessage(
 756 kumpf          1.53             new CIMClientResponseException(x.getMessage()));
 757 mike           1.2      }
 758 chuck          1.39 
 759                     //l10n start
 760                     // l10n TODO - might want to move A-L and C-L to Message
 761                     // to make this more maintainable
 762 kumpf          1.60     // Add the language header to the request
 763                         CIMMessage * cimmsg = dynamic_cast<CIMMessage *>(response);
 764                         if (cimmsg != NULL)
 765                         {
 766                             cimmsg->operationContext.set(ContentLanguageListContainer(contentLanguages));
 767                         }
 768                         else
 769                         {
 770                             ;    // l10n TODO - error back to client here
 771                         }
 772                     // l10n end
 773 mike           1.2  
 774 j.alex         1.68     response->setCloseConnect(cimReconnect);
 775                     
 776                     
 777 mike           1.2      _outputQueue->enqueue(response);
 778                     }
 779                     
 780                     CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
 781 kumpf          1.60     XmlParser& parser,
 782                         const String& messageId,
 783                         Boolean isEmptyImethodresponseTag)
 784 mike           1.2  {
 785                         XmlEntry entry;
 786 kumpf          1.12     CIMException cimException;
 787 mike           1.2  
 788 kumpf          1.60     if (!isEmptyImethodresponseTag)
 789 mike           1.2      {
 790 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
 791                             {
 792                                 return(new CIMCreateClassResponseMessage(
 793                                     messageId,
 794                                     cimException,
 795                                     QueueIdStack()));
 796                             }
 797 mike           1.2  
 798 kumpf          1.60         if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 799                             {
 800                                 if (entry.type != XmlEntry::EMPTY_TAG)
 801                                 {
 802                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
 803                                 }
 804                             }
 805 mike           1.2      }
 806 kumpf          1.60 
 807                         return(new CIMCreateClassResponseMessage(
 808                             messageId,
 809                             cimException,
 810                             QueueIdStack()));
 811 mike           1.2  }
 812                     
 813                     CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
 814 kumpf          1.60     XmlParser& parser,
 815                         const String& messageId,
 816                         Boolean isEmptyImethodresponseTag)
 817 mike           1.2  {
 818                         XmlEntry entry;
 819 kumpf          1.12     CIMException cimException;
 820 mike           1.2  
 821 kumpf          1.60     if (isEmptyImethodresponseTag)
 822                         {
 823                             MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
 824                                 "Expected open of $0 element", "IMETHODRESPONSE");
 825                             throw XmlValidationError(parser.getLine(), mlParms);
 826                         }
 827                         else if (XmlReader::getErrorElement(parser, cimException))
 828 mike           1.2      {
 829 kumpf          1.60         return(new CIMGetClassResponseMessage(
 830                                 messageId,
 831                                 cimException,
 832                                 QueueIdStack(),
 833                                 CIMClass()));
 834 mike           1.2      }
 835 kumpf          1.37     else if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 836 mike           1.2      {
 837 kumpf          1.60         CIMClass cimClass;
 838 mike           1.2  
 839 kumpf          1.60         if ((entry.type == XmlEntry::EMPTY_TAG) ||
 840                                 !XmlReader::getClassElement(parser, cimClass))
 841                             {
 842                                 // l10n
 843 humberto       1.43 
 844 kumpf          1.60             // throw XmlValidationError(parser.getLine(),"expected CLASS element");
 845 humberto       1.43 
 846 kumpf          1.60             MessageLoaderParms mlParms(
 847                                     "Client.CIMOperationResponseDecoder.EXPECTED_CLASS_ELEMENT",
 848                                     "expected CLASS element");
 849                                 throw XmlValidationError(parser.getLine(), mlParms);
 850                             }
 851 humberto       1.43 
 852 kumpf          1.60         XmlReader::expectEndTag(parser, "IRETURNVALUE");
 853 humberto       1.43 
 854 kumpf          1.60         return(new CIMGetClassResponseMessage(
 855                                 messageId,
 856                                 cimException,
 857                                 QueueIdStack(),
 858                                 cimClass));
 859 mike           1.2      }
 860                         else
 861                         {
 862 kumpf          1.60         // l10n
 863 humberto       1.43 
 864 kumpf          1.60         // throw XmlValidationError(parser.getLine(),
 865                             //   "expected ERROR or IRETURNVALUE element");
 866 humberto       1.43 
 867 kumpf          1.60         MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
 868                                 "expected ERROR or IRETURNVALUE element");
 869 humberto       1.43 
 870 kumpf          1.60         throw XmlValidationError(parser.getLine(), mlParms);
 871 mike           1.2      }
 872                     }
 873                     
 874                     CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
 875 kumpf          1.60     XmlParser& parser,
 876                         const String& messageId,
 877                         Boolean isEmptyImethodresponseTag)
 878 mike           1.2  {
 879                         XmlEntry entry;
 880 kumpf          1.12     CIMException cimException;
 881 mike           1.2  
 882 kumpf          1.60     if (!isEmptyImethodresponseTag)
 883 mike           1.2      {
 884 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
 885                             {
 886                                 return(new CIMModifyClassResponseMessage(
 887                                     messageId,
 888                                     cimException,
 889                                     QueueIdStack()));
 890                             }
 891                     
 892                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 893                             {
 894                                 if (entry.type != XmlEntry::EMPTY_TAG)
 895                                 {
 896                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
 897                                 }
 898                             }
 899 mike           1.2      }
 900 kumpf          1.60 
 901                         return(new CIMModifyClassResponseMessage(
 902                             messageId,
 903                             cimException,
 904                             QueueIdStack()));
 905 mike           1.2  }
 906                     
 907                     CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
 908 kumpf          1.60     XmlParser& parser,
 909                         const String& messageId,
 910                         Boolean isEmptyImethodresponseTag)
 911 mike           1.2  {
 912                         XmlEntry entry;
 913 kumpf          1.12     CIMException cimException;
 914 kumpf          1.60     Array<CIMName> classNames;
 915 mike           1.2  
 916 kumpf          1.60     if (!isEmptyImethodresponseTag)
 917 mike           1.2      {
 918 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
 919                             {
 920                                 return(new CIMEnumerateClassNamesResponseMessage(
 921                                     messageId,
 922                                     cimException,
 923                                     QueueIdStack(),
 924                                     Array<CIMName>()));
 925                             }
 926                     
 927                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 928                             {
 929                                 if (entry.type != XmlEntry::EMPTY_TAG)
 930                                 {
 931                                     CIMName className;
 932                     
 933                                     while (XmlReader::getClassNameElement(parser, className, false))
 934                                         classNames.append(className);
 935                     
 936                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
 937                                 }
 938                             }
 939 mike           1.2      }
 940                     
 941 kumpf          1.60     return(new CIMEnumerateClassNamesResponseMessage(
 942                             messageId,
 943                             cimException,
 944                             QueueIdStack(),
 945                             classNames));
 946 mike           1.2  }
 947                     
 948                     CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
 949 kumpf          1.60     XmlParser& parser,
 950                         const String& messageId,
 951                         Boolean isEmptyImethodresponseTag)
 952 mike           1.2  {
 953                         XmlEntry entry;
 954 kumpf          1.12     CIMException cimException;
 955 kumpf          1.60     Array<CIMClass> cimClasses;
 956 mike           1.2  
 957 kumpf          1.60     if (!isEmptyImethodresponseTag)
 958 mike           1.2      {
 959 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
 960                             {
 961                                 return(new CIMEnumerateClassesResponseMessage(
 962                                     messageId,
 963                                     cimException,
 964                                     QueueIdStack(),
 965                                     Array<CIMClass>()));
 966                             }
 967                     
 968                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
 969                             {
 970                                 if (entry.type != XmlEntry::EMPTY_TAG)
 971                                 {
 972                                     CIMClass cimClass;
 973                     
 974                                     while (XmlReader::getClassElement(parser, cimClass))
 975                                         cimClasses.append(cimClass);
 976                     
 977                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
 978                                 }
 979                             }
 980 mike           1.2      }
 981                     
 982 kumpf          1.60     return(new CIMEnumerateClassesResponseMessage(
 983                             messageId,
 984                             cimException,
 985                             QueueIdStack(),
 986                             cimClasses));
 987 mike           1.2  }
 988                     
 989                     CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
 990 kumpf          1.60     XmlParser& parser,
 991                         const String& messageId,
 992                         Boolean isEmptyImethodresponseTag)
 993 mike           1.2  {
 994                         XmlEntry entry;
 995 kumpf          1.12     CIMException cimException;
 996 mike           1.2  
 997 kumpf          1.60     if (!isEmptyImethodresponseTag)
 998 mike           1.2      {
 999 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1000                             {
1001                                 return(new CIMDeleteClassResponseMessage(
1002                                     messageId,
1003                                     cimException,
1004                                     QueueIdStack()));
1005                             }
1006                     
1007                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1008                             {
1009                                 if (entry.type != XmlEntry::EMPTY_TAG)
1010                                 {
1011                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1012                                 }
1013                             }
1014 mike           1.2      }
1015 kumpf          1.60 
1016                         return(new CIMDeleteClassResponseMessage(
1017                             messageId,
1018                             cimException,
1019                             QueueIdStack()));
1020 mike           1.2  }
1021                     
1022                     CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
1023 kumpf          1.60     XmlParser& parser,
1024                         const String& messageId,
1025                         Boolean isEmptyImethodresponseTag)
1026 mike           1.2  {
1027                         XmlEntry entry;
1028 kumpf          1.12     CIMException cimException;
1029 mike           1.2  
1030 kumpf          1.60     if (isEmptyImethodresponseTag)
1031                         {
1032                             MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
1033                                 "Expected open of $0 element", "IMETHODRESPONSE");
1034                             throw XmlValidationError(parser.getLine(), mlParms);
1035                         }
1036                         else if (XmlReader::getErrorElement(parser, cimException))
1037 mike           1.2      {
1038 kumpf          1.60         return(new CIMCreateInstanceResponseMessage(
1039                                 messageId,
1040                                 cimException,
1041                                 QueueIdStack(),
1042                                 CIMObjectPath()));
1043 mike           1.2      }
1044                         else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1045                         {
1046 kumpf          1.60         CIMObjectPath instanceName;
1047                             XmlReader::getInstanceNameElement(parser, instanceName);
1048 mike           1.2  
1049 kumpf          1.60         XmlReader::expectEndTag(parser, "IRETURNVALUE");
1050 mike           1.2  
1051 kumpf          1.60         return(new CIMCreateInstanceResponseMessage(
1052                                 messageId,
1053                                 cimException,
1054                                 QueueIdStack(),
1055                                 instanceName));
1056 mike           1.2      }
1057                         else
1058                         {
1059 kumpf          1.60         // l10n
1060 humberto       1.43 
1061 kumpf          1.60         // throw XmlValidationError(parser.getLine(),
1062                             //   "expected ERROR or IRETURNVALUE element");
1063 humberto       1.43 
1064 kumpf          1.60         MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
1065                                 "expected ERROR or IRETURNVALUE element");
1066 humberto       1.43 
1067 kumpf          1.60         throw XmlValidationError(parser.getLine(), mlParms);
1068 mike           1.2      }
1069                     }
1070                     
1071                     CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
1072 kumpf          1.60     XmlParser& parser,
1073                         const String& messageId,
1074                         Boolean isEmptyImethodresponseTag)
1075 mike           1.2  {
1076                         XmlEntry entry;
1077 kumpf          1.12     CIMException cimException;
1078 mike           1.2  
1079 kumpf          1.60     if (isEmptyImethodresponseTag)
1080                         {
1081                             MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
1082                                 "Expected open of $0 element", "IMETHODRESPONSE");
1083                             throw XmlValidationError(parser.getLine(), mlParms);
1084                         }
1085                         else if (XmlReader::getErrorElement(parser, cimException))
1086 mike           1.2      {
1087 kumpf          1.60         return(new CIMGetInstanceResponseMessage(
1088                                 messageId,
1089                                 cimException,
1090                                 QueueIdStack(),
1091                                 CIMInstance()));
1092 mike           1.2      }
1093 kumpf          1.37     else if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1094 mike           1.2      {
1095 kumpf          1.60         CIMInstance cimInstance;
1096 mike           1.2  
1097 kumpf          1.60         if ((entry.type == XmlEntry::EMPTY_TAG) ||
1098                                 !XmlReader::getInstanceElement(parser, cimInstance))
1099                             {
1100                                 // l10n
1101 humberto       1.43 
1102 kumpf          1.60             // throw XmlValidationError(
1103                                 // parser.getLine(), "expected INSTANCE element");
1104 humberto       1.43 
1105 kumpf          1.60             MessageLoaderParms mlParms(
1106                                     "Client.CIMOperationResponseDecoder.EXPECTED_INSTANCE_ELEMENT",
1107                                     "expected INSTANCE element");
1108 humberto       1.43 
1109 kumpf          1.60             throw XmlValidationError(parser.getLine(), mlParms);
1110                             }
1111 mike           1.2  
1112 kumpf          1.60         XmlReader::expectEndTag(parser, "IRETURNVALUE");
1113 mike           1.2  
1114 kumpf          1.60         return(new CIMGetInstanceResponseMessage(
1115                                 messageId,
1116                                 cimException,
1117                                 QueueIdStack(),
1118                                 cimInstance));
1119 mike           1.2      }
1120                         else
1121                         {
1122 kumpf          1.60         // l10n
1123 humberto       1.43 
1124 kumpf          1.60         // throw XmlValidationError(parser.getLine(),
1125                             //   "expected ERROR or IRETURNVALUE element");
1126 humberto       1.43 
1127 kumpf          1.60         MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
1128                                 "expected ERROR or IRETURNVALUE element");
1129 humberto       1.43 
1130 kumpf          1.60         throw XmlValidationError(parser.getLine(), mlParms);
1131 mike           1.2      }
1132                     }
1133                     
1134                     CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
1135 kumpf          1.60     XmlParser& parser,
1136                         const String& messageId,
1137                         Boolean isEmptyImethodresponseTag)
1138 mike           1.2  {
1139                         XmlEntry entry;
1140 kumpf          1.12     CIMException cimException;
1141 mike           1.2  
1142 kumpf          1.60     if (!isEmptyImethodresponseTag)
1143 mike           1.2      {
1144 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1145                             {
1146                                 return(new CIMModifyInstanceResponseMessage(
1147                                     messageId,
1148                                     cimException,
1149                                     QueueIdStack()));
1150                             }
1151                     
1152                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1153                             {
1154                                 if (entry.type != XmlEntry::EMPTY_TAG)
1155                                 {
1156                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1157                                 }
1158                             }
1159 mike           1.2      }
1160 kumpf          1.60 
1161                         return(new CIMModifyInstanceResponseMessage(
1162                             messageId,
1163                             cimException,
1164                             QueueIdStack()));
1165 mike           1.2  }
1166                     
1167                     CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
1168 kumpf          1.60     XmlParser& parser,
1169                         const String& messageId,
1170                         Boolean isEmptyImethodresponseTag)
1171 mike           1.2  {
1172                         XmlEntry entry;
1173 kumpf          1.12     CIMException cimException;
1174 kumpf          1.60     Array<CIMObjectPath> instanceNames;
1175 mike           1.2  
1176 kumpf          1.60     if (!isEmptyImethodresponseTag)
1177 mike           1.2      {
1178 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1179                             {
1180                                 return(new CIMEnumerateInstanceNamesResponseMessage(
1181                                     messageId,
1182                                     cimException,
1183                                     QueueIdStack(),
1184                                     Array<CIMObjectPath>()));
1185                             }
1186                     
1187                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1188                             {
1189                                 if (entry.type != XmlEntry::EMPTY_TAG)
1190                                 {
1191                                     String className;
1192                                     Array<CIMKeyBinding> keyBindings;
1193                     
1194                                     while (XmlReader::getInstanceNameElement(
1195                                         parser, className, keyBindings))
1196                                     {
1197                                         CIMObjectPath r(
1198                                             String::EMPTY,
1199 kumpf          1.60                         CIMNamespaceName(),
1200                                             className,
1201                                             keyBindings);
1202                                         instanceNames.append(r);
1203                                     }
1204                     
1205                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1206                                 }
1207                             }
1208 mike           1.2      }
1209                     
1210 kumpf          1.60     return(new CIMEnumerateInstanceNamesResponseMessage(
1211                             messageId,
1212                             cimException,
1213                             QueueIdStack(),
1214                             instanceNames));
1215 mike           1.2  }
1216                     
1217                     CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
1218 kumpf          1.60     XmlParser& parser,
1219                         const String& messageId,
1220                         Boolean isEmptyImethodresponseTag)
1221 mike           1.2  {
1222                         XmlEntry entry;
1223 kumpf          1.12     CIMException cimException;
1224 kumpf          1.60     Array<CIMInstance> namedInstances;
1225 mike           1.2  
1226 kumpf          1.60     if (!isEmptyImethodresponseTag)
1227 mike           1.2      {
1228 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1229                             {
1230                                 return(new CIMEnumerateInstancesResponseMessage(
1231                                     messageId,
1232                                     cimException,
1233                                     QueueIdStack(),
1234                                     Array<CIMInstance>()));
1235                             }
1236                     
1237                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1238                             {
1239                                 if (entry.type != XmlEntry::EMPTY_TAG)
1240                                 {
1241                                     CIMInstance namedInstance;
1242                     
1243                                     while (XmlReader::getNamedInstanceElement(
1244                                                parser, namedInstance))
1245                                     {
1246                                         namedInstances.append(namedInstance);
1247                                     }
1248                     
1249 kumpf          1.60                 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1250                                 }
1251                             }
1252 mike           1.2      }
1253                     
1254 kumpf          1.60     return(new CIMEnumerateInstancesResponseMessage(
1255                             messageId,
1256                             cimException,
1257                             QueueIdStack(),
1258                             namedInstances));
1259 mike           1.2  }
1260                     
1261                     CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
1262 kumpf          1.60     XmlParser& parser,
1263                         const String& messageId,
1264                         Boolean isEmptyImethodresponseTag)
1265 mike           1.2  {
1266                         XmlEntry entry;
1267 kumpf          1.12     CIMException cimException;
1268 mike           1.2  
1269 kumpf          1.60     if (!isEmptyImethodresponseTag)
1270 mike           1.2      {
1271 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1272                             {
1273                                 return(new CIMDeleteInstanceResponseMessage(
1274                                     messageId,
1275                                     cimException,
1276                                     QueueIdStack()));
1277                             }
1278                     
1279                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1280                             {
1281                                 if (entry.type != XmlEntry::EMPTY_TAG)
1282                                 {
1283                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1284                                 }
1285                             }
1286 mike           1.2      }
1287 kumpf          1.60 
1288                         return(new CIMDeleteInstanceResponseMessage(
1289                             messageId,
1290                             cimException,
1291                             QueueIdStack()));
1292 mike           1.2  }
1293                     
1294                     CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
1295 kumpf          1.60     XmlParser& parser,
1296                         const String& messageId,
1297                         Boolean isEmptyImethodresponseTag)
1298 mike           1.2  {
1299                         XmlEntry entry;
1300 kumpf          1.12     CIMException cimException;
1301 kumpf          1.60     CIMValue cimValue(CIMTYPE_STRING, false);
1302 mike           1.2  
1303 kumpf          1.60     if (!isEmptyImethodresponseTag)
1304 mike           1.2      {
1305 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1306                             {
1307                                 return(new CIMGetPropertyResponseMessage(
1308                                     messageId,
1309                                     cimException,
1310                                     QueueIdStack(),
1311                                     CIMValue()));
1312                             }
1313 kumpf          1.14 
1314 kumpf          1.60         if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1315                             {
1316                                 if (entry.type != XmlEntry::EMPTY_TAG)
1317                                 {
1318                                     if (!XmlReader::getPropertyValue(parser, cimValue))
1319                                     {
1320 kumpf          1.37                     // No value given; just return a null String value
1321 kumpf          1.60                 }
1322 kumpf          1.37 
1323 kumpf          1.60                 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1324                                 }
1325                             }
1326                             else
1327                             {
1328 kumpf          1.14             // No value given; just return a null String value
1329 kumpf          1.60         }
1330                         }
1331 mike           1.2  
1332 kumpf          1.60     return(new CIMGetPropertyResponseMessage(
1333                             messageId,
1334                             cimException,
1335                             QueueIdStack(),
1336                             cimValue));
1337 mike           1.2  }
1338                     
1339                     CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
1340 kumpf          1.60     XmlParser& parser,
1341                         const String& messageId,
1342                         Boolean isEmptyImethodresponseTag)
1343 mike           1.2  {
1344                         XmlEntry entry;
1345 kumpf          1.12     CIMException cimException;
1346 mike           1.2  
1347 kumpf          1.60     if (!isEmptyImethodresponseTag)
1348 mike           1.2      {
1349 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1350                             {
1351                                 return(new CIMSetPropertyResponseMessage(
1352                                     messageId,
1353                                     cimException,
1354                                     QueueIdStack()));
1355                             }
1356                     
1357                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1358                             {
1359                                 if (entry.type != XmlEntry::EMPTY_TAG)
1360                                 {
1361                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1362                                 }
1363                             }
1364 mike           1.2      }
1365 kumpf          1.60 
1366                         return(new CIMSetPropertyResponseMessage(
1367                             messageId,
1368                             cimException,
1369                             QueueIdStack()));
1370 mike           1.2  }
1371                     
1372                     CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
1373 kumpf          1.60     XmlParser& parser,
1374                         const String& messageId,
1375                         Boolean isEmptyImethodresponseTag)
1376 mike           1.2  {
1377                         XmlEntry entry;
1378 kumpf          1.12     CIMException cimException;
1379 mike           1.2  
1380 kumpf          1.60     if (!isEmptyImethodresponseTag)
1381 mike           1.2      {
1382 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1383                             {
1384                                 return(new CIMSetQualifierResponseMessage(
1385                                     messageId,
1386                                     cimException,
1387                                     QueueIdStack()));
1388                             }
1389                     
1390                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1391                             {
1392                                 if (entry.type != XmlEntry::EMPTY_TAG)
1393                                 {
1394                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1395                                 }
1396                             }
1397 mike           1.2      }
1398 kumpf          1.60 
1399                         return(new CIMSetQualifierResponseMessage(
1400                             messageId,
1401                             cimException,
1402                             QueueIdStack()));
1403 mike           1.2  }
1404                     
1405                     CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
1406 kumpf          1.60     XmlParser& parser,
1407                         const String& messageId,
1408                         Boolean isEmptyImethodresponseTag)
1409 mike           1.2  {
1410                         XmlEntry entry;
1411 kumpf          1.12     CIMException cimException;
1412 mike           1.2  
1413 kumpf          1.60     if (isEmptyImethodresponseTag)
1414                         {
1415                             MessageLoaderParms mlParms("Common.XmlReader.EXPECTED_OPEN",
1416                                 "Expected open of $0 element", "IMETHODRESPONSE");
1417                             throw XmlValidationError(parser.getLine(), mlParms);
1418                         }
1419                         else if (XmlReader::getErrorElement(parser, cimException))
1420 mike           1.2      {
1421 kumpf          1.60         return(new CIMGetQualifierResponseMessage(
1422                                 messageId,
1423                                 cimException,
1424                                 QueueIdStack(),
1425                                 CIMQualifierDecl()));
1426 mike           1.2      }
1427                         else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1428                         {
1429 kumpf          1.60         CIMQualifierDecl qualifierDecl;
1430                             XmlReader::getQualifierDeclElement(parser, qualifierDecl);
1431 mike           1.2  
1432 kumpf          1.60         XmlReader::expectEndTag(parser, "IRETURNVALUE");
1433 mike           1.2  
1434 kumpf          1.60         return(new CIMGetQualifierResponseMessage(
1435                                 messageId,
1436                                 cimException,
1437                                 QueueIdStack(),
1438                                 qualifierDecl));
1439 mike           1.2      }
1440                         else
1441                         {
1442 kumpf          1.60         // l10n
1443 humberto       1.43 
1444 kumpf          1.60         // throw XmlValidationError(parser.getLine(),
1445                             //   "expected ERROR or IRETURNVALUE element");
1446 humberto       1.43 
1447 kumpf          1.60         MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_ERROR_OR_IRETURNVALUE_ELEMENT",
1448                             "expected ERROR or IRETURNVALUE element");
1449 humberto       1.43 
1450 kumpf          1.60         throw XmlValidationError(parser.getLine(), mlParms);
1451 mike           1.2      }
1452                     }
1453                     
1454                     CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
1455 kumpf          1.60     XmlParser& parser,
1456                         const String& messageId,
1457                         Boolean isEmptyImethodresponseTag)
1458 mike           1.2  {
1459                         XmlEntry entry;
1460 kumpf          1.12     CIMException cimException;
1461 kumpf          1.60     Array<CIMQualifierDecl> qualifierDecls;
1462 mike           1.2  
1463 kumpf          1.60     if (!isEmptyImethodresponseTag)
1464 mike           1.2      {
1465 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1466                             {
1467                                 return(new CIMEnumerateQualifiersResponseMessage(
1468                                     messageId,
1469                                     cimException,
1470                                     QueueIdStack(),
1471                                     Array<CIMQualifierDecl>()));
1472                             }
1473                     
1474                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1475                             {
1476                                 if (entry.type != XmlEntry::EMPTY_TAG)
1477                                 {
1478                                     CIMQualifierDecl qualifierDecl;
1479                     
1480                                     while (XmlReader::getQualifierDeclElement(
1481                                                parser, qualifierDecl))
1482                                     {
1483                                         qualifierDecls.append(qualifierDecl);
1484                                     }
1485                     
1486 kumpf          1.60                 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1487                                 }
1488                             }
1489 mike           1.2      }
1490                     
1491 kumpf          1.60     return(new CIMEnumerateQualifiersResponseMessage(
1492                             messageId,
1493                             cimException,
1494                             QueueIdStack(),
1495                             qualifierDecls));
1496 mike           1.2  }
1497                     
1498                     CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
1499 kumpf          1.60     XmlParser& parser,
1500                         const String& messageId,
1501                         Boolean isEmptyImethodresponseTag)
1502 mike           1.2  {
1503                         XmlEntry entry;
1504 kumpf          1.12     CIMException cimException;
1505 mike           1.2  
1506 kumpf          1.60     if (!isEmptyImethodresponseTag)
1507 mike           1.2      {
1508 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1509                             {
1510                                 return(new CIMDeleteQualifierResponseMessage(
1511                                     messageId,
1512                                     cimException,
1513                                     QueueIdStack()));
1514                             }
1515                     
1516                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1517                             {
1518                                 if (entry.type != XmlEntry::EMPTY_TAG)
1519                                 {
1520                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1521                                 }
1522                             }
1523 mike           1.2      }
1524 kumpf          1.60 
1525                         return(new CIMDeleteQualifierResponseMessage(
1526                             messageId,
1527                             cimException,
1528                             QueueIdStack()));
1529 mike           1.2  }
1530                     
1531                     CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
1532 kumpf          1.60     XmlParser& parser,
1533                         const String& messageId,
1534                         Boolean isEmptyImethodresponseTag)
1535 mike           1.2  {
1536                         XmlEntry entry;
1537 kumpf          1.12     CIMException cimException;
1538 kumpf          1.60     Array<CIMObjectPath> objectPaths;
1539 mike           1.2  
1540 kumpf          1.60     if (!isEmptyImethodresponseTag)
1541 mike           1.2      {
1542 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1543                             {
1544                                 return(new CIMReferenceNamesResponseMessage(
1545                                     messageId,
1546                                     cimException,
1547                                     QueueIdStack(),
1548                                     Array<CIMObjectPath>()));
1549                             }
1550                     
1551                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1552                             {
1553                                 if (entry.type != XmlEntry::EMPTY_TAG)
1554                                 {
1555                                     CIMObjectPath objectPath;
1556                     
1557                                     while (XmlReader::getObjectPathElement(parser, objectPath))
1558                                         objectPaths.append(objectPath);
1559                     
1560                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1561                                 }
1562                             }
1563 mike           1.2      }
1564                     
1565 kumpf          1.60     return(new CIMReferenceNamesResponseMessage(
1566                             messageId,
1567                             cimException,
1568                             QueueIdStack(),
1569                             objectPaths));
1570 mike           1.2  }
1571                     
1572                     CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
1573 kumpf          1.60     XmlParser& parser,
1574                         const String& messageId,
1575                         Boolean isEmptyImethodresponseTag)
1576 mike           1.2  {
1577                         XmlEntry entry;
1578 kumpf          1.12     CIMException cimException;
1579 kumpf          1.60     Array<CIMObject> objectWithPathArray;
1580 mike           1.2  
1581 kumpf          1.60     if (!isEmptyImethodresponseTag)
1582 mike           1.2      {
1583 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1584                             {
1585                                 return(new CIMReferencesResponseMessage(
1586                                     messageId,
1587                                     cimException,
1588                                     QueueIdStack(),
1589                                     Array<CIMObject>()));
1590                             }
1591                     
1592                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1593                             {
1594                                 if (entry.type != XmlEntry::EMPTY_TAG)
1595                                 {
1596                                     CIMObject objectWithPath;
1597                     
1598                                     while (XmlReader::getValueObjectWithPathElement(
1599                                                parser, objectWithPath))
1600                                     {
1601                                         objectWithPathArray.append(objectWithPath);
1602                                     }
1603                     
1604 kumpf          1.60                 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1605                                 }
1606                             }
1607 mike           1.2      }
1608                     
1609 kumpf          1.60     return(new CIMReferencesResponseMessage(
1610                             messageId,
1611                             cimException,
1612                             QueueIdStack(),
1613                             objectWithPathArray));
1614 mike           1.2  }
1615                     
1616                     CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
1617 kumpf          1.60     XmlParser& parser,
1618                         const String& messageId,
1619                         Boolean isEmptyImethodresponseTag)
1620 mike           1.2  {
1621                         XmlEntry entry;
1622 kumpf          1.12     CIMException cimException;
1623 kumpf          1.60     Array<CIMObjectPath> objectPaths;
1624 mike           1.2  
1625 kumpf          1.60     if (!isEmptyImethodresponseTag)
1626 mike           1.2      {
1627 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1628                             {
1629                                 return(new CIMAssociatorNamesResponseMessage(
1630                                     messageId,
1631                                     cimException,
1632                                     QueueIdStack(),
1633                                     Array<CIMObjectPath>()));
1634                             }
1635                     
1636                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1637                             {
1638                                 if (entry.type != XmlEntry::EMPTY_TAG)
1639                                 {
1640                                     CIMObjectPath objectPath;
1641                     
1642                                     while (XmlReader::getObjectPathElement(parser, objectPath))
1643                                         objectPaths.append(objectPath);
1644                     
1645                                     XmlReader::expectEndTag(parser, "IRETURNVALUE");
1646                                 }
1647                             }
1648 mike           1.2      }
1649                     
1650 kumpf          1.60     return(new CIMAssociatorNamesResponseMessage(
1651                             messageId,
1652                             cimException,
1653                             QueueIdStack(),
1654                             objectPaths));
1655 mike           1.2  }
1656                     
1657                     CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
1658 kumpf          1.60     XmlParser& parser,
1659                         const String& messageId,
1660                         Boolean isEmptyImethodresponseTag)
1661 mike           1.2  {
1662                         XmlEntry entry;
1663 kumpf          1.12     CIMException cimException;
1664 kumpf          1.60     Array<CIMObject> objectWithPathArray;
1665 mike           1.2  
1666 kumpf          1.60     if (!isEmptyImethodresponseTag)
1667 mike           1.2      {
1668 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1669                             {
1670                                 return(new CIMAssociatorsResponseMessage(
1671                                     messageId,
1672                                     cimException,
1673                                     QueueIdStack(),
1674                                     Array<CIMObject>()));
1675                             }
1676                     
1677                             if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1678                             {
1679                                 if (entry.type != XmlEntry::EMPTY_TAG)
1680                                 {
1681                                     CIMObject objectWithPath;
1682                     
1683                                     while (XmlReader::getValueObjectWithPathElement(
1684                                                parser, objectWithPath))
1685                                     {
1686                                         objectWithPathArray.append(objectWithPath);
1687                                     }
1688                     
1689 kumpf          1.60                 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1690                                 }
1691                             }
1692 mike           1.2      }
1693                     
1694 kumpf          1.60     return(new CIMAssociatorsResponseMessage(
1695                             messageId,
1696                             cimException,
1697                             QueueIdStack(),
1698                             objectWithPathArray));
1699 kumpf          1.10 }
1700                     
1701                     CIMExecQueryResponseMessage* CIMOperationResponseDecoder::_decodeExecQueryResponse(
1702 kumpf          1.60     XmlParser& parser,
1703                         const String& messageId,
1704                         Boolean isEmptyImethodresponseTag)
1705 kumpf          1.10 {
1706                         XmlEntry entry;
1707 kumpf          1.12     CIMException cimException;
1708 kumpf          1.60     Array<CIMObject> objectWithPathArray;
1709 kumpf          1.10 
1710 kumpf          1.60     if (!isEmptyImethodresponseTag)
1711 kumpf          1.10     {
1712 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1713                             {
1714                                 return(new CIMExecQueryResponseMessage(
1715                                     messageId,
1716                                     cimException,
1717                                     QueueIdStack(),
1718                                     Array<CIMObject>()));
1719                             }
1720 kumpf          1.10 
1721 kumpf          1.60         if (XmlReader::testStartTagOrEmptyTag(parser, entry, "IRETURNVALUE"))
1722                             {
1723                                 if (entry.type != XmlEntry::EMPTY_TAG)
1724                                 {
1725 kumpf          1.37                 XmlReader::getObjectArray(parser, objectWithPathArray);
1726 kumpf          1.10 
1727 kumpf          1.60                 XmlReader::expectEndTag(parser, "IRETURNVALUE");
1728                                 }
1729                             }
1730 mike           1.2      }
1731 kumpf          1.60 
1732                         return(new CIMExecQueryResponseMessage(
1733                             messageId,
1734                             cimException,
1735                             QueueIdStack(),
1736                             objectWithPathArray));
1737 mike           1.2  }
1738                     
1739                     CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
1740 kumpf          1.60     XmlParser& parser,
1741                         const String& messageId,
1742                         const String& methodName,
1743                         Boolean isEmptyMethodresponseTag)
1744 mike           1.2  {
1745 kumpf          1.12     CIMException cimException;
1746 mike           1.2  
1747 kumpf          1.5      CIMParamValue paramValue;
1748                         Array<CIMParamValue> outParameters;
1749 kumpf          1.6      CIMValue returnValue;
1750 mike           1.2  
1751 kumpf          1.60     if (!isEmptyMethodresponseTag)
1752 mike           1.2      {
1753 kumpf          1.60         if (XmlReader::getErrorElement(parser, cimException))
1754                             {
1755                                 return(new CIMInvokeMethodResponseMessage(
1756                                     messageId,
1757                                     cimException,
1758                                     QueueIdStack(),
1759                                     returnValue,
1760                                     outParameters,
1761                                     methodName));
1762                             }
1763                     
1764 kumpf          1.4          Boolean isReturnValue = false;
1765                             Boolean isParamValue = false;
1766                             Boolean gotReturnValue = false;
1767                     
1768                             while ((isReturnValue =
1769 kumpf          1.6                      XmlReader::getReturnValueElement(parser, returnValue)) ||
1770 kumpf          1.5                 (isParamValue =
1771 kumpf          1.60                     XmlReader::getParamValueElement(parser, paramValue)))
1772 kumpf          1.4          {
1773                                 if (isReturnValue)
1774                                 {
1775                                     if (gotReturnValue)
1776                                     {
1777 kumpf          1.60                     // l10n
1778 humberto       1.43 
1779 kumpf          1.60                     // throw XmlValidationError(parser.getLine(),
1780                                         //   "unexpected RETURNVALUE element");
1781 humberto       1.43 
1782 kumpf          1.60                     MessageLoaderParms mlParms("Client.CIMOperationResponseDecoder.EXPECTED_RETURNVALUE_ELEMENT",
1783                                             "unexpected RETURNVALUE element");
1784 humberto       1.43 
1785 kumpf          1.60                     throw XmlValidationError(parser.getLine(), mlParms);
1786 kumpf          1.4                  }
1787                                     gotReturnValue = true;
1788                                 }
1789                                 else    // isParamValue == true
1790                                 {
1791 kumpf          1.60                 outParameters.append(paramValue);
1792 kumpf          1.4              }
1793                     
1794                                 isReturnValue = false;
1795                                 isParamValue = false;
1796                             }
1797 kumpf          1.60     }
1798 kumpf          1.4  
1799 kumpf          1.60     return(new CIMInvokeMethodResponseMessage(
1800                             messageId,
1801                             cimException,
1802                             QueueIdStack(),
1803                             returnValue,
1804                             outParameters,
1805                             methodName));
1806 mike           1.2  }
1807                     
1808                     PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2