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

   1 mike  1.2 //%/////////////////////////////////////////////////////////////////////////////
   2           //
   3           // Copyright (c) 2000, 2001 BMC Software, Hewlett-Packard Company, IBM,
   4           // 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           //
  13           // 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 mike  1.2 //==============================================================================
  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           //
  31           //%/////////////////////////////////////////////////////////////////////////////
  32           
  33           #include <Pegasus/Common/Config.h>
  34           #include <iostream>
  35           #include <Pegasus/Common/XmlParser.h>
  36           #include <Pegasus/Common/XmlReader.h>
  37           #include <Pegasus/Common/System.h>
  38           #include <Pegasus/Common/XmlWriter.h>
  39           #include <Pegasus/Common/HTTPMessage.h>
  40           #include <Pegasus/Common/CIMMessage.h>
  41           #include "CIMOperationResponseDecoder.h"
  42           
  43 mike  1.2 PEGASUS_USING_STD;
  44           
  45           PEGASUS_NAMESPACE_BEGIN
  46           
  47           CIMOperationResponseDecoder::CIMOperationResponseDecoder(
  48               MessageQueue* outputQueue,
  49               MessageQueue* encoderQueue,
  50               ClientAuthenticator* authenticator)
  51               :
  52               _outputQueue(outputQueue),
  53               _encoderQueue(encoderQueue),
  54               _authenticator(authenticator)
  55           {
  56           
  57           }
  58           
  59           CIMOperationResponseDecoder::~CIMOperationResponseDecoder()
  60           {
  61           
  62           }
  63           
  64 mike  1.2 void  CIMOperationResponseDecoder::setEncoderQueue(MessageQueue* encoderQueue)
  65           {
  66               _encoderQueue = encoderQueue;
  67           }
  68           
  69           void CIMOperationResponseDecoder::handleEnqueue()
  70           {
  71               Message* message = dequeue();
  72           
  73               if (!message)
  74           	return;
  75           
  76               switch (message->getType())
  77               {
  78           	case HTTP_MESSAGE:
  79           	{
  80 mday  1.3 
  81 mike  1.2 	    HTTPMessage* httpMessage = (HTTPMessage*)message;
  82           	    _handleHTTPMessage(httpMessage);
  83           	    break;
  84           	}
  85           
  86           	default:
  87           	    // ATTN: send this to the orphan queue!
  88           	    break;
  89               }
  90           
  91               delete message;
  92           }
  93           
  94           const char* CIMOperationResponseDecoder::getQueueName() const
  95           {
  96               return "CIMOperationResponseDecoder";
  97           }
  98           
  99           void CIMOperationResponseDecoder::_handleHTTPMessage(HTTPMessage* httpMessage)
 100           {
 101               //
 102 mike  1.2     // Parse the HTTP message:
 103               //
 104           
 105               String startLine;
 106               Array<HTTPHeader> headers;
 107               Sint8* content;
 108               Uint32 contentLength;
 109           
 110               httpMessage->parse(startLine, headers, contentLength);
 111           
 112               if (_authenticator->checkResponseHeaderForChallenge(headers))
 113               {
 114                   //
 115                   // Get the original request, put that in the encoder's queue for
 116                   // re-sending with authentication challenge response.
 117                   //
 118                   Message* reqMessage = _authenticator->getRequestMessage();
 119                   _encoderQueue->enqueue(reqMessage);
 120           
 121                   return;
 122               }
 123 mike  1.2     else
 124               {
 125           
 126                   //
 127                   // Received a valid/error response from the server.
 128                   // We do not need the original request message anymore, hence delete
 129                   // the request message by getting the handle from the ClientAuthenticator.
 130                   //
 131                   Message* reqMessage = _authenticator->getRequestMessage();
 132 mday  1.3 	_authenticator->clearRequest();
 133 mike  1.2         if (reqMessage)
 134                   {
 135                       delete reqMessage;
 136                   }
 137               }
 138           
 139               //
 140               // Search for "CIMOperation" header:
 141               //
 142           
 143               String cimOperation;
 144           
 145               if (!HTTPMessage::lookupHeader(
 146           	headers, "*CIMOperation", cimOperation, true))
 147               {
 148           	// ATTN: error discarded at this time!
 149           	return;
 150               }
 151           
 152               //
 153               // Zero-terminate the message:
 154 mike  1.2     //
 155           
 156               httpMessage->message.append('\0');
 157           
 158               // Calculate the beginning of the content from the message size and
 159               // the content length.  Subtract 1 to take into account the null
 160               // character we just added to the end of the message.
 161           
 162               content = (Sint8*) httpMessage->message.getData() +
 163           	httpMessage->message.size() - contentLength - 1;
 164           
 165               //
 166               // If it is a method response, then dispatch it to be handled:
 167               //
 168           
 169               if (!String::equalNoCase(cimOperation, "MethodResponse"))
 170               {
 171           	// ATTN: error discarded at this time!
 172           	return;
 173               }
 174           
 175 mike  1.2     _handleMethodResponse(content);
 176           }
 177           
 178           void CIMOperationResponseDecoder::_handleMethodResponse(char* content)
 179           {
 180               Message* response = 0;
 181           
 182               //
 183               // Create and initialize XML parser:
 184               //
 185           
 186               XmlParser parser((char*)content);
 187               XmlEntry entry;
 188           
 189               try
 190               {
 191           	//
 192           	// Process <?xml ... >
 193           	//
 194           
 195           	XmlReader::expectXmlDeclaration(parser, entry);
 196 mike  1.2 
 197           	//
 198           	// Process <CIM ... >
 199           	//
 200           
 201           	XmlReader::testCimStartTag(parser);
 202           
 203           	//
 204           	// Expect <MESSAGE ... >
 205           	//
 206           
 207           	String messageId;
 208           	const char* protocolVersion = 0;
 209           
 210           	if (!XmlReader::getMessageStartTag(parser, messageId, protocolVersion))
 211           	    throw XmlValidationError(
 212           		parser.getLine(), "expected MESSAGE element");
 213           
 214           	if (strcmp(protocolVersion, "1.0") != 0)
 215           	{
 216           	    // ATTN: protocol version being ignored at present!
 217 mike  1.2 
 218           	    return;
 219           	}
 220           
 221           	//
 222           	// Expect <SIMPLERSP ... >
 223           	//
 224           
 225           	XmlReader::expectStartTag(parser, entry, "SIMPLERSP");
 226           
 227           	//
 228           	// Expect <IMETHODRESPONSE ... >
 229           	//
 230           
 231           	const char* iMethodResponseName = 0;
 232           
 233           	if (XmlReader::getIMethodResponseStartTag(parser, iMethodResponseName))
 234           	{
 235           	    //
 236           	    // Dispatch the method:
 237           	    //
 238 mike  1.2 
 239           	    if (EqualNoCase(iMethodResponseName, "GetClass"))
 240           		response = _decodeGetClassResponse(parser, messageId);
 241           	    else if (EqualNoCase(iMethodResponseName, "GetInstance"))
 242           		response = _decodeGetInstanceResponse(parser, messageId);
 243           	    else if (EqualNoCase(iMethodResponseName, "EnumerateClassNames"))
 244           		response = _decodeEnumerateClassNamesResponse(parser,messageId);
 245           	    else if (EqualNoCase(iMethodResponseName, "References"))
 246           		response = _decodeReferencesResponse(parser, messageId);
 247           	    else if (EqualNoCase(iMethodResponseName, "ReferenceNames"))
 248           		response = _decodeReferenceNamesResponse(parser, messageId);
 249           	    else if (EqualNoCase(iMethodResponseName, "AssociatorNames"))
 250           		response = _decodeAssociatorNamesResponse(parser, messageId);
 251           	    else if (EqualNoCase(iMethodResponseName, "Associators"))
 252           		response = _decodeAssociatorsResponse(parser, messageId);
 253           	    else if (EqualNoCase(iMethodResponseName, "CreateInstance"))
 254           		response = _decodeCreateInstanceResponse(parser, messageId);
 255           	    else if (EqualNoCase(iMethodResponseName,"EnumerateInstanceNames"))
 256           		response = _decodeEnumerateInstanceNamesResponse(
 257                             parser, messageId);
 258           	    else if (EqualNoCase(iMethodResponseName,"EnumerateInstances"))
 259 mike  1.2 		response = _decodeEnumerateInstancesResponse(parser, messageId);
 260           	    else if (EqualNoCase(iMethodResponseName, "GetProperty"))
 261           		response = _decodeGetPropertyResponse(parser, messageId);
 262           	    else if (EqualNoCase(iMethodResponseName, "SetProperty"))
 263           		response = _decodeSetPropertyResponse(parser, messageId);
 264           	    else if (EqualNoCase(iMethodResponseName, "DeleteQualifier"))
 265           		response = _decodeDeleteQualifierResponse(parser, messageId);
 266           	    else if (EqualNoCase(iMethodResponseName, "GetQualifier"))
 267           		response = _decodeGetQualifierResponse(parser, messageId);
 268           	    else if (EqualNoCase(iMethodResponseName, "SetQualifier"))
 269           		response = _decodeSetQualifierResponse(parser, messageId);
 270           	    else if (EqualNoCase(iMethodResponseName, "EnumerateQualifiers"))
 271           		response = _decodeEnumerateQualifiersResponse(parser,messageId);
 272           	    else if (EqualNoCase(iMethodResponseName, "EnumerateClasses"))
 273           		response = _decodeEnumerateClassesResponse(parser, messageId);
 274           	    else if (EqualNoCase(iMethodResponseName, "CreateClass"))
 275           		response = _decodeCreateClassResponse(parser, messageId);
 276           	    else if (EqualNoCase(iMethodResponseName, "ModifyClass"))
 277           		response = _decodeModifyClassResponse(parser, messageId);
 278           	    else if (EqualNoCase(iMethodResponseName, "ModifyInstance"))
 279           		response = _decodeModifyInstanceResponse(parser, messageId);
 280 mike  1.2 	    else if (EqualNoCase(iMethodResponseName, "DeleteClass"))
 281           		response = _decodeDeleteClassResponse(parser, messageId);
 282           	    else if (EqualNoCase(iMethodResponseName, "DeleteInstance"))
 283           		response = _decodeDeleteInstanceResponse(parser, messageId);
 284           	    else
 285           	    {
 286                           // Unrecognized IMethodResponse name attribute
 287           	        throw XmlValidationError(parser.getLine(),
 288           	            String("Unrecognized IMethodResponse name \"") +
 289                                   iMethodResponseName + "\"");
 290           	    }
 291           	
 292           	    //
 293           	    // Handle end tag:
 294           	    //
 295           
 296           	    XmlReader::expectEndTag(parser, "IMETHODRESPONSE");
 297           	}
 298           	else if (XmlReader::getMethodResponseStartTag(parser, 
 299           	    iMethodResponseName))
 300           	{
 301 mike  1.2 	    response = _decodeInvokeMethodResponse(
 302                         parser, messageId, iMethodResponseName);
 303           
 304           	    //
 305           	    // Handle end tag:
 306           	    //
 307           	    XmlReader::expectEndTag(parser, "METHODRESPONSE");
 308           	}
 309           	else
 310           	{
 311           	    throw XmlValidationError(parser.getLine(),
 312           	        "expected METHODRESPONSE or IMETHODRESPONSE element");
 313           	}
 314           
 315                   //
 316                   // Handle end tags:
 317                   //
 318           	XmlReader::expectEndTag(parser, "SIMPLERSP");
 319           	XmlReader::expectEndTag(parser, "MESSAGE");
 320           	XmlReader::expectEndTag(parser, "CIM");
 321               }
 322 mike  1.2     catch (Exception& x)
 323               {
 324           	// ATTN: ignore the exception for now!
 325           
 326           	cout << x.getMessage() << endl;
 327           	return;
 328               }
 329           
 330               _outputQueue->enqueue(response);
 331           }
 332           
 333           CIMCreateClassResponseMessage* CIMOperationResponseDecoder::_decodeCreateClassResponse(
 334               XmlParser& parser, 
 335               const String& messageId)
 336           {
 337               XmlEntry entry;
 338               CIMStatusCode code;
 339               const char* description = 0;
 340           
 341               if (XmlReader::getErrorElement(parser, code, description))
 342               {
 343 mike  1.2 	return(new CIMCreateClassResponseMessage(
 344           	    messageId,
 345           	    code,
 346           	    description,
 347           	    QueueIdStack()));
 348           
 349               }
 350               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 351               {
 352           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 353           
 354           	return(new CIMCreateClassResponseMessage(
 355           	    messageId,
 356           	    CIM_ERR_SUCCESS,
 357           	    String(),
 358           	    QueueIdStack()));
 359               }
 360               else
 361               {
 362           	throw XmlValidationError(parser.getLine(),
 363           	    "expected ERROR or IRETURNVALUE element");
 364 mike  1.2     }
 365           }
 366           
 367           CIMGetClassResponseMessage* CIMOperationResponseDecoder::_decodeGetClassResponse(
 368               XmlParser& parser, const String& messageId)
 369           {
 370               XmlEntry entry;
 371               CIMStatusCode code;
 372               const char* description = 0;
 373           
 374               if (XmlReader::getErrorElement(parser, code, description))
 375               {
 376           	return(new CIMGetClassResponseMessage(
 377           	    messageId,
 378           	    code,
 379           	    description,
 380           	    QueueIdStack(),
 381           	    CIMClass()));
 382               }
 383               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 384               {
 385 mike  1.2 	CIMClass cimClass;
 386           
 387           	if (!XmlReader::getClassElement(parser, cimClass))
 388           	    throw XmlValidationError(parser.getLine(),"expected CLASS element");
 389           
 390           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 391           
 392           	return(new CIMGetClassResponseMessage(
 393           	    messageId,
 394           	    CIM_ERR_SUCCESS,
 395           	    String(),
 396           	    QueueIdStack(),
 397           	    cimClass));
 398               }
 399               else
 400               {
 401           	throw XmlValidationError(parser.getLine(),
 402           	    "expected ERROR or IRETURNVALUE element");
 403               }
 404           }
 405           
 406 mike  1.2 CIMModifyClassResponseMessage* CIMOperationResponseDecoder::_decodeModifyClassResponse(
 407               XmlParser& parser, const String& messageId)
 408           {
 409               XmlEntry entry;
 410               CIMStatusCode code;
 411               const char* description = 0;
 412           
 413               if (XmlReader::getErrorElement(parser, code, description))
 414               {
 415           	return(new CIMModifyClassResponseMessage(
 416           	    messageId,
 417           	    code,
 418           	    description,
 419           	    QueueIdStack()));
 420               }
 421               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 422               {
 423           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 424           
 425           	return(new CIMModifyClassResponseMessage(
 426           	    messageId,
 427 mike  1.2 	    CIM_ERR_SUCCESS,
 428           	    String(),
 429           	    QueueIdStack()));
 430               }
 431               else
 432               {
 433           	throw XmlValidationError(parser.getLine(),
 434           	    "expected ERROR or IRETURNVALUE element");
 435               }
 436           }
 437           
 438           CIMEnumerateClassNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassNamesResponse(
 439               XmlParser& parser, const String& messageId)
 440           {
 441               XmlEntry entry;
 442               CIMStatusCode code;
 443               const char* description = 0;
 444           
 445               if (XmlReader::getErrorElement(parser, code, description))
 446               {
 447           	return(new CIMEnumerateClassNamesResponseMessage(
 448 mike  1.2 	    messageId,
 449           	    code,
 450           	    description,
 451           	    QueueIdStack(),
 452           	    Array<String>()));
 453               }
 454               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 455               {
 456           	Array<String> classNames;
 457           	String className;
 458           
 459           	while (XmlReader::getClassNameElement(parser, className, false))
 460           	    classNames.append(className);
 461           
 462           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 463           
 464           	return(new CIMEnumerateClassNamesResponseMessage(
 465           	    messageId,
 466           	    CIM_ERR_SUCCESS,
 467           	    String(),
 468           	    QueueIdStack(),
 469 mike  1.2 	    classNames));
 470               }
 471               else
 472               {
 473           	throw XmlValidationError(parser.getLine(),
 474           	    "expected ERROR or IRETURNVALUE element");
 475               }
 476           }
 477           
 478           CIMEnumerateClassesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateClassesResponse(
 479               XmlParser& parser, const String& messageId)
 480           {
 481               XmlEntry entry;
 482               CIMStatusCode code;
 483               const char* description = 0;
 484           
 485               if (XmlReader::getErrorElement(parser, code, description))
 486               {
 487           	return(new CIMEnumerateClassesResponseMessage(
 488           	    messageId,
 489           	    code,
 490 mike  1.2 	    description,
 491           	    QueueIdStack(),
 492           	    Array<CIMClass>()));
 493               }
 494               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 495               {
 496           	Array<CIMClass> cimClasses;
 497           	CIMClass cimClass;
 498           
 499           	while (XmlReader::getClassElement(parser, cimClass))
 500           	    cimClasses.append(cimClass);
 501           
 502           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 503           
 504           	return(new CIMEnumerateClassesResponseMessage(
 505           	    messageId,
 506           	    CIM_ERR_SUCCESS,
 507           	    String(),
 508           	    QueueIdStack(),
 509           	    cimClasses));
 510               }
 511 mike  1.2     else
 512               {
 513           	throw XmlValidationError(parser.getLine(),
 514           	    "expected ERROR or IRETURNVALUE element");
 515               }
 516           }
 517           
 518           CIMDeleteClassResponseMessage* CIMOperationResponseDecoder::_decodeDeleteClassResponse(
 519               XmlParser& parser, const String& messageId)
 520           {
 521               XmlEntry entry;
 522               CIMStatusCode code;
 523               const char* description = 0;
 524           
 525               if (XmlReader::getErrorElement(parser, code, description))
 526               {
 527           	return(new CIMDeleteClassResponseMessage(
 528           	    messageId,
 529           	    code,
 530           	    description,
 531           	    QueueIdStack()));
 532 mike  1.2     }
 533               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 534               {
 535           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 536           
 537           	return(new CIMDeleteClassResponseMessage(
 538           	    messageId,
 539           	    CIM_ERR_SUCCESS,
 540           	    String(),
 541           	    QueueIdStack()));
 542               }
 543               else
 544               {
 545           	throw XmlValidationError(parser.getLine(),
 546           	    "expected ERROR or IRETURNVALUE element");
 547               }
 548           }
 549           
 550           CIMCreateInstanceResponseMessage* CIMOperationResponseDecoder::_decodeCreateInstanceResponse(
 551               XmlParser& parser, const String& messageId)
 552           {
 553 mike  1.2     XmlEntry entry;
 554               CIMStatusCode code;
 555               const char* description = 0;
 556           
 557               if (XmlReader::getErrorElement(parser, code, description))
 558               {
 559           	return(new CIMCreateInstanceResponseMessage(
 560           	    messageId,
 561           	    code,
 562           	    description,
 563           	    QueueIdStack(),
 564           	    CIMReference()));
 565               }
 566               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 567               {
 568           	CIMReference instanceName;
 569           	XmlReader::getInstanceNameElement(parser, instanceName);
 570           
 571           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 572           
 573           	return(new CIMCreateInstanceResponseMessage(
 574 mike  1.2 	    messageId,
 575           	    CIM_ERR_SUCCESS,
 576           	    String(),
 577           	    QueueIdStack(),
 578           	    instanceName));
 579               }
 580               else
 581               {
 582           	throw XmlValidationError(parser.getLine(),
 583           	    "expected ERROR or IRETURNVALUE element");
 584               }
 585           }
 586           
 587           CIMGetInstanceResponseMessage* CIMOperationResponseDecoder::_decodeGetInstanceResponse(
 588               XmlParser& parser, const String& messageId)
 589           {
 590               XmlEntry entry;
 591               CIMStatusCode code;
 592               const char* description = 0;
 593           
 594               if (XmlReader::getErrorElement(parser, code, description))
 595 mike  1.2     {
 596           	return(new CIMGetInstanceResponseMessage(
 597           	    messageId,
 598           	    code,
 599           	    description,
 600           	    QueueIdStack(),
 601           	    CIMInstance()));
 602               }
 603               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 604               {
 605           	CIMInstance cimInstance;
 606           
 607           	if (!XmlReader::getInstanceElement(parser, cimInstance))
 608           	{
 609           	    throw XmlValidationError(
 610           		parser.getLine(), "expected INSTANCE element");
 611           	}
 612           
 613           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 614           
 615           	return(new CIMGetInstanceResponseMessage(
 616 mike  1.2 	    messageId,
 617           	    CIM_ERR_SUCCESS,
 618           	    String(),
 619           	    QueueIdStack(),
 620           	    cimInstance));
 621               }
 622               else
 623               {
 624           	throw XmlValidationError(parser.getLine(),
 625           	    "expected ERROR or IRETURNVALUE element");
 626               }
 627           }
 628           
 629           CIMModifyInstanceResponseMessage* CIMOperationResponseDecoder::_decodeModifyInstanceResponse(
 630               XmlParser& parser, const String& messageId)
 631           {
 632               XmlEntry entry;
 633               CIMStatusCode code;
 634               const char* description = 0;
 635           
 636               if (XmlReader::getErrorElement(parser, code, description))
 637 mike  1.2     {
 638           	return(new CIMModifyInstanceResponseMessage(
 639           	    messageId,
 640           	    code,
 641           	    description,
 642           	    QueueIdStack()));
 643               }
 644               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 645               {
 646           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 647           
 648           	return(new CIMModifyInstanceResponseMessage(
 649           	    messageId,
 650           	    CIM_ERR_SUCCESS,
 651           	    String(),
 652           	    QueueIdStack()));
 653               }
 654               else
 655               {
 656           	throw XmlValidationError(parser.getLine(),
 657           	    "expected ERROR or IRETURNVALUE element");
 658 mike  1.2     }
 659           }
 660           
 661           CIMEnumerateInstanceNamesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstanceNamesResponse(
 662               XmlParser& parser, const String& messageId)
 663           {
 664               XmlEntry entry;
 665               CIMStatusCode code;
 666               const char* description = 0;
 667           
 668               if (XmlReader::getErrorElement(parser, code, description))
 669               {
 670           	return(new CIMEnumerateInstanceNamesResponseMessage(
 671           	    messageId,
 672           	    code,
 673           	    description,
 674           	    QueueIdStack(),
 675           	    Array<CIMReference>()));
 676               }
 677               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 678               {
 679 mike  1.2 	Array<CIMReference> instanceNames;
 680           	String className;
 681           	Array<KeyBinding> keyBindings;
 682           
 683           	while (XmlReader::getInstanceNameElement(
 684           	    parser, className, keyBindings))
 685           	{
 686           	    CIMReference r(
 687           		String::EMPTY,
 688           		String::EMPTY,
 689           		className,
 690           		keyBindings);
 691           	    instanceNames.append(r);
 692           	}
 693           
 694           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 695           
 696           	return(new CIMEnumerateInstanceNamesResponseMessage(
 697           	    messageId,
 698           	    CIM_ERR_SUCCESS,
 699           	    String(),
 700 mike  1.2 	    QueueIdStack(),
 701           	    instanceNames));
 702               }
 703               else
 704               {
 705           	throw XmlValidationError(parser.getLine(),
 706           	    "expected ERROR or IRETURNVALUE element");
 707               }
 708           }
 709           
 710           CIMEnumerateInstancesResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateInstancesResponse(
 711               XmlParser& parser, const String& messageId)
 712           {
 713               XmlEntry entry;
 714               CIMStatusCode code;
 715               const char* description = 0;
 716           
 717               if (XmlReader::getErrorElement(parser, code, description))
 718               {
 719           	return(new CIMEnumerateInstancesResponseMessage(
 720           	    messageId,
 721 mike  1.2 	    code,
 722           	    description,
 723           	    QueueIdStack(),
 724           	    Array<CIMNamedInstance>()));
 725               }
 726               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 727               {
 728           	Array<CIMNamedInstance> namedInstances;
 729           	CIMNamedInstance tmp;
 730           
 731           	while (XmlReader::getNamedInstanceElement(parser, tmp))
 732           	    namedInstances.append(tmp);
 733           
 734           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 735           
 736           	return(new CIMEnumerateInstancesResponseMessage(
 737           	    messageId,
 738           	    CIM_ERR_SUCCESS,
 739           	    String(),
 740           	    QueueIdStack(),
 741           	    namedInstances));
 742 mike  1.2     }
 743               else
 744               {
 745           	throw XmlValidationError(parser.getLine(),
 746           	    "expected ERROR or IRETURNVALUE element");
 747               }
 748           }
 749           
 750           CIMDeleteInstanceResponseMessage* CIMOperationResponseDecoder::_decodeDeleteInstanceResponse(
 751               XmlParser& parser, const String& messageId)
 752           {
 753               XmlEntry entry;
 754               CIMStatusCode code;
 755               const char* description = 0;
 756           
 757               if (XmlReader::getErrorElement(parser, code, description))
 758               {
 759           	return(new CIMDeleteInstanceResponseMessage(
 760           	    messageId,
 761           	    code,
 762           	    description,
 763 mike  1.2 	    QueueIdStack()));
 764               }
 765               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 766               {
 767           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 768           
 769           	return(new CIMDeleteInstanceResponseMessage(
 770           	    messageId,
 771           	    CIM_ERR_SUCCESS,
 772           	    String(),
 773           	    QueueIdStack()));
 774               }
 775               else
 776               {
 777           	throw XmlValidationError(parser.getLine(),
 778           	    "expected ERROR or IRETURNVALUE element");
 779               }
 780           }
 781           
 782           CIMGetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeGetPropertyResponse(
 783               XmlParser& parser, const String& messageId)
 784 mike  1.2 {
 785               XmlEntry entry;
 786               CIMStatusCode code;
 787               const char* description = 0;
 788           
 789               if (XmlReader::getErrorElement(parser, code, description))
 790               {
 791           	return(new CIMGetPropertyResponseMessage(
 792           	    messageId,
 793           	    code,
 794           	    description,
 795           	    QueueIdStack(),
 796           	    CIMValue()));
 797               }
 798               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 799               {
 800           	CIMValue cimValue;
 801           
 802           	if (!XmlReader::getPropertyValue(parser, cimValue))
 803           	{
 804                       // ATTN: Don't know what type of CIMValue to expect
 805 mike  1.2 	    throw XmlValidationError(
 806           		parser.getLine(),
 807                           "expected VALUE, VALUE.ARRAY, or VALUE.REFERENCE element");
 808           	}
 809           
 810           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 811           
 812           	return(new CIMGetPropertyResponseMessage(
 813           	    messageId,
 814           	    CIM_ERR_SUCCESS,
 815           	    String(),
 816           	    QueueIdStack(),
 817           	    cimValue));
 818               }
 819               else
 820               {
 821           	throw XmlValidationError(parser.getLine(),
 822           	    "expected ERROR or IRETURNVALUE element");
 823               }
 824           }
 825           
 826 mike  1.2 CIMSetPropertyResponseMessage* CIMOperationResponseDecoder::_decodeSetPropertyResponse(
 827               XmlParser& parser, const String& messageId)
 828           {
 829               XmlEntry entry;
 830               CIMStatusCode code;
 831               const char* description = 0;
 832           
 833               if (XmlReader::getErrorElement(parser, code, description))
 834               {
 835           	return(new CIMSetPropertyResponseMessage(
 836           	    messageId,
 837           	    code,
 838           	    description,
 839           	    QueueIdStack()));
 840               }
 841               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 842               {
 843           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 844           
 845           	return(new CIMSetPropertyResponseMessage(
 846           	    messageId,
 847 mike  1.2 	    CIM_ERR_SUCCESS,
 848           	    String(),
 849           	    QueueIdStack()));
 850               }
 851               else
 852               {
 853           	throw XmlValidationError(parser.getLine(),
 854           	    "expected ERROR or IRETURNVALUE element");
 855               }
 856           }
 857           
 858           CIMSetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeSetQualifierResponse(
 859               XmlParser& parser, const String& messageId)
 860           {
 861               XmlEntry entry;
 862               CIMStatusCode code;
 863               const char* description = 0;
 864           
 865               if (XmlReader::getErrorElement(parser, code, description))
 866               {
 867           	return(new CIMSetQualifierResponseMessage(
 868 mike  1.2 	    messageId,
 869           	    code,
 870           	    description,
 871           	    QueueIdStack()));
 872               }
 873               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 874               {
 875           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 876           
 877           	return(new CIMSetQualifierResponseMessage(
 878           	    messageId,
 879           	    CIM_ERR_SUCCESS,
 880           	    String(),
 881           	    QueueIdStack()));
 882               }
 883               else
 884               {
 885           	throw XmlValidationError(parser.getLine(),
 886           	    "expected ERROR or IRETURNVALUE element");
 887               }
 888           }
 889 mike  1.2 
 890           CIMGetQualifierResponseMessage* CIMOperationResponseDecoder::_decodeGetQualifierResponse(
 891               XmlParser& parser, const String& messageId)
 892           {
 893               XmlEntry entry;
 894               CIMStatusCode code;
 895               const char* description = 0;
 896           
 897               if (XmlReader::getErrorElement(parser, code, description))
 898               {
 899           	return(new CIMGetQualifierResponseMessage(
 900           	    messageId,
 901           	    code,
 902           	    description,
 903           	    QueueIdStack(),
 904           	    CIMQualifierDecl()));
 905               }
 906               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 907               {
 908           	CIMQualifierDecl qualifierDecl;
 909           	XmlReader::getQualifierDeclElement(parser, qualifierDecl);
 910 mike  1.2 
 911           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 912           
 913           	return(new CIMGetQualifierResponseMessage(
 914           	    messageId,
 915           	    CIM_ERR_SUCCESS,
 916           	    String(),
 917           	    QueueIdStack(),
 918           	    qualifierDecl));
 919               }
 920               else
 921               {
 922           	throw XmlValidationError(parser.getLine(),
 923           	    "expected ERROR or IRETURNVALUE element");
 924               }
 925           }
 926           
 927           CIMEnumerateQualifiersResponseMessage* CIMOperationResponseDecoder::_decodeEnumerateQualifiersResponse(
 928               XmlParser& parser, const String& messageId)
 929           {
 930               XmlEntry entry;
 931 mike  1.2     CIMStatusCode code;
 932               const char* description = 0;
 933           
 934               if (XmlReader::getErrorElement(parser, code, description))
 935               {
 936           	return(new CIMEnumerateQualifiersResponseMessage(
 937           	    messageId,
 938           	    code,
 939           	    description,
 940           	    QueueIdStack(),
 941           	    Array<CIMQualifierDecl>()));
 942               }
 943               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 944               {
 945           	Array<CIMQualifierDecl> qualifierDecls;
 946           	CIMQualifierDecl qualifierDecl;
 947           
 948           	while (XmlReader::getQualifierDeclElement(parser, qualifierDecl))
 949           	    qualifierDecls.append(qualifierDecl);
 950           
 951           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 952 mike  1.2 
 953           	return(new CIMEnumerateQualifiersResponseMessage(
 954           	    messageId,
 955           	    CIM_ERR_SUCCESS,
 956           	    String(),
 957           	    QueueIdStack(),
 958           	    qualifierDecls));
 959               }
 960               else
 961               {
 962           	throw XmlValidationError(parser.getLine(),
 963           	    "expected ERROR or IRETURNVALUE element");
 964               }
 965           }
 966           
 967           CIMDeleteQualifierResponseMessage* CIMOperationResponseDecoder::_decodeDeleteQualifierResponse(
 968               XmlParser& parser, const String& messageId)
 969           {
 970               XmlEntry entry;
 971               CIMStatusCode code;
 972               const char* description = 0;
 973 mike  1.2 
 974               if (XmlReader::getErrorElement(parser, code, description))
 975               {
 976           	return(new CIMDeleteQualifierResponseMessage(
 977           	    messageId,
 978           	    code,
 979           	    description,
 980           	    QueueIdStack()));
 981               }
 982               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
 983               {
 984           	XmlReader::testEndTag(parser, "IRETURNVALUE");
 985           
 986           	return(new CIMDeleteQualifierResponseMessage(
 987           	    messageId,
 988           	    CIM_ERR_SUCCESS,
 989           	    String(),
 990           	    QueueIdStack()));
 991               }
 992               else
 993               {
 994 mike  1.2 	throw XmlValidationError(parser.getLine(),
 995           	    "expected ERROR or IRETURNVALUE element");
 996               }
 997           }
 998           
 999           //MEB:
1000           
1001           CIMReferenceNamesResponseMessage* CIMOperationResponseDecoder::_decodeReferenceNamesResponse(
1002               XmlParser& parser, const String& messageId)
1003           {
1004               XmlEntry entry;
1005               CIMStatusCode code;
1006               const char* description = 0;
1007           
1008               if (XmlReader::getErrorElement(parser, code, description))
1009               {
1010           	return(new CIMReferenceNamesResponseMessage(
1011           	    messageId,
1012           	    code,
1013           	    description,
1014           	    QueueIdStack(),
1015 mike  1.2 	    Array<CIMReference>()));
1016               }
1017               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1018               {
1019           	CIMReference objectPath;
1020           	Array<CIMReference> objectPaths;
1021           
1022           	while (XmlReader::getObjectPathElement(parser, objectPath))
1023           	    objectPaths.append(objectPath);
1024           
1025           	XmlReader::testEndTag(parser, "IRETURNVALUE");
1026           
1027           	return(new CIMReferenceNamesResponseMessage(
1028           	    messageId,
1029           	    CIM_ERR_SUCCESS,
1030           	    String(),
1031           	    QueueIdStack(),
1032           	    objectPaths));
1033               }
1034               else
1035               {
1036 mike  1.2 	throw XmlValidationError(parser.getLine(),
1037           	    "expected ERROR or IRETURNVALUE element");
1038               }
1039           }
1040           
1041           CIMReferencesResponseMessage* CIMOperationResponseDecoder::_decodeReferencesResponse(
1042               XmlParser& parser, const String& messageId)
1043           {
1044               XmlEntry entry;
1045               CIMStatusCode code;
1046               const char* description = 0;
1047           
1048               if (XmlReader::getErrorElement(parser, code, description))
1049               {
1050           	return(new CIMReferencesResponseMessage(
1051           	    messageId,
1052           	    code,
1053           	    description,
1054           	    QueueIdStack(),
1055           	    Array<CIMObjectWithPath>()));
1056               }
1057 mike  1.2     else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1058               {
1059           	Array<CIMObjectWithPath> objectWithPathArray;
1060           	CIMObjectWithPath tmp;
1061           
1062           	while (XmlReader::getObjectWithPath(parser, tmp))
1063           	    objectWithPathArray.append(tmp);
1064           
1065           	XmlReader::testEndTag(parser, "IRETURNVALUE");
1066           
1067           	return(new CIMReferencesResponseMessage(
1068           	    messageId,
1069           	    CIM_ERR_SUCCESS,
1070           	    String(),
1071           	    QueueIdStack(),
1072           	    objectWithPathArray));
1073               }
1074               else
1075               {
1076           	throw XmlValidationError(parser.getLine(),
1077           	    "expected ERROR or IRETURNVALUE element");
1078 mike  1.2     }
1079           }
1080           
1081           CIMAssociatorNamesResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorNamesResponse(
1082               XmlParser& parser, const String& messageId)
1083           {
1084               XmlEntry entry;
1085               CIMStatusCode code;
1086               const char* description = 0;
1087           
1088               if (XmlReader::getErrorElement(parser, code, description))
1089               {
1090           	return(new CIMAssociatorNamesResponseMessage(
1091           	    messageId,
1092           	    code,
1093           	    description,
1094           	    QueueIdStack(),
1095           	    Array<CIMReference>()));
1096               }
1097               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1098               {
1099 mike  1.2 	CIMReference objectPath;
1100           	Array<CIMReference> objectPaths;
1101           
1102           	while (XmlReader::getObjectPathElement(parser, objectPath))
1103           	    objectPaths.append(objectPath);
1104           
1105           	XmlReader::testEndTag(parser, "IRETURNVALUE");
1106           
1107           	return(new CIMAssociatorNamesResponseMessage(
1108           	    messageId,
1109           	    CIM_ERR_SUCCESS,
1110           	    String(),
1111           	    QueueIdStack(),
1112           	    objectPaths));
1113               }
1114               else
1115               {
1116           	throw XmlValidationError(parser.getLine(),
1117           	    "expected ERROR or IRETURNVALUE element");
1118               }
1119           }
1120 mike  1.2 
1121           CIMAssociatorsResponseMessage* CIMOperationResponseDecoder::_decodeAssociatorsResponse(
1122               XmlParser& parser, const String& messageId)
1123           {
1124               XmlEntry entry;
1125               CIMStatusCode code;
1126               const char* description = 0;
1127           
1128               if (XmlReader::getErrorElement(parser, code, description))
1129               {
1130           	return(new CIMAssociatorsResponseMessage(
1131           	    messageId,
1132           	    code,
1133           	    description,
1134           	    QueueIdStack(),
1135           	    Array<CIMObjectWithPath>()));
1136               }
1137               else if (XmlReader::testStartTag(parser, entry, "IRETURNVALUE"))
1138               {
1139           	Array<CIMObjectWithPath> objectWithPathArray;
1140           	CIMObjectWithPath tmp;
1141 mike  1.2 
1142           	while (XmlReader::getObjectWithPath(parser, tmp))
1143           	    objectWithPathArray.append(tmp);
1144           
1145           	XmlReader::testEndTag(parser, "IRETURNVALUE");
1146           
1147           	return(new CIMAssociatorsResponseMessage(
1148           	    messageId,
1149           	    CIM_ERR_SUCCESS,
1150           	    String(),
1151           	    QueueIdStack(),
1152           	    objectWithPathArray));
1153               }
1154               else
1155               {
1156           	throw XmlValidationError(parser.getLine(),
1157           	    "expected ERROR or IRETURNVALUE element");
1158               }
1159           }
1160           
1161           CIMInvokeMethodResponseMessage* CIMOperationResponseDecoder::_decodeInvokeMethodResponse(
1162 mike  1.2     XmlParser& parser, const String& messageId, const String& methodName)
1163           {
1164               XmlEntry entry;
1165               CIMStatusCode code;
1166               const char* description = 0;
1167           
1168               CIMValue value;
1169               Array<CIMParamValue> outParameters;
1170               const char* paramName;
1171               String inValue;
1172           
1173               if (XmlReader::getErrorElement(parser, code, description))
1174               {
1175           	return(new CIMInvokeMethodResponseMessage(
1176           	    messageId,
1177           	    code,
1178           	    description,
1179           	    QueueIdStack(),
1180           	    value,
1181           	    outParameters,
1182           	    methodName));
1183 mike  1.2     }
1184 kumpf 1.4     else
1185 mike  1.2     {
1186 kumpf 1.4         Boolean isReturnValue = false;
1187                   Boolean isParamValue = false;
1188                   Boolean gotReturnValue = false;
1189           
1190                   while ((isReturnValue =
1191                               XmlReader::testStartTag(parser, entry, "RETURNVALUE")) ||
1192                          (isParamValue = XmlReader::getParamValueTag(parser, paramName)))
1193                   {
1194                       if (isReturnValue)
1195                       {
1196                           // ATTN: Need to determine the correct type
1197           	        XmlReader::getValueElement(parser, CIMType::STRING, value);
1198                   	XmlReader::testEndTag(parser, "RETURNVALUE");
1199 mike  1.2 
1200 kumpf 1.4                 if (gotReturnValue)
1201                           {
1202           	            throw XmlValidationError(parser.getLine(),
1203           	                "unexpected RETURNVALUE element");
1204                           }
1205                           gotReturnValue = true;
1206                       }
1207                       else    // isParamValue == true
1208                       {
1209                           // ATTN: Need to determine the correct type
1210           	        //XmlReader::getValueElement(parser, CIMType::NONE, inValue);
1211           	        XmlReader::getStringValueElement(parser, inValue, true);
1212 mike  1.2 
1213 kumpf 1.4 	        outParameters.append(CIMParamValue(
1214           		    CIMParameter(paramName, CIMType::STRING),
1215           		    CIMValue(inValue)));
1216 mike  1.2 	
1217 kumpf 1.4 	        XmlReader::expectEndTag(parser, "PARAMVALUE");
1218                       }
1219           
1220                       isReturnValue = false;
1221                       isParamValue = false;
1222                   }
1223           
1224                   if (!gotReturnValue)
1225                   {
1226                       throw XmlValidationError(parser.getLine(),
1227                           "expected ERROR or RETURNVALUE element");
1228                   }
1229 mike  1.2 
1230           	return(new CIMInvokeMethodResponseMessage(
1231           	    messageId,
1232           	    CIM_ERR_SUCCESS,
1233           	    String(),
1234           	    QueueIdStack(),
1235           	    value,
1236           	    outParameters,
1237           	    methodName));
1238               }
1239           }
1240           
1241           PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2