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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2