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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2