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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2