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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2