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

   1 karl  1.100 //%2006////////////////////////////////////////////////////////////////////////
   2 mike  1.2   //
   3 karl  1.88  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   4             // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   5             // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   6 karl  1.72  // IBM Corp.; EMC Corporation, The Open Group.
   7 karl  1.88  // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8             // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9 karl  1.91  // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10             // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11 karl  1.100 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  12             // EMC Corporation; Symantec Corporation; The Open Group.
  13 mike  1.2   //
  14             // Permission is hereby granted, free of charge, to any person obtaining a copy
  15 kumpf 1.47  // of this software and associated documentation files (the "Software"), to
  16             // deal in the Software without restriction, including without limitation the
  17             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  18 mike  1.2   // sell copies of the Software, and to permit persons to whom the Software is
  19             // furnished to do so, subject to the following conditions:
  20 karl  1.100 // 
  21 kumpf 1.47  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  22 mike  1.2   // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  23             // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  24 kumpf 1.47  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  25             // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  26             // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  27 mike  1.2   // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28             // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29             //
  30             //==============================================================================
  31             //
  32             //%/////////////////////////////////////////////////////////////////////////////
  33             
  34             #include <Pegasus/Common/Config.h>
  35 kumpf 1.28  #include <Pegasus/Common/Constants.h>
  36 mike  1.2   #include <cctype>
  37             #include <cstdio>
  38             #include <Pegasus/Common/XmlParser.h>
  39             #include <Pegasus/Common/XmlReader.h>
  40             #include <Pegasus/Common/XmlWriter.h>
  41             #include <Pegasus/Common/XmlConstants.h>
  42 kumpf 1.51  #include <Pegasus/Common/System.h>
  43 mike  1.2   #include <Pegasus/Common/Logger.h>
  44             #include <Pegasus/Common/Tracer.h>
  45 sage  1.41  #include <Pegasus/Common/StatisticalData.h>
  46 mike  1.2   #include "CIMOperationRequestDecoder.h"
  47 david 1.60  #include <Pegasus/Common/CommonUTF.h>
  48 humberto 1.59  #include <Pegasus/Common/MessageLoader.h>
  49                
  50 mike     1.2   PEGASUS_USING_STD;
  51                
  52                PEGASUS_NAMESPACE_BEGIN
  53                
  54                CIMOperationRequestDecoder::CIMOperationRequestDecoder(
  55 kumpf    1.104     MessageQueueService* outputQueue,
  56                    Uint32 returnQueueId)
  57                    : Base(PEGASUS_QUEUENAME_OPREQDECODER),
  58 mday     1.16        _outputQueue(outputQueue),
  59                      _returnQueueId(returnQueueId),
  60                      _serverTerminating(false)
  61 mike     1.2   {
  62                }
  63                
  64                CIMOperationRequestDecoder::~CIMOperationRequestDecoder()
  65                {
  66                }
  67                
  68                void CIMOperationRequestDecoder::sendResponse(
  69 kumpf    1.104     Uint32 queueId,
  70                    Buffer& message,
  71                    Boolean closeConnect)
  72                {
  73                    MessageQueue* queue = MessageQueue::lookup(queueId);
  74                
  75                    if (queue)
  76                    {
  77                        AutoPtr<HTTPMessage> httpMessage(new HTTPMessage(message));
  78                        httpMessage->setCloseConnect(closeConnect);
  79                        queue->enqueue(httpMessage.release());
  80                    }
  81 mike     1.2   }
  82                
  83 kumpf    1.18  void CIMOperationRequestDecoder::sendIMethodError(
  84 kumpf    1.104     Uint32 queueId,
  85                    HttpMethod httpMethod,
  86                    const String& messageId,
  87                    const String& iMethodName,
  88                    const CIMException& cimException,
  89                    Boolean closeConnect)
  90 mday     1.16  {
  91 mike     1.96      Buffer message;
  92 kumpf    1.19      message = XmlWriter::formatSimpleIMethodErrorRspMessage(
  93                        iMethodName,
  94                        messageId,
  95 kumpf    1.53          httpMethod,
  96 kumpf    1.35          cimException);
  97 kumpf    1.18  
  98 j.alex   1.95      sendResponse(queueId, message,closeConnect);
  99 kumpf    1.18  }
 100 mday     1.16  
 101 kumpf    1.18  void CIMOperationRequestDecoder::sendMethodError(
 102 kumpf    1.104     Uint32 queueId,
 103                    HttpMethod httpMethod,
 104                    const String& messageId,
 105                    const String& methodName,
 106                    const CIMException& cimException,
 107                    Boolean closeConnect)
 108 kumpf    1.18  {
 109 mike     1.96      Buffer message;
 110 kumpf    1.19      message = XmlWriter::formatSimpleMethodErrorRspMessage(
 111                        methodName,
 112                        messageId,
 113 kumpf    1.53          httpMethod,
 114 kumpf    1.35          cimException);
 115 chip     1.92  
 116 j.alex   1.95      sendResponse(queueId, message,closeConnect);
 117 mike     1.2   }
 118                
 119 kumpf    1.33  void CIMOperationRequestDecoder::sendHttpError(
 120 kumpf    1.104     Uint32 queueId,
 121                    const String& status,
 122                    const String& cimError,
 123                    const String& pegasusError,
 124                    Boolean closeConnect)
 125 kumpf    1.21  {
 126 mike     1.96      Buffer message;
 127 kumpf    1.33      message = XmlWriter::formatHttpErrorRspMessage(
 128                        status,
 129                        cimError,
 130 kumpf    1.37          pegasusError);
 131 chip     1.92  
 132 j.alex   1.95      sendResponse(queueId, message,closeConnect);
 133 kumpf    1.26  }
 134                
 135 kumpf    1.104 void CIMOperationRequestDecoder::handleEnqueue(Message* message)
 136 mike     1.2   {
 137 kumpf    1.104     if (!message)
 138                        return;
 139 mike     1.2   
 140 kumpf    1.104     switch (message->getType())
 141                    {
 142                        case HTTP_MESSAGE:
 143                             handleHTTPMessage((HTTPMessage*)message);
 144                             break;
 145                    }
 146 mday     1.16  
 147 kumpf    1.104     delete message;
 148 mday     1.16  }
 149 mike     1.2   
 150                
 151 mday     1.16  void CIMOperationRequestDecoder::handleEnqueue()
 152                {
 153 kumpf    1.104     Message* message = dequeue();
 154                    if (message)
 155                        handleEnqueue(message);
 156 mike     1.2   }
 157                
 158                //------------------------------------------------------------------------------
 159                //
 160                // From the HTTP/1.1 Specification (RFC 2626):
 161                //
 162 chip     1.92  // Both types of message consist of a start-line, zero or more header fields
 163                // (also known as "headers"), an empty line (i.e., a line with nothing
 164                // preceding the CRLF) indicating the end of the header fields, and possibly
 165 mike     1.2   // a message-body.
 166                //
 167                // Example CIM request:
 168                //
 169 chip     1.92  //     M-POST /cimom HTTP/1.1
 170                //     HOST: www.erewhon.com
 171                //     Content-Type: application/xml; charset="utf-8"
 172                //     Content-Length: xxxx
 173                //     Man: http://www.dmtf.org/cim/operation ; ns=73
 174                //     73-CIMOperation: MethodCall
 175                //     73-CIMMethod: EnumerateInstances
 176                //     73-CIMObject: root/cimv2
 177                //
 178 mike     1.2   //------------------------------------------------------------------------------
 179                
 180                void CIMOperationRequestDecoder::handleHTTPMessage(HTTPMessage* httpMessage)
 181                {
 182 kumpf    1.104     PEG_METHOD_ENTER(TRC_DISPATCHER,
 183                        "CIMOperationRequestDecoder::handleHTTPMessage()");
 184 kumpf    1.20  
 185 kumpf    1.104     // Set the Accept-Language into the thread for this service.
 186                    // This will allow all code in this thread to get
 187                    // the languages for the messages returned to the client.
 188                    Thread::setLanguages(new AcceptLanguageList(httpMessage->acceptLanguages));
 189                
 190                    // Save queueId:
 191                
 192                    Uint32 queueId = httpMessage->queueId;
 193                
 194                    // Save userName and authType:
 195                
 196                    String userName;
 197                    String authType;
 198                    Boolean closeConnect = httpMessage->getCloseConnect();
 199                
 200                    PEG_TRACE((
 201                        TRC_HTTP,
 202                        Tracer::LEVEL3,
 203                        "CIMOperationRequestDecoder::handleHTTPMessage()- "
 204                        "httpMessage->getCloseConnect() returned %d",
 205                        closeConnect));
 206 kumpf    1.104 
 207                    if (httpMessage->authInfo->isAuthenticated())
 208                    {
 209                        userName = httpMessage->authInfo->getAuthenticatedUser();
 210                        authType = httpMessage->authInfo->getAuthType();
 211                    }
 212                
 213                    // Parse the HTTP message:
 214                
 215                    String startLine;
 216                    Array<HTTPHeader> headers;
 217                    char* content;
 218                    Uint32 contentLength;
 219                
 220                    httpMessage->parse(startLine, headers, contentLength);
 221                
 222                    // Parse the request line:
 223                
 224                    String methodName;
 225                    String requestUri;
 226                    String httpVersion;
 227 kumpf    1.104     HttpMethod httpMethod = HTTP_METHOD__POST;
 228                
 229                    Tracer::trace(TRC_XML_IO, Tracer::LEVEL2, "%s",
 230                        httpMessage->message.getData());
 231                
 232                    HTTPMessage::parseRequestLine(
 233                        startLine, methodName, requestUri, httpVersion);
 234                
 235                    //
 236                    //  Set HTTP method for the request
 237                    //
 238                    if (methodName == "M-POST")
 239                    {
 240                        httpMethod = HTTP_METHOD_M_POST;
 241                    }
 242                
 243                    // Unsupported methods are caught in the HTTPAuthenticatorDelegator
 244                    PEGASUS_ASSERT(methodName == "M-POST" || methodName == "POST");
 245                
 246                    //
 247                    //  Mismatch of method and version is caught in HTTPAuthenticatorDelegator
 248 kumpf    1.104     //
 249                    PEGASUS_ASSERT(!((httpMethod == HTTP_METHOD_M_POST) &&
 250                                     (httpVersion == "HTTP/1.0")));
 251 humberto 1.80  
 252 kumpf    1.104     // Process M-POST and POST messages:
 253 humberto 1.80  
 254 kumpf    1.104     String cimContentType;
 255                    String cimOperation;
 256                    String cimBatch;
 257                    Boolean cimBatchFlag;
 258                    String cimProtocolVersion;
 259                    String cimMethod;
 260                    String cimObject;
 261                
 262                    if (httpVersion == "HTTP/1.1")
 263                    {
 264                        // Validate the presence of a "Host" header.  The HTTP/1.1 specification
 265                        // says this in section 14.23 regarding the Host header field:
 266                        //
 267                        //     All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad
 268                        //     Request) status code to any HTTP/1.1 request message which lacks
 269                        //     a Host header field.
 270                        //
 271                        // Note:  The Host header value is not validated.
 272                
 273                        String hostHeader;
 274                        Boolean hostHeaderFound = HTTPMessage::lookupHeader(
 275 kumpf    1.104             headers, "Host", hostHeader, false);
 276 mike     1.2   
 277 kumpf    1.104         if (!hostHeaderFound)
 278                        {
 279                            MessageLoaderParms parms(
 280                                "Server.CIMOperationRequestDecoder.MISSING_HOST_HEADER",
 281                                "HTTP request message lacks a Host header field.");
 282                            sendHttpError(
 283                                queueId,
 284                                HTTP_STATUS_BADREQUEST,
 285                                "",
 286                                MessageLoader::getMessage(parms),
 287                                closeConnect);
 288                            PEG_METHOD_EXIT();
 289                            return;
 290                        }
 291                    }
 292 mike     1.2   
 293 kumpf    1.104     // Validate the "CIMOperation" header:
 294 mike     1.2   
 295 kumpf    1.104     Boolean operationHeaderFound = HTTPMessage::lookupHeader(
 296                        headers, "CIMOperation", cimOperation, true);
 297                    // If the CIMOperation header was missing, the HTTPAuthenticatorDelegator
 298                    // would not have passed the message to us.
 299                    PEGASUS_ASSERT(operationHeaderFound);
 300                
 301                    if (!String::equalNoCase(cimOperation, "MethodCall"))
 302                    {
 303                        // The Specification for CIM Operations over HTTP reads:
 304                        //     3.3.4. CIMOperation
 305                        //     If a CIM Server receives CIM Operation request with this
 306                        //     [CIMOperation] header, but with a missing value or a value
 307                        //     that is not "MethodCall", then it MUST fail the request with
 308                        //     status "400 Bad Request". The CIM Server MUST include a
 309                        //     CIMError header in the response with a value of
 310                        //     unsupported-operation.
 311                        MessageLoaderParms parms(
 312                            "Server.CIMOperationRequestDecoder."
 313                                "CIMOPERATION_VALUE_NOT_SUPPORTED",
 314                            "CIMOperation value \"$0\" is not supported.",cimOperation);
 315                        sendHttpError(
 316 kumpf    1.104             queueId,
 317                            HTTP_STATUS_BADREQUEST,
 318                            "unsupported-operation",
 319                            MessageLoader::getMessage(parms),
 320                            closeConnect);
 321                        PEG_METHOD_EXIT();
 322                        return;
 323                    }
 324                
 325                    // Validate the "CIMBatch" header:
 326                
 327                    cimBatchFlag = HTTPMessage::lookupHeader(
 328                        headers, "CIMBatch", cimBatch, true);
 329                    if (cimBatchFlag)
 330                    {
 331                        // The Specification for CIM Operations over HTTP reads:
 332                        //     3.3.9. CIMBatch
 333                        //     If a CIM Server receives CIM Operation Request for which the
 334                        //     CIMBatch header is present, but the Server does not support
 335                        //     Multiple Operations, then it MUST fail the request and
 336                        //     return a status of "501 Not Implemented".
 337 kumpf    1.104         sendHttpError(
 338                            queueId,
 339                            HTTP_STATUS_NOTIMPLEMENTED,
 340                            "multiple-requests-unsupported",
 341                            String::EMPTY,
 342                            closeConnect);
 343                        PEG_METHOD_EXIT();
 344                        return;
 345                    }
 346                
 347                    // Save these headers for later checking
 348                
 349                    if (!HTTPMessage::lookupHeader(
 350                        headers, "CIMProtocolVersion", cimProtocolVersion, true))
 351                    {
 352                        // Mandated by the Specification for CIM Operations over HTTP
 353                        cimProtocolVersion.assign("1.0");
 354                    }
 355                
 356                    if (HTTPMessage::lookupHeader(headers, "CIMMethod", cimMethod, true))
 357                    {
 358 kumpf    1.104         if (cimMethod == String::EMPTY)
 359                        {
 360                            // This is not a valid value, and we use EMPTY to mean "absent"
 361                            MessageLoaderParms parms(
 362                                "Server.CIMOperationRequestDecoder.EMPTY_CIMMETHOD_VALUE",
 363                                "Empty CIMMethod value.");
 364                            sendHttpError(
 365                                queueId,
 366                                HTTP_STATUS_BADREQUEST,
 367                                "header-mismatch",
 368                                MessageLoader::getMessage(parms),
 369                                closeConnect);
 370                            PEG_METHOD_EXIT();
 371                            return;
 372                        }
 373 mike     1.98  
 374 kumpf    1.104         try
 375                        {
 376                            cimMethod = XmlReader::decodeURICharacters(cimMethod);
 377                        }
 378                        catch (const ParseError&)
 379                        {
 380                            // The CIMMethod header value could not be decoded
 381                            MessageLoaderParms parms(
 382                                "Server.CIMOperationRequestDecoder."
 383                                    "CIMMETHOD_VALUE_SYNTAX_ERROR",
 384                                "CIMMethod value syntax error.");
 385                            sendHttpError(
 386                                queueId,
 387                                HTTP_STATUS_BADREQUEST,
 388                                "header-mismatch",
 389                                MessageLoader::getMessage(parms),
 390                                closeConnect);
 391                            PEG_METHOD_EXIT();
 392                            return;
 393                        }
 394                    }
 395 mike     1.2   
 396 kumpf    1.104     if (HTTPMessage::lookupHeader(headers, "CIMObject", cimObject, true))
 397                    {
 398                        if (cimObject == String::EMPTY)
 399                        {
 400                            // This is not a valid value, and we use EMPTY to mean "absent"
 401                            MessageLoaderParms parms(
 402                                "Server.CIMOperationRequestDecoder.EMPTY_CIMOBJECT_VALUE",
 403                                "Empty CIMObject value.");
 404                            sendHttpError(
 405                                queueId,
 406                                HTTP_STATUS_BADREQUEST,
 407                                "header-mismatch",
 408                                MessageLoader::getMessage(parms),
 409                                closeConnect);
 410                            PEG_METHOD_EXIT();
 411                            return;
 412                        }
 413 mike     1.2   
 414 kumpf    1.104         try
 415                        {
 416                            cimObject = XmlReader::decodeURICharacters(cimObject);
 417                        }
 418                        catch (const ParseError&)
 419                        {
 420                            // The CIMObject header value could not be decoded
 421                            MessageLoaderParms parms(
 422                                "Server.CIMOperationRequestDecoder."
 423                                    "CIMOBJECT_VALUE_SYNTAX_ERROR",
 424                                "CIMObject value syntax error.");
 425                            sendHttpError(
 426                                queueId,
 427                                HTTP_STATUS_BADREQUEST,
 428                                "header-mismatch",
 429                                MessageLoader::getMessage(parms),
 430                                closeConnect);
 431                            PEG_METHOD_EXIT();
 432                            return;
 433                        }
 434                    }
 435 mike     1.2   
 436 kumpf    1.104     // Zero-terminate the message:
 437 mike     1.2   
 438 kumpf    1.104     httpMessage->message.append('\0');
 439 mike     1.2   
 440 kumpf    1.104     // Calculate the beginning of the content from the message size and
 441                    // the content length.  Subtract 1 to take into account the null
 442                    // character we just added to the end of the message.
 443 mike     1.2   
 444 kumpf    1.104     content = (char*) httpMessage->message.getData() +
 445                    httpMessage->message.size() - contentLength - 1;
 446 mike     1.2   
 447 kumpf    1.104     // Validate the "Content-Type" header:
 448 mike     1.2   
 449 kumpf    1.104     Boolean contentTypeHeaderFound = HTTPMessage::lookupHeader(
 450                        headers, "Content-Type", cimContentType, true);
 451 mike     1.2   
 452 kumpf    1.105     // ATTN: Bug 5928: Need to validate that the content type is text/xml or
 453                    // application/xml, and the encoding is utf-8 (or compatible)
 454                    if (!contentTypeHeaderFound)
 455 kumpf    1.104     {
 456 j.alex   1.95          MessageLoaderParms parms(
 457 kumpf    1.104             "Server.CIMOperationRequestDecoder.CIMCONTENTTYPE_SYNTAX_ERROR",
 458 kumpf    1.105             "HTTP Content-Type header error.");
 459 j.alex   1.95          sendHttpError(
 460                            queueId,
 461                            HTTP_STATUS_BADREQUEST,
 462 kumpf    1.105             "",
 463 j.alex   1.95              MessageLoader::getMessage(parms),
 464                            closeConnect);
 465 kumpf    1.104         PEG_METHOD_EXIT();
 466                        return;
 467                    }
 468                    // Validating content falls within UTF8
 469                    // (required to be complaint with section C12 of Unicode 4.0 spec,
 470                    // chapter 3.)
 471                    else
 472                    {
 473                        Uint32 count = 0;
 474                        while(count<contentLength)
 475                        {
 476                            if (!(isUTF8((char*)&content[count])))
 477                            {
 478                                MessageLoaderParms parms(
 479                                    "Server.CIMOperationRequestDecoder.INVALID_UTF8_CHARACTER",
 480                                    "Invalid UTF-8 character detected.");
 481                                sendHttpError(
 482                                    queueId,
 483                                    HTTP_STATUS_BADREQUEST,
 484                                    "request-not-valid",
 485                                    MessageLoader::getMessage(parms),
 486 kumpf    1.104                     closeConnect);
 487                
 488                                PEG_METHOD_EXIT();
 489                                    return;
 490                            }
 491                            UTF8_NEXT(content,count);
 492                        }
 493                    }
 494                
 495                    // If it is a method call, then dispatch it to be handled:
 496                
 497                    handleMethodCall(
 498                        queueId,
 499                        httpMethod,
 500                        content,
 501                        contentLength,
 502                        cimProtocolVersion,
 503                        cimMethod,
 504                        cimObject,
 505                        authType,
 506                        userName,
 507 kumpf    1.104         httpMessage->ipAddress,
 508                        httpMessage->acceptLanguages,
 509                        httpMessage->contentLanguages,
 510                        closeConnect);
 511                
 512                    PEG_METHOD_EXIT();
 513                }
 514                
 515                void CIMOperationRequestDecoder::handleMethodCall(
 516                    Uint32 queueId,
 517                    HttpMethod httpMethod,
 518                    char* content,
 519                    Uint32 contentLength,    // used for statistics only
 520                    const String& cimProtocolVersionInHeader,
 521                    const String& cimMethodInHeader,
 522                    const String& cimObjectInHeader,
 523                    const String& authType,
 524                    const String& userName,
 525                    const String& ipAddress,
 526                    const AcceptLanguageList& httpAcceptLanguages,
 527                    const ContentLanguageList& httpContentLanguages,
 528 kumpf    1.104     Boolean closeConnect)
 529                {
 530                    PEG_METHOD_ENTER(TRC_DISPATCHER,
 531                        "CIMOperationRequestDecoder::handleMethodCall()");
 532                
 533                    //
 534                    // If CIMOM is shutting down, return "Service Unavailable" response
 535                    //
 536                    if (_serverTerminating)
 537                    {
 538 j.alex   1.95          MessageLoaderParms parms(
 539 kumpf    1.104             "Server.CIMOperationRequestDecoder.CIMSERVER_SHUTTING_DOWN",
 540                            "CIM Server is shutting down.");
 541 j.alex   1.95          sendHttpError(
 542                            queueId,
 543 kumpf    1.104             HTTP_STATUS_SERVICEUNAVAILABLE,
 544                            String::EMPTY,
 545 j.alex   1.95              MessageLoader::getMessage(parms),
 546                            closeConnect);
 547 kumpf    1.104         PEG_METHOD_EXIT();
 548                        return;
 549                    }
 550                
 551                    PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
 552                        "CIMOperationRequestdecoder - XML content: $0", content));
 553                
 554                    // Create a parser:
 555                
 556                    XmlParser parser(content);
 557                    XmlEntry entry;
 558                    String messageId;
 559                    const char* cimMethodName = "";
 560                    AutoPtr<CIMOperationRequestMessage> request;
 561                
 562                    try
 563                    {
 564                        //
 565                        // Process <?xml ... >
 566                        //
 567                
 568 kumpf    1.104         // These values are currently unused
 569                        const char* xmlVersion = 0;
 570                        const char* xmlEncoding = 0;
 571 mike     1.2   
 572 kumpf    1.104         XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
 573 mike     1.2   
 574 kumpf    1.104         // Expect <CIM ...>
 575 chip     1.92  
 576 kumpf    1.104         const char* cimVersion = 0;
 577                        const char* dtdVersion = 0;
 578 mike     1.2   
 579 kumpf    1.104         XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
 580 mike     1.2   
 581 kumpf    1.104         if (strcmp(cimVersion, "2.0") != 0)
 582                        {
 583                            MessageLoaderParms parms(
 584                                "Server.CIMOperationRequestDecoder.CIM_VERSION_NOT_SUPPORTED",
 585                                "CIM version \"$0\" is not supported.",
 586                                 cimVersion);
 587                            sendHttpError(
 588                                queueId,
 589                                HTTP_STATUS_NOTIMPLEMENTED,
 590                                "unsupported-cim-version",
 591                                MessageLoader::getMessage(parms),
 592                                closeConnect);
 593 kumpf    1.23              PEG_METHOD_EXIT();
 594                            return;
 595 kumpf    1.104         }
 596 kumpf    1.23  
 597 kumpf    1.104         // We accept DTD version 2.x (see Bugzilla 1556)
 598 mday     1.16  
 599 kumpf    1.104         Boolean dtdVersionAccepted = false;
 600 mday     1.16  
 601 kumpf    1.104         if ((dtdVersion[0] == '2') &&
 602                            (dtdVersion[1] == '.') &&
 603                            (dtdVersion[2] != 0))
 604                        {
 605                            // Verify that all characters after the '.' are digits
 606                            Uint32 index = 2;
 607                            while (isdigit(dtdVersion[index]))
 608                            {
 609                                index++;
 610                            }
 611 humberto 1.59  
 612 kumpf    1.104             if (dtdVersion[index] == 0)
 613 kumpf    1.39              {
 614 kumpf    1.104                dtdVersionAccepted = true;
 615 kumpf    1.39              }
 616 kumpf    1.104         }
 617 kumpf    1.23  
 618 kumpf    1.104         if (!dtdVersionAccepted)
 619                        {
 620                            MessageLoaderParms parms(
 621                                "Server.CIMOperationRequestDecoder.DTD_VERSION_NOT_SUPPORTED",
 622                                "DTD version \"$0\" is not supported.",
 623                                dtdVersion);
 624                            sendHttpError(
 625 j.alex   1.95                  queueId,
 626 kumpf    1.104                 HTTP_STATUS_NOTIMPLEMENTED,
 627                                "unsupported-dtd-version",
 628                                MessageLoader::getMessage(parms),
 629 j.alex   1.95                  closeConnect);
 630 kumpf    1.20              PEG_METHOD_EXIT();
 631 kumpf    1.34              return;
 632 kumpf    1.104         }
 633                
 634                        // Expect <MESSAGE ...>
 635                
 636                        String protocolVersion;
 637 kumpf    1.73  
 638 kumpf    1.104         if (!XmlReader::getMessageStartTag(
 639                                 parser, messageId, protocolVersion))
 640                        {
 641                            MessageLoaderParms mlParms(
 642                                "Server.CIMOperationRequestDecoder.EXPECTED_MESSAGE_ELEMENT",
 643                                "expected MESSAGE element");
 644 mday     1.16  
 645 kumpf    1.104             throw XmlValidationError(parser.getLine(), mlParms);
 646                        }
 647 mday     1.16  
 648 kumpf    1.104         // Validate that the protocol version in the header matches the XML
 649 kumpf    1.23  
 650 kumpf    1.104         if (!String::equalNoCase(protocolVersion, cimProtocolVersionInHeader))
 651                        {
 652 j.alex   1.95              MessageLoaderParms parms(
 653 kumpf    1.104                 "Server.CIMOperationRequestDecoder."
 654                                    "CIMPROTOCOL_VERSION_MISMATCH",
 655                                "CIMProtocolVersion value \"$0\" does not match CIM request "
 656                                    "protocol version \"$1\".",
 657                                cimProtocolVersionInHeader,
 658                                protocolVersion);
 659 j.alex   1.95              sendHttpError(
 660                                queueId,
 661                                HTTP_STATUS_BADREQUEST,
 662                                "header-mismatch",
 663                                MessageLoader::getMessage(parms),
 664                                closeConnect);
 665 kumpf    1.39              PEG_METHOD_EXIT();
 666                            return;
 667 kumpf    1.104         }
 668 kumpf    1.39  
 669 kumpf    1.104         // We accept protocol version 1.x (see Bugzilla 1556)
 670                
 671                        Boolean protocolVersionAccepted = false;
 672                
 673                        if ((protocolVersion.size() >= 3) &&
 674                            (protocolVersion[0] == '1') &&
 675                            (protocolVersion[1] == '.'))
 676                        {
 677                            // Verify that all characters after the '.' are digits
 678                            Uint32 index = 2;
 679                            while ((index < protocolVersion.size()) &&
 680                                   (protocolVersion[index] >= '0') &&
 681                                   (protocolVersion[index] <= '9'))
 682                            {
 683                                index++;
 684                            }
 685                
 686                            if (index == protocolVersion.size())
 687                            {
 688                                protocolVersionAccepted = true;
 689                            }
 690 kumpf    1.104         }
 691                
 692                        if (!protocolVersionAccepted)
 693                        {
 694                            // See Specification for CIM Operations over HTTP section 4.3
 695 j.alex   1.95              MessageLoaderParms parms(
 696 kumpf    1.104                 "Server.CIMOperationRequestDecoder."
 697                                    "CIMPROTOCOL_VERSION_NOT_SUPPORTED",
 698                                "CIMProtocolVersion \"$0\" is not supported.",
 699                                     protocolVersion);
 700 j.alex   1.95              sendHttpError(
 701                                queueId,
 702 kumpf    1.104                 HTTP_STATUS_NOTIMPLEMENTED,
 703                                "unsupported-protocol-version",
 704 j.alex   1.95                  MessageLoader::getMessage(parms),
 705                                closeConnect);
 706 kumpf    1.23              PEG_METHOD_EXIT();
 707                            return;
 708 kumpf    1.104         }
 709 kumpf    1.23  
 710 kumpf    1.104         if (XmlReader::testStartTag(parser, entry, "MULTIREQ"))
 711                        {
 712                            // We wouldn't have gotten here if CIMBatch header was specified,
 713                            // so this must be indicative of a header mismatch
 714 j.alex   1.95              MessageLoaderParms parms(
 715 kumpf    1.104                 "Server.CIMOperationRequestDecoder."
 716                                    "MULTI_REQUEST_MISSING_CIMBATCH_HTTP_HEADER",
 717                                "Multi-request is missing CIMBatch HTTP header");
 718 j.alex   1.95              sendHttpError(
 719                                queueId,
 720                                HTTP_STATUS_BADREQUEST,
 721                                "header-mismatch",
 722                                MessageLoader::getMessage(parms),
 723                                closeConnect);
 724 kumpf    1.23              PEG_METHOD_EXIT();
 725                            return;
 726 kumpf    1.104             // Future: When MULTIREQ is supported, must ensure CIMMethod and
 727                            // CIMObject headers are absent, and CIMBatch header is present.
 728                        }
 729                
 730                        // Expect <SIMPLEREQ ...>
 731                
 732                        XmlReader::expectStartTag(parser, entry, "SIMPLEREQ");
 733                
 734                        // Check for <IMETHODCALL ...>
 735                
 736                        if (XmlReader::getIMethodCallStartTag(parser, cimMethodName))
 737                        {
 738                            // The Specification for CIM Operations over HTTP reads:
 739                            //     3.3.6. CIMMethod
 740                            //
 741                            //     This header MUST be present in any CIM Operation Request
 742                            //     message that contains a Simple Operation Request.
 743                            //
 744                            //     It MUST NOT be present in any CIM Operation Response message,
 745                            //     nor in any CIM Operation Request message that is not a
 746                            //     Simple Operation Request.
 747 kumpf    1.104             //
 748                            //     The name of the CIM method within a Simple Operation Request
 749                            //     is defined to be the value of the NAME attribute of the
 750                            //     <METHODCALL> or <IMETHODCALL> element.
 751                            //
 752                            //     If a CIM Server receives a CIM Operation Request for which
 753                            //     either:
 754                            //
 755                            //     - The CIMMethod header is present but has an invalid value,
 756                            //       or;
 757                            //     - The CIMMethod header is not present but the Operation
 758                            //       Request Message is a Simple Operation Request, or;
 759                            //     - The CIMMethod header is present but the Operation Request
 760                            //       Message is not a Simple Operation Request, or;
 761                            //     - The CIMMethod header is present, the Operation Request
 762                            //       Message is a Simple Operation Request, but the
 763                            //       CIMIdentifier value (when unencoded) does not match the
 764                            //       unique method name within the Simple Operation Request,
 765                            //
 766                            //     then it MUST fail the request and return a status of
 767                            //     "400 Bad Request" (and MUST include a CIMError header in the
 768 kumpf    1.104             //     response with a value of header-mismatch), subject to the
 769                            //     considerations specified in Errors.
 770                            if (!String::equalNoCase(cimMethodName, cimMethodInHeader))
 771                            {
 772                                // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
 773                                if (cimMethodInHeader == String::EMPTY)
 774                                {
 775                                    MessageLoaderParms parms(
 776                                        "Server.CIMOperationRequestDecoder."
 777                                            "MISSING_CIMMETHOD_HTTP_HEADER",
 778                                        "Missing CIMMethod HTTP header.");
 779                                    sendHttpError(
 780                                        queueId,
 781                                        HTTP_STATUS_BADREQUEST,
 782                                        "header-mismatch",
 783                                        MessageLoader::getMessage(parms),
 784                                        closeConnect);
 785                                }
 786                                else
 787                                {
 788                                    MessageLoaderParms parms(
 789 kumpf    1.104                         "Server.CIMOperationRequestDecoder."
 790                                             "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
 791                                        "CIMMethod value \"$0\" does not match CIM request "
 792                                             "method \"$1\".",
 793                                        cimMethodInHeader,
 794                                        cimMethodName);
 795                                    sendHttpError(
 796                                        queueId,
 797                                        HTTP_STATUS_BADREQUEST,
 798                                        "header-mismatch",
 799                                        MessageLoader::getMessage(parms),
 800                                        closeConnect);
 801                                }
 802                                PEG_METHOD_EXIT();
 803                                return;
 804                            }
 805 kumpf    1.23  
 806 kumpf    1.104             // Expect <LOCALNAMESPACEPATH ...>
 807                
 808                            String nameSpace;
 809                
 810                            if (!XmlReader::getLocalNameSpacePathElement(parser, nameSpace))
 811                            {
 812                                MessageLoaderParms mlParms(
 813                                    "Server.CIMOperationRequestDecoder."
 814                                        "EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
 815                                    "expected LOCALNAMESPACEPATH element");
 816                                throw XmlValidationError(parser.getLine(), mlParms);
 817                            }
 818                
 819                            // The Specification for CIM Operations over HTTP reads:
 820                            //     3.3.7. CIMObject
 821                            //
 822                            //     This header MUST be present in any CIM Operation Request
 823                            //     message that contains a Simple Operation Request.
 824                            //
 825                            //     It MUST NOT be present in any CIM Operation Response message,
 826                            //     nor in any CIM Operation Request message that is not a
 827 kumpf    1.104             //     Simple Operation Request.
 828                            //
 829                            //     The header identifies the CIM object (which MUST be a Class
 830                            //     or Instance for an extrinsic method, or a Namespace for an
 831                            //     intrinsic method) on which the method is to be invoked, using
 832                            //     a CIM object path encoded in an HTTP-safe representation.
 833                            //
 834                            //     If a CIM Server receives a CIM Operation Request for which
 835                            //     either:
 836                            //
 837                            //     - The CIMObject header is present but has an invalid value,
 838                            //       or;
 839                            //     - The CIMObject header is not present but the Operation
 840                            //       Request Message is a Simple Operation Request, or;
 841                            //     - The CIMObject header is present but the Operation Request
 842                            //       Message is not a Simple Operation Request, or;
 843                            //     - The CIMObject header is present, the Operation Request
 844                            //       Message is a Simple Operation Request, but the ObjectPath
 845                            //       value does not match (where match is defined in the section
 846                            //       section on Encoding CIM Object Paths) the Operation Request
 847                            //       Message,
 848 kumpf    1.104             //
 849                            //     then it MUST fail the request and return a status of
 850                            //     "400 Bad Request" (and MUST include a CIMError header in the
 851                            //     response with a value of header-mismatch), subject to the
 852                            //     considerations specified in Errors.
 853                            if (!String::equalNoCase(nameSpace, cimObjectInHeader))
 854                            {
 855                                if (cimObjectInHeader == String::EMPTY)
 856                                {
 857                                    MessageLoaderParms parms(
 858                                        "Server.CIMOperationRequestDecoder."
 859                                            "MISSING_CIMOBJECT_HTTP_HEADER",
 860                                        "Missing CIMObject HTTP header.");
 861                                    sendHttpError(
 862                                        queueId,
 863                                        HTTP_STATUS_BADREQUEST,
 864                                        "header-mismatch",
 865                                        MessageLoader::getMessage(parms),
 866                                        closeConnect);
 867                                }
 868                                else
 869 kumpf    1.104                 {
 870                                    MessageLoaderParms parms(
 871                                        "Server.CIMOperationRequestDecoder."
 872                                            "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT:",
 873                                        "CIMObject value \"$0\" does not match CIM request "
 874                                            "object \"$1\".",
 875                                        cimObjectInHeader,
 876                                        nameSpace);
 877                                    sendHttpError(
 878                                        queueId,
 879                                        HTTP_STATUS_BADREQUEST,
 880                                        "header-mismatch",
 881                                        MessageLoader::getMessage(parms),
 882                                        closeConnect);
 883                                }
 884                                PEG_METHOD_EXIT();
 885                                return;
 886                            }
 887                
 888                            // This try block only catches CIMExceptions, because they must be
 889                            // responded to with a proper IMETHODRESPONSE.  Other exceptions are
 890 kumpf    1.104             // caught in the outer try block.
 891                            try
 892                            {
 893                                // Delegate to appropriate method to handle:
 894                
 895                                if (System::strcasecmp(cimMethodName, "GetClass") == 0)
 896                                    request.reset(decodeGetClassRequest(
 897                                        queueId, parser, messageId, nameSpace));
 898                                else if (System::strcasecmp(cimMethodName, "GetInstance") == 0)
 899                                    request.reset(decodeGetInstanceRequest(
 900                                        queueId, parser, messageId, nameSpace));
 901                                else if (System::strcasecmp(
 902                                             cimMethodName, "EnumerateClassNames") == 0)
 903                                    request.reset(decodeEnumerateClassNamesRequest(
 904                                        queueId, parser, messageId, nameSpace));
 905                                else if (System::strcasecmp(cimMethodName, "References") == 0)
 906                                    request.reset(decodeReferencesRequest(
 907                                        queueId, parser, messageId, nameSpace));
 908                                else if (System::strcasecmp(
 909                                             cimMethodName, "ReferenceNames") == 0)
 910                                    request.reset(decodeReferenceNamesRequest(
 911 kumpf    1.104                         queueId, parser, messageId, nameSpace));
 912                                else if (System::strcasecmp(
 913                                             cimMethodName, "AssociatorNames") == 0)
 914                                    request.reset(decodeAssociatorNamesRequest(
 915                                        queueId, parser, messageId, nameSpace));
 916                                else if (System::strcasecmp(cimMethodName, "Associators") == 0)
 917                                    request.reset(decodeAssociatorsRequest(
 918                                        queueId, parser, messageId, nameSpace));
 919                                else if (System::strcasecmp(
 920                                             cimMethodName, "CreateInstance") == 0)
 921                                    request.reset(decodeCreateInstanceRequest(
 922                                        queueId, parser, messageId, nameSpace));
 923                                else if (System::strcasecmp(
 924                                             cimMethodName, "EnumerateInstanceNames")==0)
 925                                    request.reset(decodeEnumerateInstanceNamesRequest(
 926                                        queueId, parser, messageId, nameSpace));
 927                                else if (System::strcasecmp(
 928                                             cimMethodName, "DeleteQualifier") == 0)
 929                                    request.reset(decodeDeleteQualifierRequest(
 930                                        queueId, parser, messageId, nameSpace));
 931                                else if (System::strcasecmp(cimMethodName, "GetQualifier") == 0)
 932 kumpf    1.104                     request.reset(decodeGetQualifierRequest(
 933                                        queueId, parser, messageId, nameSpace));
 934                                else if (System::strcasecmp(cimMethodName, "SetQualifier") == 0)
 935                                    request.reset(decodeSetQualifierRequest(
 936                                        queueId, parser, messageId, nameSpace));
 937                                else if (System::strcasecmp(
 938                                             cimMethodName, "EnumerateQualifiers") == 0)
 939                                    request.reset(decodeEnumerateQualifiersRequest(
 940                                        queueId, parser, messageId, nameSpace));
 941                                else if (System::strcasecmp(
 942                                             cimMethodName, "EnumerateClasses") == 0)
 943                                    request.reset(decodeEnumerateClassesRequest(
 944                                        queueId, parser, messageId, nameSpace));
 945                                else if (System::strcasecmp(
 946                                             cimMethodName, "EnumerateInstances") == 0)
 947                                    request.reset(decodeEnumerateInstancesRequest(
 948                                        queueId, parser, messageId, nameSpace));
 949                                else if (System::strcasecmp(cimMethodName, "CreateClass") == 0)
 950                                    request.reset(decodeCreateClassRequest(
 951                                        queueId, parser, messageId, nameSpace));
 952                                else if (System::strcasecmp(cimMethodName, "ModifyClass") == 0)
 953 kumpf    1.104                     request.reset(decodeModifyClassRequest(
 954                                        queueId, parser, messageId, nameSpace));
 955                                else if (System::strcasecmp(
 956                                             cimMethodName, "ModifyInstance") == 0)
 957                                    request.reset(decodeModifyInstanceRequest(
 958                                        queueId, parser, messageId, nameSpace));
 959                                else if (System::strcasecmp(cimMethodName, "DeleteClass") == 0)
 960                                    request.reset(decodeDeleteClassRequest(
 961                                        queueId, parser, messageId, nameSpace));
 962                                else if (System::strcasecmp(
 963                                             cimMethodName, "DeleteInstance") == 0)
 964                                    request.reset(decodeDeleteInstanceRequest(
 965                                        queueId, parser, messageId, nameSpace));
 966                                else if (System::strcasecmp(cimMethodName, "GetProperty") == 0)
 967                                    request.reset(decodeGetPropertyRequest(
 968                                        queueId, parser, messageId, nameSpace));
 969                                else if (System::strcasecmp(cimMethodName, "SetProperty") == 0)
 970                                    request.reset(decodeSetPropertyRequest(
 971                                        queueId, parser, messageId, nameSpace));
 972                                else if (System::strcasecmp(cimMethodName, "ExecQuery") == 0)
 973                                    request.reset(decodeExecQueryRequest(
 974 kumpf    1.104                         queueId, parser, messageId, nameSpace));
 975                                else
 976                                {
 977                                    throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
 978                                        MessageLoaderParms(
 979                                            "Server.CIMOperationRequestDecoder."
 980                                                "UNRECOGNIZED_INTRINSIC_METHOD",
 981                                            "Unrecognized intrinsic method: $0",
 982                                            cimMethodName));
 983                                }
 984                            }
 985                            catch (CIMException& e)
 986                            {
 987                                sendIMethodError(
 988                                    queueId,
 989                                    httpMethod,
 990                                    messageId,
 991                                    cimMethodName,
 992                                    e,
 993                                    closeConnect);
 994                
 995 kumpf    1.104                 PEG_METHOD_EXIT();
 996                                return;
 997                            }
 998                            catch (XmlException&)
 999                            {
1000                                // XmlExceptions are handled below
1001                                throw;
1002                            }
1003                            catch (Exception& e)
1004                            {
1005                                // Caught an unexpected exception from decoding.  Since we must
1006                                // have had a problem reconstructing a CIM object, we'll treat
1007                                // it as an invalid parameter
1008                                sendIMethodError(
1009                                    queueId,
1010                                    httpMethod,
1011                                    messageId,
1012                                    cimMethodName,
1013                                    PEGASUS_CIM_EXCEPTION(
1014                                        CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1015                                    closeConnect);
1016 kumpf    1.104 
1017                                PEG_METHOD_EXIT();
1018                                return;
1019                            }
1020                
1021                            // Expect </IMETHODCALL>
1022                
1023                            XmlReader::expectEndTag(parser, "IMETHODCALL");
1024                        }
1025                        // Expect <METHODCALL ...>
1026                        else if (XmlReader::getMethodCallStartTag(parser, cimMethodName))
1027                        {
1028                            CIMObjectPath reference;
1029                
1030                            // The Specification for CIM Operations over HTTP reads:
1031                            //     3.3.6. CIMMethod
1032                            //
1033                            //     This header MUST be present in any CIM Operation Request
1034                            //     message that contains a Simple Operation Request.
1035                            //
1036                            //     It MUST NOT be present in any CIM Operation Response message,
1037 kumpf    1.104             //     nor in any CIM Operation Request message that is not a
1038                            //     Simple Operation Request.
1039                            //
1040                            //     The name of the CIM method within a Simple Operation Request
1041                            //     is defined to be the value of the NAME attribute of the
1042                            //     <METHODCALL> or <IMETHODCALL> element.
1043                            //
1044                            //     If a CIM Server receives a CIM Operation Request for which
1045                            //     either:
1046                            //
1047                            //     - The CIMMethod header is present but has an invalid value,
1048                            //       or;
1049                            //     - The CIMMethod header is not present but the Operation
1050                            //       Request Message is a Simple Operation Request, or;
1051                            //     - The CIMMethod header is present but the Operation Request
1052                            //       Message is not a Simple Operation Request, or;
1053                            //     - The CIMMethod header is present, the Operation Request
1054                            //       Message is a Simple Operation Request, but the
1055                            //       CIMIdentifier value (when unencoded) does not match the
1056                            //       unique method name within the Simple Operation Request,
1057                            //
1058 kumpf    1.104             //     then it MUST fail the request and return a status of
1059                            //     "400 Bad Request" (and MUST include a CIMError header in the
1060                            //     response with a value of header-mismatch), subject to the
1061                            //     considerations specified in Errors.
1062                
1063                            // Extrinic methods can have UTF-8!
1064                            String cimMethodNameUTF16(cimMethodName);
1065                            if (cimMethodNameUTF16 != cimMethodInHeader)
1066                            {
1067                                // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
1068                                if (cimMethodInHeader == String::EMPTY)
1069                                {
1070                                    MessageLoaderParms parms(
1071                                        "Server.CIMOperationRequestDecoder."
1072                                            "MISSING_CIMMETHOD_HTTP_HEADER",
1073                                        "Missing CIMMethod HTTP header.");
1074                                    sendHttpError(
1075                                        queueId,
1076                                        HTTP_STATUS_BADREQUEST,
1077                                        "header-mismatch",
1078                                        MessageLoader::getMessage(parms),
1079 kumpf    1.104                         closeConnect);
1080                                }
1081                                else
1082                                {
1083                                    MessageLoaderParms parms(
1084                                        "Server.CIMOperationRequestDecoder."
1085                                            "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
1086                                        "CIMMethod value \"$0\" does not match CIM request "
1087                                            "method \"$1\".",
1088                                        (const char*)cimMethodInHeader.getCString(),
1089                                        cimMethodName);
1090                                    sendHttpError(
1091                                        queueId,
1092                                        HTTP_STATUS_BADREQUEST,
1093                                        "header-mismatch",
1094                                        MessageLoader::getMessage(parms),
1095                                        closeConnect);
1096                                }
1097                                PEG_METHOD_EXIT();
1098                                return;
1099                            }
1100 kumpf    1.104 
1101                            //
1102                            // Check for <LOCALINSTANCEPATHELEMENT> or <LOCALCLASSPATHELEMENT>
1103                            //
1104                            if (!(XmlReader::getLocalInstancePathElement(parser, reference) ||
1105                                  XmlReader::getLocalClassPathElement(parser, reference)))
1106                            {
1107                                MessageLoaderParms parms(
1108                                    "Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
1109                                    MISSING_ELEMENT_LOCALPATH);
1110                                // this throw is not updated with MLP because
1111                                // MISSING_ELEMENT_LOCALPATH is a hardcoded variable,
1112                                // not a message
1113                                throw XmlValidationError(parser.getLine(), parms);
1114                            }
1115                
1116                            // The Specification for CIM Operations over HTTP reads:
1117                            //     3.3.7. CIMObject
1118                            //
1119                            //     This header MUST be present in any CIM Operation Request
1120                            //     message that contains a Simple Operation Request.
1121 kumpf    1.104             //
1122                            //     It MUST NOT be present in any CIM Operation Response message,
1123                            //     nor in any CIM Operation Request message that is not a
1124                            //     Simple Operation Request.
1125                            //
1126                            //     The header identifies the CIM object (which MUST be a Class
1127                            //     or Instance for an extrinsic method, or a Namespace for an
1128                            //     intrinsic method) on which the method is to be invoked, using
1129                            //     a CIM object path encoded in an HTTP-safe representation.
1130                            //
1131                            //     If a CIM Server receives a CIM Operation Request for which
1132                            //     either:
1133                            //
1134                            //     - The CIMObject header is present but has an invalid value,
1135                            //       or;
1136                            //     - The CIMObject header is not present but the Operation
1137                            //       Request Message is a Simple Operation Request, or;
1138                            //     - The CIMObject header is present but the Operation Request
1139                            //       Message is not a Simple Operation Request, or;
1140                            //     - The CIMObject header is present, the Operation Request
1141                            //       Message is a Simple Operation Request, but the ObjectPath
1142 kumpf    1.104             //       value does not match (where match is defined in the section
1143                            //       section on Encoding CIM Object Paths) the Operation Request
1144                            //       Message,
1145                            //
1146                            //     then it MUST fail the request and return a status of
1147                            //     "400 Bad Request" (and MUST include a CIMError header in the
1148                            //     response with a value of header-mismatch), subject to the
1149                            //     considerations specified in Errors.
1150                            if (cimObjectInHeader == String::EMPTY)
1151                            {
1152                                MessageLoaderParms parms(
1153                                    "Server.CIMOperationRequestDecoder."
1154                                        "MISSING_CIMOBJECT_HTTP_HEADER",
1155                                    "Missing CIMObject HTTP header.");
1156                                sendHttpError(
1157                                    queueId,
1158                                    HTTP_STATUS_BADREQUEST,
1159                                    "header-mismatch",
1160                                    MessageLoader::getMessage(parms),
1161                                    closeConnect);
1162                                PEG_METHOD_EXIT();
1163 kumpf    1.104                 return;
1164                            }
1165                
1166                            CIMObjectPath headerObjectReference;
1167                            try
1168                            {
1169                                headerObjectReference.set(cimObjectInHeader);
1170                            }
1171                            catch (Exception&)
1172                            {
1173                                MessageLoaderParms parms(
1174                                    "Server.CIMOperationRequestDecoder."
1175                                        "COULD_NOT_PARSE_CIMOBJECT_VALUE",
1176                                    "Could not parse CIMObject value \"$0\".",
1177                                    cimObjectInHeader);
1178                                sendHttpError(
1179                                    queueId,
1180                                    HTTP_STATUS_BADREQUEST,
1181                                    "header-mismatch",
1182                                    MessageLoader::getMessage(parms),
1183                                    closeConnect);
1184 kumpf    1.104                 PEG_METHOD_EXIT();
1185                                return;
1186                            }
1187                
1188                            if (!reference.identical(headerObjectReference))
1189                            {
1190                                MessageLoaderParms parms(
1191                                    "Server.CIMOperationRequestDecoder."
1192                                        "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT:",
1193                                    "CIMObject value \"$0\" does not match CIM request "
1194                                        "object \"$1\".",
1195                                    cimObjectInHeader,
1196                                       reference.toString());
1197                                sendHttpError(
1198                                    queueId,
1199                                    HTTP_STATUS_BADREQUEST,
1200                                    "header-mismatch",
1201                                    MessageLoader::getMessage(parms),
1202                                    closeConnect);
1203                                PEG_METHOD_EXIT();
1204                                return;
1205 kumpf    1.104             }
1206                
1207                            // This try block only catches CIMExceptions, because they must be
1208                            // responded to with a proper METHODRESPONSE.  Other exceptions are
1209                            // caught in the outer try block.
1210                            try
1211                            {
1212                                // Delegate to appropriate method to handle:
1213                
1214                                request.reset(decodeInvokeMethodRequest(
1215                                   queueId,
1216                                   parser,
1217                                   messageId,
1218                                   reference,
1219                                   cimMethodNameUTF16)); // contains UTF-16 converted from UTF-8
1220                            }
1221                            catch (CIMException& e)
1222                            {
1223                                sendMethodError(
1224                                    queueId,
1225                                    httpMethod,
1226 kumpf    1.104                     messageId,
1227                                    cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1228                                    e,
1229                                    closeConnect);
1230                
1231                                PEG_METHOD_EXIT();
1232                                return;
1233                            }
1234                            catch (XmlException&)
1235                            {
1236                                // XmlExceptions are handled below
1237                                throw;
1238                            }
1239                            catch (Exception& e)
1240                            {
1241                                // Caught an unexpected exception from decoding.  Since we must
1242                                // have had a problem reconstructing a CIM object, we'll treata
1243                                // it as an invalid parameter
1244                                sendMethodError(
1245                                    queueId,
1246                                    httpMethod,
1247 kumpf    1.104                     messageId,
1248                                    cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1249                                    PEGASUS_CIM_EXCEPTION(
1250                                        CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1251                                    closeConnect);
1252                
1253                                PEG_METHOD_EXIT();
1254                                return;
1255                            }
1256 kumpf    1.73  
1257 kumpf    1.104             // Expect </METHODCALL>
1258 mday     1.16  
1259 kumpf    1.104             XmlReader::expectEndTag(parser, "METHODCALL");
1260                        }
1261                        else
1262                        {
1263                            MessageLoaderParms mlParms(
1264                               "Server.CIMOperationRequestDecoder.EXPECTED_IMETHODCALL_ELEMENT",
1265                               "expected IMETHODCALL or METHODCALL element");
1266                            throw XmlValidationError(parser.getLine(),mlParms);
1267                        }
1268                
1269                        // Expect </SIMPLEREQ>
1270                
1271                        XmlReader::expectEndTag(parser, "SIMPLEREQ");
1272                
1273                        // Expect </MESSAGE>
1274                
1275                        XmlReader::expectEndTag(parser, "MESSAGE");
1276                
1277                        // Expect </CIM>
1278                
1279                        XmlReader::expectEndTag(parser, "CIM");
1280 kumpf    1.104     }
1281                    catch (XmlValidationError& e)
1282                    {
1283                        Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
1284                            "CIMOperationRequestDecoder::handleMethodCall - "
1285                                "XmlValidationError exception has occurred. Message: $0",
1286                            e.getMessage());
1287 kumpf    1.24  
1288 kumpf    1.104         sendHttpError(
1289                            queueId,
1290                            HTTP_STATUS_BADREQUEST,
1291                            "request-not-valid",
1292                            e.getMessage(),
1293                            closeConnect);
1294                        PEG_METHOD_EXIT();
1295                        return;
1296                    }
1297                    catch (XmlSemanticError& e)
1298                    {
1299                        Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
1300                            "CIMOperationRequestDecoder::handleMethodCall - "
1301                                "XmlSemanticError exception has occurred. Message: $0",
1302                            e.getMessage());
1303 mday     1.16  
1304 kumpf    1.104         // ATTN-RK-P2-20020404: Is this the correct response for these errors?
1305                        sendHttpError(
1306                            queueId,
1307                            HTTP_STATUS_BADREQUEST,
1308                            "request-not-valid",
1309                            e.getMessage(),
1310                            closeConnect);
1311                        PEG_METHOD_EXIT();
1312                        return;
1313                    }
1314                    catch (XmlException& e)
1315                    {
1316                        Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::TRACE,
1317                            "CIMOperationRequestDecoder::handleMethodCall - "
1318                                "XmlException has occurred. Message: $0",
1319                            e.getMessage());
1320                
1321                        sendHttpError(
1322                            queueId,
1323                            HTTP_STATUS_BADREQUEST,
1324                            "request-not-well-formed",
1325 kumpf    1.104             e.getMessage(),
1326                            closeConnect);
1327                        PEG_METHOD_EXIT();
1328                        return;
1329                    }
1330                    catch (Exception& e)
1331                    {
1332                        // Don't know why I got this exception.  Seems like a bad thing.
1333                        // Any exceptions we're expecting should be caught separately and
1334                        // dealt with appropriately.  This is a last resort.
1335                        sendHttpError(
1336                            queueId,
1337                            HTTP_STATUS_INTERNALSERVERERROR,
1338                            String::EMPTY,
1339                            e.getMessage(),
1340                            closeConnect);
1341                        PEG_METHOD_EXIT();
1342                        return;
1343                    }
1344                    catch (...)
1345                    {
1346 kumpf    1.104         // Don't know why I got whatever this is.  Seems like a bad thing.
1347                        // Any exceptions we're expecting should be caught separately and
1348                        // dealt with appropriately.  This is a last resort.
1349                        sendHttpError(
1350                            queueId,
1351                            HTTP_STATUS_INTERNALSERVERERROR,
1352                            String::EMPTY,
1353                            String::EMPTY,
1354                            closeConnect);
1355                        PEG_METHOD_EXIT();
1356                        return;
1357                    }
1358                
1359                    STAT_BYTESREAD
1360                
1361                    request->authType = authType;
1362                    request->userName = userName;
1363                    request->ipAddress = ipAddress;
1364                    request->setHttpMethod (httpMethod);
1365 sage     1.41  
1366 chuck    1.58  //l10n start
1367                // l10n TODO - might want to move A-L and C-L to Message
1368                // to make this more maintainable
1369 kumpf    1.104     // Add the language headers to the request
1370                    CIMMessage* cimmsg = dynamic_cast<CIMMessage*>(request.get());
1371                    if (cimmsg != NULL)
1372                    {
1373                        cimmsg->operationContext.insert(IdentityContainer(userName));
1374                        cimmsg->operationContext.set(
1375                            AcceptLanguageListContainer(httpAcceptLanguages));
1376                        cimmsg->operationContext.set(
1377                            ContentLanguageListContainer(httpContentLanguages));
1378                    }
1379                    else
1380                    {
1381                        ;    // l10n TODO - error back to client here
1382                    }
1383 chip     1.92  // l10n end
1384 chuck    1.58  
1385 kumpf    1.104     request->setCloseConnect(closeConnect);
1386                    _outputQueue->enqueue(request.release());
1387 chip     1.92  
1388 kumpf    1.104     PEG_METHOD_EXIT();
1389 mike     1.2   }
1390                
1391 kumpf    1.104 CIMCreateClassRequestMessage*
1392                    CIMOperationRequestDecoder::decodeCreateClassRequest(
1393                        Uint32 queueId,
1394                        XmlParser& parser,
1395                        const String& messageId,
1396                        const CIMNamespaceName& nameSpace)
1397                {
1398                    PEG_METHOD_ENTER(TRC_DISPATCHER,
1399                        "CIMOperationRequestDecoder::decodeCreateClassRequest()");
1400                
1401                    STAT_GETSTARTTIME
1402                
1403                    CIMClass newClass;
1404                    Boolean duplicateParameter = false;
1405                    Boolean gotClass = false;
1406                    Boolean emptyTag;
1407                
1408                    for (const char* name;
1409                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1410                    {
1411                        if (System::strcasecmp(name, "NewClass") == 0)
1412 kumpf    1.104         {
1413                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1414                            XmlReader::getClassElement(parser, newClass);
1415                            duplicateParameter = gotClass;
1416                            gotClass = true;
1417                        }
1418                        else
1419                        {
1420                            PEG_METHOD_EXIT();
1421                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1422                        }
1423 mike     1.2   
1424 kumpf    1.104         if (!emptyTag)
1425                        {
1426                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1427                        }
1428 sage     1.41  
1429 kumpf    1.104         if (duplicateParameter)
1430                        {
1431                            PEG_METHOD_EXIT();
1432                            throw PEGASUS_CIM_EXCEPTION(
1433                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1434                        }
1435                    }
1436                
1437                    if (!gotClass)
1438                    {
1439                        PEG_METHOD_EXIT();
1440                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1441                    }
1442                
1443                    AutoPtr<CIMCreateClassRequestMessage> request(
1444                        new CIMCreateClassRequestMessage(
1445                            messageId,
1446                            nameSpace,
1447                            newClass,
1448                            QueueIdStack(queueId, _returnQueueId)));
1449                
1450 kumpf    1.104     STAT_SERVERSTART
1451                
1452                    PEG_METHOD_EXIT();
1453                    return request.release();
1454 mike     1.2   }
1455                
1456                CIMGetClassRequestMessage* CIMOperationRequestDecoder::decodeGetClassRequest(
1457 kumpf    1.104     Uint32 queueId,
1458                    XmlParser& parser,
1459                    const String& messageId,
1460                    const CIMNamespaceName& nameSpace)
1461                {
1462                    PEG_METHOD_ENTER(TRC_DISPATCHER,
1463                        "CIMOperationRequestDecoder::decodeGetClassRequest()");
1464                
1465                    STAT_GETSTARTTIME
1466                
1467                    CIMName className;
1468                    Boolean localOnly = true;
1469                    Boolean includeQualifiers = true;
1470                    Boolean includeClassOrigin = false;
1471                    CIMPropertyList propertyList;
1472                    Boolean duplicateParameter = false;
1473                    Boolean gotClassName = false;
1474                    Boolean gotLocalOnly = false;
1475                    Boolean gotIncludeQualifiers = false;
1476                    Boolean gotIncludeClassOrigin = false;
1477                    Boolean gotPropertyList = false;
1478 kumpf    1.104     Boolean emptyTag;
1479                
1480                    for (const char* name;
1481                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1482                    {
1483                        if (System::strcasecmp(name, "ClassName") == 0)
1484                        {
1485                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1486                            XmlReader::getClassNameElement(parser, className, true);
1487                            duplicateParameter = gotClassName;
1488                            gotClassName = true;
1489                        }
1490                        else if (System::strcasecmp(name, "LocalOnly") == 0)
1491                        {
1492                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1493                            XmlReader::getBooleanValueElement(parser, localOnly, true);
1494                            duplicateParameter = gotLocalOnly;
1495                            gotLocalOnly = true;
1496                        }
1497                        else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
1498                        {
1499 kumpf    1.104             XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1500                            XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
1501                            duplicateParameter = gotIncludeQualifiers;
1502                            gotIncludeQualifiers = true;
1503                        }
1504                        else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
1505                        {
1506                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1507                            XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
1508                            duplicateParameter = gotIncludeClassOrigin;
1509                            gotIncludeClassOrigin = true;
1510                        }
1511                        else if (System::strcasecmp(name, "PropertyList") == 0)
1512                        {
1513                            if (!emptyTag)
1514                            {
1515                                CIMValue pl;
1516                                if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
1517                                {
1518                                    Array<String> propertyListArray;
1519                                    pl.get(propertyListArray);
1520 kumpf    1.104                     Array<CIMName> cimNameArray;
1521                                    for (Uint32 i = 0; i < propertyListArray.size(); i++)
1522                                    {
1523                                        cimNameArray.append(propertyListArray[i]);
1524                                    }
1525                                    propertyList.set(cimNameArray);
1526                                }
1527                            }
1528                            duplicateParameter = gotPropertyList;
1529                            gotPropertyList = true;
1530                        }
1531                        else
1532                        {
1533                            PEG_METHOD_EXIT();
1534                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1535                        }
1536                
1537                        if (!emptyTag)
1538                        {
1539                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1540                        }
1541 kumpf    1.104 
1542                        if (duplicateParameter)
1543                        {
1544                            PEG_METHOD_EXIT();
1545                            throw PEGASUS_CIM_EXCEPTION(
1546                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1547                        }
1548                    }
1549                
1550                    if (!gotClassName)
1551                    {
1552                        PEG_METHOD_EXIT();
1553                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1554                    }
1555                
1556                    AutoPtr<CIMGetClassRequestMessage> request(new CIMGetClassRequestMessage(
1557                        messageId,
1558                        nameSpace,
1559                        className,
1560                        localOnly,
1561                        includeQualifiers,
1562 kumpf    1.104         includeClassOrigin,
1563                        propertyList,
1564                        QueueIdStack(queueId, _returnQueueId)));
1565                
1566                    STAT_SERVERSTART
1567                
1568                    PEG_METHOD_EXIT();
1569                    return request.release();
1570                }
1571                
1572                CIMModifyClassRequestMessage*
1573                    CIMOperationRequestDecoder::decodeModifyClassRequest(
1574                        Uint32 queueId,
1575                        XmlParser& parser,
1576                        const String& messageId,
1577                        const CIMNamespaceName& nameSpace)
1578                {
1579                    STAT_GETSTARTTIME
1580                
1581                    CIMClass modifiedClass;
1582                    Boolean duplicateParameter = false;
1583 kumpf    1.104     Boolean gotClass = false;
1584                    Boolean emptyTag;
1585                
1586                    for (const char* name;
1587                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1588                    {
1589                        if (System::strcasecmp(name, "ModifiedClass") == 0)
1590                        {
1591                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1592                            XmlReader::getClassElement(parser, modifiedClass);
1593                            duplicateParameter = gotClass;
1594                            gotClass = true;
1595                        }
1596                        else
1597                        {
1598                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1599                        }
1600                
1601                        if (!emptyTag)
1602                        {
1603                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1604 kumpf    1.104         }
1605                
1606                        if (duplicateParameter)
1607                        {
1608                            throw PEGASUS_CIM_EXCEPTION(
1609                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1610                        }
1611                    }
1612                
1613                    if (!gotClass)
1614                    {
1615                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1616                    }
1617                
1618                    AutoPtr<CIMModifyClassRequestMessage> request(
1619                        new CIMModifyClassRequestMessage(
1620                            messageId,
1621                            nameSpace,
1622                            modifiedClass,
1623                            QueueIdStack(queueId, _returnQueueId)));
1624                
1625 kumpf    1.104     STAT_SERVERSTART
1626                
1627                    return request.release();
1628                }
1629                
1630                CIMEnumerateClassNamesRequestMessage*
1631                    CIMOperationRequestDecoder::decodeEnumerateClassNamesRequest(
1632                        Uint32 queueId,
1633                        XmlParser& parser,
1634                        const String& messageId,
1635                        const CIMNamespaceName& nameSpace)
1636                {
1637                    STAT_GETSTARTTIME
1638                
1639                    CIMName className;
1640                    Boolean deepInheritance = false;
1641                    Boolean duplicateParameter = false;
1642                    Boolean gotClassName = false;
1643                    Boolean gotDeepInheritance = false;
1644                    Boolean emptyTag;
1645                
1646 kumpf    1.104     for (const char* name;
1647                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1648                    {
1649                        if (System::strcasecmp(name, "ClassName") == 0)
1650                        {
1651                            //
1652                            //  ClassName may be NULL
1653                            //
1654                            if (!emptyTag)
1655                            {
1656                                XmlReader::getClassNameElement(parser, className, false);
1657                            }
1658                            duplicateParameter = gotClassName;
1659                            gotClassName = true;
1660                        }
1661                        else if (System::strcasecmp(name, "DeepInheritance") == 0)
1662                        {
1663                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1664                            XmlReader::getBooleanValueElement(parser, deepInheritance, true);
1665                            duplicateParameter = gotDeepInheritance;
1666                            gotDeepInheritance = true;
1667 kumpf    1.104         }
1668                        else
1669                        {
1670                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1671                        }
1672                
1673                        if (!emptyTag)
1674                        {
1675                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1676                        }
1677                
1678                        if (duplicateParameter)
1679                        {
1680                            throw PEGASUS_CIM_EXCEPTION(
1681                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1682                        }
1683                    }
1684                
1685                    AutoPtr<CIMEnumerateClassNamesRequestMessage> request(
1686                        new CIMEnumerateClassNamesRequestMessage(
1687                            messageId,
1688 kumpf    1.104             nameSpace,
1689                            className,
1690                            deepInheritance,
1691                            QueueIdStack(queueId, _returnQueueId)));
1692                
1693                    STAT_SERVERSTART
1694                
1695                    return request.release();
1696                }
1697                
1698                CIMEnumerateClassesRequestMessage*
1699                    CIMOperationRequestDecoder::decodeEnumerateClassesRequest(
1700                        Uint32 queueId,
1701                        XmlParser& parser,
1702                        const String& messageId,
1703                        const CIMNamespaceName& nameSpace)
1704                {
1705                    STAT_GETSTARTTIME
1706                
1707                    CIMName className;
1708                    Boolean deepInheritance = false;
1709 kumpf    1.104     Boolean localOnly = true;
1710                    Boolean includeQualifiers = true;
1711                    Boolean includeClassOrigin = false;
1712                    Boolean duplicateParameter = false;
1713                    Boolean gotClassName = false;
1714                    Boolean gotDeepInheritance = false;
1715                    Boolean gotLocalOnly = false;
1716                    Boolean gotIncludeQualifiers = false;
1717                    Boolean gotIncludeClassOrigin = false;
1718                    Boolean emptyTag;
1719                
1720                    for (const char* name;
1721                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1722                    {
1723                        if (System::strcasecmp(name, "ClassName") == 0)
1724                        {
1725                            //
1726                            //  ClassName may be NULL
1727                            //
1728                            if (!emptyTag)
1729                            {
1730 kumpf    1.104                 XmlReader::getClassNameElement(parser, className, false);
1731                            }
1732                            duplicateParameter = gotClassName;
1733                            gotClassName = true;
1734                        }
1735                        else if (System::strcasecmp(name, "DeepInheritance") == 0)
1736                        {
1737                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1738                            XmlReader::getBooleanValueElement(parser, deepInheritance, true);
1739                            duplicateParameter = gotDeepInheritance;
1740                            gotDeepInheritance = true;
1741                        }
1742                        else if (System::strcasecmp(name, "LocalOnly") == 0)
1743                        {
1744                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1745                            XmlReader::getBooleanValueElement(parser, localOnly, true);
1746                            duplicateParameter = gotLocalOnly;
1747                            gotLocalOnly = true;
1748                        }
1749                        else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
1750                        {
1751 kumpf    1.104             XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1752                            XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
1753                            duplicateParameter = gotIncludeQualifiers;
1754                            gotIncludeQualifiers = true;
1755                        }
1756                        else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
1757                        {
1758                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1759                            XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
1760                            duplicateParameter = gotIncludeClassOrigin;
1761                            gotIncludeClassOrigin = true;
1762                        }
1763                        else
1764                        {
1765                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1766                        }
1767                
1768                        if (!emptyTag)
1769                        {
1770                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1771                        }
1772 kumpf    1.104 
1773                        if (duplicateParameter)
1774                        {
1775                            throw PEGASUS_CIM_EXCEPTION(
1776                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1777                        }
1778                    }
1779                
1780                    AutoPtr<CIMEnumerateClassesRequestMessage> request(
1781                        new CIMEnumerateClassesRequestMessage(
1782                            messageId,
1783                            nameSpace,
1784                            className,
1785                            deepInheritance,
1786                            localOnly,
1787                            includeQualifiers,
1788                            includeClassOrigin,
1789                            QueueIdStack(queueId, _returnQueueId)));
1790                
1791                    STAT_SERVERSTART
1792                
1793 kumpf    1.104     return request.release();
1794                }
1795                
1796                CIMDeleteClassRequestMessage*
1797                    CIMOperationRequestDecoder::decodeDeleteClassRequest(
1798                        Uint32 queueId,
1799                        XmlParser& parser,
1800                        const String& messageId,
1801                        const CIMNamespaceName& nameSpace)
1802                {
1803                    STAT_GETSTARTTIME
1804                
1805                    CIMName className;
1806                    Boolean duplicateParameter = false;
1807                    Boolean gotClassName = false;
1808                    Boolean emptyTag;
1809                
1810                    for (const char* name;
1811                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1812                    {
1813                        if (System::strcasecmp(name, "ClassName") == 0)
1814 kumpf    1.104         {
1815                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1816                            XmlReader::getClassNameElement(parser, className);
1817                            duplicateParameter = gotClassName;
1818                            gotClassName = true;
1819                        }
1820                        else
1821                        {
1822                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1823                        }
1824                
1825                        if (!emptyTag)
1826                        {
1827                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1828                        }
1829                
1830                        if (duplicateParameter)
1831                        {
1832                            throw PEGASUS_CIM_EXCEPTION(
1833                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1834                        }
1835 kumpf    1.104     }
1836                
1837                    if (!gotClassName)
1838                    {
1839                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1840                    }
1841                
1842                    AutoPtr<CIMDeleteClassRequestMessage> request(
1843                        new CIMDeleteClassRequestMessage(
1844                            messageId,
1845                            nameSpace,
1846                            className,
1847                            QueueIdStack(queueId, _returnQueueId)));
1848                
1849                    STAT_SERVERSTART
1850                
1851                    return request.release();
1852                }
1853                
1854                CIMCreateInstanceRequestMessage*
1855                    CIMOperationRequestDecoder::decodeCreateInstanceRequest(
1856 kumpf    1.104         Uint32 queueId,
1857                        XmlParser& parser,
1858                        const String& messageId,
1859                        const CIMNamespaceName& nameSpace)
1860                {
1861                    STAT_GETSTARTTIME
1862                
1863                    CIMInstance newInstance;
1864                    Boolean duplicateParameter = false;
1865                    Boolean gotInstance = false;
1866                    Boolean emptyTag;
1867                
1868                    for (const char* name;
1869                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1870                    {
1871                        if (System::strcasecmp(name, "NewInstance") == 0)
1872                        {
1873                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1874                            XmlReader::getInstanceElement(parser, newInstance);
1875                            duplicateParameter = gotInstance;
1876                            gotInstance = true;
1877 kumpf    1.104         }
1878                        else
1879                        {
1880                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1881                        }
1882                
1883                        if (!emptyTag)
1884                        {
1885                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1886                        }
1887                
1888                        if (duplicateParameter)
1889                        {
1890                            throw PEGASUS_CIM_EXCEPTION(
1891                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1892                        }
1893                    }
1894                
1895                    if (!gotInstance)
1896                    {
1897                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1898 kumpf    1.104     }
1899                
1900                    AutoPtr<CIMCreateInstanceRequestMessage> request(
1901                        new CIMCreateInstanceRequestMessage(
1902                            messageId,
1903                            nameSpace,
1904                            newInstance,
1905                            QueueIdStack(queueId, _returnQueueId)));
1906                
1907                    STAT_SERVERSTART
1908                
1909                    return request.release();
1910                }
1911                
1912                CIMGetInstanceRequestMessage*
1913                    CIMOperationRequestDecoder::decodeGetInstanceRequest(
1914                        Uint32 queueId,
1915                        XmlParser& parser,
1916                        const String& messageId,
1917                        const CIMNamespaceName& nameSpace)
1918                {
1919 kumpf    1.104     STAT_GETSTARTTIME
1920                
1921                    CIMObjectPath instanceName;
1922                    Boolean localOnly = true;
1923                    Boolean includeQualifiers = false;
1924                    Boolean includeClassOrigin = false;
1925                    CIMPropertyList propertyList;
1926                    Boolean duplicateParameter = false;
1927                    Boolean gotInstanceName = false;
1928                    Boolean gotLocalOnly = false;
1929                    Boolean gotIncludeQualifiers = false;
1930                    Boolean gotIncludeClassOrigin = false;
1931                    Boolean gotPropertyList = false;
1932                    Boolean emptyTag;
1933                
1934                    for (const char* name;
1935                         XmlReader::getIParamValueTag(parser, name, emptyTag); )
1936                    {
1937                        if (System::strcasecmp(name, "InstanceName") == 0)
1938                        {
1939                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1940 kumpf    1.104             XmlReader::getInstanceNameElement(parser, instanceName);
1941                            duplicateParameter = gotInstanceName;
1942                            gotInstanceName = true;
1943                        }
1944                        else if (System::strcasecmp(name, "LocalOnly") == 0)
1945                        {
1946                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1947                            XmlReader::getBooleanValueElement(parser, localOnly, true);
1948                            duplicateParameter = gotLocalOnly;
1949                            gotLocalOnly = true;
1950                        }
1951                        else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
1952                        {
1953                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1954                            XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
1955                            duplicateParameter = gotIncludeQualifiers;
1956                            gotIncludeQualifiers = true;
1957                        }
1958                        else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
1959                        {
1960                            XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1961 kumpf    1.104             XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
1962                            duplicateParameter = gotIncludeClassOrigin;
1963                            gotIncludeClassOrigin = true;
1964                        }
1965                        else if (System::strcasecmp(name, "PropertyList") == 0)
1966                        {
1967                            if (!emptyTag)
1968                            {
1969                                CIMValue pl;
1970                                if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
1971                                {
1972                                    Array<String> propertyListArray;
1973                                    pl.get(propertyListArray);
1974                                    Array<CIMName> cimNameArray;
1975                                    for (Uint32 i = 0; i < propertyListArray.size(); i++)
1976                                    {
1977                                        cimNameArray.append(propertyListArray[i]);
1978                                    }
1979                                    propertyList.set(cimNameArray);
1980                                }
1981                            }
1982 kumpf    1.104             duplicateParameter = gotPropertyList;
1983                            gotPropertyList = true;
1984                        }
1985                        else
1986                        {
1987                            throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
1988                        }
1989                
1990                        if (!emptyTag)
1991                        {
1992                            XmlReader::expectEndTag(parser, "IPARAMVALUE");
1993                        }
1994                
1995                        if (duplicateParameter)
1996                        {
1997                            throw PEGASUS_CIM_EXCEPTION(
1998                                CIM_ERR_INVALID_PARAMETER, String::EMPTY);
1999                        }
2000                    }
2001                
2002                    if (!gotInstanceName)
2003 kumpf    1.104     {
2004                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2005                    }
2006                
2007                    AutoPtr<CIMGetInstanceRequestMessage> request(
2008                        new CIMGetInstanceRequestMessage(
2009                            messageId,
2010                            nameSpace,
2011                            instanceName,
2012                            false,    // Bug 1985 localOnly is deprecated
2013 h.sterling 1.97  #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
2014 kumpf      1.104             false,
2015 h.sterling 1.97  #else
2016 kumpf      1.104             includeQualifiers,
2017 h.sterling 1.97  #endif
2018 kumpf      1.104             includeClassOrigin,
2019                              propertyList,
2020                              QueueIdStack(queueId, _returnQueueId)));
2021                  
2022                      STAT_SERVERSTART
2023                  
2024                      return request.release();
2025                  }
2026                  
2027                  CIMModifyInstanceRequestMessage*
2028                      CIMOperationRequestDecoder::decodeModifyInstanceRequest(
2029                          Uint32 queueId,
2030                          XmlParser& parser,
2031                          const String& messageId,
2032                          const CIMNamespaceName& nameSpace)
2033                  {
2034                      STAT_GETSTARTTIME
2035                  
2036                      CIMInstance modifiedInstance;
2037                      Boolean includeQualifiers = true;
2038                      CIMPropertyList propertyList;
2039 kumpf      1.104     Boolean duplicateParameter = false;
2040                      Boolean gotInstance = false;
2041                      Boolean gotIncludeQualifiers = false;
2042                      Boolean gotPropertyList = false;
2043                      Boolean emptyTag;
2044                  
2045                      for (const char* name;
2046                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2047                      {
2048                          if (System::strcasecmp(name, "ModifiedInstance") == 0)
2049                          {
2050                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2051                              XmlReader::getNamedInstanceElement(parser, modifiedInstance);
2052                              duplicateParameter = gotInstance;
2053                              gotInstance = true;
2054                          }
2055                          else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2056                          {
2057                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2058                              XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2059                              duplicateParameter = gotIncludeQualifiers;
2060 kumpf      1.104             gotIncludeQualifiers = true;
2061                          }
2062                          else if (System::strcasecmp(name, "PropertyList") == 0)
2063                          {
2064                              if (!emptyTag)
2065                              {
2066                                  CIMValue pl;
2067                                  if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2068                                  {
2069                                      Array<String> propertyListArray;
2070                                      pl.get(propertyListArray);
2071                                      Array<CIMName> cimNameArray;
2072                                      for (Uint32 i = 0; i < propertyListArray.size(); i++)
2073                                      {
2074                                          cimNameArray.append(propertyListArray[i]);
2075                                      }
2076                                      propertyList.set(cimNameArray);
2077                                  }
2078                              }
2079                              duplicateParameter = gotPropertyList;
2080                              gotPropertyList = true;
2081 kumpf      1.104         }
2082                          else
2083                          {
2084                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2085                          }
2086                  
2087                          if (!emptyTag)
2088                          {
2089                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2090                          }
2091                  
2092                          if (duplicateParameter)
2093                          {
2094                              throw PEGASUS_CIM_EXCEPTION(
2095                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2096                          }
2097                      }
2098                  
2099                      if (!gotInstance)
2100                      {
2101                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2102 kumpf      1.104     }
2103                  
2104                      AutoPtr<CIMModifyInstanceRequestMessage> request(
2105                          new CIMModifyInstanceRequestMessage(
2106                              messageId,
2107                              nameSpace,
2108                              modifiedInstance,
2109                              includeQualifiers,
2110                              propertyList,
2111                              QueueIdStack(queueId, _returnQueueId)));
2112                  
2113                      STAT_SERVERSTART
2114                  
2115                      return request.release();
2116                  }
2117                  
2118                  CIMEnumerateInstancesRequestMessage*
2119                      CIMOperationRequestDecoder::decodeEnumerateInstancesRequest(
2120                          Uint32 queueId,
2121                          XmlParser& parser,
2122                          const String& messageId,
2123 kumpf      1.104         const CIMNamespaceName& nameSpace)
2124                  {
2125                      STAT_GETSTARTTIME
2126                  
2127                      CIMName className;
2128                      Boolean deepInheritance = true;
2129                      Boolean localOnly = true;
2130                      Boolean includeQualifiers = false;
2131                      Boolean includeClassOrigin = false;
2132                      CIMPropertyList propertyList;
2133                      Boolean duplicateParameter = false;
2134                      Boolean gotClassName = false;
2135                      Boolean gotDeepInheritance = false;
2136                      Boolean gotLocalOnly = false;
2137                      Boolean gotIncludeQualifiers = false;
2138                      Boolean gotIncludeClassOrigin = false;
2139                      Boolean gotPropertyList = false;
2140                      Boolean emptyTag;
2141                  
2142                      for (const char* name;
2143                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2144 kumpf      1.104     {
2145                          if (System::strcasecmp(name, "ClassName") == 0)
2146                          {
2147                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2148                              XmlReader::getClassNameElement(parser, className, true);
2149                              duplicateParameter = gotClassName;
2150                              gotClassName = true;
2151                          }
2152                          else if (System::strcasecmp(name, "DeepInheritance") == 0)
2153                          {
2154                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2155                              XmlReader::getBooleanValueElement(parser, deepInheritance, true);
2156                              duplicateParameter = gotDeepInheritance;
2157                              gotDeepInheritance = true;
2158                          }
2159                          else if (System::strcasecmp(name, "LocalOnly") == 0)
2160                          {
2161                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2162                              XmlReader::getBooleanValueElement(parser, localOnly, true);
2163                              duplicateParameter = gotLocalOnly;
2164                              gotLocalOnly = true;
2165 kumpf      1.104         }
2166                          else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2167                          {
2168                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2169                              XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2170                              duplicateParameter = gotIncludeQualifiers;
2171                              gotIncludeQualifiers = true;
2172                          }
2173                          else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
2174                          {
2175                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2176                              XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
2177                              duplicateParameter = gotIncludeClassOrigin;
2178                              gotIncludeClassOrigin = true;
2179                          }
2180                          else if (System::strcasecmp(name, "PropertyList") == 0)
2181                          {
2182                              if (!emptyTag)
2183                              {
2184                                  CIMValue pl;
2185                                  if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2186 kumpf      1.104                 {
2187                                      Array<String> propertyListArray;
2188                                      pl.get(propertyListArray);
2189                                      Array<CIMName> cimNameArray;
2190                                      for (Uint32 i = 0; i < propertyListArray.size(); i++)
2191                                      {
2192                                          cimNameArray.append(propertyListArray[i]);
2193                                      }
2194                                      propertyList.set(cimNameArray);
2195                                  }
2196                              }
2197                              duplicateParameter = gotPropertyList;
2198                              gotPropertyList = true;
2199                          }
2200                          else
2201                          {
2202                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2203                          }
2204                  
2205                          if (!emptyTag)
2206                          {
2207 kumpf      1.104             XmlReader::expectEndTag(parser, "IPARAMVALUE");
2208                          }
2209                  
2210                          if (duplicateParameter)
2211                          {
2212                              throw PEGASUS_CIM_EXCEPTION(
2213                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2214                          }
2215                      }
2216                  
2217                      if (!gotClassName)
2218                      {
2219                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2220                      }
2221                  
2222                      AutoPtr<CIMEnumerateInstancesRequestMessage> request(
2223                          new CIMEnumerateInstancesRequestMessage(
2224                              messageId,
2225                              nameSpace,
2226                              className,
2227                              deepInheritance,
2228 kumpf      1.104             false,    // Bug 1985 localOnly is deprecated
2229 h.sterling 1.97  #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
2230 kumpf      1.104             false,
2231 h.sterling 1.97  #else
2232 kumpf      1.104             includeQualifiers,
2233 h.sterling 1.97  #endif
2234 kumpf      1.104             includeClassOrigin,
2235                              propertyList,
2236                              QueueIdStack(queueId, _returnQueueId)));
2237                  
2238                      STAT_SERVERSTART
2239                  
2240                      return request.release();
2241                  }
2242                  
2243                  CIMEnumerateInstanceNamesRequestMessage*
2244                      CIMOperationRequestDecoder::decodeEnumerateInstanceNamesRequest(
2245                          Uint32 queueId,
2246                          XmlParser& parser,
2247                          const String& messageId,
2248                          const CIMNamespaceName& nameSpace)
2249                  {
2250                      STAT_GETSTARTTIME
2251                  
2252                      CIMName className;
2253                      Boolean duplicateParameter = false;
2254                      Boolean gotClassName = false;
2255 kumpf      1.104     Boolean emptyTag;
2256                  
2257                      for (const char* name;
2258                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2259                      {
2260                          if (System::strcasecmp(name, "ClassName") == 0)
2261                          {
2262                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2263                              XmlReader::getClassNameElement(parser, className, true);
2264                              duplicateParameter = gotClassName;
2265                              gotClassName = true;
2266                          }
2267                          else
2268                          {
2269                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2270                          }
2271                  
2272                          if (!emptyTag)
2273                          {
2274                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2275                          }
2276 kumpf      1.104 
2277                          if (duplicateParameter)
2278                          {
2279                              throw PEGASUS_CIM_EXCEPTION(
2280                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2281                          }
2282                      }
2283                  
2284                      if (!gotClassName)
2285                      {
2286                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2287                      }
2288                  
2289                      AutoPtr<CIMEnumerateInstanceNamesRequestMessage> request(
2290                          new CIMEnumerateInstanceNamesRequestMessage(
2291                              messageId,
2292                              nameSpace,
2293                              className,
2294                              QueueIdStack(queueId, _returnQueueId)));
2295                  
2296                      STAT_SERVERSTART
2297 kumpf      1.104 
2298                      return request.release();
2299                  }
2300                  
2301                  CIMDeleteInstanceRequestMessage*
2302                      CIMOperationRequestDecoder::decodeDeleteInstanceRequest(
2303                          Uint32 queueId,
2304                          XmlParser& parser,
2305                          const String& messageId,
2306                          const CIMNamespaceName& nameSpace)
2307                  {
2308                      STAT_GETSTARTTIME
2309                  
2310                      CIMObjectPath instanceName;
2311                      Boolean duplicateParameter = false;
2312                      Boolean gotInstanceName = false;
2313                      Boolean emptyTag;
2314                  
2315                      for (const char* name;
2316                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2317                      {
2318 kumpf      1.104         if (System::strcasecmp(name, "InstanceName") == 0)
2319                          {
2320                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2321                              XmlReader::getInstanceNameElement(parser, instanceName);
2322                              duplicateParameter = gotInstanceName;
2323                              gotInstanceName = true;
2324                          }
2325                          else
2326                          {
2327                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2328                          }
2329                  
2330                          if (!emptyTag)
2331                          {
2332                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2333                          }
2334                  
2335                          if (duplicateParameter)
2336                          {
2337                              throw PEGASUS_CIM_EXCEPTION(
2338                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2339 kumpf      1.104         }
2340                      }
2341                  
2342                      if (!gotInstanceName)
2343                      {
2344                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2345                      }
2346                  
2347                      AutoPtr<CIMDeleteInstanceRequestMessage> request(
2348                          new CIMDeleteInstanceRequestMessage(
2349                              messageId,
2350                              nameSpace,
2351                              instanceName,
2352                              QueueIdStack(queueId, _returnQueueId)));
2353                  
2354                      STAT_SERVERSTART
2355                  
2356                      return request.release();
2357                  }
2358                  
2359                  CIMSetQualifierRequestMessage*
2360 kumpf      1.104     CIMOperationRequestDecoder::decodeSetQualifierRequest(
2361                          Uint32 queueId,
2362                          XmlParser& parser,
2363                          const String& messageId,
2364                          const CIMNamespaceName& nameSpace)
2365                  {
2366                      STAT_GETSTARTTIME
2367                  
2368                      CIMQualifierDecl qualifierDeclaration;
2369                      Boolean duplicateParameter = false;
2370                      Boolean gotQualifierDeclaration = false;
2371                      Boolean emptyTag;
2372                  
2373                      for (const char* name;
2374                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2375                      {
2376                          if (System::strcasecmp(name, "QualifierDeclaration") == 0)
2377                          {
2378                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2379                              XmlReader::getQualifierDeclElement(parser, qualifierDeclaration);
2380                              duplicateParameter = gotQualifierDeclaration;
2381 kumpf      1.104             gotQualifierDeclaration = true;
2382                          }
2383                          else
2384                          {
2385                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2386                          }
2387                  
2388                          if (!emptyTag)
2389                          {
2390                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2391                          }
2392                  
2393                          if (duplicateParameter)
2394                          {
2395                              throw PEGASUS_CIM_EXCEPTION(
2396                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2397                          }
2398                      }
2399                  
2400                      if (!gotQualifierDeclaration)
2401                      {
2402 kumpf      1.104         throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2403                      }
2404                  
2405                      AutoPtr<CIMSetQualifierRequestMessage> request(
2406                          new CIMSetQualifierRequestMessage(
2407                              messageId,
2408                              nameSpace,
2409                              qualifierDeclaration,
2410                              QueueIdStack(queueId, _returnQueueId)));
2411                  
2412                      STAT_SERVERSTART
2413                  
2414                      return request.release();
2415                  }
2416                  
2417                  CIMGetQualifierRequestMessage*
2418                      CIMOperationRequestDecoder::decodeGetQualifierRequest(
2419                          Uint32 queueId,
2420                          XmlParser& parser,
2421                          const String& messageId,
2422                          const CIMNamespaceName& nameSpace)
2423 kumpf      1.104 {
2424                      STAT_GETSTARTTIME
2425                  
2426                      String qualifierNameString;
2427                      CIMName qualifierName;
2428                      Boolean duplicateParameter = false;
2429                      Boolean gotQualifierName = false;
2430                      Boolean emptyTag;
2431                  
2432                      for (const char* name;
2433                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2434                      {
2435                          if (System::strcasecmp(name, "QualifierName") == 0)
2436                          {
2437                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2438                              XmlReader::getStringValueElement(parser, qualifierNameString, true);
2439                              qualifierName = qualifierNameString;
2440                              duplicateParameter = gotQualifierName;
2441                              gotQualifierName = true;
2442                          }
2443                          else
2444 kumpf      1.104         {
2445                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2446                          }
2447                  
2448                          if (!emptyTag)
2449                          {
2450                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2451                          }
2452                  
2453                          if (duplicateParameter)
2454                          {
2455                              throw PEGASUS_CIM_EXCEPTION(
2456                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2457                          }
2458                      }
2459                  
2460                      if (!gotQualifierName)
2461                      {
2462                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2463                      }
2464                  
2465 kumpf      1.104     AutoPtr<CIMGetQualifierRequestMessage> request(
2466                          new CIMGetQualifierRequestMessage(
2467                              messageId,
2468                              nameSpace,
2469                              qualifierName,
2470                              QueueIdStack(queueId, _returnQueueId)));
2471                  
2472                      STAT_SERVERSTART
2473                  
2474                      return request.release();
2475                  }
2476                  
2477                  CIMEnumerateQualifiersRequestMessage*
2478                      CIMOperationRequestDecoder::decodeEnumerateQualifiersRequest(
2479                          Uint32 queueId,
2480                          XmlParser& parser,
2481                          const String& messageId,
2482                          const CIMNamespaceName& nameSpace)
2483                  {
2484                      STAT_GETSTARTTIME
2485                      Boolean emptyTag;
2486 kumpf      1.104 
2487                      for (const char* name;
2488                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2489                      {
2490                          // No IPARAMVALUEs are defined for this operation
2491                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2492                      }
2493                  
2494                      AutoPtr<CIMEnumerateQualifiersRequestMessage> request(
2495                          new CIMEnumerateQualifiersRequestMessage(
2496                              messageId,
2497                              nameSpace,
2498                              QueueIdStack(queueId, _returnQueueId)));
2499                  
2500                      STAT_SERVERSTART
2501                  
2502                      return request.release();
2503                  }
2504                  
2505                  CIMDeleteQualifierRequestMessage*
2506                      CIMOperationRequestDecoder::decodeDeleteQualifierRequest(
2507 kumpf      1.104         Uint32 queueId,
2508                          XmlParser& parser,
2509                          const String& messageId,
2510                          const CIMNamespaceName& nameSpace)
2511                  {
2512                      STAT_GETSTARTTIME
2513                  
2514                      String qualifierNameString;
2515                      CIMName qualifierName;
2516                      Boolean duplicateParameter = false;
2517                      Boolean gotQualifierName = false;
2518                      Boolean emptyTag;
2519                  
2520                      for (const char* name;
2521                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2522                      {
2523                          if (System::strcasecmp(name, "QualifierName") == 0)
2524                          {
2525                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2526                              XmlReader::getStringValueElement(parser, qualifierNameString, true);
2527                              qualifierName = qualifierNameString;
2528 kumpf      1.104             duplicateParameter = gotQualifierName;
2529                              gotQualifierName = true;
2530                          }
2531                          else
2532                          {
2533                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2534                          }
2535                  
2536                          if (!emptyTag)
2537                          {
2538                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2539                          }
2540                  
2541                          if (duplicateParameter)
2542                          {
2543                              throw PEGASUS_CIM_EXCEPTION(
2544                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2545                          }
2546                      }
2547                  
2548                      if (!gotQualifierName)
2549 kumpf      1.104     {
2550                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2551                      }
2552                  
2553                      AutoPtr<CIMDeleteQualifierRequestMessage> request(
2554                          new CIMDeleteQualifierRequestMessage(
2555                              messageId,
2556                              nameSpace,
2557                              qualifierName,
2558                              QueueIdStack(queueId, _returnQueueId)));
2559                  
2560                      STAT_SERVERSTART
2561                  
2562                      return request.release();
2563                  }
2564                  
2565                  CIMReferenceNamesRequestMessage*
2566                      CIMOperationRequestDecoder::decodeReferenceNamesRequest(
2567                          Uint32 queueId,
2568                          XmlParser& parser,
2569                          const String& messageId,
2570 kumpf      1.104         const CIMNamespaceName& nameSpace)
2571                  {
2572                      STAT_GETSTARTTIME
2573                  
2574                      CIMObjectPath objectName;
2575                      CIMName resultClass;
2576                      String role;
2577                      Boolean duplicateParameter = false;
2578                      Boolean gotObjectName = false;
2579                      Boolean gotResultClass = false;
2580                      Boolean gotRole = false;
2581                      Boolean emptyTag;
2582                  
2583                      for (const char* name;
2584                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2585                      {
2586                          if (System::strcasecmp(name, "ObjectName") == 0)
2587                          {
2588                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2589                              XmlReader::getObjectNameElement(parser, objectName);
2590                              duplicateParameter = gotObjectName;
2591 kumpf      1.104             gotObjectName = true;
2592                          }
2593                          else if (System::strcasecmp(name, "ResultClass") == 0)
2594                          {
2595                              //
2596                              //  ResultClass may be NULL
2597                              //
2598                              if (!emptyTag)
2599                              {
2600                                  XmlReader::getClassNameElement(parser, resultClass, false);
2601                              }
2602                              duplicateParameter = gotResultClass;
2603                              gotResultClass = true;
2604                          }
2605                          else if (System::strcasecmp(name, "Role") == 0)
2606                          {
2607                              //
2608                              //  Role may be NULL
2609                              //
2610                              if (!emptyTag)
2611                              {
2612 kumpf      1.104                 XmlReader::getStringValueElement(parser, role, false);
2613                              }
2614                              duplicateParameter = gotRole;
2615                              gotRole = true;
2616                          }
2617                          else
2618                          {
2619                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2620                          }
2621                  
2622                          if (!emptyTag)
2623                          {
2624                             XmlReader::expectEndTag(parser, "IPARAMVALUE");
2625                          }
2626                  
2627                          if (duplicateParameter)
2628                          {
2629                              throw PEGASUS_CIM_EXCEPTION(
2630                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2631                          }
2632                      }
2633 kumpf      1.104 
2634                      if (!gotObjectName)
2635                      {
2636                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2637                      }
2638                  
2639                      AutoPtr<CIMReferenceNamesRequestMessage> request(
2640                          new CIMReferenceNamesRequestMessage(
2641                              messageId,
2642                              nameSpace,
2643                              objectName,
2644                              resultClass,
2645                              role,
2646                              QueueIdStack(queueId, _returnQueueId)));
2647                  
2648                      STAT_SERVERSTART
2649                  
2650                      return request.release();
2651                  }
2652                  
2653                  CIMReferencesRequestMessage*
2654 kumpf      1.104     CIMOperationRequestDecoder::decodeReferencesRequest(
2655                          Uint32 queueId,
2656                          XmlParser& parser,
2657                          const String& messageId,
2658                          const CIMNamespaceName& nameSpace)
2659                  {
2660                      STAT_GETSTARTTIME
2661                  
2662                      CIMObjectPath objectName;
2663                      CIMName resultClass;
2664                      String role;
2665                      Boolean includeQualifiers = false;
2666                      Boolean includeClassOrigin = false;
2667                      CIMPropertyList propertyList;
2668                      Boolean duplicateParameter = false;
2669                      Boolean gotObjectName = false;
2670                      Boolean gotResultClass = false;
2671                      Boolean gotRole = false;
2672                      Boolean gotIncludeQualifiers = false;
2673                      Boolean gotIncludeClassOrigin = false;
2674                      Boolean gotPropertyList = false;
2675 kumpf      1.104     Boolean emptyTag;
2676                  
2677                      for (const char* name;
2678                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2679                      {
2680                          if (System::strcasecmp(name, "ObjectName") == 0)
2681                          {
2682                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2683                              XmlReader::getObjectNameElement(parser, objectName);
2684                              duplicateParameter = gotObjectName;
2685                              gotObjectName = true;
2686                          }
2687                          else if (System::strcasecmp(name, "ResultClass") == 0)
2688                          {
2689                              //
2690                              //  ResultClass may be NULL
2691                              //
2692                              if (!emptyTag)
2693                              {
2694                                  XmlReader::getClassNameElement(parser, resultClass, false);
2695                              }
2696 kumpf      1.104             duplicateParameter = gotResultClass;
2697                              gotResultClass = true;
2698                          }
2699                          else if (System::strcasecmp(name, "Role") == 0)
2700                          {
2701                              //
2702                              //  Role may be NULL
2703                              //
2704                              if (!emptyTag)
2705                              {
2706                                  XmlReader::getStringValueElement(parser, role, false);
2707                              }
2708                              duplicateParameter = gotRole;
2709                              gotRole = true;
2710                          }
2711                          else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2712                          {
2713                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2714                              XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2715                              duplicateParameter = gotIncludeQualifiers;
2716                              gotIncludeQualifiers = true;
2717 kumpf      1.104         }
2718                          else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
2719                          {
2720                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2721                              XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
2722                              duplicateParameter = gotIncludeClassOrigin;
2723                              gotIncludeClassOrigin = true;
2724                          }
2725                          else if (System::strcasecmp(name, "PropertyList") == 0)
2726                          {
2727                              if (!emptyTag)
2728                              {
2729                                  CIMValue pl;
2730                                  if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2731                                  {
2732                                      Array<String> propertyListArray;
2733                                      pl.get(propertyListArray);
2734                                      Array<CIMName> cimNameArray;
2735                                      for (Uint32 i = 0; i < propertyListArray.size(); i++)
2736                                      {
2737                                          cimNameArray.append(propertyListArray[i]);
2738 kumpf      1.104                     }
2739                                      propertyList.set(cimNameArray);
2740                                  }
2741                              }
2742                              duplicateParameter = gotPropertyList;
2743                              gotPropertyList = true;
2744                          }
2745                          else
2746                          {
2747                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2748                          }
2749                  
2750                         if (!emptyTag)
2751                         {
2752                             XmlReader::expectEndTag(parser, "IPARAMVALUE");
2753                         }
2754                  
2755                         if (duplicateParameter)
2756                         {
2757                             throw PEGASUS_CIM_EXCEPTION(
2758                                 CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2759 kumpf      1.104        }
2760                      }
2761                  
2762                      if (!gotObjectName)
2763                      {
2764                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2765                      }
2766                  
2767                      AutoPtr<CIMReferencesRequestMessage> request(
2768                          new CIMReferencesRequestMessage(
2769                              messageId,
2770                              nameSpace,
2771                              objectName,
2772                              resultClass,
2773                              role,
2774                              includeQualifiers,
2775                              includeClassOrigin,
2776                              propertyList,
2777                              QueueIdStack(queueId, _returnQueueId)));
2778                  
2779                      STAT_SERVERSTART
2780 kumpf      1.104 
2781                      return request.release();
2782                  }
2783                  
2784                  CIMAssociatorNamesRequestMessage*
2785                      CIMOperationRequestDecoder::decodeAssociatorNamesRequest(
2786                          Uint32 queueId,
2787                          XmlParser& parser,
2788                          const String& messageId,
2789                          const CIMNamespaceName& nameSpace)
2790                  {
2791                      STAT_GETSTARTTIME
2792                  
2793                      CIMObjectPath objectName;
2794                      CIMName assocClass;
2795                      CIMName resultClass;
2796                      String role;
2797                      String resultRole;
2798                      Boolean duplicateParameter = false;
2799                      Boolean gotObjectName = false;
2800                      Boolean gotAssocClass = false;
2801 kumpf      1.104     Boolean gotResultClass = false;
2802                      Boolean gotRole = false;
2803                      Boolean gotResultRole = false;
2804                      Boolean emptyTag;
2805                  
2806                      for (const char* name;
2807                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2808                      {
2809                          if (System::strcasecmp(name, "ObjectName") == 0)
2810                          {
2811                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2812                              XmlReader::getObjectNameElement(parser, objectName);
2813                              duplicateParameter = gotObjectName;
2814                              gotObjectName = true;
2815                          }
2816                          else if (System::strcasecmp(name, "AssocClass") == 0)
2817                          {
2818                              //
2819                              //  AssocClass may be NULL
2820                              //
2821                              if (!emptyTag)
2822 kumpf      1.104             {
2823                                  XmlReader::getClassNameElement(parser, assocClass, false);
2824                              }
2825                              duplicateParameter = gotAssocClass;
2826                              gotAssocClass = true;
2827                          }
2828                          else if (System::strcasecmp(name, "ResultClass") == 0)
2829                          {
2830                              //
2831                              //  ResultClass may be NULL
2832                              //
2833                              if (!emptyTag)
2834                              {
2835                                  XmlReader::getClassNameElement(parser, resultClass, false);
2836                              }
2837                              duplicateParameter = gotResultClass;
2838                              gotResultClass = true;
2839                          }
2840                          else if (System::strcasecmp(name, "Role") == 0)
2841                          {
2842                              //
2843 kumpf      1.104             //  Role may be NULL
2844                              //
2845                              if (!emptyTag)
2846                              {
2847                                  XmlReader::getStringValueElement(parser, role, false);
2848                              }
2849                              duplicateParameter = gotRole;
2850                              gotRole = true;
2851                          }
2852                          else if (System::strcasecmp(name, "ResultRole") == 0)
2853                          {
2854                              //
2855                              //  ResultRole may be NULL
2856                              //
2857                              if (!emptyTag)
2858                              {
2859                                  XmlReader::getStringValueElement(parser, resultRole, false);
2860                              }
2861                              duplicateParameter = gotResultRole;
2862                              gotResultRole = true;
2863                          }
2864 kumpf      1.104         else
2865                          {
2866                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
2867                          }
2868                  
2869                          if (!emptyTag)
2870                          {
2871                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
2872                          }
2873                  
2874                          if (duplicateParameter)
2875                          {
2876                              throw PEGASUS_CIM_EXCEPTION(
2877                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2878                          }
2879                      }
2880                  
2881                      if (!gotObjectName)
2882                      {
2883                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
2884                      }
2885 kumpf      1.104 
2886                      AutoPtr<CIMAssociatorNamesRequestMessage> request(
2887                          new CIMAssociatorNamesRequestMessage(
2888                              messageId,
2889                              nameSpace,
2890                              objectName,
2891                              assocClass,
2892                              resultClass,
2893                              role,
2894                              resultRole,
2895                              QueueIdStack(queueId, _returnQueueId)));
2896                  
2897                      STAT_SERVERSTART
2898                  
2899                      return request.release();
2900                  }
2901                  
2902                  CIMAssociatorsRequestMessage*
2903                      CIMOperationRequestDecoder::decodeAssociatorsRequest(
2904                          Uint32 queueId,
2905                          XmlParser& parser,
2906 kumpf      1.104         const String& messageId,
2907                          const CIMNamespaceName& nameSpace)
2908                  {
2909                      STAT_GETSTARTTIME
2910                  
2911                      CIMObjectPath objectName;
2912                      CIMName assocClass;
2913                      CIMName resultClass;
2914                      String role;
2915                      String resultRole;
2916                      Boolean includeQualifiers = false;
2917                      Boolean includeClassOrigin = false;
2918                      CIMPropertyList propertyList;
2919                      Boolean duplicateParameter = false;
2920                      Boolean gotObjectName = false;
2921                      Boolean gotAssocClass = false;
2922                      Boolean gotResultClass = false;
2923                      Boolean gotRole = false;
2924                      Boolean gotResultRole = false;
2925                      Boolean gotIncludeQualifiers = false;
2926                      Boolean gotIncludeClassOrigin = false;
2927 kumpf      1.104     Boolean gotPropertyList = false;
2928                      Boolean emptyTag;
2929                  
2930                      for (const char* name;
2931                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
2932                      {
2933                          if (System::strcasecmp(name, "ObjectName") == 0)
2934                          {
2935                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2936                              XmlReader::getObjectNameElement(parser, objectName);
2937                              duplicateParameter = gotObjectName;
2938                              gotObjectName = true;
2939                          }
2940                          else if (System::strcasecmp(name, "AssocClass") == 0)
2941                          {
2942                              //
2943                              //  AssocClass may be NULL
2944                              //
2945                              if (!emptyTag)
2946                              {
2947                                  XmlReader::getClassNameElement(parser, assocClass, false);
2948 kumpf      1.104             }
2949                              duplicateParameter = gotAssocClass;
2950                              gotAssocClass = true;
2951                          }
2952                          else if (System::strcasecmp(name, "ResultClass") == 0)
2953                          {
2954                              //
2955                              //  ResultClass may be NULL
2956                              //
2957                              if (!emptyTag)
2958                              {
2959                                  XmlReader::getClassNameElement(parser, resultClass, false);
2960                              }
2961                              duplicateParameter = gotResultClass;
2962                              gotResultClass = true;
2963                          }
2964                          else if (System::strcasecmp(name, "Role") == 0)
2965                          {
2966                              //
2967                              //  Role may be NULL
2968                              //
2969 kumpf      1.104             if (!emptyTag)
2970                              {
2971                                  XmlReader::getStringValueElement(parser, role, false);
2972                              }
2973                              duplicateParameter = gotRole;
2974                              gotRole = true;
2975                          }
2976                          else if (System::strcasecmp(name, "ResultRole") == 0)
2977                          {
2978                              //
2979                              //  ResultRole may be NULL
2980                              //
2981                              if (!emptyTag)
2982                              {
2983                                  XmlReader::getStringValueElement(parser, resultRole, false);
2984                              }
2985                              duplicateParameter = gotResultRole;
2986                              gotResultRole = true;
2987                          }
2988                          else if (System::strcasecmp(name, "IncludeQualifiers") == 0)
2989                          {
2990 kumpf      1.104             XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2991                              XmlReader::getBooleanValueElement(parser, includeQualifiers, true);
2992                              duplicateParameter = gotIncludeQualifiers;
2993                              gotIncludeQualifiers = true;
2994                          }
2995                          else if (System::strcasecmp(name, "IncludeClassOrigin") == 0)
2996                          {
2997                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2998                              XmlReader::getBooleanValueElement(parser, includeClassOrigin, true);
2999                              duplicateParameter = gotIncludeClassOrigin;
3000                              gotIncludeClassOrigin = true;
3001                          }
3002                          else if (System::strcasecmp(name, "PropertyList") == 0)
3003                          {
3004                              if (!emptyTag)
3005                              {
3006                                  CIMValue pl;
3007                                  if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
3008                                  {
3009                                      Array<String> propertyListArray;
3010                                      pl.get(propertyListArray);
3011 kumpf      1.104                     Array<CIMName> cimNameArray;
3012                                      for (Uint32 i = 0; i < propertyListArray.size(); i++)
3013                                      {
3014                                          cimNameArray.append(propertyListArray[i]);
3015                                      }
3016                                      propertyList.set(cimNameArray);
3017                                  }
3018                              }
3019                              duplicateParameter = gotPropertyList;
3020                              gotPropertyList = true;
3021                          }
3022                          else
3023                          {
3024                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3025                          }
3026                  
3027                          if (!emptyTag)
3028                          {
3029                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
3030                          }
3031                  
3032 kumpf      1.104         if (duplicateParameter)
3033                          {
3034                              throw PEGASUS_CIM_EXCEPTION(
3035                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3036                          }
3037                      }
3038                  
3039                      if (!gotObjectName)
3040                      {
3041                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3042                      }
3043                  
3044                      AutoPtr<CIMAssociatorsRequestMessage> request(
3045                          new CIMAssociatorsRequestMessage(
3046                              messageId,
3047                              nameSpace,
3048                              objectName,
3049                              assocClass,
3050                              resultClass,
3051                              role,
3052                              resultRole,
3053 kumpf      1.104             includeQualifiers,
3054                              includeClassOrigin,
3055                              propertyList,
3056                              QueueIdStack(queueId, _returnQueueId)));
3057                  
3058                      STAT_SERVERSTART
3059                  
3060                      return request.release();
3061                  }
3062                  
3063                  CIMGetPropertyRequestMessage*
3064                      CIMOperationRequestDecoder::decodeGetPropertyRequest(
3065                          Uint32 queueId,
3066                          XmlParser& parser,
3067                          const String& messageId,
3068                          const CIMNamespaceName& nameSpace)
3069                  {
3070                      STAT_GETSTARTTIME
3071                  
3072                      CIMObjectPath instanceName;
3073                      String propertyName;
3074 kumpf      1.104     Boolean duplicateParameter = false;
3075                      Boolean gotInstanceName = false;
3076                      Boolean gotPropertyName = false;
3077                      Boolean emptyTag;
3078                  
3079                      for (const char* name;
3080                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
3081                      {
3082                          if (System::strcasecmp(name, "InstanceName") == 0)
3083                          {
3084                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3085                              XmlReader::getInstanceNameElement(parser, instanceName);
3086                              duplicateParameter = gotInstanceName;
3087                              gotInstanceName = true;
3088                          }
3089                          else if (System::strcasecmp(name, "PropertyName") == 0)
3090                          {
3091                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3092                              XmlReader::getStringValueElement(parser, propertyName, true);
3093                              duplicateParameter = gotPropertyName;
3094                              gotPropertyName = true;
3095 kumpf      1.104         }
3096                          else
3097                          {
3098                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3099                          }
3100                  
3101                          if (!emptyTag)
3102                          {
3103                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
3104                          }
3105                  
3106                          if (duplicateParameter)
3107                          {
3108                              throw PEGASUS_CIM_EXCEPTION(
3109                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3110                          }
3111                      }
3112                  
3113                      if (!gotInstanceName || !gotPropertyName)
3114                      {
3115                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3116 kumpf      1.104     }
3117                  
3118                      AutoPtr<CIMGetPropertyRequestMessage> request(
3119                          new CIMGetPropertyRequestMessage(
3120                              messageId,
3121                              nameSpace,
3122                              instanceName,
3123                              propertyName,
3124                              QueueIdStack(queueId, _returnQueueId)));
3125                  
3126                      STAT_SERVERSTART
3127                  
3128                      return request.release();
3129                  }
3130                  
3131                  CIMSetPropertyRequestMessage*
3132                      CIMOperationRequestDecoder::decodeSetPropertyRequest(
3133                          Uint32 queueId,
3134                          XmlParser& parser,
3135                          const String& messageId,
3136                          const CIMNamespaceName& nameSpace)
3137 kumpf      1.104 {
3138                      STAT_GETSTARTTIME
3139                  
3140                      CIMObjectPath instanceName;
3141                      String propertyName;
3142                      CIMValue propertyValue;
3143                      Boolean duplicateParameter = false;
3144                      Boolean gotInstanceName = false;
3145                      Boolean gotPropertyName = false;
3146                      Boolean gotNewValue = false;
3147                      Boolean emptyTag;
3148                  
3149                      for (const char* name;
3150                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
3151                      {
3152                          if (System::strcasecmp(name, "InstanceName") == 0)
3153                          {
3154                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3155                              XmlReader::getInstanceNameElement(parser, instanceName);
3156                              duplicateParameter = gotInstanceName;
3157                              gotInstanceName = true;
3158 kumpf      1.104         }
3159                          else if (System::strcasecmp(name, "PropertyName") == 0)
3160                          {
3161                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3162                              XmlReader::getStringValueElement(parser, propertyName, true);
3163                              duplicateParameter = gotPropertyName;
3164                              gotPropertyName = true;
3165                          }
3166                          else if (System::strcasecmp(name, "NewValue") == 0)
3167                          {
3168                              if (emptyTag || !XmlReader::getPropertyValue(parser, propertyValue))
3169                              {
3170                                  propertyValue.setNullValue(CIMTYPE_STRING, false);
3171                              }
3172                              duplicateParameter = gotNewValue;
3173                              gotNewValue = true;
3174                          }
3175                          else
3176                          {
3177                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3178                          }
3179 kumpf      1.104 
3180                          if (!emptyTag)
3181                          {
3182                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
3183                          }
3184                  
3185                          if (duplicateParameter)
3186                          {
3187                              throw PEGASUS_CIM_EXCEPTION(
3188                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3189                          }
3190                      }
3191                  
3192                      if (!gotInstanceName || !gotPropertyName)
3193                      {
3194                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3195                      }
3196                  
3197                      AutoPtr<CIMSetPropertyRequestMessage> request(
3198                          new CIMSetPropertyRequestMessage(
3199                              messageId,
3200 kumpf      1.104             nameSpace,
3201                              instanceName,
3202                              propertyName,
3203                              propertyValue,
3204                              QueueIdStack(queueId, _returnQueueId)));
3205 kumpf      1.29  
3206 kumpf      1.104     STAT_SERVERSTART
3207 sage       1.41  
3208 kumpf      1.104     return request.release();
3209 kumpf      1.29  }
3210                  
3211                  CIMExecQueryRequestMessage* CIMOperationRequestDecoder::decodeExecQueryRequest(
3212 kumpf      1.104     Uint32 queueId,
3213                      XmlParser& parser,
3214                      const String& messageId,
3215                      const CIMNamespaceName& nameSpace)
3216                  {
3217                      STAT_GETSTARTTIME
3218                  
3219                      String queryLanguage;
3220                      String query;
3221                      Boolean duplicateParameter = false;
3222                      Boolean gotQueryLanguage = false;
3223                      Boolean gotQuery = false;
3224                      Boolean emptyTag;
3225                  
3226                      for (const char* name;
3227                           XmlReader::getIParamValueTag(parser, name, emptyTag); )
3228                      {
3229                          if (System::strcasecmp(name, "QueryLanguage") == 0)
3230                          {
3231                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3232                              XmlReader::getStringValueElement(parser, queryLanguage, true);
3233 kumpf      1.104             duplicateParameter = gotQueryLanguage;
3234                              gotQueryLanguage = true;
3235                          }
3236                          else if (System::strcasecmp(name, "Query") == 0)
3237                          {
3238                              XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3239                              XmlReader::getStringValueElement(parser, query, true);
3240                              duplicateParameter = gotQuery;
3241                              gotQuery = true;
3242                          }
3243                          else
3244                          {
3245                              throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3246                          }
3247                  
3248                          if (!emptyTag)
3249                          {
3250                              XmlReader::expectEndTag(parser, "IPARAMVALUE");
3251                          }
3252                  
3253                          if (duplicateParameter)
3254 kumpf      1.104         {
3255                              throw PEGASUS_CIM_EXCEPTION(
3256                                  CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3257                          }
3258                      }
3259                  
3260                      if (!gotQueryLanguage || !gotQuery)
3261                      {
3262                          throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, String::EMPTY);
3263                      }
3264                  
3265                      AutoPtr<CIMExecQueryRequestMessage> request(
3266                          new CIMExecQueryRequestMessage(
3267                              messageId,
3268                              nameSpace,
3269                              queryLanguage,
3270                              query,
3271                              QueueIdStack(queueId, _returnQueueId)));
3272                  
3273                      STAT_SERVERSTART
3274                  
3275 kumpf      1.104     return request.release();
3276                  }
3277                  
3278                  CIMInvokeMethodRequestMessage*
3279                      CIMOperationRequestDecoder::decodeInvokeMethodRequest(
3280                          Uint32 queueId,
3281                          XmlParser& parser,
3282                          const String& messageId,
3283                          const CIMObjectPath& reference,
3284                          const String& cimMethodName)
3285                  {
3286                      STAT_GETSTARTTIME
3287                  
3288                      CIMParamValue paramValue;
3289                      Array<CIMParamValue> inParameters;
3290                  
3291                      while (XmlReader::getParamValueElement(parser, paramValue))
3292                      {
3293                          inParameters.append(paramValue);
3294                      }
3295                  
3296 kumpf      1.104     AutoPtr<CIMInvokeMethodRequestMessage> request(
3297                          new CIMInvokeMethodRequestMessage(
3298                              messageId,
3299                              reference.getNameSpace(),
3300                              reference,
3301                              cimMethodName,
3302                              inParameters,
3303                              QueueIdStack(queueId, _returnQueueId)));
3304 kumpf      1.9   
3305 kumpf      1.104     STAT_SERVERSTART
3306 mike       1.2   
3307 kumpf      1.104     return request.release();
3308 mike       1.2   }
3309                  
3310                  void CIMOperationRequestDecoder::setServerTerminating(Boolean flag)
3311                  {
3312 kumpf      1.104     _serverTerminating = flag;
3313 mike       1.2   }
3314                  
3315                  PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2