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

   1 martin 1.121 //%LICENSE////////////////////////////////////////////////////////////////
   2 martin 1.122 //
   3 martin 1.121 // Licensed to The Open Group (TOG) under one or more contributor license
   4              // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   5              // this work for additional information regarding copyright ownership.
   6              // Each contributor licenses this file to you under the OpenPegasus Open
   7              // Source License; you may not use this file except in compliance with the
   8              // License.
   9 martin 1.122 //
  10 martin 1.121 // Permission is hereby granted, free of charge, to any person obtaining a
  11              // copy of this software and associated documentation files (the "Software"),
  12              // to deal in the Software without restriction, including without limitation
  13              // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14              // and/or sell copies of the Software, and to permit persons to whom the
  15              // Software is furnished to do so, subject to the following conditions:
  16 martin 1.122 //
  17 martin 1.121 // The above copyright notice and this permission notice shall be included
  18              // in all copies or substantial portions of the Software.
  19 martin 1.122 //
  20 martin 1.121 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21 martin 1.122 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 martin 1.121 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23              // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  24              // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25              // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26              // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27 martin 1.122 //
  28 martin 1.121 //////////////////////////////////////////////////////////////////////////
  29 mike   1.2   //
  30              //%/////////////////////////////////////////////////////////////////////////////
  31              
  32              #include <Pegasus/Common/Config.h>
  33 kumpf  1.28  #include <Pegasus/Common/Constants.h>
  34 mike   1.2   #include <cctype>
  35              #include <cstdio>
  36              #include <Pegasus/Common/XmlParser.h>
  37              #include <Pegasus/Common/XmlReader.h>
  38              #include <Pegasus/Common/XmlWriter.h>
  39              #include <Pegasus/Common/XmlConstants.h>
  40 kumpf  1.51  #include <Pegasus/Common/System.h>
  41 mike   1.2   #include <Pegasus/Common/Logger.h>
  42              #include <Pegasus/Common/Tracer.h>
  43 sage   1.41  #include <Pegasus/Common/StatisticalData.h>
  44 mike   1.2   #include "CIMOperationRequestDecoder.h"
  45 david  1.60  #include <Pegasus/Common/CommonUTF.h>
  46 humberto 1.59  #include <Pegasus/Common/MessageLoader.h>
  47 mike     1.120 #include <Pegasus/Common/BinaryCodec.h>
  48 karl     1.127.2.7 #include <Pegasus/Common/OperationContextInternal.h>
  49                    #include <Pegasus/General/CIMError.h>
  50                    
  51                    #ifdef PEGASUS_PAM_SESSION_SECURITY
  52                    #include <Pegasus/Security/Authentication/PAMSessionBasicAuthenticator.h>
  53                    #include <Pegasus/Security/Authentication/AuthenticationStatus.h>
  54                    #endif
  55                    
  56 humberto 1.59      
  57 mike     1.2       PEGASUS_USING_STD;
  58                    
  59                    PEGASUS_NAMESPACE_BEGIN
  60                    
  61 karl     1.127.2.5 /******************************************************************************
  62                    **
  63                    **             Local Functions
  64 karl     1.127.2.4 **
  65                    ******************************************************************************/
  66                    // KS_TODO_PULL Expand use of these two functions to all operations.
  67                    // Create a propertyList with the internal tags set. Used for property
  68                    // lists that involve instances. Tags used in output Xml Processing
  69                    void _createPropertyListWithTags(XmlParser& parser, CIMPropertyList& pl)
  70                    {
  71                        CIMValue val;
  72                        if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, val))
  73                        {
  74                            Array<String> propertyListArray;
  75                            val.get(propertyListArray);
  76                            pl.append(propertyListArray);
  77                        }
  78                    }
  79                    
  80                    // Create a PropertyList without the propertyList internal tags.  Used for
  81                    // propertylists on class operations.
  82                    void _createPropertyListWithoutTags(XmlParser& parser, CIMPropertyList& pl)
  83                    {
  84                        CIMValue val;
  85 karl     1.127.2.4     if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, val))
  86                        {
  87                            Array<String> propertyListArray;
  88                            val.get(propertyListArray);
  89                            Array<CIMName> cimNameArray;
  90                            for (Uint32 i = 0; i < propertyListArray.size(); i++)
  91                            {
  92                                cimNameArray.append(propertyListArray[i]);
  93                            }
  94                            pl.set(cimNameArray);
  95                        }
  96                    }
  97                    
  98 karl     1.127.2.5 /******************************************************************************
  99                    **
 100 karl     1.127.2.4 **            CIMOperationRequestDecoder Class
 101                    **
 102                    ******************************************************************************/
 103 karl     1.127.2.5 // throw CIM_ERR_NOT_SUPPORTED with no additional text
 104                    void _throwCIMExceptionCIMErrNotSupported(const String& param = String::EMPTY)
 105                    {
 106                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, param);
 107                    }
 108                    
 109                    // Throw CIM_ERR_INVALID_PARAMETER with optional parameter name(s)
 110                    void _throwCIMExceptionInvalidParameter(const String& param = String::EMPTY)
 111                    {
 112                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER, param);
 113                    }
 114                    
 115                    // Common call for all cases where duplicate IparameterValues recieved
 116                    // in a single operation. Throw InvalidParameter exception with optional
 117                    // additional data.
 118                    void _throwCIMExceptionDuplicateParameter(const String& name = String::EMPTY)
 119                    {
 120                        _throwCIMExceptionInvalidParameter(name);
 121                    }
 122                    
 123                    // Common call for cases where Invalid IParameterValue names recived
 124 karl     1.127.2.5 void _throwCIMExceptionInvalidIParamName(const String& param = String::EMPTY)
 125                    {
 126                        _throwCIMExceptionCIMErrNotSupported(param);
 127                    }
 128                    
 129 karl     1.127.2.7 #ifdef PEGASUS_PAM_SESSION_SECURITY
 130                    void CIMOperationRequestDecoder::_updateExpiredPassword(
 131                        Uint32 queueId,
 132                        HttpMethod httpMethod,
 133                        const String& messageId,
 134                        Boolean closeConnect,
 135                        const ContentLanguageList& httpContentLanguages,
 136                        CIMMessage * request,
 137                        const String& userName,
 138                        const String& oldPass)
 139                    {
 140                        static CIMName meth = CIMName("UpdateExpiredPassword");
 141                        static CIMName clName = CIMName("PG_Account");
 142                    
 143                    
 144                        // this has to be an invokeMethod and
 145                        if (CIM_INVOKE_METHOD_REQUEST_MESSAGE != request->getType())
 146                        {
 147                            sendHttpError(
 148                                queueId,
 149                                HTTP_STATUS_BADREQUEST,
 150 karl     1.127.2.7             "invalid header",
 151                                "Header \'Pragma: UpdateExpiredPassword\' not valid for this "
 152                                    "CIMMethod.",
 153                                closeConnect);
 154                    
 155                            return;
 156                        }
 157                    
 158                        CIMInvokeMethodRequestMessage* msg =
 159                            dynamic_cast<CIMInvokeMethodRequestMessage*>(request);
 160                    
 161                        // class PG_Account
 162                        // method UpdateExpiredPassword
 163                        // InterOp namespace
 164                        if ((!clName.equal(msg->className)) ||
 165                            (!(meth.equal(msg->methodName))) ||
 166                            (!msg->nameSpace.equal(PEGASUS_NAMESPACENAME_INTEROP.getString())))
 167                        {
 168                            // not of interest for us, chicken out
 169                            sendHttpError(
 170                                queueId,
 171 karl     1.127.2.7             HTTP_STATUS_BADREQUEST,
 172                                "invalid header",
 173                                "Header \'Pragma: UpdateExpiredPassword\' not valid for this "
 174                                    "class, method or namespace.",
 175                                closeConnect);
 176                            return;
 177                        }
 178                    
 179                        String newPass;
 180                        Boolean found = false;
 181                    
 182                        try
 183                        {
 184                            // Get new password from request - String-type Parameter UserPassword
 185                            Array<CIMParamValue> inParm = msg->inParameters;
 186                            for (Uint32 i=0; i < inParm.size(); i++)
 187                            {
 188                                CIMParamValue x = inParm[i];
 189                                if (String::equalNoCase(x.getParameterName(),"UserPassword"))
 190                                {
 191                                    CIMValue passValue = x.getValue();
 192 karl     1.127.2.7                 passValue.get(newPass);
 193                                    found = true;
 194                                    break;
 195                                }
 196                            }
 197                        } catch(Exception &e)
 198                        {
 199                            // already know it is an invokeMethod, see checks above
 200                            sendMethodError(
 201                                queueId,
 202                                httpMethod,
 203                                messageId,
 204                                meth.getString(),
 205                                PEGASUS_CIM_EXCEPTION(
 206                                    CIM_ERR_INVALID_PARAMETER, e.getMessage()),
 207                                closeConnect);
 208                            return;
 209                        }
 210                        if (!found)
 211                        {
 212                            sendMethodError(
 213 karl     1.127.2.7             queueId,
 214                                httpMethod,
 215                                messageId,
 216                                meth.getString(),
 217                                PEGASUS_CIM_EXCEPTION(
 218                                    CIM_ERR_INVALID_PARAMETER, "Missing Parameter UserPassword"),
 219                                closeConnect);
 220                            return;
 221                        }
 222                        // Call password update function from PAMSession.h
 223                        AuthenticationStatus authStat =
 224                            PAMSessionBasicAuthenticator::updateExpiredPassword(
 225                                userName,
 226                                oldPass,
 227                                newPass);
 228                    
 229                        if (authStat.isSuccess())
 230                        {
 231                            // Send success message
 232                            Buffer message;
 233                            Buffer emptyBody;
 234 karl     1.127.2.7 
 235                            message = XmlWriter::formatSimpleMethodRspMessage(
 236                                meth,
 237                                messageId,
 238                                httpMethod,
 239                                httpContentLanguages,
 240                                emptyBody,
 241                                0,
 242                                true,
 243                                true);
 244                    
 245                            sendResponse(queueId, message,closeConnect);
 246                        }
 247                        else
 248                        {
 249                            sendHttpError(
 250                                queueId,
 251                                authStat.getHttpStatus(),
 252                                String::EMPTY,
 253                                authStat.getErrorDetail(),
 254                                closeConnect);
 255 karl     1.127.2.7     }
 256                    }
 257                    #endif
 258                    
 259                    
 260                    
 261                    
 262 mike     1.2       CIMOperationRequestDecoder::CIMOperationRequestDecoder(
 263 sahana.prabhakar 1.126         MessageQueue* outputQueue,
 264 kumpf            1.104         Uint32 returnQueueId)
 265                                : Base(PEGASUS_QUEUENAME_OPREQDECODER),
 266 mday             1.16            _outputQueue(outputQueue),
 267                                  _returnQueueId(returnQueueId),
 268                                  _serverTerminating(false)
 269 mike             1.2       {
 270                            }
 271                            
 272                            CIMOperationRequestDecoder::~CIMOperationRequestDecoder()
 273                            {
 274                            }
 275                            
 276                            void CIMOperationRequestDecoder::sendResponse(
 277 kumpf            1.104         Uint32 queueId,
 278                                Buffer& message,
 279                                Boolean closeConnect)
 280                            {
 281                                MessageQueue* queue = MessageQueue::lookup(queueId);
 282                            
 283                                if (queue)
 284                                {
 285                                    AutoPtr<HTTPMessage> httpMessage(new HTTPMessage(message));
 286                                    httpMessage->setCloseConnect(closeConnect);
 287                                    queue->enqueue(httpMessage.release());
 288                                }
 289 mike             1.2       }
 290                            
 291 kumpf            1.18      void CIMOperationRequestDecoder::sendIMethodError(
 292 kumpf            1.104         Uint32 queueId,
 293                                HttpMethod httpMethod,
 294                                const String& messageId,
 295                                const String& iMethodName,
 296                                const CIMException& cimException,
 297                                Boolean closeConnect)
 298 mday             1.16      {
 299 mike             1.96          Buffer message;
 300 kumpf            1.19          message = XmlWriter::formatSimpleIMethodErrorRspMessage(
 301                                    iMethodName,
 302                                    messageId,
 303 kumpf            1.53              httpMethod,
 304 kumpf            1.35              cimException);
 305 kumpf            1.18      
 306 j.alex           1.95          sendResponse(queueId, message,closeConnect);
 307 kumpf            1.18      }
 308 mday             1.16      
 309 kumpf            1.18      void CIMOperationRequestDecoder::sendMethodError(
 310 kumpf            1.104         Uint32 queueId,
 311                                HttpMethod httpMethod,
 312                                const String& messageId,
 313                                const String& methodName,
 314                                const CIMException& cimException,
 315                                Boolean closeConnect)
 316 kumpf            1.18      {
 317 mike             1.96          Buffer message;
 318 kumpf            1.19          message = XmlWriter::formatSimpleMethodErrorRspMessage(
 319                                    methodName,
 320                                    messageId,
 321 kumpf            1.53              httpMethod,
 322 kumpf            1.35              cimException);
 323 chip             1.92      
 324 j.alex           1.95          sendResponse(queueId, message,closeConnect);
 325 mike             1.2       }
 326                            
 327 karl             1.127.2.7 void CIMOperationRequestDecoder::sendUserAccountExpired(
 328                                Uint32 queueId,
 329                                HttpMethod httpMethod,
 330                                const String& messageId,
 331                                const String& methodName,
 332                                Boolean closeConnect,
 333                                Boolean isIMethod)
 334                            {
 335                                Buffer message;
 336                            
 337                                CIMError errorInst;
 338                                errorInst.setErrorType(CIMError::ERROR_TYPE_OTHER);
 339                                errorInst.setOtherErrorType("Expired Password");
 340                                errorInst.setProbableCause(CIMError::PROBABLE_CAUSE_AUTHENTICATION_FAILURE);
 341                            
 342                                CIMException myExc(
 343                                    CIM_ERR_ACCESS_DENIED,
 344                                    "User Account Expired",
 345                                    errorInst.getInstance());
 346                            
 347                                if (isIMethod)
 348 karl             1.127.2.7     {
 349                                    message = XmlWriter::formatSimpleIMethodErrorRspMessage(
 350                                        methodName,
 351                                        messageId,
 352                                        httpMethod,
 353                                        myExc);
 354                                }
 355                                else
 356                                {
 357                                    message = XmlWriter::formatSimpleMethodErrorRspMessage(
 358                                        methodName,
 359                                        messageId,
 360                                        httpMethod,
 361                                        myExc);
 362                                }
 363                            
 364                                sendResponse(queueId, message,closeConnect);
 365                            }
 366                            
 367 kumpf            1.33      void CIMOperationRequestDecoder::sendHttpError(
 368 kumpf            1.104         Uint32 queueId,
 369                                const String& status,
 370                                const String& cimError,
 371                                const String& pegasusError,
 372                                Boolean closeConnect)
 373 kumpf            1.21      {
 374 mike             1.96          Buffer message;
 375 kumpf            1.33          message = XmlWriter::formatHttpErrorRspMessage(
 376                                    status,
 377                                    cimError,
 378 kumpf            1.37              pegasusError);
 379 chip             1.92      
 380 j.alex           1.95          sendResponse(queueId, message,closeConnect);
 381 kumpf            1.26      }
 382                            
 383 kumpf            1.104     void CIMOperationRequestDecoder::handleEnqueue(Message* message)
 384 mike             1.2       {
 385 kumpf            1.104         if (!message)
 386                                    return;
 387 mike             1.2       
 388 kumpf            1.104         switch (message->getType())
 389                                {
 390                                    case HTTP_MESSAGE:
 391                                         handleHTTPMessage((HTTPMessage*)message);
 392                                         break;
 393 kumpf            1.112     
 394                                    default:
 395                                        // Unexpected message type
 396 karl             1.127.2.5             PEGASUS_UNREACHABLE(PEGASUS_ASSERT(0);)
 397 kumpf            1.112                 break;
 398 kumpf            1.104         }
 399 mday             1.16      
 400 kumpf            1.104         delete message;
 401 mday             1.16      }
 402 mike             1.2       
 403                            
 404 mday             1.16      void CIMOperationRequestDecoder::handleEnqueue()
 405                            {
 406 kumpf            1.104         Message* message = dequeue();
 407                                if (message)
 408                                    handleEnqueue(message);
 409 mike             1.2       }
 410                            
 411                            //------------------------------------------------------------------------------
 412                            //
 413                            // From the HTTP/1.1 Specification (RFC 2626):
 414                            //
 415 chip             1.92      // Both types of message consist of a start-line, zero or more header fields
 416                            // (also known as "headers"), an empty line (i.e., a line with nothing
 417                            // preceding the CRLF) indicating the end of the header fields, and possibly
 418 mike             1.2       // a message-body.
 419                            //
 420                            // Example CIM request:
 421                            //
 422 chip             1.92      //     M-POST /cimom HTTP/1.1
 423                            //     HOST: www.erewhon.com
 424 karl             1.127.2.2 //     Content-Type: application/xml; charset=utf-8
 425 chip             1.92      //     Content-Length: xxxx
 426                            //     Man: http://www.dmtf.org/cim/operation ; ns=73
 427                            //     73-CIMOperation: MethodCall
 428                            //     73-CIMMethod: EnumerateInstances
 429                            //     73-CIMObject: root/cimv2
 430                            //
 431 mike             1.2       //------------------------------------------------------------------------------
 432                            
 433                            void CIMOperationRequestDecoder::handleHTTPMessage(HTTPMessage* httpMessage)
 434                            {
 435 kumpf            1.104         PEG_METHOD_ENTER(TRC_DISPATCHER,
 436                                    "CIMOperationRequestDecoder::handleHTTPMessage()");
 437 kumpf            1.20      
 438 kumpf            1.104         // Set the Accept-Language into the thread for this service.
 439                                // This will allow all code in this thread to get
 440                                // the languages for the messages returned to the client.
 441 kumpf            1.114         Thread::setLanguages(httpMessage->acceptLanguages);
 442 kumpf            1.104     
 443                                // Save queueId:
 444                            
 445                                Uint32 queueId = httpMessage->queueId;
 446                            
 447 karl             1.127.2.7     // Save userName, userRole, userPass and authType:
 448 kumpf            1.104     
 449                                String userName;
 450 karl             1.127.2.7     String userRole;
 451                                String userPass;
 452                                Boolean isExpiredPassword = false;
 453                                Boolean updateExpiredPassword;
 454 kumpf            1.104         String authType;
 455                                Boolean closeConnect = httpMessage->getCloseConnect();
 456                            
 457                                PEG_TRACE((
 458                                    TRC_HTTP,
 459 marek            1.118             Tracer::LEVEL4,
 460 kumpf            1.104             "CIMOperationRequestDecoder::handleHTTPMessage()- "
 461                                    "httpMessage->getCloseConnect() returned %d",
 462                                    closeConnect));
 463                            
 464 sushma.fernandes 1.109         userName = httpMessage->authInfo->getAuthenticatedUser();
 465                                authType = httpMessage->authInfo->getAuthType();
 466 karl             1.127.2.7     userRole = httpMessage->authInfo->getUserRole();
 467                                userPass = httpMessage->authInfo->getAuthenticatedPassword();
 468                            
 469                            #ifdef PEGASUS_PAM_SESSION_SECURITY
 470                                isExpiredPassword = httpMessage->authInfo->isExpiredPassword();
 471                            #endif
 472 kumpf            1.104     
 473                                // Parse the HTTP message:
 474                            
 475                                String startLine;
 476                                Array<HTTPHeader> headers;
 477                                char* content;
 478                                Uint32 contentLength;
 479                            
 480                                httpMessage->parse(startLine, headers, contentLength);
 481                            
 482                                // Parse the request line:
 483                            
 484                                String methodName;
 485                                String requestUri;
 486                                String httpVersion;
 487                                HttpMethod httpMethod = HTTP_METHOD__POST;
 488                            
 489                                HTTPMessage::parseRequestLine(
 490                                    startLine, methodName, requestUri, httpVersion);
 491                            
 492                                //
 493 kumpf            1.104         //  Set HTTP method for the request
 494                                //
 495                                if (methodName == "M-POST")
 496                                {
 497                                    httpMethod = HTTP_METHOD_M_POST;
 498                                }
 499                            
 500                                // Unsupported methods are caught in the HTTPAuthenticatorDelegator
 501                                PEGASUS_ASSERT(methodName == "M-POST" || methodName == "POST");
 502                            
 503                                //
 504                                //  Mismatch of method and version is caught in HTTPAuthenticatorDelegator
 505                                //
 506                                PEGASUS_ASSERT(!((httpMethod == HTTP_METHOD_M_POST) &&
 507                                                 (httpVersion == "HTTP/1.0")));
 508 humberto         1.80      
 509 kumpf            1.104         // Process M-POST and POST messages:
 510 humberto         1.80      
 511 kumpf            1.104         if (httpVersion == "HTTP/1.1")
 512                                {
 513                                    // Validate the presence of a "Host" header.  The HTTP/1.1 specification
 514                                    // says this in section 14.23 regarding the Host header field:
 515                                    //
 516                                    //     All Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad
 517                                    //     Request) status code to any HTTP/1.1 request message which lacks
 518                                    //     a Host header field.
 519                                    //
 520                                    // Note:  The Host header value is not validated.
 521                            
 522 kumpf            1.124             const char* hostHeader;
 523 kumpf            1.104             Boolean hostHeaderFound = HTTPMessage::lookupHeader(
 524                                        headers, "Host", hostHeader, false);
 525 mike             1.2       
 526 kumpf            1.104             if (!hostHeaderFound)
 527                                    {
 528                                        MessageLoaderParms parms(
 529                                            "Server.CIMOperationRequestDecoder.MISSING_HOST_HEADER",
 530                                            "HTTP request message lacks a Host header field.");
 531                                        sendHttpError(
 532                                            queueId,
 533                                            HTTP_STATUS_BADREQUEST,
 534                                            "",
 535                                            MessageLoader::getMessage(parms),
 536                                            closeConnect);
 537                                        PEG_METHOD_EXIT();
 538                                        return;
 539                                    }
 540                                }
 541 mike             1.2       
 542 kumpf            1.104         // Validate the "CIMOperation" header:
 543 mike             1.2       
 544 kumpf            1.124         const char* cimOperation;
 545 karl             1.127.2.5 
 546 kumpf            1.104         // If the CIMOperation header was missing, the HTTPAuthenticatorDelegator
 547                                // would not have passed the message to us.
 548 karl             1.127.2.5     PEGASUS_FCT_EXECUTE_AND_ASSERT(
 549                                    true,
 550                                    HTTPMessage::lookupHeader(headers, "CIMOperation", cimOperation, true));
 551 kumpf            1.104     
 552 kumpf            1.124         if (System::strcasecmp(cimOperation, "MethodCall") != 0)
 553 kumpf            1.104         {
 554                                    // The Specification for CIM Operations over HTTP reads:
 555                                    //     3.3.4. CIMOperation
 556                                    //     If a CIM Server receives CIM Operation request with this
 557                                    //     [CIMOperation] header, but with a missing value or a value
 558                                    //     that is not "MethodCall", then it MUST fail the request with
 559                                    //     status "400 Bad Request". The CIM Server MUST include a
 560                                    //     CIMError header in the response with a value of
 561                                    //     unsupported-operation.
 562                                    MessageLoaderParms parms(
 563                                        "Server.CIMOperationRequestDecoder."
 564                                            "CIMOPERATION_VALUE_NOT_SUPPORTED",
 565                                        "CIMOperation value \"$0\" is not supported.",cimOperation);
 566                                    sendHttpError(
 567                                        queueId,
 568                                        HTTP_STATUS_BADREQUEST,
 569                                        "unsupported-operation",
 570                                        MessageLoader::getMessage(parms),
 571                                        closeConnect);
 572                                    PEG_METHOD_EXIT();
 573                                    return;
 574 kumpf            1.104         }
 575                            
 576                                // Validate the "CIMBatch" header:
 577                            
 578 kumpf            1.124         const char* cimBatch;
 579                                if (HTTPMessage::lookupHeader(headers, "CIMBatch", cimBatch, true))
 580 kumpf            1.104         {
 581                                    // The Specification for CIM Operations over HTTP reads:
 582                                    //     3.3.9. CIMBatch
 583                                    //     If a CIM Server receives CIM Operation Request for which the
 584                                    //     CIMBatch header is present, but the Server does not support
 585                                    //     Multiple Operations, then it MUST fail the request and
 586                                    //     return a status of "501 Not Implemented".
 587                                    sendHttpError(
 588                                        queueId,
 589                                        HTTP_STATUS_NOTIMPLEMENTED,
 590                                        "multiple-requests-unsupported",
 591                                        String::EMPTY,
 592                                        closeConnect);
 593                                    PEG_METHOD_EXIT();
 594                                    return;
 595                                }
 596                            
 597                                // Save these headers for later checking
 598                            
 599 kumpf            1.124         const char* cimProtocolVersion;
 600 kumpf            1.104         if (!HTTPMessage::lookupHeader(
 601                                    headers, "CIMProtocolVersion", cimProtocolVersion, true))
 602                                {
 603                                    // Mandated by the Specification for CIM Operations over HTTP
 604 kumpf            1.124             cimProtocolVersion = "1.0";
 605 kumpf            1.104         }
 606                            
 607 karl             1.127.2.7     // Validate if Pragma: UpdateExpiredPassword is set
 608                                updateExpiredPassword = false;
 609                            
 610                                String pragmaValue;
 611                                if(HTTPMessage::lookupHeader(headers,"Pragma",pragmaValue))
 612                                {
 613                                    updateExpiredPassword =
 614                                        (PEG_NOT_FOUND != pragmaValue.find("UpdateExpiredPassword"));
 615                                }
 616                            
 617 kumpf            1.124         String cimMethod;
 618 kumpf            1.104         if (HTTPMessage::lookupHeader(headers, "CIMMethod", cimMethod, true))
 619                                {
 620                                    if (cimMethod == String::EMPTY)
 621                                    {
 622                                        // This is not a valid value, and we use EMPTY to mean "absent"
 623                                        MessageLoaderParms parms(
 624                                            "Server.CIMOperationRequestDecoder.EMPTY_CIMMETHOD_VALUE",
 625                                            "Empty CIMMethod value.");
 626                                        sendHttpError(
 627                                            queueId,
 628                                            HTTP_STATUS_BADREQUEST,
 629                                            "header-mismatch",
 630                                            MessageLoader::getMessage(parms),
 631                                            closeConnect);
 632                                        PEG_METHOD_EXIT();
 633                                        return;
 634                                    }
 635 mike             1.98      
 636 kumpf            1.104             try
 637                                    {
 638                                        cimMethod = XmlReader::decodeURICharacters(cimMethod);
 639                                    }
 640                                    catch (const ParseError&)
 641                                    {
 642                                        // The CIMMethod header value could not be decoded
 643                                        MessageLoaderParms parms(
 644                                            "Server.CIMOperationRequestDecoder."
 645                                                "CIMMETHOD_VALUE_SYNTAX_ERROR",
 646                                            "CIMMethod value syntax error.");
 647                                        sendHttpError(
 648                                            queueId,
 649                                            HTTP_STATUS_BADREQUEST,
 650                                            "header-mismatch",
 651                                            MessageLoader::getMessage(parms),
 652                                            closeConnect);
 653                                        PEG_METHOD_EXIT();
 654                                        return;
 655                                    }
 656                                }
 657 mike             1.2       
 658 kumpf            1.124         String cimObject;
 659 kumpf            1.104         if (HTTPMessage::lookupHeader(headers, "CIMObject", cimObject, true))
 660                                {
 661                                    if (cimObject == String::EMPTY)
 662                                    {
 663                                        // This is not a valid value, and we use EMPTY to mean "absent"
 664                                        MessageLoaderParms parms(
 665                                            "Server.CIMOperationRequestDecoder.EMPTY_CIMOBJECT_VALUE",
 666                                            "Empty CIMObject value.");
 667                                        sendHttpError(
 668                                            queueId,
 669                                            HTTP_STATUS_BADREQUEST,
 670                                            "header-mismatch",
 671                                            MessageLoader::getMessage(parms),
 672                                            closeConnect);
 673                                        PEG_METHOD_EXIT();
 674                                        return;
 675                                    }
 676 mike             1.2       
 677 kumpf            1.104             try
 678                                    {
 679                                        cimObject = XmlReader::decodeURICharacters(cimObject);
 680                                    }
 681                                    catch (const ParseError&)
 682                                    {
 683                                        // The CIMObject header value could not be decoded
 684                                        MessageLoaderParms parms(
 685                                            "Server.CIMOperationRequestDecoder."
 686                                                "CIMOBJECT_VALUE_SYNTAX_ERROR",
 687                                            "CIMObject value syntax error.");
 688                                        sendHttpError(
 689                                            queueId,
 690                                            HTTP_STATUS_BADREQUEST,
 691                                            "header-mismatch",
 692                                            MessageLoader::getMessage(parms),
 693                                            closeConnect);
 694                                        PEG_METHOD_EXIT();
 695                                        return;
 696                                    }
 697                                }
 698 mike             1.2       
 699 kumpf            1.104         // Validate the "Content-Type" header:
 700 mike             1.2       
 701 kumpf            1.124         const char* cimContentType;
 702 kumpf            1.104         Boolean contentTypeHeaderFound = HTTPMessage::lookupHeader(
 703                                    headers, "Content-Type", cimContentType, true);
 704 kumpf            1.115         String type;
 705                                String charset;
 706 mike             1.120         Boolean binaryRequest = false;
 707 kumpf            1.115     
 708 kumpf            1.123         if (!contentTypeHeaderFound ||
 709 kumpf            1.115             !HTTPMessage::parseContentTypeHeader(cimContentType, type, charset) ||
 710 marek            1.127             (((!String::equalNoCase(type, "application/xml") &&
 711 kumpf            1.115              !String::equalNoCase(type, "text/xml")) ||
 712 kumpf            1.123             !String::equalNoCase(charset, "utf-8"))
 713                                    && !(binaryRequest = String::equalNoCase(type,
 714 mike             1.120                 "application/x-openpegasus"))
 715 marek            1.127             ))
 716 kumpf            1.104         {
 717 j.alex           1.95              MessageLoaderParms parms(
 718 kumpf            1.104                 "Server.CIMOperationRequestDecoder.CIMCONTENTTYPE_SYNTAX_ERROR",
 719 kumpf            1.105                 "HTTP Content-Type header error.");
 720 j.alex           1.95              sendHttpError(
 721                                        queueId,
 722                                        HTTP_STATUS_BADREQUEST,
 723 kumpf            1.105                 "",
 724 j.alex           1.95                  MessageLoader::getMessage(parms),
 725                                        closeConnect);
 726 kumpf            1.104             PEG_METHOD_EXIT();
 727                                    return;
 728                                }
 729 karl             1.127.2.2     // Calculate the beginning of the content from the message size and
 730                                // the content length.
 731                                if (binaryRequest)
 732                                {
 733                                    // binary the "Content" also contains a few padding '\0' to align
 734                                    // data structures to 8byte boundary
 735                                    // the padding '\0' are also part of the counted contentLength
 736                                    Uint32 headerEnd = httpMessage->message.size() - contentLength;
 737                                    Uint32 binContentStart = CIMBuffer::round(headerEnd);
 738                            
 739                                    contentLength = contentLength - (binContentStart - headerEnd);
 740                                    content = (char*) httpMessage->message.getData() + binContentStart;
 741                                }
 742                                else
 743                                {
 744                                    content = (char*) httpMessage->message.getData() +
 745                                        httpMessage->message.size() - contentLength;
 746                                }
 747                            
 748 kumpf            1.104         // Validating content falls within UTF8
 749                                // (required to be complaint with section C12 of Unicode 4.0 spec,
 750                                // chapter 3.)
 751 karl             1.127.2.2     if (!binaryRequest)
 752 kumpf            1.104         {
 753                                    Uint32 count = 0;
 754                                    while(count<contentLength)
 755                                    {
 756                                        if (!(isUTF8((char*)&content[count])))
 757                                        {
 758                                            MessageLoaderParms parms(
 759                                                "Server.CIMOperationRequestDecoder.INVALID_UTF8_CHARACTER",
 760                                                "Invalid UTF-8 character detected.");
 761                                            sendHttpError(
 762                                                queueId,
 763                                                HTTP_STATUS_BADREQUEST,
 764                                                "request-not-valid",
 765                                                MessageLoader::getMessage(parms),
 766                                                closeConnect);
 767                            
 768                                            PEG_METHOD_EXIT();
 769 mike             1.120                     return;
 770 kumpf            1.104                 }
 771                                        UTF8_NEXT(content,count);
 772                                    }
 773                                }
 774                            
 775 kumpf            1.123         // Check for "Accept: application/x-openpegasus" HTTP header to see if
 776 mike             1.120         // client can accept binary responses.
 777                            
 778                                bool binaryResponse;
 779                            
 780                                if (HTTPMessage::lookupHeader(headers, "Accept", type, true) &&
 781                                    String::equalNoCase(type, "application/x-openpegasus"))
 782                                {
 783                                    binaryResponse = true;
 784                                }
 785                                else
 786                                {
 787                                    binaryResponse = false;
 788                                }
 789 karl             1.127.2.2     httpMessage->binaryResponse=binaryResponse;
 790 mike             1.120     
 791 kumpf            1.104         // If it is a method call, then dispatch it to be handled:
 792                            
 793                                handleMethodCall(
 794                                    queueId,
 795                                    httpMethod,
 796                                    content,
 797                                    contentLength,
 798                                    cimProtocolVersion,
 799                                    cimMethod,
 800                                    cimObject,
 801                                    authType,
 802                                    userName,
 803 karl             1.127.2.7         userRole,
 804                                    userPass,
 805                                    isExpiredPassword,
 806                                    updateExpiredPassword,
 807 kumpf            1.104             httpMessage->ipAddress,
 808                                    httpMessage->acceptLanguages,
 809                                    httpMessage->contentLanguages,
 810 mike             1.120             closeConnect,
 811                                    binaryRequest,
 812                                    binaryResponse);
 813 kumpf            1.104     
 814                                PEG_METHOD_EXIT();
 815                            }
 816                            
 817                            void CIMOperationRequestDecoder::handleMethodCall(
 818                                Uint32 queueId,
 819                                HttpMethod httpMethod,
 820                                char* content,
 821                                Uint32 contentLength,    // used for statistics only
 822 kumpf            1.124         const char* cimProtocolVersionInHeader,
 823 kumpf            1.104         const String& cimMethodInHeader,
 824                                const String& cimObjectInHeader,
 825                                const String& authType,
 826                                const String& userName,
 827 karl             1.127.2.7     const String& userRole,
 828                                const String& userPass,
 829                                Boolean isExpiredPassword,
 830                                Boolean updateExpiredPassword,
 831 kumpf            1.104         const String& ipAddress,
 832                                const AcceptLanguageList& httpAcceptLanguages,
 833                                const ContentLanguageList& httpContentLanguages,
 834 mike             1.120         Boolean closeConnect,
 835                                Boolean binaryRequest,
 836                                Boolean binaryResponse)
 837 kumpf            1.104     {
 838                                PEG_METHOD_ENTER(TRC_DISPATCHER,
 839                                    "CIMOperationRequestDecoder::handleMethodCall()");
 840                            
 841                                //
 842                                // If CIMOM is shutting down, return "Service Unavailable" response
 843                                //
 844                                if (_serverTerminating)
 845                                {
 846 j.alex           1.95              MessageLoaderParms parms(
 847 kumpf            1.104                 "Server.CIMOperationRequestDecoder.CIMSERVER_SHUTTING_DOWN",
 848                                        "CIM Server is shutting down.");
 849 j.alex           1.95              sendHttpError(
 850                                        queueId,
 851 kumpf            1.104                 HTTP_STATUS_SERVICEUNAVAILABLE,
 852                                        String::EMPTY,
 853 j.alex           1.95                  MessageLoader::getMessage(parms),
 854                                        closeConnect);
 855 kumpf            1.104             PEG_METHOD_EXIT();
 856                                    return;
 857                                }
 858                            
 859 karl             1.127.2.3     // Trace as binary display if binary request
 860 karl             1.127.2.1     if(binaryRequest)
 861                                {
 862                                    PEG_TRACE((TRC_XML,Tracer::LEVEL4,
 863                                        "CIMOperationRequestdecoder - Binary content: Not Shown."));
 864                                }
 865                                else
 866                                {
 867                                    PEG_TRACE((TRC_XML,Tracer::LEVEL4,
 868                                        "CIMOperationRequestdecoder - XML content: %s",
 869                                        content));
 870                                }
 871 kumpf            1.104     
 872 mike             1.120         //
 873                                // Handle binary messages:
 874                                //
 875 kumpf            1.104     
 876                                AutoPtr<CIMOperationRequestMessage> request;
 877 karl             1.127.2.7     String messageId;
 878                                Boolean isIMethodCall = true;
 879 kumpf            1.104     
 880 mike             1.120         if (binaryRequest)
 881 kumpf            1.104         {
 882 karl             1.127.2.2         CIMBuffer buf(content, contentLength);
 883                                    CIMBufferReleaser buf_(buf);
 884 mike             1.120     
 885                                    request.reset(BinaryCodec::decodeRequest(buf, queueId, _returnQueueId));
 886                            
 887                                    if (!request.get())
 888                                    {
 889                                        sendHttpError(
 890                                            queueId,
 891                                            HTTP_STATUS_BADREQUEST,
 892                                            "Corrupt binary request message",
 893                                            String::EMPTY,
 894                                            closeConnect);
 895                                        PEG_METHOD_EXIT();
 896                                        return;
 897                                    }
 898                                }
 899                                else try
 900                                {
 901                                    XmlParser parser(content);
 902                                    XmlEntry entry;
 903                                    const char* cimMethodName = "";
 904                            
 905 kumpf            1.104             //
 906                                    // Process <?xml ... >
 907                                    //
 908                            
 909                                    // These values are currently unused
 910                                    const char* xmlVersion = 0;
 911                                    const char* xmlEncoding = 0;
 912 mike             1.2       
 913 kumpf            1.104             XmlReader::getXmlDeclaration(parser, xmlVersion, xmlEncoding);
 914 mike             1.2       
 915 kumpf            1.104             // Expect <CIM ...>
 916 chip             1.92      
 917 kumpf            1.104             const char* cimVersion = 0;
 918                                    const char* dtdVersion = 0;
 919 mike             1.2       
 920 kumpf            1.104             XmlReader::getCimStartTag(parser, cimVersion, dtdVersion);
 921 mike             1.2       
 922 karl             1.108             if (!XmlReader::isSupportedCIMVersion(cimVersion))
 923 kumpf            1.104             {
 924                                        MessageLoaderParms parms(
 925                                            "Server.CIMOperationRequestDecoder.CIM_VERSION_NOT_SUPPORTED",
 926                                            "CIM version \"$0\" is not supported.",
 927                                             cimVersion);
 928                                        sendHttpError(
 929                                            queueId,
 930                                            HTTP_STATUS_NOTIMPLEMENTED,
 931                                            "unsupported-cim-version",
 932                                            MessageLoader::getMessage(parms),
 933                                            closeConnect);
 934 kumpf            1.23                  PEG_METHOD_EXIT();
 935                                        return;
 936 kumpf            1.104             }
 937 kumpf            1.23      
 938 karl             1.108             if (!XmlReader::isSupportedDTDVersion(dtdVersion))
 939 kumpf            1.104             {
 940                                        MessageLoaderParms parms(
 941                                            "Server.CIMOperationRequestDecoder.DTD_VERSION_NOT_SUPPORTED",
 942                                            "DTD version \"$0\" is not supported.",
 943                                            dtdVersion);
 944                                        sendHttpError(
 945 j.alex           1.95                      queueId,
 946 kumpf            1.104                     HTTP_STATUS_NOTIMPLEMENTED,
 947                                            "unsupported-dtd-version",
 948                                            MessageLoader::getMessage(parms),
 949 j.alex           1.95                      closeConnect);
 950 kumpf            1.20                  PEG_METHOD_EXIT();
 951 kumpf            1.34                  return;
 952 kumpf            1.104             }
 953                            
 954                                    // Expect <MESSAGE ...>
 955                            
 956                                    String protocolVersion;
 957 kumpf            1.73      
 958 kumpf            1.104             if (!XmlReader::getMessageStartTag(
 959                                             parser, messageId, protocolVersion))
 960                                    {
 961                                        MessageLoaderParms mlParms(
 962                                            "Server.CIMOperationRequestDecoder.EXPECTED_MESSAGE_ELEMENT",
 963                                            "expected MESSAGE element");
 964 mday             1.16      
 965 kumpf            1.104                 throw XmlValidationError(parser.getLine(), mlParms);
 966                                    }
 967 mday             1.16      
 968 kumpf            1.104             // Validate that the protocol version in the header matches the XML
 969                                    if (!String::equalNoCase(protocolVersion, cimProtocolVersionInHeader))
 970                                    {
 971 j.alex           1.95                  MessageLoaderParms parms(
 972 kumpf            1.104                     "Server.CIMOperationRequestDecoder."
 973                                                "CIMPROTOCOL_VERSION_MISMATCH",
 974                                            "CIMProtocolVersion value \"$0\" does not match CIM request "
 975                                                "protocol version \"$1\".",
 976                                            cimProtocolVersionInHeader,
 977                                            protocolVersion);
 978 j.alex           1.95                  sendHttpError(
 979                                            queueId,
 980                                            HTTP_STATUS_BADREQUEST,
 981                                            "header-mismatch",
 982                                            MessageLoader::getMessage(parms),
 983                                            closeConnect);
 984 kumpf            1.39                  PEG_METHOD_EXIT();
 985                                        return;
 986 kumpf            1.104             }
 987 kumpf            1.39      
 988 karl             1.108             // Accept protocol version 1.x (see Bugzilla 1556)
 989                                    if (!XmlReader::isSupportedProtocolVersion(protocolVersion))
 990 kumpf            1.104             {
 991                                        // See Specification for CIM Operations over HTTP section 4.3
 992 j.alex           1.95                  MessageLoaderParms parms(
 993 kumpf            1.104                     "Server.CIMOperationRequestDecoder."
 994                                                "CIMPROTOCOL_VERSION_NOT_SUPPORTED",
 995                                            "CIMProtocolVersion \"$0\" is not supported.",
 996                                                 protocolVersion);
 997 j.alex           1.95                  sendHttpError(
 998                                            queueId,
 999 kumpf            1.104                     HTTP_STATUS_NOTIMPLEMENTED,
1000                                            "unsupported-protocol-version",
1001 j.alex           1.95                      MessageLoader::getMessage(parms),
1002                                            closeConnect);
1003 kumpf            1.23                  PEG_METHOD_EXIT();
1004                                        return;
1005 kumpf            1.104             }
1006 kumpf            1.23      
1007 kumpf            1.104             if (XmlReader::testStartTag(parser, entry, "MULTIREQ"))
1008                                    {
1009                                        // We wouldn't have gotten here if CIMBatch header was specified,
1010                                        // so this must be indicative of a header mismatch
1011 j.alex           1.95                  MessageLoaderParms parms(
1012 kumpf            1.104                     "Server.CIMOperationRequestDecoder."
1013                                                "MULTI_REQUEST_MISSING_CIMBATCH_HTTP_HEADER",
1014                                            "Multi-request is missing CIMBatch HTTP header");
1015 j.alex           1.95                  sendHttpError(
1016                                            queueId,
1017                                            HTTP_STATUS_BADREQUEST,
1018                                            "header-mismatch",
1019                                            MessageLoader::getMessage(parms),
1020                                            closeConnect);
1021 kumpf            1.23                  PEG_METHOD_EXIT();
1022                                        return;
1023 kumpf            1.104                 // Future: When MULTIREQ is supported, must ensure CIMMethod and
1024                                        // CIMObject headers are absent, and CIMBatch header is present.
1025                                    }
1026                            
1027                                    // Expect <SIMPLEREQ ...>
1028                            
1029                                    XmlReader::expectStartTag(parser, entry, "SIMPLEREQ");
1030                            
1031                                    // Check for <IMETHODCALL ...>
1032                            
1033                                    if (XmlReader::getIMethodCallStartTag(parser, cimMethodName))
1034                                    {
1035 karl             1.127.2.7             isIMethodCall = true;
1036 kumpf            1.104                 // The Specification for CIM Operations over HTTP reads:
1037                                        //     3.3.6. CIMMethod
1038                                        //
1039                                        //     This header MUST be present in any CIM Operation Request
1040                                        //     message that contains a Simple Operation Request.
1041                                        //
1042                                        //     It MUST NOT be present in any CIM Operation Response message,
1043                                        //     nor in any CIM Operation Request message that is not a
1044                                        //     Simple Operation Request.
1045                                        //
1046                                        //     The name of the CIM method within a Simple Operation Request
1047                                        //     is defined to be the value of the NAME attribute of the
1048                                        //     <METHODCALL> or <IMETHODCALL> element.
1049                                        //
1050                                        //     If a CIM Server receives a CIM Operation Request for which
1051                                        //     either:
1052                                        //
1053                                        //     - The CIMMethod header is present but has an invalid value,
1054                                        //       or;
1055                                        //     - The CIMMethod header is not present but the Operation
1056                                        //       Request Message is a Simple Operation Request, or;
1057 kumpf            1.104                 //     - The CIMMethod header is present but the Operation Request
1058                                        //       Message is not a Simple Operation Request, or;
1059                                        //     - The CIMMethod header is present, the Operation Request
1060                                        //       Message is a Simple Operation Request, but the
1061                                        //       CIMIdentifier value (when unencoded) does not match the
1062                                        //       unique method name within the Simple Operation Request,
1063                                        //
1064                                        //     then it MUST fail the request and return a status of
1065                                        //     "400 Bad Request" (and MUST include a CIMError header in the
1066                                        //     response with a value of header-mismatch), subject to the
1067                                        //     considerations specified in Errors.
1068                                        if (!String::equalNoCase(cimMethodName, cimMethodInHeader))
1069                                        {
1070                                            // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
1071                                            if (cimMethodInHeader == String::EMPTY)
1072                                            {
1073                                                MessageLoaderParms parms(
1074                                                    "Server.CIMOperationRequestDecoder."
1075                                                        "MISSING_CIMMETHOD_HTTP_HEADER",
1076                                                    "Missing CIMMethod HTTP header.");
1077                                                sendHttpError(
1078 kumpf            1.104                             queueId,
1079                                                    HTTP_STATUS_BADREQUEST,
1080                                                    "header-mismatch",
1081                                                    MessageLoader::getMessage(parms),
1082                                                    closeConnect);
1083                                            }
1084                                            else
1085                                            {
1086                                                MessageLoaderParms parms(
1087                                                    "Server.CIMOperationRequestDecoder."
1088                                                         "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
1089                                                    "CIMMethod value \"$0\" does not match CIM request "
1090                                                         "method \"$1\".",
1091                                                    cimMethodInHeader,
1092                                                    cimMethodName);
1093                                                sendHttpError(
1094                                                    queueId,
1095                                                    HTTP_STATUS_BADREQUEST,
1096                                                    "header-mismatch",
1097                                                    MessageLoader::getMessage(parms),
1098                                                    closeConnect);
1099 kumpf            1.104                     }
1100                                            PEG_METHOD_EXIT();
1101                                            return;
1102                                        }
1103 kumpf            1.23      
1104 kumpf            1.104                 // Expect <LOCALNAMESPACEPATH ...>
1105                            
1106                                        String nameSpace;
1107                            
1108                                        if (!XmlReader::getLocalNameSpacePathElement(parser, nameSpace))
1109                                        {
1110                                            MessageLoaderParms mlParms(
1111                                                "Server.CIMOperationRequestDecoder."
1112                                                    "EXPECTED_LOCALNAMESPACEPATH_ELEMENT",
1113                                                "expected LOCALNAMESPACEPATH element");
1114                                            throw XmlValidationError(parser.getLine(), mlParms);
1115                                        }
1116                            
1117                                        // The Specification for CIM Operations over HTTP reads:
1118                                        //     3.3.7. CIMObject
1119                                        //
1120                                        //     This header MUST be present in any CIM Operation Request
1121                                        //     message that contains a Simple Operation Request.
1122                                        //
1123                                        //     It MUST NOT be present in any CIM Operation Response message,
1124                                        //     nor in any CIM Operation Request message that is not a
1125 kumpf            1.104                 //     Simple Operation Request.
1126                                        //
1127                                        //     The header identifies the CIM object (which MUST be a Class
1128                                        //     or Instance for an extrinsic method, or a Namespace for an
1129                                        //     intrinsic method) on which the method is to be invoked, using
1130                                        //     a CIM object path encoded in an HTTP-safe representation.
1131                                        //
1132                                        //     If a CIM Server receives a CIM Operation Request for which
1133                                        //     either:
1134                                        //
1135                                        //     - The CIMObject header is present but has an invalid value,
1136                                        //       or;
1137                                        //     - The CIMObject header is not present but the Operation
1138                                        //       Request Message is a Simple Operation Request, or;
1139                                        //     - The CIMObject header is present but the Operation Request
1140                                        //       Message is not a Simple Operation Request, or;
1141                                        //     - The CIMObject header is present, the Operation Request
1142                                        //       Message is a Simple Operation Request, but the ObjectPath
1143                                        //       value does not match (where match is defined in the section
1144                                        //       section on Encoding CIM Object Paths) the Operation Request
1145                                        //       Message,
1146 kumpf            1.104                 //
1147                                        //     then it MUST fail the request and return a status of
1148                                        //     "400 Bad Request" (and MUST include a CIMError header in the
1149                                        //     response with a value of header-mismatch), subject to the
1150                                        //     considerations specified in Errors.
1151                                        if (!String::equalNoCase(nameSpace, cimObjectInHeader))
1152                                        {
1153                                            if (cimObjectInHeader == String::EMPTY)
1154                                            {
1155                                                MessageLoaderParms parms(
1156                                                    "Server.CIMOperationRequestDecoder."
1157                                                        "MISSING_CIMOBJECT_HTTP_HEADER",
1158                                                    "Missing CIMObject HTTP header.");
1159                                                sendHttpError(
1160                                                    queueId,
1161                                                    HTTP_STATUS_BADREQUEST,
1162                                                    "header-mismatch",
1163                                                    MessageLoader::getMessage(parms),
1164                                                    closeConnect);
1165                                            }
1166                                            else
1167 kumpf            1.104                     {
1168                                                MessageLoaderParms parms(
1169                                                    "Server.CIMOperationRequestDecoder."
1170 kumpf            1.113                                 "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT",
1171 kumpf            1.104                             "CIMObject value \"$0\" does not match CIM request "
1172                                                        "object \"$1\".",
1173                                                    cimObjectInHeader,
1174                                                    nameSpace);
1175                                                sendHttpError(
1176                                                    queueId,
1177                                                    HTTP_STATUS_BADREQUEST,
1178                                                    "header-mismatch",
1179                                                    MessageLoader::getMessage(parms),
1180                                                    closeConnect);
1181                                            }
1182                                            PEG_METHOD_EXIT();
1183                                            return;
1184                                        }
1185                            
1186                                        // This try block only catches CIMExceptions, because they must be
1187                                        // responded to with a proper IMETHODRESPONSE.  Other exceptions are
1188                                        // caught in the outer try block.
1189                                        try
1190                                        {
1191                                            // Delegate to appropriate method to handle:
1192 kumpf            1.104     
1193                                            if (System::strcasecmp(cimMethodName, "GetClass") == 0)
1194                                                request.reset(decodeGetClassRequest(
1195                                                    queueId, parser, messageId, nameSpace));
1196                                            else if (System::strcasecmp(cimMethodName, "GetInstance") == 0)
1197                                                request.reset(decodeGetInstanceRequest(
1198                                                    queueId, parser, messageId, nameSpace));
1199                                            else if (System::strcasecmp(
1200                                                         cimMethodName, "EnumerateClassNames") == 0)
1201                                                request.reset(decodeEnumerateClassNamesRequest(
1202                                                    queueId, parser, messageId, nameSpace));
1203                                            else if (System::strcasecmp(cimMethodName, "References") == 0)
1204                                                request.reset(decodeReferencesRequest(
1205                                                    queueId, parser, messageId, nameSpace));
1206                                            else if (System::strcasecmp(
1207                                                         cimMethodName, "ReferenceNames") == 0)
1208                                                request.reset(decodeReferenceNamesRequest(
1209                                                    queueId, parser, messageId, nameSpace));
1210                                            else if (System::strcasecmp(
1211                                                         cimMethodName, "AssociatorNames") == 0)
1212                                                request.reset(decodeAssociatorNamesRequest(
1213 kumpf            1.104                             queueId, parser, messageId, nameSpace));
1214                                            else if (System::strcasecmp(cimMethodName, "Associators") == 0)
1215                                                request.reset(decodeAssociatorsRequest(
1216                                                    queueId, parser, messageId, nameSpace));
1217                                            else if (System::strcasecmp(
1218                                                         cimMethodName, "CreateInstance") == 0)
1219                                                request.reset(decodeCreateInstanceRequest(
1220                                                    queueId, parser, messageId, nameSpace));
1221                                            else if (System::strcasecmp(
1222                                                         cimMethodName, "EnumerateInstanceNames")==0)
1223                                                request.reset(decodeEnumerateInstanceNamesRequest(
1224                                                    queueId, parser, messageId, nameSpace));
1225                                            else if (System::strcasecmp(
1226                                                         cimMethodName, "DeleteQualifier") == 0)
1227                                                request.reset(decodeDeleteQualifierRequest(
1228                                                    queueId, parser, messageId, nameSpace));
1229                                            else if (System::strcasecmp(cimMethodName, "GetQualifier") == 0)
1230                                                request.reset(decodeGetQualifierRequest(
1231                                                    queueId, parser, messageId, nameSpace));
1232                                            else if (System::strcasecmp(cimMethodName, "SetQualifier") == 0)
1233                                                request.reset(decodeSetQualifierRequest(
1234 kumpf            1.104                             queueId, parser, messageId, nameSpace));
1235                                            else if (System::strcasecmp(
1236                                                         cimMethodName, "EnumerateQualifiers") == 0)
1237                                                request.reset(decodeEnumerateQualifiersRequest(
1238                                                    queueId, parser, messageId, nameSpace));
1239                                            else if (System::strcasecmp(
1240                                                         cimMethodName, "EnumerateClasses") == 0)
1241                                                request.reset(decodeEnumerateClassesRequest(
1242                                                    queueId, parser, messageId, nameSpace));
1243                                            else if (System::strcasecmp(
1244                                                         cimMethodName, "EnumerateInstances") == 0)
1245                                                request.reset(decodeEnumerateInstancesRequest(
1246                                                    queueId, parser, messageId, nameSpace));
1247                                            else if (System::strcasecmp(cimMethodName, "CreateClass") == 0)
1248                                                request.reset(decodeCreateClassRequest(
1249                                                    queueId, parser, messageId, nameSpace));
1250                                            else if (System::strcasecmp(cimMethodName, "ModifyClass") == 0)
1251                                                request.reset(decodeModifyClassRequest(
1252                                                    queueId, parser, messageId, nameSpace));
1253                                            else if (System::strcasecmp(
1254                                                         cimMethodName, "ModifyInstance") == 0)
1255 kumpf            1.104                         request.reset(decodeModifyInstanceRequest(
1256                                                    queueId, parser, messageId, nameSpace));
1257                                            else if (System::strcasecmp(cimMethodName, "DeleteClass") == 0)
1258                                                request.reset(decodeDeleteClassRequest(
1259                                                    queueId, parser, messageId, nameSpace));
1260                                            else if (System::strcasecmp(
1261                                                         cimMethodName, "DeleteInstance") == 0)
1262                                                request.reset(decodeDeleteInstanceRequest(
1263                                                    queueId, parser, messageId, nameSpace));
1264                                            else if (System::strcasecmp(cimMethodName, "GetProperty") == 0)
1265                                                request.reset(decodeGetPropertyRequest(
1266                                                    queueId, parser, messageId, nameSpace));
1267                                            else if (System::strcasecmp(cimMethodName, "SetProperty") == 0)
1268                                                request.reset(decodeSetPropertyRequest(
1269                                                    queueId, parser, messageId, nameSpace));
1270                                            else if (System::strcasecmp(cimMethodName, "ExecQuery") == 0)
1271                                                request.reset(decodeExecQueryRequest(
1272                                                    queueId, parser, messageId, nameSpace));
1273 karl             1.127.2.1                 // Pull Operations decoders
1274                                            else if (System::strcasecmp(
1275                                                         cimMethodName, "OpenEnumerateInstances") == 0)
1276                                                request.reset(decodeOpenEnumerateInstancesRequest(
1277                                                    queueId, parser, messageId, nameSpace));
1278                            
1279                                            else if (System::strcasecmp(
1280                                                         cimMethodName, "OpenEnumerateInstancePaths") == 0)
1281                                                request.reset(decodeOpenEnumerateInstancePathsRequest(
1282                                                    queueId, parser, messageId, nameSpace));
1283                            
1284                                            else if (System::strcasecmp(
1285                                                         cimMethodName, "OpenReferenceInstances") == 0)
1286                                                request.reset(decodeOpenReferenceInstancesRequest(
1287                                                    queueId, parser, messageId, nameSpace));
1288                            
1289                                            else if (System::strcasecmp(
1290                                                         cimMethodName, "OpenReferenceInstancePaths") == 0)
1291                                                request.reset(decodeOpenReferenceInstancePathsRequest(
1292                                                    queueId, parser, messageId, nameSpace));
1293                            
1294 karl             1.127.2.1                 else if (System::strcasecmp(
1295                                                         cimMethodName, "OpenAssociatorInstances") == 0)
1296                                                request.reset(decodeOpenAssociatorInstancesRequest(
1297                                                    queueId, parser, messageId, nameSpace));
1298                            
1299                                            else if (System::strcasecmp(
1300                                                         cimMethodName, "OpenAssociatorInstancePaths") == 0)
1301                                                request.reset(decodeOpenAssociatorInstancePathsRequest(
1302                                                    queueId, parser, messageId, nameSpace));
1303                            
1304                                            else if (System::strcasecmp(
1305                                                         cimMethodName, "PullInstancesWithPath") == 0)
1306                                                request.reset(decodePullInstancesWithPathRequest(
1307                                                    queueId, parser, messageId, nameSpace));
1308                            
1309                                            else if (System::strcasecmp(
1310                                                         cimMethodName, "PullInstancePaths") == 0)
1311                                                request.reset(decodePullInstancePathsRequest(
1312                                                    queueId, parser, messageId, nameSpace));
1313                            
1314                                            else if (System::strcasecmp(
1315 karl             1.127.2.1                              cimMethodName, "CloseEnumeration") == 0)
1316                                                request.reset(decodeCloseEnumerationRequest(
1317                                                    queueId, parser, messageId, nameSpace));
1318                            
1319                                            else if (System::strcasecmp(
1320                                                         cimMethodName, "EnumerationCount") == 0)
1321                                                request.reset(decodeEnumerationCountRequest(
1322                                                    queueId, parser, messageId, nameSpace));
1323 karl             1.127.2.6 
1324                                            else if (System::strcasecmp(
1325                                                         cimMethodName, "OpenQueryInstances") == 0)
1326                                                request.reset(decodeOpenQueryInstancesRequest(
1327                                                    queueId, parser, messageId, nameSpace));
1328 karl             1.127.2.1                 // End Of Pull Operations
1329 kumpf            1.104                     else
1330                                            {
1331                                                throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED,
1332                                                    MessageLoaderParms(
1333                                                        "Server.CIMOperationRequestDecoder."
1334                                                            "UNRECOGNIZED_INTRINSIC_METHOD",
1335                                                        "Unrecognized intrinsic method: $0",
1336                                                        cimMethodName));
1337                                            }
1338                                        }
1339                                        catch (CIMException& e)
1340                                        {
1341                                            sendIMethodError(
1342                                                queueId,
1343                                                httpMethod,
1344                                                messageId,
1345                                                cimMethodName,
1346                                                e,
1347                                                closeConnect);
1348                            
1349                                            PEG_METHOD_EXIT();
1350 kumpf            1.104                     return;
1351                                        }
1352                                        catch (XmlException&)
1353                                        {
1354                                            // XmlExceptions are handled below
1355                                            throw;
1356                                        }
1357                                        catch (Exception& e)
1358                                        {
1359                                            // Caught an unexpected exception from decoding.  Since we must
1360                                            // have had a problem reconstructing a CIM object, we'll treat
1361                                            // it as an invalid parameter
1362                                            sendIMethodError(
1363                                                queueId,
1364                                                httpMethod,
1365                                                messageId,
1366                                                cimMethodName,
1367                                                PEGASUS_CIM_EXCEPTION(
1368                                                    CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1369                                                closeConnect);
1370                            
1371 kumpf            1.104                     PEG_METHOD_EXIT();
1372                                            return;
1373                                        }
1374                            
1375                                        // Expect </IMETHODCALL>
1376                            
1377                                        XmlReader::expectEndTag(parser, "IMETHODCALL");
1378                                    }
1379                                    // Expect <METHODCALL ...>
1380                                    else if (XmlReader::getMethodCallStartTag(parser, cimMethodName))
1381                                    {
1382                                        CIMObjectPath reference;
1383 karl             1.127.2.7             isIMethodCall = false;
1384 kumpf            1.104     
1385                                        // The Specification for CIM Operations over HTTP reads:
1386                                        //     3.3.6. CIMMethod
1387                                        //
1388                                        //     This header MUST be present in any CIM Operation Request
1389                                        //     message that contains a Simple Operation Request.
1390                                        //
1391                                        //     It MUST NOT be present in any CIM Operation Response message,
1392                                        //     nor in any CIM Operation Request message that is not a
1393                                        //     Simple Operation Request.
1394                                        //
1395                                        //     The name of the CIM method within a Simple Operation Request
1396                                        //     is defined to be the value of the NAME attribute of the
1397                                        //     <METHODCALL> or <IMETHODCALL> element.
1398                                        //
1399                                        //     If a CIM Server receives a CIM Operation Request for which
1400                                        //     either:
1401                                        //
1402                                        //     - The CIMMethod header is present but has an invalid value,
1403                                        //       or;
1404                                        //     - The CIMMethod header is not present but the Operation
1405 kumpf            1.104                 //       Request Message is a Simple Operation Request, or;
1406                                        //     - The CIMMethod header is present but the Operation Request
1407                                        //       Message is not a Simple Operation Request, or;
1408                                        //     - The CIMMethod header is present, the Operation Request
1409                                        //       Message is a Simple Operation Request, but the
1410                                        //       CIMIdentifier value (when unencoded) does not match the
1411                                        //       unique method name within the Simple Operation Request,
1412                                        //
1413                                        //     then it MUST fail the request and return a status of
1414                                        //     "400 Bad Request" (and MUST include a CIMError header in the
1415                                        //     response with a value of header-mismatch), subject to the
1416                                        //     considerations specified in Errors.
1417                            
1418                                        // Extrinic methods can have UTF-8!
1419                                        String cimMethodNameUTF16(cimMethodName);
1420                                        if (cimMethodNameUTF16 != cimMethodInHeader)
1421                                        {
1422                                            // ATTN-RK-P3-20020304: How to decode cimMethodInHeader?
1423                                            if (cimMethodInHeader == String::EMPTY)
1424                                            {
1425                                                MessageLoaderParms parms(
1426 kumpf            1.104                             "Server.CIMOperationRequestDecoder."
1427                                                        "MISSING_CIMMETHOD_HTTP_HEADER",
1428                                                    "Missing CIMMethod HTTP header.");
1429                                                sendHttpError(
1430                                                    queueId,
1431                                                    HTTP_STATUS_BADREQUEST,
1432                                                    "header-mismatch",
1433                                                    MessageLoader::getMessage(parms),
1434                                                    closeConnect);
1435                                            }
1436                                            else
1437                                            {
1438                                                MessageLoaderParms parms(
1439                                                    "Server.CIMOperationRequestDecoder."
1440                                                        "CIMMETHOD_VALUE_DOES_NOT_MATCH_REQUEST_METHOD",
1441                                                    "CIMMethod value \"$0\" does not match CIM request "
1442                                                        "method \"$1\".",
1443                                                    (const char*)cimMethodInHeader.getCString(),
1444                                                    cimMethodName);
1445                                                sendHttpError(
1446                                                    queueId,
1447 kumpf            1.104                             HTTP_STATUS_BADREQUEST,
1448                                                    "header-mismatch",
1449                                                    MessageLoader::getMessage(parms),
1450                                                    closeConnect);
1451                                            }
1452                                            PEG_METHOD_EXIT();
1453                                            return;
1454                                        }
1455                            
1456                                        //
1457                                        // Check for <LOCALINSTANCEPATHELEMENT> or <LOCALCLASSPATHELEMENT>
1458                                        //
1459                                        if (!(XmlReader::getLocalInstancePathElement(parser, reference) ||
1460                                              XmlReader::getLocalClassPathElement(parser, reference)))
1461                                        {
1462                                            MessageLoaderParms parms(
1463                                                "Common.XmlConstants.MISSING_ELEMENT_LOCALPATH",
1464                                                MISSING_ELEMENT_LOCALPATH);
1465                                            // this throw is not updated with MLP because
1466                                            // MISSING_ELEMENT_LOCALPATH is a hardcoded variable,
1467                                            // not a message
1468 kumpf            1.104                     throw XmlValidationError(parser.getLine(), parms);
1469                                        }
1470                            
1471                                        // The Specification for CIM Operations over HTTP reads:
1472                                        //     3.3.7. CIMObject
1473                                        //
1474                                        //     This header MUST be present in any CIM Operation Request
1475                                        //     message that contains a Simple Operation Request.
1476                                        //
1477                                        //     It MUST NOT be present in any CIM Operation Response message,
1478                                        //     nor in any CIM Operation Request message that is not a
1479                                        //     Simple Operation Request.
1480                                        //
1481                                        //     The header identifies the CIM object (which MUST be a Class
1482                                        //     or Instance for an extrinsic method, or a Namespace for an
1483                                        //     intrinsic method) on which the method is to be invoked, using
1484                                        //     a CIM object path encoded in an HTTP-safe representation.
1485                                        //
1486                                        //     If a CIM Server receives a CIM Operation Request for which
1487                                        //     either:
1488                                        //
1489 kumpf            1.104                 //     - The CIMObject header is present but has an invalid value,
1490                                        //       or;
1491                                        //     - The CIMObject header is not present but the Operation
1492                                        //       Request Message is a Simple Operation Request, or;
1493                                        //     - The CIMObject header is present but the Operation Request
1494                                        //       Message is not a Simple Operation Request, or;
1495                                        //     - The CIMObject header is present, the Operation Request
1496                                        //       Message is a Simple Operation Request, but the ObjectPath
1497                                        //       value does not match (where match is defined in the section
1498                                        //       section on Encoding CIM Object Paths) the Operation Request
1499                                        //       Message,
1500                                        //
1501                                        //     then it MUST fail the request and return a status of
1502                                        //     "400 Bad Request" (and MUST include a CIMError header in the
1503                                        //     response with a value of header-mismatch), subject to the
1504                                        //     considerations specified in Errors.
1505                                        if (cimObjectInHeader == String::EMPTY)
1506                                        {
1507                                            MessageLoaderParms parms(
1508                                                "Server.CIMOperationRequestDecoder."
1509                                                    "MISSING_CIMOBJECT_HTTP_HEADER",
1510 kumpf            1.104                         "Missing CIMObject HTTP header.");
1511                                            sendHttpError(
1512                                                queueId,
1513                                                HTTP_STATUS_BADREQUEST,
1514                                                "header-mismatch",
1515                                                MessageLoader::getMessage(parms),
1516                                                closeConnect);
1517                                            PEG_METHOD_EXIT();
1518                                            return;
1519                                        }
1520                            
1521                                        CIMObjectPath headerObjectReference;
1522                                        try
1523                                        {
1524                                            headerObjectReference.set(cimObjectInHeader);
1525                                        }
1526                                        catch (Exception&)
1527                                        {
1528                                            MessageLoaderParms parms(
1529                                                "Server.CIMOperationRequestDecoder."
1530                                                    "COULD_NOT_PARSE_CIMOBJECT_VALUE",
1531 kumpf            1.104                         "Could not parse CIMObject value \"$0\".",
1532                                                cimObjectInHeader);
1533                                            sendHttpError(
1534                                                queueId,
1535                                                HTTP_STATUS_BADREQUEST,
1536                                                "header-mismatch",
1537                                                MessageLoader::getMessage(parms),
1538                                                closeConnect);
1539                                            PEG_METHOD_EXIT();
1540                                            return;
1541                                        }
1542                            
1543                                        if (!reference.identical(headerObjectReference))
1544                                        {
1545                                            MessageLoaderParms parms(
1546                                                "Server.CIMOperationRequestDecoder."
1547 kumpf            1.113                             "CIMOBJECT_VALUE_DOES_NOT_MATCH_REQUEST_OBJECT",
1548 kumpf            1.104                         "CIMObject value \"$0\" does not match CIM request "
1549                                                    "object \"$1\".",
1550                                                cimObjectInHeader,
1551 kumpf            1.113                         reference.toString());
1552 kumpf            1.104                     sendHttpError(
1553                                                queueId,
1554                                                HTTP_STATUS_BADREQUEST,
1555                                                "header-mismatch",
1556                                                MessageLoader::getMessage(parms),
1557                                                closeConnect);
1558                                            PEG_METHOD_EXIT();
1559                                            return;
1560                                        }
1561                            
1562                                        // This try block only catches CIMExceptions, because they must be
1563                                        // responded to with a proper METHODRESPONSE.  Other exceptions are
1564                                        // caught in the outer try block.
1565                                        try
1566                                        {
1567                                            // Delegate to appropriate method to handle:
1568                            
1569                                            request.reset(decodeInvokeMethodRequest(
1570                                               queueId,
1571                                               parser,
1572                                               messageId,
1573 kumpf            1.104                        reference,
1574                                               cimMethodNameUTF16)); // contains UTF-16 converted from UTF-8
1575                                        }
1576                                        catch (CIMException& e)
1577                                        {
1578                                            sendMethodError(
1579                                                queueId,
1580                                                httpMethod,
1581                                                messageId,
1582                                                cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1583                                                e,
1584                                                closeConnect);
1585                            
1586                                            PEG_METHOD_EXIT();
1587                                            return;
1588                                        }
1589                                        catch (XmlException&)
1590                                        {
1591                                            // XmlExceptions are handled below
1592                                            throw;
1593                                        }
1594 kumpf            1.104                 catch (Exception& e)
1595                                        {
1596                                            // Caught an unexpected exception from decoding.  Since we must
1597                                            // have had a problem reconstructing a CIM object, we'll treata
1598                                            // it as an invalid parameter
1599                                            sendMethodError(
1600                                                queueId,
1601                                                httpMethod,
1602                                                messageId,
1603                                                cimMethodNameUTF16, // contains UTF-16 converted from UTF-8
1604                                                PEGASUS_CIM_EXCEPTION(
1605                                                    CIM_ERR_INVALID_PARAMETER, e.getMessage()),
1606                                                closeConnect);
1607                            
1608                                            PEG_METHOD_EXIT();
1609                                            return;
1610                                        }
1611 kumpf            1.73      
1612 kumpf            1.104                 // Expect </METHODCALL>
1613 mday             1.16      
1614 kumpf            1.104                 XmlReader::expectEndTag(parser, "METHODCALL");
1615                                    }
1616                                    else
1617                                    {
1618                                        MessageLoaderParms mlParms(
1619                                           "Server.CIMOperationRequestDecoder.EXPECTED_IMETHODCALL_ELEMENT",
1620                                           "expected IMETHODCALL or METHODCALL element");
1621                                        throw XmlValidationError(parser.getLine(),mlParms);
1622                                    }
1623                            
1624                                    // Expect </SIMPLEREQ>
1625                            
1626                                    XmlReader::expectEndTag(parser, "SIMPLEREQ");
1627                            
1628                                    // Expect </MESSAGE>
1629                            
1630                                    XmlReader::expectEndTag(parser, "MESSAGE");
1631                            
1632                                    // Expect </CIM>
1633                            
1634                                    XmlReader::expectEndTag(parser, "CIM");
1635 kumpf            1.104         }
1636                                catch (XmlValidationError& e)
1637                                {
1638 thilo.boehm      1.119             PEG_TRACE((TRC_XML,Tracer::LEVEL1,
1639 kumpf            1.104                 "CIMOperationRequestDecoder::handleMethodCall - "
1640 marek            1.116                     "XmlValidationError exception has occurred. Message: %s",
1641                                        (const char*) e.getMessage().getCString()));
1642 kumpf            1.24      
1643 kumpf            1.104             sendHttpError(
1644                                        queueId,
1645                                        HTTP_STATUS_BADREQUEST,
1646                                        "request-not-valid",
1647                                        e.getMessage(),
1648                                        closeConnect);
1649                                    PEG_METHOD_EXIT();
1650                                    return;
1651                                }
1652                                catch (XmlSemanticError& e)
1653                                {
1654 thilo.boehm      1.119             PEG_TRACE((TRC_XML,Tracer::LEVEL1,
1655 kumpf            1.104                 "CIMOperationRequestDecoder::handleMethodCall - "
1656 marek            1.116                     "XmlSemanticError exception has occurred. Message: %s",
1657                                        (const char*) e.getMessage().getCString()));
1658 mday             1.16      
1659 kumpf            1.104             // ATTN-RK-P2-20020404: Is this the correct response for these errors?
1660                                    sendHttpError(
1661                                        queueId,
1662                                        HTTP_STATUS_BADREQUEST,
1663                                        "request-not-valid",
1664                                        e.getMessage(),
1665                                        closeConnect);
1666                                    PEG_METHOD_EXIT();
1667                                    return;
1668                                }
1669                                catch (XmlException& e)
1670                                {
1671 thilo.boehm      1.119             PEG_TRACE((TRC_XML,Tracer::LEVEL1,
1672 kumpf            1.104                 "CIMOperationRequestDecoder::handleMethodCall - "
1673 marek            1.116                     "XmlException has occurred. Message: %s",
1674                                        (const char*) e.getMessage().getCString()));
1675 kumpf            1.104     
1676                                    sendHttpError(
1677                                        queueId,
1678                                        HTTP_STATUS_BADREQUEST,
1679                                        "request-not-well-formed",
1680                                        e.getMessage(),
1681                                        closeConnect);
1682                                    PEG_METHOD_EXIT();
1683                                    return;
1684                                }
1685 karl             1.127.2.5     catch (TooManyElementsException& e)
1686                                {
1687                                    PEG_TRACE((TRC_XML,Tracer::LEVEL1,
1688                                        "CIMOperationRequestDecoder::handleMethodCall - "
1689                                            "TooManyElementsException has occurred. Message: %s",
1690                                        (const char*) e.getMessage().getCString()));
1691                            
1692                                    sendHttpError(
1693                                        queueId,
1694                                        HTTP_STATUS_BADREQUEST,
1695                                        "request-with-too-many-elements",
1696                                        e.getMessage(),
1697                                        closeConnect);
1698                                    PEG_METHOD_EXIT();
1699                                    return;
1700                                }
1701 kumpf            1.104         catch (Exception& e)
1702                                {
1703                                    // Don't know why I got this exception.  Seems like a bad thing.
1704                                    // Any exceptions we're expecting should be caught separately and
1705                                    // dealt with appropriately.  This is a last resort.
1706                                    sendHttpError(
1707                                        queueId,
1708                                        HTTP_STATUS_INTERNALSERVERERROR,
1709                                        String::EMPTY,
1710                                        e.getMessage(),
1711                                        closeConnect);
1712                                    PEG_METHOD_EXIT();
1713                                    return;
1714                                }
1715                                catch (...)
1716                                {
1717                                    // Don't know why I got whatever this is.  Seems like a bad thing.
1718                                    // Any exceptions we're expecting should be caught separately and
1719                                    // dealt with appropriately.  This is a last resort.
1720                                    sendHttpError(
1721                                        queueId,
1722 kumpf            1.104                 HTTP_STATUS_INTERNALSERVERERROR,
1723                                        String::EMPTY,
1724                                        String::EMPTY,
1725                                        closeConnect);
1726                                    PEG_METHOD_EXIT();
1727                                    return;
1728                                }
1729                            
1730                                STAT_BYTESREAD
1731                            
1732                                request->authType = authType;
1733                                request->userName = userName;
1734                                request->ipAddress = ipAddress;
1735                                request->setHttpMethod (httpMethod);
1736 mike             1.120         request->binaryResponse = binaryResponse;
1737 sage             1.41      
1738 chuck            1.58      //l10n start
1739                            // l10n TODO - might want to move A-L and C-L to Message
1740                            // to make this more maintainable
1741 kumpf            1.104         // Add the language headers to the request
1742                                CIMMessage* cimmsg = dynamic_cast<CIMMessage*>(request.get());
1743                                if (cimmsg != NULL)
1744                                {
1745                                    cimmsg->operationContext.insert(IdentityContainer(userName));
1746 karl             1.127.2.7         cimmsg->operationContext.insert(UserRoleContainer(userRole));
1747 kumpf            1.104             cimmsg->operationContext.set(
1748                                        AcceptLanguageListContainer(httpAcceptLanguages));
1749                                    cimmsg->operationContext.set(
1750                                        ContentLanguageListContainer(httpContentLanguages));
1751                                }
1752                                else
1753                                {
1754                                    ;    // l10n TODO - error back to client here
1755                                }
1756 chip             1.92      // l10n end
1757 chuck            1.58      
1758 karl             1.127.2.7 #ifdef PEGASUS_PAM_SESSION_SECURITY
1759                            
1760                                // Whatever happens on the authentication, we need to check for
1761                                // a change of an expired password
1762                                // Since the definition for password updates is not completely
1763                                // defined in DMTF yet, keep this feature PAM_SESSION only
1764                                // This also only works with CIM-XML right now.
1765                                if (isExpiredPassword)
1766                                {
1767                                    // only try password update if req. Pragma is set
1768                                    if (updateExpiredPassword)
1769                                    {
1770                                        // update expired password
1771                                        // fct. _updateExpiredPassword returns false
1772                                        //        if the request was NOT for PG_Account etc.
1773                                        _updateExpiredPassword(
1774                                            queueId,
1775                                            httpMethod,
1776                                            messageId,
1777                                            closeConnect,
1778                                            httpContentLanguages,
1779 karl             1.127.2.7                 cimmsg,
1780                                            userName,
1781                                            userPass);
1782                                    }
1783                                    else
1784                                    {
1785                                        sendUserAccountExpired(
1786                                            queueId,
1787                                            httpMethod,
1788                                            messageId,
1789                                            cimMethodInHeader,
1790                                            closeConnect,
1791                                            isIMethodCall);
1792                                    }
1793                                    PEG_METHOD_EXIT();
1794                                    return;
1795                                }
1796                            #endif
1797                            
1798 kumpf            1.104         request->setCloseConnect(closeConnect);
1799                                _outputQueue->enqueue(request.release());
1800 chip             1.92      
1801 kumpf            1.104         PEG_METHOD_EXIT();
1802 mike             1.2       }
1803 karl             1.127.2.5 /**************************************************************************
1804                            **
1805                            **  Decode CIM Operation Type Common IParameter types.
1806                            **  Each class defines processing for a particular IPARAM type
1807                            **  (ex. boolean)or parameter name (i.e. propertyListIParam)
1808                            **  Each struct defines:
1809                            **      got - Boolean defines whether this parameter has been found
1810                            **      value - The value container for this type
1811                            **      iParamFound(...) - function sets the duplicate flag and the got flag
1812                            **      get - Function to get the defined parameter from the
1813                            **            parser
1814                            **      NOTE: at least one has multiple get.. functions.
1815                            ** NOTE: Some of these are defined for a particular attribute (ex.
1816                            **      propertyListIparam) so the attribute name is integrated into the
1817                            **      methods and others for a whole class of attributes (Boolean,
1818                            **      String,ClassName etc.) so the attribute name is defined as part
1819                            **      of the constructor.
1820                            ***************************************************************************/
1821                            // Common xml attribute accessor for all boolean attributes.   The
1822                            // attribute name is defined in the constructor.
1823                            // The usage pattern is:
1824 karl             1.127.2.5 //    Boolean duplicate;     // Flag to indicate multiple calls
1825                            //
1826                            //    booleanIParam xyz("xyz"); default is false for attribute xyz
1827                            //
1828                            //    if(xyz.get(parser, name, emptyTag)   // parses to test if name == xyz
1829                            //        iParamFound(duplicate);          // set flag to indicate exists etc.
1830                            class booleanIParam
1831                            {
1832                            public:
1833                                Boolean got;
1834                                Boolean value;
1835                            
1836                                // constructor with default value = false
1837                                booleanIParam(const char* name): got(false),value(false),iParamName(name){}
1838                            
1839                                // constructor with initial value specifically set from the input
1840                                booleanIParam(const char* name, Boolean _value):
1841                                    got(false),value(_value),iParamName(name){}
1842                            
1843                                ~booleanIParam(){}
1844                            
1845 karl             1.127.2.5     void iParamFound(Boolean& duplicate)
1846                                {
1847                                    duplicate = got;
1848                                    got = true;
1849                                }
1850                            
1851                                // get the value of the parameter if the parameter if it exists.
1852                                // Note that the attribute name is defined in the constructor
1853                                // Value is required.
1854                                // @param parser
1855                                // @param testName attribute name from parse.
1856                                // @emptyTag returns true if emptyTag returned true from parser
1857                                Boolean get(XmlParser& parser, const char * testName,  Boolean& emptyTag)
1858                                {
1859                                    if (System::strcasecmp(iParamName.getCString(), testName) == 0)
1860                                    {
1861                                        XmlReader::rejectNullIParamValue(parser, emptyTag,
1862                                                                         iParamName.getCString());
1863                                        XmlReader::getBooleanValueElement(parser, value, true);
1864                                        return true;
1865                                    }
1866 karl             1.127.2.5         return false;
1867                                }
1868                                private:
1869                                String iParamName;
1870                                // hide unused default constructor and assign, copy constructors
1871                                booleanIParam();
1872                                booleanIParam(const booleanIParam&);
1873                                booleanIParam& operator = (const booleanIParam&);
1874                            };
1875                            
1876                            // decode Iparam to CIMName representing class names.  This struct
1877                            // has two get functions:
1878                            //     get - parse where the parameter value is required
1879                            //     getOptional - parse where the parameter value is optional
1880                            
1881                            class classNameIParam
1882                            {
1883                            public:
1884                                Boolean got;
1885                                CIMName value;
1886                            
1887 karl             1.127.2.5     // Set the flag to inidcate that this IParam has been gotten and also
1888                                // set the flag defined by the duplicate parameter
1889                                // @param duplicate Boolean that is set to previous value of the got
1890                                // variable indicating whether this is second call to this IParam
1891                                void iParamFound(Boolean& duplicate)
1892                                {
1893                                    duplicate = got;
1894                                    got = true;
1895                                }
1896                            
1897                                // construct an IParam definition with name.
1898                                // @param name const char* defining name of IParam to match
1899                                // @return true if IParam found with _attrName
1900                                classNameIParam(const char* name): got(false), iParamName(name){}
1901                            
1902                                ~classNameIParam(){}
1903                            
1904                                // Get Required value element.Test for name parameter as IParam with
1905                                // name and if found, if value not NULL, parse the className and
1906                                // set into value
1907                                Boolean get(XmlParser& parser, const char* name, Boolean& emptyTag)
1908 karl             1.127.2.5     {
1909                                    if (System::strcasecmp(name,iParamName.getCString()) == 0)
1910                                    {
1911                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1912                                        XmlReader::getClassNameElement(parser, value, true);
1913                                        return true;
1914                                    }
1915                                    return false;
1916                                }
1917                                // Get Iparam with optional value.
1918                                Boolean getOptional(XmlParser& parser, const char* name,
1919                                                    Boolean& emptyTag)
1920                                {
1921                                    if (System::strcasecmp(name, iParamName.getCString()) == 0)
1922                                    {
1923                                        //  value may be NULL
1924                                        if (!emptyTag)
1925                                        {
1926                                            XmlReader::getClassNameElement(parser, value, false);
1927                                        }
1928                                        return true;
1929 karl             1.127.2.5         }
1930                                    return false;
1931                                }
1932                            private:
1933                                String iParamName;
1934                                // hide unused default constructor and assign, copy constructors
1935                                classNameIParam();
1936                                classNameIParam(const classNameIParam&);
1937                                classNameIParam& operator = (const classNameIParam&);
1938                            };
1939                            
1940                            // test for "InstanceName" iParam and if found, return CIMObjectPath
1941                            // in value
1942                            class instanceNameIParam
1943                            {
1944                            public:
1945                                Boolean got;
1946                                CIMObjectPath value;
1947                            
1948                                void iParamFound(Boolean& duplicate)
1949                                {
1950 karl             1.127.2.5         duplicate = got;
1951                                    got = true;
1952                                }
1953                                instanceNameIParam(): got(false){}
1954                            
1955                                ~instanceNameIParam(){}
1956                            
1957                                Boolean get(XmlParser& parser, const char * name, Boolean& emptyTag)
1958                                {
1959                                    if (System::strcasecmp(name, "InstanceName") == 0)
1960                                    {
1961                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
1962                                        XmlReader::getInstanceNameElement(parser, value);
1963                                        return true;
1964                                    }
1965                                    return false;
1966                                }
1967                            private:
1968                                // hide unused assign, copy constructors
1969                                instanceNameIParam(const instanceNameIParam&);
1970                                instanceNameIParam& operator = (const instanceNameIParam&);
1971 karl             1.127.2.5 };
1972                            
1973                            // test for "ObjectName" attribute and if found, return CIMObjectPath
1974                            // This struct has an extra attribute, the flag isClassNameElement which
1975                            // returns true if the objectName was a classPath and not an instance
1976                            // path.
1977                            // If Xmlreader returns true, this is class only element, no
1978                            //  key bindings. That state must be set into the request
1979                            //  message (ex. objectName.isClassElement)
1980                            // @param (Optional) Name of IParam.  Default is ObjectName.  Note
1981                            // that pull operations use InstanceName as IParamName.
1982                            class objectNameIParam
1983                            {
1984                            public:
1985                                Boolean got;
1986                                CIMObjectPath value;
1987                                Boolean isClassNameElement;
1988                            
1989                                void iParamFound(Boolean& duplicate)
1990                                {
1991                                    duplicate = got;
1992 karl             1.127.2.5         got = true;
1993                                }
1994                            
1995                                // Constructor using default IParam name
1996                                objectNameIParam(): got(false), isClassNameElement(false),
1997                                    iParamName("ObjectName"){}
1998                            
1999                                // Constructor with IParam name included
2000                                objectNameIParam(const char* name): got(false), isClassNameElement(false),
2001                                    iParamName(name){}
2002                            
2003                                ~objectNameIParam(){}
2004                            
2005                                Boolean get(XmlParser& parser, const char * name, Boolean& emptyTag)
2006                                {
2007                                    if (System::strcasecmp(name, iParamName.getCString()) == 0)
2008                                    {
2009                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2010                                        isClassNameElement =
2011                                            XmlReader::getObjectNameElement(parser, value);
2012                                        return true;
2013 karl             1.127.2.5         }
2014                                    return false;
2015                                }
2016                            private:
2017                                String iParamName;
2018                                // hide unused assign, copy constructors
2019                                objectNameIParam(const objectNameIParam&);
2020                                objectNameIParam& operator = (const objectNameIParam&);
2021                            };
2022                            
2023                            // test for "PropertyList" attribute and, if found, return property list
2024                            // in the value element.
2025                            class propertyListIParam
2026                            {
2027                            public:
2028                                Boolean got;
2029                                CIMPropertyList value;
2030                            
2031                                void iParamFound(Boolean& duplicate)
2032                                {
2033                                    duplicate = got;
2034 karl             1.127.2.5         got = true;
2035                                }
2036                            
2037                                // construct a propertyListIParam object
2038                                propertyListIParam(): got(false){}
2039                            
2040                                ~propertyListIParam(){}
2041                            
2042                                Boolean get(XmlParser& parser, const char* name, Boolean& emptyTag)
2043                                {
2044                                    if (System::strcasecmp(name, "PropertyList") == 0)
2045                                    {
2046                                        if (!emptyTag)
2047                                        {
2048                                            CIMValue pl;
2049                                            if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2050                                            {
2051                                                Array<String> propertyListArray;
2052                                                pl.get(propertyListArray);
2053                                                // NOTE: Cannot use the propertyList.set(...) method
2054                                                // here because set does not create propertyList tags
2055 karl             1.127.2.5                     value.append(propertyListArray);
2056                                            }
2057                                        }
2058                                        return true;
2059                                    }
2060                                    return false;
2061                                }
2062                            
2063                                // This version of the get function usees the propertyList set function
2064                                // to set the property list array into the propertyList object.  It
2065                                // can only be used for those Operations where the propertylist is NOT
2066                                // used by the Server in the response (i.e. getClass and modifyInstance).
2067                                //
2068                                Boolean getSpecial(XmlParser& parser, const char* name, Boolean& emptyTag)
2069                                {
2070                                    if (System::strcasecmp(name, "PropertyList") == 0)
2071                                    {
2072                                        if (!emptyTag)
2073                                        {
2074                                            CIMValue pl;
2075                                            if (XmlReader::getValueArrayElement(parser, CIMTYPE_STRING, pl))
2076 karl             1.127.2.5                 {
2077                                                Array<String> propertyListArray;
2078                                                pl.get(propertyListArray);
2079                                                Array<CIMName> cimNameArray;
2080                                                // Map the strings to CIMNames.
2081                                                for (Uint32 i = 0; i < propertyListArray.size(); i++)
2082                                                {
2083                                                    cimNameArray.append(propertyListArray[i]);
2084                                                }
2085                                                // use set to put list into property list without
2086                                                // setting propertyList tags.
2087                                                value.set(cimNameArray);
2088                                            }
2089                                        }
2090                                        return true;
2091                                    }
2092                                    return false;
2093                                }
2094                            private:
2095                                // hide unused default assign, copy constructors
2096                                propertyListIParam(const propertyListIParam&);
2097 karl             1.127.2.5     propertyListIParam& operator = (const propertyListIParam&);
2098                            };
2099                            
2100                            // Attribute decoder for String Parameters
2101                            // The constructor MUST include the attribute name.
2102                            // The second defines whether a value is required.
2103                            // If true and there is no value, the XmlReader does an exception.
2104                            class stringIParam
2105                            {
2106                            public:
2107                                Boolean got;
2108                                String value;
2109                            
2110                                // constructor with definition of attribute and default for the
2111                                // required flag.
2112                                // @param name const char* with name of IParam to match
2113                                // @param valueRequired Boolean that defines whether value is required
2114                                stringIParam(const char* name, Boolean _valueRequired):
2115                                    got(false), iParamName(name), valueRequired(_valueRequired){}
2116                            
2117                                ~stringIParam(){}
2118 karl             1.127.2.5 
2119                                void iParamFound(Boolean& duplicate)
2120                                {
2121                                    duplicate = got;
2122                                    got = true;
2123                                }
2124                            
2125                                // get the attribute if it exists. The attribute name is defined in
2126                                // the constructor
2127                                // @param parser
2128                                // @param testName attribute name from parse.
2129                                // @emptyTag returns true if emptyTag returned true from parser
2130                                // @return Returns true if testName matches the IParam defined by current
2131                                // position in the parser
2132                                Boolean get(XmlParser& parser, const char * testName,  Boolean& emptyTag)
2133                                {
2134                                    if (System::strcasecmp(iParamName.getCString(), testName) == 0)
2135                                    {
2136                                        if (!emptyTag)
2137                                        {
2138                                            XmlReader::getStringValueElement(parser, value, valueRequired);
2139 karl             1.127.2.5             }
2140                                        return true;
2141                                    }
2142                                    return false;
2143                                }
2144                            private:
2145                                String iParamName;
2146                                Boolean valueRequired;
2147                                stringIParam();
2148                                stringIParam(const stringIParam&);
2149                                stringIParam& operator = (const stringIParam&);
2150                            };
2151                            
2152                            // Attribute decoder for Uint32Arg Parameters
2153                            // The constructor MUST include the attribute name.
2154                            // The second defines whether a value is required.
2155                            // If true and there is no value, the XmlReader does an exception.
2156                            //
2157 karl             1.127.2.6 //// KS_TODO NEED REVIEW ON THIS ONE
2158 karl             1.127.2.5 class uint32ArgIParam
2159                            {
2160                            public:
2161                                Boolean got;
2162                                Uint32Arg value;
2163                            
2164                                // constructor with definition of iParam name and default for the
2165                                // required flag (false). Default value of parameter is NULL if
2166                                // no value is supplied.
2167                                // @param name const char* with name of IParam to match
2168                                uint32ArgIParam(const char* name):
2169                                    got(false), iParamName(name), valueRequired(false){}
2170                            
2171                                // constructor with definition of iParam name and default for the
2172                                // required flag (false). Default value of parameter is integer defined
2173                                // by supplied value.
2174                                // @param name const char* with name of IParam to match
2175                                uint32ArgIParam(const char* name, Uint32 _int):
2176                                    got(false), value(_int), iParamName(name), valueRequired(false){}
2177                            
2178                                // constructor with definition of attribute and default for the
2179 karl             1.127.2.5     // required flag.
2180                                // @param name const char* with name of IParam to match
2181                                // @param valueRequired Boolean that defines whether value is required
2182                            ////  uint32ArgIParam(const char* name, Boolean _valueRequired):
2183                            ////      got(false), iParamName(name), valueRequired(_valueRequired){}
2184                            
2185                                ~uint32ArgIParam(){}
2186                            
2187                                void iParamFound(Boolean& duplicate)
2188                                {
2189                                    duplicate = got;
2190                                    got = true;
2191                                }
2192                            
2193                                // get the attribute if it exists. The attribute name is defined in
2194                                // the constructor
2195                                // @param parser
2196                                // @param testName attribute name from parse.
2197                                // @emptyTag returns true if emptyTag returned true from parser
2198                                // @return Returns true if testName matches the IParam defined by current
2199                                // position in the parser
2200 karl             1.127.2.5     Boolean get(XmlParser& parser, const char * testName,  Boolean& emptyTag)
2201                                {
2202                                    if (valueRequired)
2203                                    {
2204                                        XmlReader::rejectNullIParamValue(parser, emptyTag, testName);
2205                                    }
2206                                    if (System::strcasecmp(iParamName.getCString(), testName) == 0)
2207                                    {
2208                                        XmlReader::getUint32ArgValueElement(parser, value, true);
2209                                        return true;
2210                                    }
2211                                    return false;
2212                                }
2213                            private:
2214                                String iParamName;
2215                                Boolean valueRequired;
2216                                uint32ArgIParam();
2217                                uint32ArgIParam(const uint32ArgIParam&);
2218                                uint32ArgIParam& operator = (const uint32ArgIParam&);
2219                            };
2220                            
2221 karl             1.127.2.5 // Attribute decoder for Uint32 Parameters
2222                            // The constructor MUST include the attribute name.
2223                            // The second defines whether a value is required.
2224                            // If true and there is no value, the XmlReader does an exception.
2225                            class uint32IParam
2226                            {
2227                            public:
2228                                Boolean got;
2229                                Uint32 value;
2230                            
2231                                // constructor with definition of iParam name and default for the
2232                                // required flag (false). Default value of parameter is NULL if
2233                                // no value is supplied.
2234                                // @param name const char* with name of IParam to match
2235                                uint32IParam(const char* name):
2236                                    got(false), iParamName(name), valueRequired(false){}
2237                            
2238                                // constructor with definition of iParam name and default for the
2239                                // required flag (false). Default value of parameter is integer defined
2240                                // by supplied value.
2241                                // @param name const char* with name of IParam to match
2242 karl             1.127.2.5     uint32IParam(const char* name, Uint32 _int):
2243                                    got(false), value(_int), iParamName(name), valueRequired(false){}
2244                            
2245                                // constructor with definition of attribute and default for the
2246                                // required flag.
2247                                // @param name const char* with name of IParam to match
2248                                // @param valueRequired Boolean that defines whether value is required
2249                            ////  uint32IParam(const char* name, Boolean _valueRequired):
2250                            ////      got(false), iParamName(name), valueRequired(_valueRequired){}
2251                            
2252                                ~uint32IParam(){}
2253                            
2254                                void iParamFound(Boolean& duplicate)
2255                                {
2256                                    duplicate = got;
2257                                    got = true;
2258                                }
2259                            
2260                                // get the attribute if it exists. The attribute name is defined in
2261                                // the constructor
2262                                // @param parser
2263 karl             1.127.2.5     // @param testName attribute name from parse.
2264                                // @emptyTag returns true if emptyTag returned true from parser
2265                                // @return Returns true if testName matches the IParam defined by current
2266                                // position in the parser
2267                                Boolean get(XmlParser& parser, const char * testName,  Boolean& emptyTag)
2268                                {
2269                                    if (valueRequired)
2270                                    {
2271                                        XmlReader::rejectNullIParamValue(parser, emptyTag, testName);
2272                                    }
2273                                    if (System::strcasecmp(iParamName.getCString(), testName) == 0)
2274                                    {
2275                                        XmlReader::getUint32ValueElement(parser, value, true);
2276                                        return true;
2277                                    }
2278                                    return false;
2279                                }
2280                            private:
2281                                String iParamName;
2282                                Boolean valueRequired;
2283                                uint32IParam();
2284 karl             1.127.2.5     uint32IParam(const uint32IParam&);
2285                                uint32IParam& operator = (const uint32IParam&);
2286                            };
2287                            
2288                            /************************************************************************
2289                            **
2290                            **      Common functions used by the decoders to avoid duplicate code.
2291                            **
2292                            **************************************************************************/
2293                            // test for valid end of XML and duplicate parameters on input
2294                            // This function returns if OK or executes appropriate exceptions if there
2295                            // is either a duplicate (duplicateParameter == true) or the
2296                            // end tag IPARAMVALUE is not found.
2297                            void _checkMissingEndTagOrDuplicateParamValue(
2298                                XmlParser& parser, Boolean duplicateParameter, Boolean emptyTag)
2299                            {
2300                                if (!emptyTag)
2301                                {
2302                                    XmlReader::expectEndTag(parser, "IPARAMVALUE");
2303                                }
2304                            
2305 karl             1.127.2.5     if (duplicateParameter)
2306                                {
2307                                    _throwCIMExceptionDuplicateParameter();
2308                                }
2309                            }
2310                            
2311                            // test if Required paramters exist (i.e. the got variable is
2312                            // true. Generates exception if exist == false
2313                            void _testRequiredParametersExist(Boolean exist)
2314                            {
2315                                if (!exist)
2316                                {
2317                                    _throwCIMExceptionInvalidParameter();
2318                                }
2319                            }
2320                            /**************************************************************************
2321                            **
2322                            **  Decode each CIMOperation type, processing the parameters for that type
2323                            **  and producing either a CIMMessage of the appropriate type or
2324                            **  an exception.
2325                            **
2326 karl             1.127.2.5 ***************************************************************************/
2327 mike             1.2       
2328 kumpf            1.104     CIMCreateClassRequestMessage*
2329                                CIMOperationRequestDecoder::decodeCreateClassRequest(
2330                                    Uint32 queueId,
2331                                    XmlParser& parser,
2332                                    const String& messageId,
2333                                    const CIMNamespaceName& nameSpace)
2334                            {
2335                                STAT_GETSTARTTIME
2336                            
2337                                CIMClass newClass;
2338 karl             1.127.2.5     Boolean gotNewClass = false;
2339                            
2340 kumpf            1.104         Boolean emptyTag;
2341 karl             1.127.2.5     Boolean duplicateParameter = false;
2342 kumpf            1.104     
2343                                for (const char* name;
2344                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2345                                {
2346                                    if (System::strcasecmp(name, "NewClass") == 0)
2347                                    {
2348                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2349 kumpf            1.106                 if (!XmlReader::getClassElement(parser, newClass))
2350                                        {
2351 karl             1.127.2.5                 _throwCIMExceptionInvalidParameter("NewClass");
2352 kumpf            1.106                 }
2353 karl             1.127.2.5             duplicateParameter = gotNewClass;
2354                                        gotNewClass = true;
2355 kumpf            1.104             }
2356                                    else
2357                                    {
2358 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2359 kumpf            1.104             }
2360 sage             1.41      
2361 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2362                                    _checkMissingEndTagOrDuplicateParamValue(
2363                                        parser, duplicateParameter, emptyTag);
2364 kumpf            1.104         }
2365                            
2366 karl             1.127.2.5     _testRequiredParametersExist(gotNewClass);
2367 kumpf            1.104     
2368                                AutoPtr<CIMCreateClassRequestMessage> request(
2369                                    new CIMCreateClassRequestMessage(
2370                                        messageId,
2371                                        nameSpace,
2372                                        newClass,
2373                                        QueueIdStack(queueId, _returnQueueId)));
2374                            
2375                                STAT_SERVERSTART
2376                            
2377                                return request.release();
2378 mike             1.2       }
2379                            
2380                            CIMGetClassRequestMessage* CIMOperationRequestDecoder::decodeGetClassRequest(
2381 kumpf            1.104         Uint32 queueId,
2382                                XmlParser& parser,
2383                                const String& messageId,
2384                                const CIMNamespaceName& nameSpace)
2385                            {
2386                                STAT_GETSTARTTIME
2387                            
2388 karl             1.127.2.5     // GetClass Parameters
2389                                classNameIParam className("ClassName");
2390                                booleanIParam localOnly("localOnly",true);
2391                                booleanIParam includeQualifiers("IncludeQualifiers", true);
2392                                booleanIParam includeClassOrigin("IncludeClassOrigin");
2393                                propertyListIParam propertyList;
2394                            
2395 kumpf            1.104         Boolean duplicateParameter = false;
2396                                Boolean emptyTag;
2397                            
2398                                for (const char* name;
2399                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2400                                {
2401 karl             1.127.2.5         if(className.get(parser, name, emptyTag))
2402 kumpf            1.104             {
2403 karl             1.127.2.5             className.iParamFound(duplicateParameter);
2404 kumpf            1.104             }
2405 karl             1.127.2.5         else if(localOnly.get(parser, name, emptyTag))
2406 kumpf            1.104             {
2407 karl             1.127.2.5             localOnly.iParamFound(duplicateParameter);
2408 kumpf            1.104             }
2409 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
2410 kumpf            1.104             {
2411 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
2412 kumpf            1.104             }
2413 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
2414 kumpf            1.104             {
2415 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
2416 kumpf            1.104             }
2417 karl             1.127.2.5         else if(propertyList.getSpecial(parser, name, emptyTag))
2418 kumpf            1.104             {
2419 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
2420 kumpf            1.104             }
2421                                    else
2422                                    {
2423 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2424 kumpf            1.104             }
2425 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2426                                    _checkMissingEndTagOrDuplicateParamValue(
2427                                        parser, duplicateParameter, emptyTag);
2428 kumpf            1.104         }
2429                            
2430 karl             1.127.2.5     // test for required parameters
2431                                _testRequiredParametersExist(className.got);
2432 kumpf            1.104     
2433 karl             1.127.2.5     // Build message
2434 kumpf            1.104         AutoPtr<CIMGetClassRequestMessage> request(new CIMGetClassRequestMessage(
2435                                    messageId,
2436                                    nameSpace,
2437 karl             1.127.2.5         className.value,
2438                                    localOnly.value,
2439                                    includeQualifiers.value,
2440                                    includeClassOrigin.value,
2441                                    propertyList.value,
2442 kumpf            1.104             QueueIdStack(queueId, _returnQueueId)));
2443                            
2444                                STAT_SERVERSTART
2445                            
2446                                return request.release();
2447                            }
2448                            
2449                            CIMModifyClassRequestMessage*
2450                                CIMOperationRequestDecoder::decodeModifyClassRequest(
2451                                    Uint32 queueId,
2452                                    XmlParser& parser,
2453                                    const String& messageId,
2454                                    const CIMNamespaceName& nameSpace)
2455                            {
2456                                STAT_GETSTARTTIME
2457                            
2458                                CIMClass modifiedClass;
2459                                Boolean gotClass = false;
2460 karl             1.127.2.5 
2461 kumpf            1.104         Boolean emptyTag;
2462 karl             1.127.2.5     Boolean duplicateParameter = false;
2463 kumpf            1.104     
2464                                for (const char* name;
2465                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2466                                {
2467                                    if (System::strcasecmp(name, "ModifiedClass") == 0)
2468                                    {
2469                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2470 kumpf            1.106                 if (!XmlReader::getClassElement(parser, modifiedClass))
2471                                        {
2472 karl             1.127.2.5                 _throwCIMExceptionInvalidParameter("ModifiedClass");
2473 kumpf            1.106                 }
2474 kumpf            1.104                 duplicateParameter = gotClass;
2475                                        gotClass = true;
2476                                    }
2477                                    else
2478                                    {
2479 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2480 kumpf            1.104             }
2481                            
2482 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2483                                    _checkMissingEndTagOrDuplicateParamValue(
2484                                        parser, duplicateParameter, emptyTag);
2485 kumpf            1.104         }
2486                            
2487 karl             1.127.2.5     _testRequiredParametersExist(gotClass);
2488 kumpf            1.104     
2489                                AutoPtr<CIMModifyClassRequestMessage> request(
2490                                    new CIMModifyClassRequestMessage(
2491                                        messageId,
2492                                        nameSpace,
2493                                        modifiedClass,
2494                                        QueueIdStack(queueId, _returnQueueId)));
2495                            
2496                                STAT_SERVERSTART
2497                            
2498                                return request.release();
2499                            }
2500                            
2501                            CIMEnumerateClassNamesRequestMessage*
2502                                CIMOperationRequestDecoder::decodeEnumerateClassNamesRequest(
2503                                    Uint32 queueId,
2504                                    XmlParser& parser,
2505                                    const String& messageId,
2506                                    const CIMNamespaceName& nameSpace)
2507                            {
2508                                STAT_GETSTARTTIME
2509 kumpf            1.104     
2510 karl             1.127.2.5     classNameIParam className("ClassName");
2511                                booleanIParam deepInheritance("DeepInheritance");
2512                            
2513 kumpf            1.104         Boolean duplicateParameter = false;
2514                                Boolean emptyTag;
2515                            
2516                                for (const char* name;
2517                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2518                                {
2519 karl             1.127.2.5         if(className.getOptional(parser, name, emptyTag))
2520 kumpf            1.104             {
2521 karl             1.127.2.5             className.iParamFound(duplicateParameter);
2522 kumpf            1.104             }
2523 karl             1.127.2.5         else if(deepInheritance.get(parser, name, emptyTag))
2524 kumpf            1.104             {
2525 karl             1.127.2.5             deepInheritance.iParamFound(duplicateParameter);
2526 kumpf            1.104             }
2527                                    else
2528                                    {
2529 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2530 kumpf            1.104             }
2531                            
2532 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2533                                    _checkMissingEndTagOrDuplicateParamValue(
2534                                        parser, duplicateParameter, emptyTag);
2535 kumpf            1.104         }
2536                            
2537 karl             1.127.2.5     // NOTE: className not required for this operation
2538                            
2539 kumpf            1.104         AutoPtr<CIMEnumerateClassNamesRequestMessage> request(
2540                                    new CIMEnumerateClassNamesRequestMessage(
2541                                        messageId,
2542                                        nameSpace,
2543 karl             1.127.2.5             className.value,
2544                                        deepInheritance.value,
2545 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2546                            
2547                                STAT_SERVERSTART
2548                            
2549                                return request.release();
2550                            }
2551                            
2552                            CIMEnumerateClassesRequestMessage*
2553                                CIMOperationRequestDecoder::decodeEnumerateClassesRequest(
2554                                    Uint32 queueId,
2555                                    XmlParser& parser,
2556                                    const String& messageId,
2557                                    const CIMNamespaceName& nameSpace)
2558                            {
2559                                STAT_GETSTARTTIME
2560                            
2561 karl             1.127.2.5     // EnumerateClasses Parameters
2562                                classNameIParam className("ClassName");
2563                                booleanIParam deepInheritance("deepInheritance");
2564                                booleanIParam localOnly("localOnly",true);
2565                                booleanIParam includeQualifiers("IncludeQualifiers", true);
2566                                booleanIParam includeClassOrigin("IncludeClassOrigin");
2567                            
2568 kumpf            1.104         Boolean duplicateParameter = false;
2569                                Boolean emptyTag;
2570                            
2571                                for (const char* name;
2572                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2573                                {
2574 karl             1.127.2.5         if(className.getOptional(parser, name, emptyTag))
2575 kumpf            1.104             {
2576 karl             1.127.2.5             className.iParamFound(duplicateParameter);
2577 kumpf            1.104             }
2578 karl             1.127.2.5         else if(deepInheritance.get(parser, name, emptyTag))
2579 kumpf            1.104             {
2580 karl             1.127.2.5             deepInheritance.iParamFound(duplicateParameter);
2581 kumpf            1.104             }
2582 karl             1.127.2.5         else if(localOnly.get(parser, name, emptyTag))
2583 kumpf            1.104             {
2584 karl             1.127.2.5             localOnly.iParamFound(duplicateParameter);
2585 kumpf            1.104             }
2586 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
2587 kumpf            1.104             {
2588 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
2589 kumpf            1.104             }
2590 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
2591 kumpf            1.104             {
2592 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
2593 kumpf            1.104             }
2594                                    else
2595                                    {
2596 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2597 kumpf            1.104             }
2598                            
2599 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2600                                    _checkMissingEndTagOrDuplicateParamValue(
2601                                        parser, duplicateParameter, emptyTag);
2602 kumpf            1.104         }
2603                            
2604 karl             1.127.2.5     // NOTE: Class name not required for this enumerate.
2605                            
2606 kumpf            1.104         AutoPtr<CIMEnumerateClassesRequestMessage> request(
2607                                    new CIMEnumerateClassesRequestMessage(
2608                                        messageId,
2609                                        nameSpace,
2610 karl             1.127.2.5             className.value,
2611                                        deepInheritance.value,
2612                                        localOnly.value,
2613                                        includeQualifiers.value,
2614                                        includeClassOrigin.value,
2615 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2616                            
2617                                STAT_SERVERSTART
2618                            
2619                                return request.release();
2620                            }
2621                            
2622                            CIMDeleteClassRequestMessage*
2623                                CIMOperationRequestDecoder::decodeDeleteClassRequest(
2624                                    Uint32 queueId,
2625                                    XmlParser& parser,
2626                                    const String& messageId,
2627                                    const CIMNamespaceName& nameSpace)
2628                            {
2629                                STAT_GETSTARTTIME
2630                            
2631 karl             1.127.2.5     classNameIParam className("ClassName");
2632                            
2633 kumpf            1.104         Boolean duplicateParameter = false;
2634                                Boolean emptyTag;
2635                            
2636                                for (const char* name;
2637                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2638                                {
2639 karl             1.127.2.5         if(className.get(parser, name, emptyTag))
2640 kumpf            1.104             {
2641 karl             1.127.2.5             className.iParamFound(duplicateParameter);
2642 kumpf            1.104             }
2643                                    else
2644                                    {
2645 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2646 kumpf            1.104             }
2647                            
2648 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2649                                    _checkMissingEndTagOrDuplicateParamValue(
2650                                        parser, duplicateParameter, emptyTag);
2651 kumpf            1.104         }
2652                            
2653 karl             1.127.2.5     _testRequiredParametersExist(className.got);
2654 kumpf            1.104     
2655                                AutoPtr<CIMDeleteClassRequestMessage> request(
2656                                    new CIMDeleteClassRequestMessage(
2657                                        messageId,
2658                                        nameSpace,
2659 karl             1.127.2.5             className.value,
2660 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2661                            
2662                                STAT_SERVERSTART
2663                            
2664                                return request.release();
2665                            }
2666                            
2667                            CIMCreateInstanceRequestMessage*
2668                                CIMOperationRequestDecoder::decodeCreateInstanceRequest(
2669                                    Uint32 queueId,
2670                                    XmlParser& parser,
2671                                    const String& messageId,
2672                                    const CIMNamespaceName& nameSpace)
2673                            {
2674                                STAT_GETSTARTTIME
2675                            
2676                                CIMInstance newInstance;
2677                                Boolean gotInstance = false;
2678 karl             1.127.2.5 
2679 kumpf            1.104         Boolean emptyTag;
2680 karl             1.127.2.5     Boolean duplicateParameter = false;
2681 kumpf            1.104     
2682                                for (const char* name;
2683                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2684                                {
2685                                    if (System::strcasecmp(name, "NewInstance") == 0)
2686                                    {
2687                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2688                                        XmlReader::getInstanceElement(parser, newInstance);
2689                                        duplicateParameter = gotInstance;
2690                                        gotInstance = true;
2691                                    }
2692                                    else
2693                                    {
2694 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2695 kumpf            1.104             }
2696                            
2697 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2698                                    _checkMissingEndTagOrDuplicateParamValue(
2699                                        parser, duplicateParameter, emptyTag);
2700 kumpf            1.104         }
2701                            
2702 karl             1.127.2.5 
2703                                _testRequiredParametersExist(gotInstance);
2704 kumpf            1.104     
2705                                AutoPtr<CIMCreateInstanceRequestMessage> request(
2706                                    new CIMCreateInstanceRequestMessage(
2707                                        messageId,
2708                                        nameSpace,
2709                                        newInstance,
2710                                        QueueIdStack(queueId, _returnQueueId)));
2711                            
2712                                STAT_SERVERSTART
2713                            
2714                                return request.release();
2715                            }
2716                            
2717                            CIMGetInstanceRequestMessage*
2718                                CIMOperationRequestDecoder::decodeGetInstanceRequest(
2719                                    Uint32 queueId,
2720                                    XmlParser& parser,
2721                                    const String& messageId,
2722                                    const CIMNamespaceName& nameSpace)
2723                            {
2724                                STAT_GETSTARTTIME
2725 kumpf            1.104     
2726 karl             1.127.2.5     instanceNameIParam instanceName;
2727                                // This attribute is accepted for compatibility reasons, but is
2728                                // not honored because it is deprecated.
2729                                booleanIParam localOnly("localOnly",true);
2730                                booleanIParam includeQualifiers("IncludeQualifiers");
2731                                booleanIParam includeClassOrigin("IncludeClassOrigin");
2732                                propertyListIParam propertyList;
2733                            
2734 kumpf            1.104         Boolean duplicateParameter = false;
2735                                Boolean emptyTag;
2736                            
2737                                for (const char* name;
2738                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2739                                {
2740 karl             1.127.2.5         if(instanceName.get(parser, name, emptyTag))
2741 kumpf            1.104             {
2742 karl             1.127.2.5             instanceName.iParamFound(duplicateParameter);
2743 kumpf            1.104             }
2744 karl             1.127.2.5         // localOnly is accepted for compatibility reasons, but is
2745                                    // not honored because it is deprecated.
2746                                    else if(localOnly.get(parser, name, emptyTag))
2747 kumpf            1.104             {
2748 karl             1.127.2.5             localOnly.iParamFound(duplicateParameter);
2749 kumpf            1.104             }
2750 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
2751 kumpf            1.104             {
2752 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
2753 kumpf            1.104             }
2754 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
2755 kumpf            1.104             {
2756 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
2757 kumpf            1.104             }
2758 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
2759 kumpf            1.104             {
2760 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
2761 kumpf            1.104             }
2762                                    else
2763                                    {
2764 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2765 kumpf            1.104             }
2766                            
2767 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2768                                    _checkMissingEndTagOrDuplicateParamValue(
2769                                        parser, duplicateParameter, emptyTag);
2770 kumpf            1.104         }
2771                            
2772 karl             1.127.2.5     _testRequiredParametersExist(instanceName.got);
2773 kumpf            1.104     
2774                                AutoPtr<CIMGetInstanceRequestMessage> request(
2775                                    new CIMGetInstanceRequestMessage(
2776                                        messageId,
2777                                        nameSpace,
2778 karl             1.127.2.5             instanceName.value,
2779 h.sterling       1.97      #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
2780 kumpf            1.104                 false,
2781 h.sterling       1.97      #else
2782 karl             1.127.2.5             includeQualifiers.value,
2783 h.sterling       1.97      #endif
2784 karl             1.127.2.5             includeClassOrigin.value,
2785                                        propertyList.value,
2786 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2787                            
2788                                STAT_SERVERSTART
2789                            
2790                                return request.release();
2791                            }
2792                            
2793 karl             1.127.2.5 
2794 kumpf            1.104     CIMModifyInstanceRequestMessage*
2795                                CIMOperationRequestDecoder::decodeModifyInstanceRequest(
2796                                    Uint32 queueId,
2797                                    XmlParser& parser,
2798                                    const String& messageId,
2799                                    const CIMNamespaceName& nameSpace)
2800                            {
2801                                STAT_GETSTARTTIME
2802                            
2803                                CIMInstance modifiedInstance;
2804                                Boolean gotInstance = false;
2805 karl             1.127.2.5 
2806                                booleanIParam includeQualifiers("IncludeQualifiers", true);
2807                                propertyListIParam propertyList;
2808                            
2809 kumpf            1.104         Boolean emptyTag;
2810 karl             1.127.2.5     Boolean duplicateParameter = false;
2811 kumpf            1.104     
2812                                for (const char* name;
2813                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2814                                {
2815                                    if (System::strcasecmp(name, "ModifiedInstance") == 0)
2816                                    {
2817                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
2818                                        XmlReader::getNamedInstanceElement(parser, modifiedInstance);
2819                                        duplicateParameter = gotInstance;
2820                                        gotInstance = true;
2821                                    }
2822 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
2823 kumpf            1.104             {
2824 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
2825 kumpf            1.104             }
2826 karl             1.127.2.5         else if(propertyList.getSpecial(parser, name, emptyTag))
2827 kumpf            1.104             {
2828 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
2829 kumpf            1.104             }
2830                                    else
2831                                    {
2832 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2833 kumpf            1.104             }
2834                            
2835 karl             1.127.2.5         _checkMissingEndTagOrDuplicateParamValue(
2836                                        parser, duplicateParameter, emptyTag);
2837 kumpf            1.104         }
2838                            
2839 karl             1.127.2.5     _testRequiredParametersExist(gotInstance);
2840 kumpf            1.104     
2841                                AutoPtr<CIMModifyInstanceRequestMessage> request(
2842                                    new CIMModifyInstanceRequestMessage(
2843                                        messageId,
2844                                        nameSpace,
2845                                        modifiedInstance,
2846 karl             1.127.2.5             includeQualifiers.value,
2847                                        propertyList.value,
2848 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2849                            
2850                                STAT_SERVERSTART
2851                            
2852                                return request.release();
2853                            }
2854                            
2855                            CIMEnumerateInstancesRequestMessage*
2856                                CIMOperationRequestDecoder::decodeEnumerateInstancesRequest(
2857                                    Uint32 queueId,
2858                                    XmlParser& parser,
2859                                    const String& messageId,
2860                                    const CIMNamespaceName& nameSpace)
2861                            {
2862                                STAT_GETSTARTTIME
2863                            
2864 karl             1.127.2.5     // EnumerateInstance Parameters
2865                                classNameIParam className("ClassName");
2866                                booleanIParam deepInheritance("DeepInheritance", true);
2867                                // localOnly is accepted for compatibility reasons, but is
2868                                // not honored because it is deprecated.
2869                                booleanIParam localOnly("localOnly", true);
2870                                booleanIParam includeQualifiers("IncludeQualifiers");
2871                                booleanIParam includeClassOrigin("IncludeClassOrigin");
2872                                propertyListIParam propertyList;
2873                            
2874 kumpf            1.104         Boolean duplicateParameter = false;
2875                                Boolean emptyTag;
2876                            
2877                                for (const char* name;
2878                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2879                                {
2880 karl             1.127.2.5         if(className.get(parser, name, emptyTag))
2881 kumpf            1.104             {
2882 karl             1.127.2.5             className.iParamFound(duplicateParameter);
2883 kumpf            1.104             }
2884 karl             1.127.2.5         else if(deepInheritance.get(parser, name, emptyTag))
2885 kumpf            1.104             {
2886 karl             1.127.2.5             deepInheritance.iParamFound(duplicateParameter);
2887 kumpf            1.104             }
2888 karl             1.127.2.5         // This attribute is accepted for compatibility reasons, but is
2889                                    // not honored because it is deprecated.
2890                                    else if(localOnly.get(parser, name, emptyTag))
2891 kumpf            1.104             {
2892 karl             1.127.2.5             localOnly.iParamFound(duplicateParameter);
2893 kumpf            1.104             }
2894 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
2895 kumpf            1.104             {
2896 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
2897 kumpf            1.104             }
2898 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
2899 kumpf            1.104             {
2900 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
2901 kumpf            1.104             }
2902 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
2903 kumpf            1.104             {
2904 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
2905 kumpf            1.104             }
2906 karl             1.127.2.5         else
2907 kumpf            1.104             {
2908 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2909 kumpf            1.104             }
2910                            
2911 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2912                                    _checkMissingEndTagOrDuplicateParamValue(
2913                                        parser, duplicateParameter, emptyTag);
2914 kumpf            1.104         }
2915                            
2916 karl             1.127.2.5     _testRequiredParametersExist(className.got);
2917 karl             1.127.2.3 
2918 kumpf            1.104         AutoPtr<CIMEnumerateInstancesRequestMessage> request(
2919                                    new CIMEnumerateInstancesRequestMessage(
2920                                        messageId,
2921                                        nameSpace,
2922 karl             1.127.2.5             className.value,
2923                                        deepInheritance.value,
2924 h.sterling       1.97      #ifdef PEGASUS_DISABLE_INSTANCE_QUALIFIERS
2925 kumpf            1.104                 false,
2926 h.sterling       1.97      #else
2927 karl             1.127.2.5             includeQualifiers.value,
2928 h.sterling       1.97      #endif
2929 karl             1.127.2.5             includeClassOrigin.value,
2930                                        propertyList.value,
2931 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2932                            
2933                                STAT_SERVERSTART
2934                            
2935                                return request.release();
2936                            }
2937                            
2938                            CIMEnumerateInstanceNamesRequestMessage*
2939                                CIMOperationRequestDecoder::decodeEnumerateInstanceNamesRequest(
2940                                    Uint32 queueId,
2941                                    XmlParser& parser,
2942                                    const String& messageId,
2943                                    const CIMNamespaceName& nameSpace)
2944                            {
2945                                STAT_GETSTARTTIME
2946                            
2947 karl             1.127.2.5     classNameIParam className("ClassName");
2948                            
2949 kumpf            1.104         Boolean duplicateParameter = false;
2950                                Boolean emptyTag;
2951                            
2952                                for (const char* name;
2953                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2954                                {
2955 karl             1.127.2.5         if(className.get(parser, name, emptyTag))
2956 kumpf            1.104             {
2957 karl             1.127.2.5             className.iParamFound(duplicateParameter);
2958 kumpf            1.104             }
2959                                    else
2960                                    {
2961 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
2962 kumpf            1.104             }
2963                            
2964 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
2965                                    _checkMissingEndTagOrDuplicateParamValue(
2966                                        parser, duplicateParameter, emptyTag);
2967 kumpf            1.104         }
2968                            
2969 karl             1.127.2.5     _testRequiredParametersExist(className.got);
2970 kumpf            1.104     
2971                                AutoPtr<CIMEnumerateInstanceNamesRequestMessage> request(
2972                                    new CIMEnumerateInstanceNamesRequestMessage(
2973                                        messageId,
2974                                        nameSpace,
2975 karl             1.127.2.5             className.value,
2976 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
2977                            
2978                                STAT_SERVERSTART
2979                            
2980                                return request.release();
2981                            }
2982                            
2983                            CIMDeleteInstanceRequestMessage*
2984                                CIMOperationRequestDecoder::decodeDeleteInstanceRequest(
2985                                    Uint32 queueId,
2986                                    XmlParser& parser,
2987                                    const String& messageId,
2988                                    const CIMNamespaceName& nameSpace)
2989                            {
2990                                STAT_GETSTARTTIME
2991                            
2992 karl             1.127.2.5     instanceNameIParam instanceName;
2993                            
2994 kumpf            1.104         Boolean duplicateParameter = false;
2995                                Boolean emptyTag;
2996                            
2997                                for (const char* name;
2998                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
2999                                {
3000 karl             1.127.2.5         if(instanceName.get(parser, name, emptyTag))
3001 kumpf            1.104             {
3002 karl             1.127.2.5             instanceName.iParamFound(duplicateParameter);
3003 kumpf            1.104             }
3004                                    else
3005                                    {
3006 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3007 kumpf            1.104             }
3008                            
3009 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3010                                    _checkMissingEndTagOrDuplicateParamValue(
3011                                        parser, duplicateParameter, emptyTag);
3012 kumpf            1.104         }
3013                            
3014 karl             1.127.2.5     _testRequiredParametersExist(instanceName.got);
3015 kumpf            1.104     
3016                                AutoPtr<CIMDeleteInstanceRequestMessage> request(
3017                                    new CIMDeleteInstanceRequestMessage(
3018                                        messageId,
3019                                        nameSpace,
3020 karl             1.127.2.5             instanceName.value,
3021 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
3022                            
3023                                STAT_SERVERSTART
3024                            
3025                                return request.release();
3026                            }
3027                            
3028                            CIMSetQualifierRequestMessage*
3029                                CIMOperationRequestDecoder::decodeSetQualifierRequest(
3030                                    Uint32 queueId,
3031                                    XmlParser& parser,
3032                                    const String& messageId,
3033                                    const CIMNamespaceName& nameSpace)
3034                            {
3035                                STAT_GETSTARTTIME
3036                            
3037                                CIMQualifierDecl qualifierDeclaration;
3038                                Boolean duplicateParameter = false;
3039                                Boolean gotQualifierDeclaration = false;
3040                                Boolean emptyTag;
3041                            
3042 kumpf            1.104         for (const char* name;
3043                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3044                                {
3045                                    if (System::strcasecmp(name, "QualifierDeclaration") == 0)
3046                                    {
3047                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3048                                        XmlReader::getQualifierDeclElement(parser, qualifierDeclaration);
3049                                        duplicateParameter = gotQualifierDeclaration;
3050                                        gotQualifierDeclaration = true;
3051                                    }
3052                                    else
3053                                    {
3054 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3055 kumpf            1.104             }
3056                            
3057 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3058                                    _checkMissingEndTagOrDuplicateParamValue(
3059                                        parser, duplicateParameter, emptyTag);
3060 kumpf            1.104         }
3061                            
3062 karl             1.127.2.5     _testRequiredParametersExist(gotQualifierDeclaration);
3063 kumpf            1.104     
3064                                AutoPtr<CIMSetQualifierRequestMessage> request(
3065                                    new CIMSetQualifierRequestMessage(
3066                                        messageId,
3067                                        nameSpace,
3068                                        qualifierDeclaration,
3069                                        QueueIdStack(queueId, _returnQueueId)));
3070                            
3071                                STAT_SERVERSTART
3072                            
3073                                return request.release();
3074                            }
3075                            
3076                            CIMGetQualifierRequestMessage*
3077                                CIMOperationRequestDecoder::decodeGetQualifierRequest(
3078                                    Uint32 queueId,
3079                                    XmlParser& parser,
3080                                    const String& messageId,
3081                                    const CIMNamespaceName& nameSpace)
3082                            {
3083                                STAT_GETSTARTTIME
3084 kumpf            1.104     
3085                                String qualifierNameString;
3086                                CIMName qualifierName;
3087                                Boolean duplicateParameter = false;
3088                                Boolean gotQualifierName = false;
3089                                Boolean emptyTag;
3090                            
3091                                for (const char* name;
3092                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3093                                {
3094                                    if (System::strcasecmp(name, "QualifierName") == 0)
3095                                    {
3096                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3097                                        XmlReader::getStringValueElement(parser, qualifierNameString, true);
3098                                        qualifierName = qualifierNameString;
3099                                        duplicateParameter = gotQualifierName;
3100                                        gotQualifierName = true;
3101                                    }
3102                                    else
3103                                    {
3104 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3105 kumpf            1.104             }
3106                            
3107 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3108                                    _checkMissingEndTagOrDuplicateParamValue(
3109                                        parser, duplicateParameter, emptyTag);
3110 kumpf            1.104         }
3111                            
3112 karl             1.127.2.5     _testRequiredParametersExist(gotQualifierName);
3113 kumpf            1.104     
3114                                AutoPtr<CIMGetQualifierRequestMessage> request(
3115                                    new CIMGetQualifierRequestMessage(
3116                                        messageId,
3117                                        nameSpace,
3118                                        qualifierName,
3119                                        QueueIdStack(queueId, _returnQueueId)));
3120                            
3121                                STAT_SERVERSTART
3122                            
3123                                return request.release();
3124                            }
3125                            
3126                            CIMEnumerateQualifiersRequestMessage*
3127                                CIMOperationRequestDecoder::decodeEnumerateQualifiersRequest(
3128                                    Uint32 queueId,
3129                                    XmlParser& parser,
3130                                    const String& messageId,
3131                                    const CIMNamespaceName& nameSpace)
3132                            {
3133                                STAT_GETSTARTTIME
3134 kumpf            1.104         Boolean emptyTag;
3135                            
3136                                for (const char* name;
3137                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3138                                {
3139                                    // No IPARAMVALUEs are defined for this operation
3140 karl             1.127.2.5         _throwCIMExceptionInvalidIParamName();
3141 kumpf            1.104         }
3142                            
3143                                AutoPtr<CIMEnumerateQualifiersRequestMessage> request(
3144                                    new CIMEnumerateQualifiersRequestMessage(
3145                                        messageId,
3146                                        nameSpace,
3147                                        QueueIdStack(queueId, _returnQueueId)));
3148                            
3149                                STAT_SERVERSTART
3150                            
3151                                return request.release();
3152                            }
3153                            
3154                            CIMDeleteQualifierRequestMessage*
3155                                CIMOperationRequestDecoder::decodeDeleteQualifierRequest(
3156                                    Uint32 queueId,
3157                                    XmlParser& parser,
3158                                    const String& messageId,
3159                                    const CIMNamespaceName& nameSpace)
3160                            {
3161                                STAT_GETSTARTTIME
3162 kumpf            1.104     
3163                                String qualifierNameString;
3164                                CIMName qualifierName;
3165                                Boolean gotQualifierName = false;
3166 karl             1.127.2.5 
3167 kumpf            1.104         Boolean emptyTag;
3168 karl             1.127.2.5     Boolean duplicateParameter = false;
3169 kumpf            1.104     
3170                                for (const char* name;
3171                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3172                                {
3173                                    if (System::strcasecmp(name, "QualifierName") == 0)
3174                                    {
3175                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3176                                        XmlReader::getStringValueElement(parser, qualifierNameString, true);
3177                                        qualifierName = qualifierNameString;
3178                                        duplicateParameter = gotQualifierName;
3179                                        gotQualifierName = true;
3180                                    }
3181                                    else
3182                                    {
3183 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3184 kumpf            1.104             }
3185                            
3186                            
3187 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3188                                    _checkMissingEndTagOrDuplicateParamValue(
3189                                        parser, duplicateParameter, emptyTag);
3190 kumpf            1.104         }
3191                            
3192 karl             1.127.2.5     _testRequiredParametersExist(gotQualifierName);
3193 kumpf            1.104     
3194                                AutoPtr<CIMDeleteQualifierRequestMessage> request(
3195                                    new CIMDeleteQualifierRequestMessage(
3196                                        messageId,
3197                                        nameSpace,
3198                                        qualifierName,
3199                                        QueueIdStack(queueId, _returnQueueId)));
3200                            
3201                                STAT_SERVERSTART
3202                            
3203                                return request.release();
3204                            }
3205                            
3206                            CIMReferenceNamesRequestMessage*
3207                                CIMOperationRequestDecoder::decodeReferenceNamesRequest(
3208                                    Uint32 queueId,
3209                                    XmlParser& parser,
3210                                    const String& messageId,
3211                                    const CIMNamespaceName& nameSpace)
3212                            {
3213                                STAT_GETSTARTTIME
3214 karl             1.127.2.5     objectNameIParam objectName;
3215                                classNameIParam resultClass("ResultClass");
3216                                stringIParam role("role", false);
3217 kumpf            1.104     
3218                                Boolean duplicateParameter = false;
3219                                Boolean emptyTag;
3220                            
3221                                for (const char* name;
3222 karl             1.127.2.5         XmlReader::getIParamValueTag(parser, name, emptyTag); )
3223 kumpf            1.104         {
3224 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
3225 kumpf            1.104             {
3226 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
3227 kumpf            1.104             }
3228 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
3229 kumpf            1.104             {
3230 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
3231 kumpf            1.104             }
3232 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
3233 kumpf            1.104             {
3234 karl             1.127.2.5             role.iParamFound(duplicateParameter);
3235 kumpf            1.104             }
3236                                    else
3237                                    {
3238 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3239 kumpf            1.104             }
3240                            
3241 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3242                                    _checkMissingEndTagOrDuplicateParamValue(
3243                                        parser, duplicateParameter, emptyTag);
3244 kumpf            1.104         }
3245                            
3246 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
3247 kumpf            1.104     
3248                                AutoPtr<CIMReferenceNamesRequestMessage> request(
3249                                    new CIMReferenceNamesRequestMessage(
3250                                        messageId,
3251                                        nameSpace,
3252 karl             1.127.2.5             objectName.value,
3253                                        resultClass.value,
3254                                        role.value,
3255                                        QueueIdStack(queueId, _returnQueueId),
3256                                        objectName.isClassNameElement));
3257 kumpf            1.104     
3258                                STAT_SERVERSTART
3259                            
3260                                return request.release();
3261                            }
3262                            
3263                            CIMReferencesRequestMessage*
3264                                CIMOperationRequestDecoder::decodeReferencesRequest(
3265                                    Uint32 queueId,
3266                                    XmlParser& parser,
3267                                    const String& messageId,
3268                                    const CIMNamespaceName& nameSpace)
3269                            {
3270                                STAT_GETSTARTTIME
3271                            
3272 karl             1.127.2.5     objectNameIParam objectName;
3273                                classNameIParam resultClass("ResultClass");
3274                                stringIParam role("role", false);
3275                                booleanIParam includeQualifiers("IncludeQualifiers");
3276                                booleanIParam includeClassOrigin("IncludeClassOrigin");
3277                                propertyListIParam propertyList;
3278                            
3279 kumpf            1.104         Boolean duplicateParameter = false;
3280                                Boolean emptyTag;
3281                            
3282                                for (const char* name;
3283                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3284                                {
3285 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
3286 kumpf            1.104             {
3287 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
3288 kumpf            1.104             }
3289 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
3290 kumpf            1.104             {
3291 karl             1.127.2.5             role.iParamFound(duplicateParameter);
3292 kumpf            1.104             }
3293 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
3294 kumpf            1.104             {
3295 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
3296 kumpf            1.104             }
3297 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
3298 kumpf            1.104             {
3299 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
3300 kumpf            1.104             }
3301 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
3302 kumpf            1.104             {
3303 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
3304 kumpf            1.104             }
3305 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
3306 kumpf            1.104             {
3307 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
3308 kumpf            1.104             }
3309                                    else
3310                                    {
3311 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3312 kumpf            1.104             }
3313                            
3314 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3315                                    _checkMissingEndTagOrDuplicateParamValue(
3316                                        parser, duplicateParameter, emptyTag);
3317 kumpf            1.104         }
3318                            
3319 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
3320 kumpf            1.104     
3321                                AutoPtr<CIMReferencesRequestMessage> request(
3322                                    new CIMReferencesRequestMessage(
3323                                        messageId,
3324                                        nameSpace,
3325 karl             1.127.2.5             objectName.value,
3326                                        resultClass.value,
3327                                        role.value,
3328                                        includeQualifiers.value,
3329                                        includeClassOrigin.value,
3330                                        propertyList.value,
3331                                        QueueIdStack(queueId, _returnQueueId),
3332                                        objectName.isClassNameElement));
3333 kumpf            1.104     
3334                                STAT_SERVERSTART
3335                            
3336                                return request.release();
3337                            }
3338                            
3339                            CIMAssociatorNamesRequestMessage*
3340                                CIMOperationRequestDecoder::decodeAssociatorNamesRequest(
3341                                    Uint32 queueId,
3342                                    XmlParser& parser,
3343                                    const String& messageId,
3344                                    const CIMNamespaceName& nameSpace)
3345                            {
3346                                STAT_GETSTARTTIME
3347                            
3348 karl             1.127.2.5     objectNameIParam objectName;
3349                                classNameIParam assocClass("AssocClass");
3350                                classNameIParam resultClass("ResultClass");
3351                                stringIParam role("role", false);
3352                                stringIParam resultRole("Resultrole", false);
3353                            
3354 kumpf            1.104         Boolean emptyTag;
3355 karl             1.127.2.5     Boolean duplicateParameter = false;
3356 kumpf            1.104     
3357                                for (const char* name;
3358                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3359                                {
3360 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
3361 kumpf            1.104             {
3362 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
3363 kumpf            1.104             }
3364 karl             1.127.2.5         else if (assocClass.getOptional(parser, name, emptyTag))
3365 kumpf            1.104             {
3366 karl             1.127.2.5             assocClass.iParamFound(duplicateParameter);
3367 kumpf            1.104             }
3368 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
3369 kumpf            1.104             {
3370 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
3371 kumpf            1.104             }
3372 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
3373 kumpf            1.104             {
3374 karl             1.127.2.5             role.iParamFound(duplicateParameter);
3375 kumpf            1.104             }
3376 karl             1.127.2.5         else if(resultRole.get(parser, name, emptyTag))
3377 kumpf            1.104             {
3378 karl             1.127.2.5             resultRole.iParamFound(duplicateParameter);
3379 kumpf            1.104             }
3380                                    else
3381                                    {
3382 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3383 kumpf            1.104     
3384                                    }
3385                            
3386 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3387                                    _checkMissingEndTagOrDuplicateParamValue(
3388                                        parser, duplicateParameter, emptyTag);
3389 kumpf            1.104         }
3390                            
3391 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
3392 kumpf            1.104     
3393                                AutoPtr<CIMAssociatorNamesRequestMessage> request(
3394                                    new CIMAssociatorNamesRequestMessage(
3395                                        messageId,
3396                                        nameSpace,
3397 karl             1.127.2.5             objectName.value,
3398                                        assocClass.value,
3399                                        resultClass.value,
3400                                        role.value,
3401                                        resultRole.value,
3402                                        QueueIdStack(queueId, _returnQueueId),
3403                                        objectName.isClassNameElement));
3404 kumpf            1.104     
3405                                STAT_SERVERSTART
3406                            
3407                                return request.release();
3408                            }
3409                            
3410                            CIMAssociatorsRequestMessage*
3411                                CIMOperationRequestDecoder::decodeAssociatorsRequest(
3412                                    Uint32 queueId,
3413                                    XmlParser& parser,
3414                                    const String& messageId,
3415                                    const CIMNamespaceName& nameSpace)
3416                            {
3417                                STAT_GETSTARTTIME
3418                            
3419 karl             1.127.2.5     // Associator Operation Parameters
3420                                objectNameIParam objectName;
3421                                classNameIParam assocClass("AssocClass");
3422                                classNameIParam resultClass("ResultClass");
3423                                stringIParam resultRole("Resultrole", false);
3424                                stringIParam role("role", false);
3425                                booleanIParam includeQualifiers("IncludeQualifiers");
3426                                booleanIParam includeClassOrigin("IncludeClassOrigin");
3427                                propertyListIParam propertyList;
3428                            
3429 kumpf            1.104         Boolean duplicateParameter = false;
3430                                Boolean emptyTag;
3431                            
3432                                for (const char* name;
3433                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3434                                {
3435 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
3436 kumpf            1.104             {
3437 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
3438 kumpf            1.104             }
3439 karl             1.127.2.5         else if (assocClass.getOptional(parser, name, emptyTag))
3440 kumpf            1.104             {
3441 karl             1.127.2.5             assocClass.iParamFound(duplicateParameter);
3442 kumpf            1.104             }
3443 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
3444 kumpf            1.104             {
3445 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
3446 kumpf            1.104             }
3447 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
3448 kumpf            1.104             {
3449 karl             1.127.2.5             role.iParamFound(duplicateParameter);
3450 kumpf            1.104             }
3451 karl             1.127.2.5         else if(resultRole.get(parser, name, emptyTag))
3452 kumpf            1.104             {
3453 karl             1.127.2.5             resultRole.iParamFound(duplicateParameter);
3454 kumpf            1.104             }
3455 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
3456 kumpf            1.104             {
3457 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
3458 kumpf            1.104             }
3459 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
3460 kumpf            1.104             {
3461 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
3462 kumpf            1.104             }
3463 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
3464 kumpf            1.104             {
3465 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
3466 kumpf            1.104             }
3467                                    else
3468                                    {
3469 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3470 kumpf            1.104             }
3471                            
3472 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3473                                    _checkMissingEndTagOrDuplicateParamValue(
3474                                        parser, duplicateParameter, emptyTag);
3475 kumpf            1.104         }
3476                            
3477 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
3478 kumpf            1.104     
3479                                AutoPtr<CIMAssociatorsRequestMessage> request(
3480                                    new CIMAssociatorsRequestMessage(
3481                                        messageId,
3482                                        nameSpace,
3483 karl             1.127.2.5             objectName.value,
3484                                        assocClass.value,
3485                                        resultClass.value,
3486                                        role.value,
3487                                        resultRole.value,
3488                                        includeQualifiers.value,
3489                                        includeClassOrigin.value,
3490                                        propertyList.value,
3491                                        QueueIdStack(queueId, _returnQueueId),
3492                                        objectName.isClassNameElement));
3493 kumpf            1.104     
3494                                STAT_SERVERSTART
3495                            
3496                                return request.release();
3497                            }
3498                            
3499                            CIMGetPropertyRequestMessage*
3500                                CIMOperationRequestDecoder::decodeGetPropertyRequest(
3501                                    Uint32 queueId,
3502                                    XmlParser& parser,
3503                                    const String& messageId,
3504                                    const CIMNamespaceName& nameSpace)
3505                            {
3506                                STAT_GETSTARTTIME
3507                            
3508                                CIMObjectPath instanceName;
3509                                String propertyName;
3510                                Boolean duplicateParameter = false;
3511                                Boolean gotInstanceName = false;
3512                                Boolean gotPropertyName = false;
3513                                Boolean emptyTag;
3514 kumpf            1.104     
3515                                for (const char* name;
3516                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3517                                {
3518                                    if (System::strcasecmp(name, "InstanceName") == 0)
3519                                    {
3520                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3521                                        XmlReader::getInstanceNameElement(parser, instanceName);
3522                                        duplicateParameter = gotInstanceName;
3523                                        gotInstanceName = true;
3524                                    }
3525                                    else if (System::strcasecmp(name, "PropertyName") == 0)
3526                                    {
3527                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3528                                        XmlReader::getStringValueElement(parser, propertyName, true);
3529                                        duplicateParameter = gotPropertyName;
3530                                        gotPropertyName = true;
3531                                    }
3532                                    else
3533                                    {
3534 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3535 kumpf            1.104             }
3536                            
3537 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3538                                    _checkMissingEndTagOrDuplicateParamValue(
3539                                        parser, duplicateParameter, emptyTag);
3540 kumpf            1.104         }
3541                            
3542 karl             1.127.2.5     _testRequiredParametersExist(gotInstanceName && gotPropertyName);
3543 kumpf            1.104     
3544                                AutoPtr<CIMGetPropertyRequestMessage> request(
3545                                    new CIMGetPropertyRequestMessage(
3546                                        messageId,
3547                                        nameSpace,
3548                                        instanceName,
3549                                        propertyName,
3550                                        QueueIdStack(queueId, _returnQueueId)));
3551                            
3552                                STAT_SERVERSTART
3553                            
3554                                return request.release();
3555                            }
3556                            
3557                            CIMSetPropertyRequestMessage*
3558                                CIMOperationRequestDecoder::decodeSetPropertyRequest(
3559                                    Uint32 queueId,
3560                                    XmlParser& parser,
3561                                    const String& messageId,
3562                                    const CIMNamespaceName& nameSpace)
3563                            {
3564 kumpf            1.104         STAT_GETSTARTTIME
3565                            
3566                                CIMObjectPath instanceName;
3567                                String propertyName;
3568                                CIMValue propertyValue;
3569                                Boolean duplicateParameter = false;
3570                                Boolean gotInstanceName = false;
3571                                Boolean gotPropertyName = false;
3572                                Boolean gotNewValue = false;
3573                                Boolean emptyTag;
3574                            
3575                                for (const char* name;
3576                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3577                                {
3578                                    if (System::strcasecmp(name, "InstanceName") == 0)
3579                                    {
3580                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3581                                        XmlReader::getInstanceNameElement(parser, instanceName);
3582                                        duplicateParameter = gotInstanceName;
3583                                        gotInstanceName = true;
3584                                    }
3585 kumpf            1.104             else if (System::strcasecmp(name, "PropertyName") == 0)
3586                                    {
3587                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
3588                                        XmlReader::getStringValueElement(parser, propertyName, true);
3589                                        duplicateParameter = gotPropertyName;
3590                                        gotPropertyName = true;
3591                                    }
3592                                    else if (System::strcasecmp(name, "NewValue") == 0)
3593                                    {
3594                                        if (emptyTag || !XmlReader::getPropertyValue(parser, propertyValue))
3595                                        {
3596                                            propertyValue.setNullValue(CIMTYPE_STRING, false);
3597                                        }
3598                                        duplicateParameter = gotNewValue;
3599                                        gotNewValue = true;
3600                                    }
3601                                    else
3602                                    {
3603 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3604 kumpf            1.104             }
3605                            
3606 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3607                                    _checkMissingEndTagOrDuplicateParamValue(
3608                                        parser, duplicateParameter, emptyTag);
3609 kumpf            1.104         }
3610                            
3611 karl             1.127.2.5     _testRequiredParametersExist(gotInstanceName && gotPropertyName);
3612 kumpf            1.104     
3613                                AutoPtr<CIMSetPropertyRequestMessage> request(
3614                                    new CIMSetPropertyRequestMessage(
3615                                        messageId,
3616                                        nameSpace,
3617                                        instanceName,
3618                                        propertyName,
3619                                        propertyValue,
3620                                        QueueIdStack(queueId, _returnQueueId)));
3621 kumpf            1.29      
3622 kumpf            1.104         STAT_SERVERSTART
3623 sage             1.41      
3624 kumpf            1.104         return request.release();
3625 kumpf            1.29      }
3626                            
3627                            CIMExecQueryRequestMessage* CIMOperationRequestDecoder::decodeExecQueryRequest(
3628 kumpf            1.104         Uint32 queueId,
3629                                XmlParser& parser,
3630                                const String& messageId,
3631                                const CIMNamespaceName& nameSpace)
3632                            {
3633                                STAT_GETSTARTTIME
3634                            
3635 karl             1.127.2.5     // define execQuery parameters.  Values are required parameters exist.
3636                                stringIParam queryLanguage("QueryLanguage", true);
3637                                stringIParam query("Query", true);
3638                            
3639 kumpf            1.104         Boolean emptyTag;
3640 karl             1.127.2.5     Boolean duplicateParameter = false;
3641 kumpf            1.104     
3642                                for (const char* name;
3643                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3644                                {
3645 karl             1.127.2.5         if(queryLanguage.get(parser, name, emptyTag))
3646 kumpf            1.104             {
3647 karl             1.127.2.5             queryLanguage.iParamFound(duplicateParameter);
3648 kumpf            1.104             }
3649 karl             1.127.2.5         else if(query.get(parser, name, emptyTag))
3650 kumpf            1.104             {
3651 karl             1.127.2.5             query.iParamFound(duplicateParameter);
3652 kumpf            1.104             }
3653                                    else
3654                                    {
3655 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3656 kumpf            1.104             }
3657                            
3658 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3659                                    _checkMissingEndTagOrDuplicateParamValue(parser,
3660                                        duplicateParameter, emptyTag);
3661 kumpf            1.104         }
3662                            
3663 karl             1.127.2.5     _testRequiredParametersExist(queryLanguage.got && query.got);
3664 kumpf            1.104     
3665                                AutoPtr<CIMExecQueryRequestMessage> request(
3666                                    new CIMExecQueryRequestMessage(
3667                                        messageId,
3668                                        nameSpace,
3669 karl             1.127.2.5             queryLanguage.value,
3670                                        query.value,
3671 kumpf            1.104                 QueueIdStack(queueId, _returnQueueId)));
3672                            
3673                                STAT_SERVERSTART
3674                            
3675                                return request.release();
3676                            }
3677                            
3678                            CIMInvokeMethodRequestMessage*
3679                                CIMOperationRequestDecoder::decodeInvokeMethodRequest(
3680                                    Uint32 queueId,
3681                                    XmlParser& parser,
3682                                    const String& messageId,
3683                                    const CIMObjectPath& reference,
3684                                    const String& cimMethodName)
3685                            {
3686                                STAT_GETSTARTTIME
3687                            
3688                                CIMParamValue paramValue;
3689                                Array<CIMParamValue> inParameters;
3690                            
3691                                while (XmlReader::getParamValueElement(parser, paramValue))
3692 kumpf            1.104         {
3693                                    inParameters.append(paramValue);
3694                                }
3695                            
3696                                AutoPtr<CIMInvokeMethodRequestMessage> request(
3697                                    new CIMInvokeMethodRequestMessage(
3698                                        messageId,
3699                                        reference.getNameSpace(),
3700                                        reference,
3701                                        cimMethodName,
3702                                        inParameters,
3703                                        QueueIdStack(queueId, _returnQueueId)));
3704 kumpf            1.9       
3705 kumpf            1.104         STAT_SERVERSTART
3706 mike             1.2       
3707 kumpf            1.104         return request.release();
3708 mike             1.2       }
3709                            
3710 karl             1.127.2.1 // EXP_PULL_BEGIN
3711                            CIMOpenEnumerateInstancesRequestMessage*
3712                                CIMOperationRequestDecoder::decodeOpenEnumerateInstancesRequest(
3713                                    Uint32 queueId,
3714                                    XmlParser& parser,
3715                                    const String& messageId,
3716                                    const CIMNamespaceName& nameSpace)
3717                            {
3718                                STAT_GETSTARTTIME
3719                            
3720 karl             1.127.2.5     // EnumerateInstance Parameters
3721                                classNameIParam className("ClassName");
3722                                booleanIParam deepInheritance("DeepInheritance", true);
3723                                booleanIParam includeQualifiers("IncludeQualifiers");
3724                                booleanIParam includeClassOrigin("IncludeClassOrigin");
3725                                propertyListIParam propertyList;
3726                                //// TODO confirm the false here
3727                                stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3728                                stringIParam filterQuery("FilterQuery", false);
3729                                booleanIParam continueOnError("ContinueOnError");
3730                                // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3731                                uint32IParam maxObjectCount("MaxObjectCount", 0);
3732                                // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3733                                uint32ArgIParam operationTimeout("OperationTimeout");
3734 karl             1.127.2.1 
3735                                Boolean duplicateParameter = false;
3736                            
3737                                Boolean emptyTag;
3738                            
3739                                for (const char* name;
3740                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3741                                {
3742 karl             1.127.2.5         if(className.get(parser, name, emptyTag))
3743 karl             1.127.2.1         {
3744 karl             1.127.2.5             className.iParamFound(duplicateParameter);
3745 karl             1.127.2.1         }
3746 karl             1.127.2.5         else if(deepInheritance.get(parser, name, emptyTag))
3747 karl             1.127.2.1         {
3748 karl             1.127.2.5             deepInheritance.iParamFound(duplicateParameter);
3749 karl             1.127.2.1         }
3750 karl             1.127.2.5         else if(includeQualifiers.get(parser, name, emptyTag))
3751 karl             1.127.2.1         {
3752 karl             1.127.2.5             includeQualifiers.iParamFound(duplicateParameter);
3753 karl             1.127.2.1         }
3754 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
3755 karl             1.127.2.1         {
3756 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
3757 karl             1.127.2.1         }
3758 karl             1.127.2.5         // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
3759                                    else if(filterQueryLanguage.get(parser, name, emptyTag))
3760 karl             1.127.2.1         {
3761 karl             1.127.2.5             filterQueryLanguage.iParamFound(duplicateParameter);
3762 karl             1.127.2.1         }
3763 karl             1.127.2.5         // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
3764                                    else if(filterQuery.get(parser, name, emptyTag))
3765 karl             1.127.2.1         {
3766 karl             1.127.2.5             filterQuery.iParamFound(duplicateParameter);
3767 karl             1.127.2.1         }
3768 karl             1.127.2.5         // [IN,OPTIONAL] Boolean ContinueOnError = false,
3769                                    else if (continueOnError.get(parser, name, emptyTag))
3770 karl             1.127.2.1         {
3771 karl             1.127.2.5             continueOnError.iParamFound(duplicateParameter);
3772                                    }
3773                                    // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3774                                    else if (operationTimeout.get(parser, name, emptyTag))
3775                                    {
3776                                        operationTimeout.iParamFound(duplicateParameter);
3777 karl             1.127.2.1         }
3778                                    // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3779 karl             1.127.2.5         else if (maxObjectCount.get(parser, name, emptyTag))
3780 karl             1.127.2.1         {
3781 karl             1.127.2.5             maxObjectCount.iParamFound(duplicateParameter);
3782 karl             1.127.2.1         }
3783 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
3784 karl             1.127.2.1         {
3785 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
3786 karl             1.127.2.1         }
3787                                    else
3788                                    {
3789 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName(name);
3790 karl             1.127.2.1         }
3791                            
3792 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3793                                    _checkMissingEndTagOrDuplicateParamValue(
3794                                        parser, duplicateParameter, emptyTag);
3795 karl             1.127.2.1 
3796                                }
3797                            
3798 karl             1.127.2.5     _testRequiredParametersExist(className.got);
3799 karl             1.127.2.1 
3800                                AutoPtr<CIMOpenEnumerateInstancesRequestMessage> request(
3801                                    new CIMOpenEnumerateInstancesRequestMessage(
3802                                        messageId,
3803                                        nameSpace,
3804 karl             1.127.2.5             className.value,
3805                                        deepInheritance.value,
3806                                        includeClassOrigin.value,
3807                                        propertyList.value,
3808                                        filterQueryLanguage.value,
3809                                        filterQuery.value,
3810                                        operationTimeout.value,
3811                                        continueOnError.value,
3812                                        maxObjectCount.value,
3813 karl             1.127.2.1             QueueIdStack(queueId, _returnQueueId)));
3814                            
3815                                STAT_SERVERSTART
3816                            
3817                                return request.release();
3818                            }
3819                            
3820                            
3821                            CIMOpenEnumerateInstancePathsRequestMessage*
3822                                CIMOperationRequestDecoder::decodeOpenEnumerateInstancePathsRequest(
3823                                    Uint32 queueId,
3824                                    XmlParser& parser,
3825                                    const String& messageId,
3826                                    const CIMNamespaceName& nameSpace)
3827                            {
3828                                STAT_GETSTARTTIME
3829                            
3830 karl             1.127.2.5     // EnumerateInstance Parameters
3831                                classNameIParam className("ClassName");
3832                                //// TODO confirm the false here
3833                                stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3834                                stringIParam filterQuery("FilterQuery", false);
3835                                booleanIParam continueOnError("ContinueOnError");
3836                                // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3837                                uint32IParam maxObjectCount("MaxObjectCount", 0);
3838                                // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3839                                uint32ArgIParam operationTimeout("OperationTimeout");
3840 karl             1.127.2.1 
3841                                Boolean duplicateParameter = false;
3842                                Boolean emptyTag;
3843                            
3844                                for (const char* name;
3845                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3846                                {
3847 karl             1.127.2.5         if(className.get(parser, name, emptyTag))
3848 karl             1.127.2.1         {
3849 karl             1.127.2.5             className.iParamFound(duplicateParameter);
3850 karl             1.127.2.1         }
3851 karl             1.127.2.5         // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
3852                                    else if(filterQueryLanguage.get(parser, name, emptyTag))
3853 karl             1.127.2.1         {
3854 karl             1.127.2.5             filterQueryLanguage.iParamFound(duplicateParameter);
3855 karl             1.127.2.1         }
3856 karl             1.127.2.5         // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
3857                                    else if(filterQuery.get(parser, name, emptyTag))
3858 karl             1.127.2.1         {
3859 karl             1.127.2.5             filterQuery.iParamFound(duplicateParameter);
3860 karl             1.127.2.1         }
3861                                    // [IN,OPTIONAL] Boolean ContinueOnError = false,
3862 karl             1.127.2.5         else if (continueOnError.get(parser, name, emptyTag))
3863 karl             1.127.2.1         {
3864 karl             1.127.2.5             continueOnError.iParamFound(duplicateParameter);
3865 karl             1.127.2.1         }
3866 karl             1.127.2.5         // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3867                                    else if (operationTimeout.get(parser, name, emptyTag))
3868 karl             1.127.2.1         {
3869 karl             1.127.2.5             operationTimeout.iParamFound(duplicateParameter);
3870 karl             1.127.2.1         }
3871 karl             1.127.2.5         // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3872                                    else if (maxObjectCount.get(parser, name, emptyTag))
3873 karl             1.127.2.1         {
3874 karl             1.127.2.5             maxObjectCount.iParamFound(duplicateParameter);
3875 karl             1.127.2.1         }
3876 karl             1.127.2.5         else
3877 karl             1.127.2.1         {
3878 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName(name);
3879 karl             1.127.2.1         }
3880                            
3881 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3882                                    _checkMissingEndTagOrDuplicateParamValue(
3883                                        parser, duplicateParameter, emptyTag);
3884 karl             1.127.2.1 
3885                                }
3886                            
3887 karl             1.127.2.5     _testRequiredParametersExist(className.got);
3888 karl             1.127.2.1 
3889                                AutoPtr<CIMOpenEnumerateInstancePathsRequestMessage> request(
3890                                    new CIMOpenEnumerateInstancePathsRequestMessage(
3891                                        messageId,
3892                                        nameSpace,
3893 karl             1.127.2.5             className.value,
3894                                        filterQueryLanguage.value,
3895                                        filterQuery.value,
3896                                        operationTimeout.value,
3897                                        continueOnError.value,
3898                                        maxObjectCount.value,
3899 karl             1.127.2.1             QueueIdStack(queueId, _returnQueueId)));
3900                            
3901                                STAT_SERVERSTART
3902                            
3903                                return request.release();
3904                            }
3905                            
3906                            CIMOpenReferenceInstancesRequestMessage*
3907                                CIMOperationRequestDecoder::decodeOpenReferenceInstancesRequest(
3908                                    Uint32 queueId,
3909                                    XmlParser& parser,
3910                                    const String& messageId,
3911                                    const CIMNamespaceName& nameSpace)
3912                            {
3913                                STAT_GETSTARTTIME
3914                            
3915 karl             1.127.2.5     objectNameIParam objectName("InstanceName");
3916                                classNameIParam resultClass("ResultClass");
3917                                stringIParam role("role", false);
3918                                booleanIParam includeClassOrigin("IncludeClassOrigin");
3919                                propertyListIParam propertyList;
3920                            
3921                                stringIParam filterQueryLanguage("FilterQueryLanguage",false);
3922                                stringIParam filterQuery("FilterQuery", false);
3923                                booleanIParam continueOnError("ContinueOnError");
3924                                uint32IParam maxObjectCount("MaxObjectCount", 0);
3925                                uint32ArgIParam operationTimeout("OperationTimeout");
3926 karl             1.127.2.1 
3927                                Boolean duplicateParameter = false;
3928                                Boolean emptyTag;
3929                            
3930 karl             1.127.2.5 
3931 karl             1.127.2.1     for (const char* name;
3932                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
3933                                {
3934 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
3935 karl             1.127.2.1         {
3936 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
3937 karl             1.127.2.1         }
3938 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
3939 karl             1.127.2.1         {
3940 karl             1.127.2.5             role.iParamFound(duplicateParameter);
3941 karl             1.127.2.1         }
3942 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
3943 karl             1.127.2.1         {
3944 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
3945 karl             1.127.2.1         }
3946 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
3947 karl             1.127.2.1         {
3948 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
3949 karl             1.127.2.1         }
3950 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
3951 karl             1.127.2.1         {
3952 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
3953 karl             1.127.2.1         }
3954 karl             1.127.2.5         // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
3955                                    else if(filterQueryLanguage.get(parser, name, emptyTag))
3956 karl             1.127.2.1         {
3957 karl             1.127.2.5             filterQueryLanguage.iParamFound(duplicateParameter);
3958 karl             1.127.2.1         }
3959 karl             1.127.2.5         // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
3960                                    else if(filterQuery.get(parser, name, emptyTag))
3961 karl             1.127.2.1         {
3962 karl             1.127.2.5             filterQuery.iParamFound(duplicateParameter);
3963 karl             1.127.2.1         }
3964 karl             1.127.2.5         // [IN,OPTIONAL] Boolean ContinueOnError = false,
3965                                    else if (continueOnError.get(parser, name, emptyTag))
3966 karl             1.127.2.1         {
3967 karl             1.127.2.5             continueOnError.iParamFound(duplicateParameter);
3968 karl             1.127.2.1         }
3969 karl             1.127.2.5         // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
3970                                    else if (operationTimeout.get(parser, name, emptyTag))
3971 karl             1.127.2.1         {
3972 karl             1.127.2.5             operationTimeout.iParamFound(duplicateParameter);
3973 karl             1.127.2.1         }
3974 karl             1.127.2.5         // [IN,OPTIONAL] uint32 MaxObjectCount = 0
3975                                    else if (maxObjectCount.get(parser, name, emptyTag))
3976 karl             1.127.2.1         {
3977 karl             1.127.2.5             maxObjectCount.iParamFound(duplicateParameter);
3978 karl             1.127.2.1         }
3979                                    else
3980                                    {
3981 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
3982 karl             1.127.2.1         }
3983                            
3984 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
3985                                    _checkMissingEndTagOrDuplicateParamValue(
3986                                        parser, duplicateParameter, emptyTag);
3987 karl             1.127.2.1     }
3988                            
3989 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
3990 karl             1.127.2.1 
3991                                AutoPtr<CIMOpenReferenceInstancesRequestMessage> request(
3992                                    new CIMOpenReferenceInstancesRequestMessage(
3993                                        messageId,
3994                                        nameSpace,
3995 karl             1.127.2.5             objectName.value,
3996                                        resultClass.value,
3997                                        role.value,
3998                                        includeClassOrigin.value,
3999                                        propertyList.value,
4000                                        filterQueryLanguage.value,
4001                                        filterQuery.value,
4002                                        operationTimeout.value,
4003                                        continueOnError.value,
4004                                        maxObjectCount.value,
4005 karl             1.127.2.1             QueueIdStack(queueId, _returnQueueId)));
4006                            
4007                                STAT_SERVERSTART
4008                            
4009                                return request.release();
4010                            }
4011                            
4012                            
4013                            CIMOpenReferenceInstancePathsRequestMessage*
4014                                CIMOperationRequestDecoder::decodeOpenReferenceInstancePathsRequest(
4015                                    Uint32 queueId,
4016                                    XmlParser& parser,
4017                                    const String& messageId,
4018                                    const CIMNamespaceName& nameSpace)
4019                            {
4020                                STAT_GETSTARTTIME
4021                            
4022 karl             1.127.2.5     objectNameIParam objectName("InstanceName");
4023                                classNameIParam resultClass("ResultClass");
4024                                stringIParam role("role", false);
4025                            
4026                                stringIParam filterQueryLanguage("FilterQueryLanguage",false);
4027                                stringIParam filterQuery("FilterQuery", false);
4028                                booleanIParam continueOnError("ContinueOnError");
4029                                uint32IParam maxObjectCount("MaxObjectCount", 0);
4030                                uint32ArgIParam operationTimeout("OperationTimeout");
4031 karl             1.127.2.1 
4032                                Boolean duplicateParameter = false;
4033                                Boolean emptyTag;
4034                            
4035                                for (const char* name;
4036                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4037                                {
4038 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
4039 karl             1.127.2.1         {
4040 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
4041 karl             1.127.2.1         }
4042 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
4043 karl             1.127.2.1         {
4044 karl             1.127.2.5             role.iParamFound(duplicateParameter);
4045 karl             1.127.2.1         }
4046 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
4047 karl             1.127.2.1         {
4048 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
4049 karl             1.127.2.1         }
4050 karl             1.127.2.5         else if(filterQueryLanguage.get(parser, name, emptyTag))
4051 karl             1.127.2.1         {
4052 karl             1.127.2.5             filterQueryLanguage.iParamFound(duplicateParameter);
4053 karl             1.127.2.1         }
4054 karl             1.127.2.5         else if(filterQuery.get(parser, name, emptyTag))
4055 karl             1.127.2.1         {
4056 karl             1.127.2.5             filterQuery.iParamFound(duplicateParameter);
4057 karl             1.127.2.1         }
4058 karl             1.127.2.5         else if (continueOnError.get(parser, name, emptyTag))
4059 karl             1.127.2.1         {
4060 karl             1.127.2.5             continueOnError.iParamFound(duplicateParameter);
4061 karl             1.127.2.1         }
4062 karl             1.127.2.5         else if (operationTimeout.get(parser, name, emptyTag))
4063 karl             1.127.2.1         {
4064 karl             1.127.2.5             operationTimeout.iParamFound(duplicateParameter);
4065 karl             1.127.2.1         }
4066 karl             1.127.2.5         else if (maxObjectCount.get(parser, name, emptyTag))
4067 karl             1.127.2.1         {
4068 karl             1.127.2.5             maxObjectCount.iParamFound(duplicateParameter);
4069 karl             1.127.2.1         }
4070                                    else
4071                                    {
4072 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
4073 karl             1.127.2.1         }
4074                            
4075 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
4076                                    _checkMissingEndTagOrDuplicateParamValue(
4077                                        parser, duplicateParameter, emptyTag);
4078 karl             1.127.2.1     }
4079                            
4080 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
4081 karl             1.127.2.1 
4082                                AutoPtr<CIMOpenReferenceInstancePathsRequestMessage> request(
4083                                    new CIMOpenReferenceInstancePathsRequestMessage(
4084                                        messageId,
4085                                        nameSpace,
4086 karl             1.127.2.5             objectName.value,
4087                                        resultClass.value,
4088                                        role.value,
4089                                        filterQueryLanguage.value,
4090                                        filterQuery.value,
4091                                        operationTimeout.value,
4092                                        continueOnError.value,
4093                                        maxObjectCount.value,
4094 karl             1.127.2.1             QueueIdStack(queueId, _returnQueueId)));
4095                            
4096                                STAT_SERVERSTART
4097                            
4098                                return request.release();
4099                            }
4100                            
4101                            CIMOpenAssociatorInstancesRequestMessage*
4102                                CIMOperationRequestDecoder::decodeOpenAssociatorInstancesRequest(
4103                                    Uint32 queueId,
4104                                    XmlParser& parser,
4105                                    const String& messageId,
4106                                    const CIMNamespaceName& nameSpace)
4107                            {
4108                                STAT_GETSTARTTIME
4109                            
4110 karl             1.127.2.5     objectNameIParam objectName("InstanceName");
4111                                classNameIParam assocClass("AssocClass");
4112                                classNameIParam resultClass("ResultClass");
4113                                stringIParam resultRole("Resultrole", false);
4114                                stringIParam role("role", false);
4115                                booleanIParam includeClassOrigin("IncludeClassOrigin");
4116                                propertyListIParam propertyList;
4117                            
4118                                stringIParam filterQueryLanguage("FilterQueryLanguage",false);
4119                                stringIParam filterQuery("FilterQuery", false);
4120                                booleanIParam continueOnError("ContinueOnError");
4121                                uint32IParam maxObjectCount("MaxObjectCount", 0);
4122                                uint32ArgIParam operationTimeout("OperationTimeout");
4123 karl             1.127.2.1 
4124                                Boolean duplicateParameter = false;
4125                                Boolean emptyTag;
4126                            
4127                                for (const char* name;
4128                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4129                                {
4130 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
4131 karl             1.127.2.1         {
4132 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
4133 karl             1.127.2.1         }
4134 karl             1.127.2.5         else if (assocClass.getOptional(parser, name, emptyTag))
4135 karl             1.127.2.1         {
4136 karl             1.127.2.5             assocClass.iParamFound(duplicateParameter);
4137 karl             1.127.2.1         }
4138 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
4139 karl             1.127.2.1         {
4140 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
4141 karl             1.127.2.1         }
4142 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
4143 karl             1.127.2.1         {
4144 karl             1.127.2.5             role.iParamFound(duplicateParameter);
4145 karl             1.127.2.1         }
4146 karl             1.127.2.5         else if(resultRole.get(parser, name, emptyTag))
4147 karl             1.127.2.1         {
4148 karl             1.127.2.5             resultRole.iParamFound(duplicateParameter);
4149 karl             1.127.2.1         }
4150 karl             1.127.2.5         else if(includeClassOrigin.get(parser, name,  emptyTag))
4151 karl             1.127.2.1         {
4152 karl             1.127.2.5             includeClassOrigin.iParamFound(duplicateParameter);
4153 karl             1.127.2.1         }
4154 karl             1.127.2.5         else if(propertyList.get(parser, name, emptyTag))
4155 karl             1.127.2.1         {
4156 karl             1.127.2.5             propertyList.iParamFound(duplicateParameter);
4157 karl             1.127.2.1         }
4158 karl             1.127.2.5         else if(filterQueryLanguage.get(parser, name, emptyTag))
4159 karl             1.127.2.1         {
4160 karl             1.127.2.5             filterQueryLanguage.iParamFound(duplicateParameter);
4161 karl             1.127.2.1         }
4162 karl             1.127.2.5         else if(filterQuery.get(parser, name, emptyTag))
4163 karl             1.127.2.1         {
4164 karl             1.127.2.5             filterQuery.iParamFound(duplicateParameter);
4165 karl             1.127.2.1         }
4166 karl             1.127.2.5         else if (continueOnError.get(parser, name, emptyTag))
4167 karl             1.127.2.1         {
4168 karl             1.127.2.5             continueOnError.iParamFound(duplicateParameter);
4169 karl             1.127.2.1         }
4170 karl             1.127.2.5         else if (operationTimeout.get(parser, name, emptyTag))
4171 karl             1.127.2.1         {
4172 karl             1.127.2.5             operationTimeout.iParamFound(duplicateParameter);
4173 karl             1.127.2.1         }
4174 karl             1.127.2.5         else if (maxObjectCount.get(parser, name, emptyTag))
4175 karl             1.127.2.1         {
4176 karl             1.127.2.5             maxObjectCount.iParamFound(duplicateParameter);
4177 karl             1.127.2.1         }
4178                                    else
4179                                    {
4180 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
4181 karl             1.127.2.1         }
4182                            
4183 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
4184                                    _checkMissingEndTagOrDuplicateParamValue(
4185                                        parser, duplicateParameter, emptyTag);
4186 karl             1.127.2.1     }
4187                            
4188 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
4189 karl             1.127.2.1 
4190                                AutoPtr<CIMOpenAssociatorInstancesRequestMessage> request(
4191                                    new CIMOpenAssociatorInstancesRequestMessage(
4192                                        messageId,
4193                                        nameSpace,
4194 karl             1.127.2.5             objectName.value,
4195                                        assocClass.value,
4196                                        resultClass.value,
4197                                        role.value,
4198                                        resultRole.value,
4199                                        includeClassOrigin.value,
4200                                        propertyList.value,
4201                                        filterQueryLanguage.value,
4202                                        filterQuery.value,
4203                                        operationTimeout.value,
4204                                        continueOnError.value,
4205                                        maxObjectCount.value,
4206 karl             1.127.2.1             QueueIdStack(queueId, _returnQueueId)));
4207                            
4208                                STAT_SERVERSTART
4209                            
4210                                return request.release();
4211                            }
4212                            
4213                            CIMOpenAssociatorInstancePathsRequestMessage*
4214                                CIMOperationRequestDecoder::decodeOpenAssociatorInstancePathsRequest(
4215                                    Uint32 queueId,
4216                                    XmlParser& parser,
4217                                    const String& messageId,
4218                                    const CIMNamespaceName& nameSpace)
4219                            {
4220                                STAT_GETSTARTTIME
4221                            
4222 karl             1.127.2.5     objectNameIParam objectName("InstanceName");
4223                                classNameIParam assocClass("AssocClass");
4224                                classNameIParam resultClass("ResultClass");
4225                                stringIParam resultRole("Resultrole", false);
4226                                stringIParam role("role", false);
4227                            
4228                                stringIParam filterQueryLanguage("FilterQueryLanguage",false);
4229                                stringIParam filterQuery("FilterQuery", false);
4230                                booleanIParam continueOnError("ContinueOnError");
4231                                uint32IParam maxObjectCount("MaxObjectCount", 0);
4232                                uint32ArgIParam operationTimeout("OperationTimeout");
4233 karl             1.127.2.1 
4234                                Boolean duplicateParameter = false;
4235                                Boolean emptyTag;
4236                            
4237                                for (const char* name;
4238                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4239                                {
4240 karl             1.127.2.5         if(objectName.get(parser, name, emptyTag))
4241 karl             1.127.2.1         {
4242 karl             1.127.2.5             objectName.iParamFound(duplicateParameter);
4243 karl             1.127.2.1         }
4244 karl             1.127.2.5         else if (assocClass.getOptional(parser, name, emptyTag))
4245 karl             1.127.2.1         {
4246 karl             1.127.2.5             assocClass.iParamFound(duplicateParameter);
4247 karl             1.127.2.1         }
4248 karl             1.127.2.5         else if (resultClass.getOptional(parser, name, emptyTag))
4249 karl             1.127.2.1         {
4250 karl             1.127.2.5             resultClass.iParamFound(duplicateParameter);
4251 karl             1.127.2.1         }
4252 karl             1.127.2.5         else if(role.get(parser, name, emptyTag))
4253 karl             1.127.2.1         {
4254 karl             1.127.2.5             role.iParamFound(duplicateParameter);
4255 karl             1.127.2.1         }
4256 karl             1.127.2.5         else if(resultRole.get(parser, name, emptyTag))
4257 karl             1.127.2.1         {
4258 karl             1.127.2.5             resultRole.iParamFound(duplicateParameter);
4259 karl             1.127.2.1         }
4260 karl             1.127.2.5         else if(filterQueryLanguage.get(parser, name, emptyTag))
4261 karl             1.127.2.1         {
4262 karl             1.127.2.5             filterQueryLanguage.iParamFound(duplicateParameter);
4263 karl             1.127.2.1         }
4264 karl             1.127.2.5         else if(filterQuery.get(parser, name, emptyTag))
4265 karl             1.127.2.1         {
4266 karl             1.127.2.5             filterQuery.iParamFound(duplicateParameter);
4267 karl             1.127.2.1         }
4268 karl             1.127.2.5         else if (continueOnError.get(parser, name, emptyTag))
4269 karl             1.127.2.1         {
4270 karl             1.127.2.5             continueOnError.iParamFound(duplicateParameter);
4271 karl             1.127.2.1         }
4272 karl             1.127.2.5         else if (operationTimeout.get(parser, name, emptyTag))
4273 karl             1.127.2.1         {
4274 karl             1.127.2.5             operationTimeout.iParamFound(duplicateParameter);
4275 karl             1.127.2.1         }
4276 karl             1.127.2.5         else if (maxObjectCount.get(parser, name, emptyTag))
4277 karl             1.127.2.1         {
4278 karl             1.127.2.5             maxObjectCount.iParamFound(duplicateParameter);
4279 karl             1.127.2.1         }
4280                                    else
4281                                    {
4282 karl             1.127.2.5             _throwCIMExceptionInvalidIParamName();
4283 karl             1.127.2.1         }
4284                            
4285 karl             1.127.2.5         // generate exception if endtag error or duplicate attributes
4286                                    _checkMissingEndTagOrDuplicateParamValue(
4287                                        parser, duplicateParameter, emptyTag);
4288 karl             1.127.2.1     }
4289                            
4290 karl             1.127.2.5     _testRequiredParametersExist(objectName.got);
4291 karl             1.127.2.1 
4292                                AutoPtr<CIMOpenAssociatorInstancePathsRequestMessage> request(
4293                                    new CIMOpenAssociatorInstancePathsRequestMessage(
4294                                        messageId,
4295                                        nameSpace,
4296 karl             1.127.2.5             objectName.value,
4297                                        assocClass.value,
4298                                        resultClass.value,
4299                                        role.value,
4300                                        resultRole.value,
4301                                        filterQueryLanguage.value,
4302                                        filterQuery.value,
4303                                        operationTimeout.value,
4304                                        continueOnError.value,
4305                                        maxObjectCount.value,
4306 karl             1.127.2.1             QueueIdStack(queueId, _returnQueueId)));
4307                            
4308                                STAT_SERVERSTART
4309                            
4310                                return request.release();
4311                            }
4312                            
4313                            CIMPullInstancesWithPathRequestMessage*
4314                                CIMOperationRequestDecoder::decodePullInstancesWithPathRequest(
4315                                    Uint32 queueId,
4316                                    XmlParser& parser,
4317                                    const String& messageId,
4318                                    const CIMNamespaceName& nameSpace)
4319                            {
4320                                STAT_GETSTARTTIME
4321                            
4322                                String enumerationContext = String::EMPTY;
4323 karl             1.127.2.5     Uint32 maxObjectCount = 0;
4324 karl             1.127.2.1 
4325                                Boolean duplicateParameter = false;
4326                                Boolean gotEnumerationContext = false;
4327                                Boolean gotMaxObjectCount = false;
4328                            
4329                                Boolean emptyTag;
4330                            
4331                                for (const char* name;
4332                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4333                                {
4334                                    if (System::strcasecmp(name, "EnumerationContext") == 0)
4335                                    {
4336                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4337                                        XmlReader::getStringValueElement(parser, enumerationContext, true);
4338                                        duplicateParameter = gotEnumerationContext;
4339                                        gotEnumerationContext = true;
4340                                    }
4341                            
4342                                    else if (System::strcasecmp(name, "MaxObjectCount") == 0)
4343                                    {
4344                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4345 karl             1.127.2.1             XmlReader::getUint32ValueElement(parser, maxObjectCount, true);
4346                                        duplicateParameter = gotMaxObjectCount;
4347                                        gotMaxObjectCount = true;
4348                                    }
4349                                    else
4350                                    {
4351                                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
4352                                    }
4353                            
4354                                    if (!emptyTag)
4355                                    {
4356                                        XmlReader::expectEndTag(parser, "IPARAMVALUE");
4357                                    }
4358                            
4359                                    if (duplicateParameter)
4360                                    {
4361                            
4362                                        throw PEGASUS_CIM_EXCEPTION(
4363                                            CIM_ERR_INVALID_PARAMETER, "Duplicate IPARAM received");
4364                                    }
4365                                }
4366 karl             1.127.2.1 
4367                                if (!gotEnumerationContext)
4368                                {
4369                                    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4370                                            "EnumerationContext IPARAM required");
4371                                }
4372                            
4373                                if (!gotMaxObjectCount)
4374                                {
4375                                    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4376                                            "MaxObjectCount IPARAM required");
4377                                }
4378                            
4379                                AutoPtr<CIMPullInstancesWithPathRequestMessage> request(
4380                                    new CIMPullInstancesWithPathRequestMessage(
4381                                        messageId,
4382                                        nameSpace,
4383                                        enumerationContext,
4384                                        maxObjectCount,
4385                                        QueueIdStack(queueId, _returnQueueId)));
4386                            
4387 karl             1.127.2.1     STAT_SERVERSTART
4388                            
4389                                return request.release();
4390                            }
4391                            
4392                            CIMPullInstancePathsRequestMessage*
4393                                CIMOperationRequestDecoder::decodePullInstancePathsRequest(
4394                                    Uint32 queueId,
4395                                    XmlParser& parser,
4396                                    const String& messageId,
4397                                    const CIMNamespaceName& nameSpace)
4398                            {
4399                                STAT_GETSTARTTIME
4400                            
4401                                String enumerationContext = String::EMPTY;
4402 karl             1.127.2.5     Uint32 maxObjectCount = 0;
4403 karl             1.127.2.1 
4404                                Boolean duplicateParameter = false;
4405                                Boolean gotEnumerationContext = false;
4406                                Boolean gotMaxObjectCount = false;
4407                            
4408                                Boolean emptyTag;
4409                            
4410                                for (const char* name;
4411                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4412                                {
4413                                    if (System::strcasecmp(name, "EnumerationContext") == 0)
4414                                    {
4415                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4416                                        XmlReader::getStringValueElement(parser, enumerationContext, true);
4417                                        duplicateParameter = gotEnumerationContext;
4418                                        gotEnumerationContext = true;
4419                                    }
4420                            
4421                                    else if (System::strcasecmp(name, "MaxObjectCount") == 0)
4422                                    {
4423                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4424 karl             1.127.2.1             XmlReader::getUint32ValueElement(parser, maxObjectCount, true);
4425                                        duplicateParameter = gotMaxObjectCount;
4426                                        gotMaxObjectCount = true;
4427                                    }
4428                                    else
4429                                    {
4430                                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED,
4431                                            "Invalid IPARAMVALUE tag ");
4432                                    }
4433                            
4434                                    if (!emptyTag)
4435                                    {
4436                                        XmlReader::expectEndTag(parser, "IPARAMVALUE");
4437                                    }
4438                            
4439                                    if (duplicateParameter)
4440                                    {
4441                                        throw PEGASUS_CIM_EXCEPTION(
4442                                            CIM_ERR_INVALID_PARAMETER, String::EMPTY);
4443                                    }
4444                                }
4445 karl             1.127.2.1 
4446                                if (!gotEnumerationContext)
4447                                {
4448                                    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4449                                            "EnumerationContext IPARAM required");
4450                                }
4451                            
4452                                if (!gotMaxObjectCount)
4453                                {
4454                                    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4455                                            "MaxObjectCount IPARAM required");
4456                                }
4457                            
4458                                AutoPtr<CIMPullInstancePathsRequestMessage> request(
4459                                    new CIMPullInstancePathsRequestMessage(
4460                                        messageId,
4461                                        nameSpace,
4462                                        enumerationContext,
4463                                        maxObjectCount,
4464                                        QueueIdStack(queueId, _returnQueueId)));
4465                            
4466 karl             1.127.2.1     STAT_SERVERSTART
4467                            
4468                                return request.release();
4469                            }
4470                            
4471                            CIMCloseEnumerationRequestMessage*
4472                                CIMOperationRequestDecoder::decodeCloseEnumerationRequest(
4473                                    Uint32 queueId,
4474                                    XmlParser& parser,
4475                                    const String& messageId,
4476                                    const CIMNamespaceName& nameSpace)
4477                            {
4478                                STAT_GETSTARTTIME
4479                            
4480                                String enumerationContext = String::EMPTY;
4481                                Boolean duplicateParameter = false;
4482                                Boolean gotEnumerationContext = false;
4483                            
4484                                Boolean emptyTag;
4485                                for (const char* name;
4486                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4487 karl             1.127.2.1     {
4488                                    if (System::strcasecmp(name, "EnumerationContext") == 0)
4489                                    {
4490                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4491                                        XmlReader::getStringValueElement(parser, enumerationContext, true);
4492                                        duplicateParameter = gotEnumerationContext;
4493                                        gotEnumerationContext = true;
4494                                    }
4495                                    else
4496                                    {
4497                                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
4498                                    }
4499                            
4500                                    if (!emptyTag)
4501                                    {
4502                                        XmlReader::expectEndTag(parser, "IPARAMVALUE");
4503                                    }
4504                            
4505                            
4506                                    if (duplicateParameter)
4507                                    {
4508 karl             1.127.2.1             throw PEGASUS_CIM_EXCEPTION(
4509                                            CIM_ERR_INVALID_PARAMETER, String::EMPTY);
4510                                    }
4511                                }
4512                            
4513                                if (!gotEnumerationContext)
4514                                {
4515                                    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4516                                        "EnumerationContext IPARAM required");
4517                                }
4518                            
4519                                AutoPtr<CIMCloseEnumerationRequestMessage> request(
4520                                    new CIMCloseEnumerationRequestMessage(
4521                                        messageId,
4522                                        nameSpace,
4523                                        enumerationContext,
4524                                        QueueIdStack(queueId, _returnQueueId)));
4525                            
4526                                STAT_SERVERSTART
4527                            
4528                                return request.release();
4529 karl             1.127.2.1 }
4530                            
4531                            
4532                            CIMEnumerationCountRequestMessage*
4533                                CIMOperationRequestDecoder::decodeEnumerationCountRequest(
4534                                    Uint32 queueId,
4535                                    XmlParser& parser,
4536                                    const String& messageId,
4537                                    const CIMNamespaceName& nameSpace)
4538                            {
4539                                STAT_GETSTARTTIME
4540                            
4541                                String enumerationContext = String::EMPTY;
4542                                Boolean duplicateParameter = false;
4543                                Boolean gotEnumerationContext = false;
4544                            
4545                                Boolean emptyTag;
4546                            
4547                                for (const char* name;
4548                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4549                                {
4550 karl             1.127.2.1         if (System::strcasecmp(name, "EnumerationContext") == 0)
4551                                    {
4552                                        XmlReader::rejectNullIParamValue(parser, emptyTag, name);
4553                                        XmlReader::getStringValueElement(parser, enumerationContext, true);
4554                                        duplicateParameter = gotEnumerationContext;
4555                                        gotEnumerationContext = true;
4556                                    }
4557                                    else
4558                                    {
4559                                        throw PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
4560                                    }
4561                            
4562                                    if (!emptyTag)
4563                                    {
4564                                        XmlReader::expectEndTag(parser, "IPARAMVALUE");
4565                                    }
4566                            
4567                                    if (duplicateParameter)
4568                                    {
4569                                        throw PEGASUS_CIM_EXCEPTION(
4570                                            CIM_ERR_INVALID_PARAMETER, String::EMPTY);
4571 karl             1.127.2.1         }
4572                                }
4573                            
4574                                if (!gotEnumerationContext)
4575                                {
4576                                    throw PEGASUS_CIM_EXCEPTION(CIM_ERR_INVALID_PARAMETER,
4577                                        "Missing EnumerationContext Parameter");
4578                                }
4579                            
4580                            
4581                                AutoPtr<CIMEnumerationCountRequestMessage> request(
4582                                    new CIMEnumerationCountRequestMessage(
4583                                        messageId,
4584                                        nameSpace,
4585                                        enumerationContext,
4586                                        QueueIdStack(queueId, _returnQueueId)));
4587                            
4588                                STAT_SERVERSTART
4589                            
4590                                return request.release();
4591                            }
4592 karl             1.127.2.6 
4593                            CIMOpenQueryInstancesRequestMessage*
4594                                CIMOperationRequestDecoder::decodeOpenQueryInstancesRequest(
4595                                    Uint32 queueId,
4596                                    XmlParser& parser,
4597                                    const String& messageId,
4598                                    const CIMNamespaceName& nameSpace)
4599                            {
4600                                STAT_GETSTARTTIME
4601                            
4602                                stringIParam filterQueryLanguage("FilterQueryLanguage",true);
4603                                stringIParam filterQuery("FilterQuery", true);
4604                            
4605                                booleanIParam returnQueryResultClass("ReturnQueryResultClass");
4606                                booleanIParam continueOnError("ContinueOnError");
4607                                // [IN,OPTIONAL] uint32 MaxObjectCount = 0
4608                                uint32IParam maxObjectCount("MaxObjectCount", 0);
4609                                // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
4610                                uint32ArgIParam operationTimeout("OperationTimeout");
4611                            
4612                                Boolean duplicateParameter = false;
4613 karl             1.127.2.6     Boolean emptyTag;
4614                            
4615                                for (const char* name;
4616                                     XmlReader::getIParamValueTag(parser, name, emptyTag); )
4617                                {
4618                                    // [IN,OPTIONAL,NULL] string FilterQueryLanguage = NULL,
4619                                    if(filterQueryLanguage.get(parser, name, emptyTag))
4620                                    {
4621                                        filterQueryLanguage.iParamFound(duplicateParameter);
4622                                    }
4623                                    // [IN,OPTIONAL,NULL] string FilterQuery = NULL,
4624                                    else if(filterQuery.get(parser, name, emptyTag))
4625                                    {
4626                                        filterQuery.iParamFound(duplicateParameter);
4627                                    }
4628                                    else if (returnQueryResultClass.get(parser, name, emptyTag))
4629                                    {
4630                                        returnQueryResultClass.iParamFound(duplicateParameter);
4631                                    }
4632                                    // [IN,OPTIONAL] Boolean ContinueOnError = false,
4633                                    else if (continueOnError.get(parser, name, emptyTag))
4634 karl             1.127.2.6         {
4635                                        continueOnError.iParamFound(duplicateParameter);
4636                                    }
4637                                    // [IN,OPTIONAL,NULL] uint32 OperationTimeout = NULL,
4638                                    else if (operationTimeout.get(parser, name, emptyTag))
4639                                    {
4640                                        operationTimeout.iParamFound(duplicateParameter);
4641                                    }
4642                                    // [IN,OPTIONAL] uint32 MaxObjectCount = 0
4643                                    else if (maxObjectCount.get(parser, name, emptyTag))
4644                                    {
4645                                        maxObjectCount.iParamFound(duplicateParameter);
4646                                    }
4647                                    else
4648                                    {
4649                                        _throwCIMExceptionInvalidIParamName(name);
4650                                    }
4651                            
4652                                    // generate exception if endtag error or duplicate attributes
4653                                    _checkMissingEndTagOrDuplicateParamValue(
4654                                        parser, duplicateParameter, emptyTag);
4655 karl             1.127.2.6     }
4656                            
4657                                _testRequiredParametersExist(filterQuery.got);
4658                                _testRequiredParametersExist(filterQueryLanguage.got);
4659                            
4660                                AutoPtr<CIMOpenQueryInstancesRequestMessage> request(
4661                                    new CIMOpenQueryInstancesRequestMessage(
4662                                        messageId,
4663                                        nameSpace,
4664                                        filterQuery.value,
4665                                        filterQueryLanguage.value,
4666                                        returnQueryResultClass.value,
4667                                        operationTimeout.value,
4668                                        continueOnError.value,
4669                                        maxObjectCount.value,
4670                                        QueueIdStack(queueId, _returnQueueId)));
4671                            
4672                                STAT_SERVERSTART
4673                            
4674                                return request.release();
4675                            }
4676 karl             1.127.2.3 //EXP_PULL_END
4677 karl             1.127.2.1 
4678 mike             1.2       void CIMOperationRequestDecoder::setServerTerminating(Boolean flag)
4679                            {
4680 kumpf            1.104         _serverTerminating = flag;
4681 mike             1.2       }
4682                            
4683                            PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2