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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2