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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2