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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2