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

   1 karl  1.5 //%2005////////////////////////////////////////////////////////////////////////
   2 schuur 1.1 //
   3 karl   1.2 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   4            // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   6 schuur 1.1 // IBM Corp.; EMC Corporation, The Open Group.
   7 karl   1.2 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9 karl   1.5 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11 schuur 1.1 //
  12            // Permission is hereby granted, free of charge, to any person obtaining a copy
  13            // of this software and associated documentation files (the "Software"), to
  14            // deal in the Software without restriction, including without limitation the
  15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  16            // sell copies of the Software, and to permit persons to whom the Software is
  17            // furnished to do so, subject to the following conditions:
  18 chip   1.7 //
  19 schuur 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  20            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  21            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  22            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  23            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  24            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  25            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27            //
  28            //==============================================================================
  29            //
  30            // Author: Chip Vincent (cvincent@us.ibm.com)
  31            //
  32            // Modified By:
  33 brian.campbell 1.3 //         Brian G. Campbell, EMC (campbell_brian@emc.com) - PEP140/phase2
  34 chip           1.7 //
  35 schuur         1.1 //%/////////////////////////////////////////////////////////////////////////////
  36                    
  37                    #include "OperationResponseHandler.h"
  38 chip           1.7 
  39                    #include <Pegasus/Common/Logger.h>
  40                    
  41                    #include <Pegasus/ProviderManager2/ProviderManagerService.h>
  42 schuur         1.1 
  43                    PEGASUS_NAMESPACE_BEGIN
  44                    
  45 chip           1.7 //
  46                    // OperationResponseHandler
  47                    //
  48                    
  49                    OperationResponseHandler::OperationResponseHandler(
  50                        CIMRequestMessage *request,
  51                        CIMResponseMessage *response)
  52                        : _request(request),
  53                        _response(response),
  54 chip           1.8     _responseObjectTotal(0),
  55 chip           1.7     _responseMessageTotal(0),
  56                    	_responseObjectThreshold(0)
  57 brian.campbell 1.3 {
  58                    #ifndef PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD
  59 chip           1.7  #define PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD 100
  60 brian.campbell 1.3 #elif PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD  == 0
  61 chip           1.7  #undef PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD
  62                     #define PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD  ~0
  63 brian.campbell 1.3 #endif
  64                    
  65 carolann.graves 1.6     if (!request || (request->requestIsOOP == true))
  66 a.dunfey        1.4     {
  67                             _responseObjectThreshold = ~0;
  68                         }
  69                     	else
  70                         {
  71                             _responseObjectThreshold = PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD;
  72 brian.campbell  1.3 
  73                     #ifdef PEGASUS_DEBUG
  74 chip            1.7 	    static const char *responseObjectThreshold =
  75 a.dunfey        1.4 		    getenv("PEGASUS_RESPONSE_OBJECT_COUNT_THRESHOLD");
  76 chip            1.7 
  77                             if (responseObjectThreshold)
  78 a.dunfey        1.4 	    {
  79 chip            1.7 		    Uint32 i = (Uint32)atoi(responseObjectThreshold);
  80                     
  81                                 if (i > 0)
  82                                 {
  83                                     _responseObjectThreshold = i;
  84                                 }
  85 a.dunfey        1.4 	    }
  86 brian.campbell  1.3 #endif
  87 a.dunfey        1.4     }
  88 brian.campbell  1.3 }
  89                     
  90                     OperationResponseHandler::~OperationResponseHandler()
  91                     {
  92                     	_request = 0;
  93                     	_response = 0;
  94                     }
  95                     
  96 chip            1.7 CIMRequestMessage * OperationResponseHandler::getRequest(void) const
  97                     {
  98                         return(_request);
  99                     }
 100                     
 101                     CIMResponseMessage * OperationResponseHandler::getResponse(void) const
 102                     {
 103                         return(_response);
 104                     }
 105                     
 106                     void OperationResponseHandler::setStatus(
 107                         const Uint32 code,
 108                         const String & message)
 109                     {
 110                         _response->cimException = PEGASUS_CIM_EXCEPTION(CIMStatusCode(code), message);
 111                     }
 112                     
 113                     void OperationResponseHandler::setStatus(
 114                         const Uint32 code,
 115 a.dunfey        1.11.10.1     const ContentLanguageList & langs,
 116 chip            1.7           const String & message)
 117                           {
 118                               _response->cimException =
 119                                   PEGASUS_CIM_EXCEPTION_LANG(
 120                                   langs,
 121                                   CIMStatusCode(code),
 122                                   message);
 123                           }
 124                           
 125                           Boolean OperationResponseHandler::isAsync(void) const
 126                           {
 127                               return(true);
 128                           }
 129                           
 130 brian.campbell  1.3       // This is only called from SimpleResponseHandler.deliver() but lives in this
 131                           // class because all asyncronous response must have a "response" pointer
 132                           // to go through. Only operation classes have a response pointer
 133                           void OperationResponseHandler::send(Boolean isComplete)
 134                           {
 135                           	// some handlers do not send async because their callers cannot handle
 136                           	// partial responses. If this is the case, stop here.
 137                           
 138                           	if (isAsync() == false)
 139                           	{
 140                           		// preserve tradional behavior
 141                           		if (isComplete == true)
 142 chip            1.7               {
 143                                       transfer();
 144                                   }
 145                           
 146                                   return;
 147 brian.campbell  1.3       	}
 148                           
 149                           	SimpleResponseHandler *simpleP = dynamic_cast<SimpleResponseHandler*>(this);
 150                           
 151                           	// It is possible to instantiate this class directly (not derived)
 152 chip            1.7       	// The caller would do this only if the operation does not have any data to
 153 brian.campbell  1.3       	// be returned
 154                           
 155                           	if (! simpleP)
 156                           	{
 157                           		// if there is no data to be returned, then the message should NEVER be
 158                           		// incomplete (even on an error)
 159                           		if (isComplete == false)
 160 chip            1.7               {
 161                                       PEGASUS_ASSERT(false);
 162                                   }
 163                           
 164                                   return;
 165 brian.campbell  1.3       	}
 166                           
 167                           	SimpleResponseHandler &simple = *simpleP;
 168                           	PEGASUS_ASSERT(_response);
 169                           	Uint32 objectCount = simple.size();
 170                           
 171                           	// have not reached threshold yet
 172 chip            1.7       	if ((isComplete == false) && (objectCount < _responseObjectThreshold))
 173                               {
 174                                   return;
 175                               }
 176 brian.campbell  1.3       
 177                           	CIMResponseMessage *response = _response;
 178                           
 179                           	// for complete responses, just use the one handed down from caller
 180                           	// otherwise, create our own that the caller never sees but is
 181                           	// utilized for async responses underneath
 182                           
 183                           	if (isComplete == false)
 184 chip            1.7           {
 185                                   _response = _request->buildResponse();
 186                               }
 187 brian.campbell  1.3       
 188                           	_response->setComplete(isComplete);
 189                           	_responseObjectTotal += objectCount;
 190                           
 191                           	// since we are reusing response for every chunk,keep track of original count
 192                           	_response->setIndex(_responseMessageTotal++);
 193                           
 194                           	// set the originally allocated response to one more than the current.
 195                           	// The reason for doing this is proactive in case of an exception. This
 196                           	// allows the last response to be set as it may not re-enter this code.
 197                           
 198                           	if (isComplete == false)
 199 chip            1.7           {
 200                                   response->setIndex(_responseMessageTotal);
 201                               }
 202 brian.campbell  1.3       
 203                           	validate();
 204                           
 205                           	if (_response->cimException.getCode() != CIM_ERR_SUCCESS)
 206 chip            1.7           {
 207                                   simple.clear();
 208                               }
 209                           
 210 brian.campbell  1.3       	String function = getClass() + "::" + "transfer";
 211 chip            1.7       	Logger::put(
 212                                   Logger::STANDARD_LOG,
 213                                   System::CIMSERVER,
 214                                   Logger::TRACE,
 215                                   function);
 216                           
 217 brian.campbell  1.3       	transfer();
 218                           	simple.clear();
 219                           
 220                           	// l10n
 221 chip            1.7       	_response->operationContext.set(ContentLanguageListContainer(simple.getLanguages()));
 222 brian.campbell  1.3       
 223                           	// call thru ProviderManager to get externally declared entry point
 224                           
 225                           	if (isComplete == false)
 226                           	{
 227                           		ProviderManagerService::handleCimResponse(*_request, *_response);
 228                           	}
 229                           
 230                           	// put caller's allocated response back in place. Note that _response
 231                           	// is INVALID after sending because it has been deleted externally
 232                           
 233                           	_response = response;
 234                           }
 235                           
 236 chip            1.7       void OperationResponseHandler::transfer(void)
 237                           {
 238                           }
 239                           
 240                           void OperationResponseHandler::validate(void)
 241                           {
 242                           }
 243                           
 244                           String OperationResponseHandler::getClass(void) const
 245                           {
 246                               return(String("OperationResponseHandler"));
 247                           }
 248                           
 249                           Uint32 OperationResponseHandler::getResponseObjectTotal(void) const
 250                           {
 251                               return(_responseObjectTotal);
 252                           }
 253                           
 254                           Uint32 OperationResponseHandler::getResponseMessageTotal(void) const
 255                           {
 256                               return(_responseMessageTotal);
 257 chip            1.7       }
 258                           
 259                           Uint32 OperationResponseHandler::getResponseObjectThreshold(void) const
 260                           {
 261                               return(_responseObjectThreshold);
 262                           }
 263                           
 264                           //
 265                           // GetInstanceResponseHandler
 266                           //
 267                           
 268                           GetInstanceResponseHandler::GetInstanceResponseHandler(
 269                               CIMGetInstanceRequestMessage * request,
 270                               CIMGetInstanceResponseMessage * response)
 271                               : OperationResponseHandler(request, response)
 272                           {
 273                               #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 274                               // Attempt to get the cached class definition used to validate results of this
 275                               // operation. If it does not exist, then this feature is disabled for this
 276                               // operation.
 277                               CIMClass cimClass;
 278 chip            1.7       
 279                               try
 280                               {
 281                                   CachedClassDefinitionContainer container =
 282                                       request->operationContext.get(CachedClassDefinitionContainer::NAME);
 283                           
 284                                   cimClass = container.getClass();
 285                           
 286                               }
 287                               catch(Exception &)
 288                               {
 289                                   // Do nothing. Container is missing, which implies normalization is disabled
 290                                   // for this operation.
 291                               }
 292                           
 293                               _normalizer =
 294                                   ObjectNormalizer(
 295                                       cimClass,
 296                                       request->includeQualifiers,
 297                                       request->includeClassOrigin);
 298                               #endif
 299 chip            1.7       }
 300                           
 301                           void GetInstanceResponseHandler::deliver(const CIMInstance & cimInstance)
 302                           {
 303                               if(cimInstance.isUninitialized())
 304                               {
 305                                   MessageLoaderParms message(
 306                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 307                                       "The object is not initialized.");
 308                           
 309                                   throw CIMException(CIM_ERR_FAILED, message);
 310                               }
 311                           
 312 chip            1.9           if(SimpleInstanceResponseHandler::size() != 0)
 313                               {
 314                                   MessageLoaderParms message(
 315                                       "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
 316                                       "Too many objects delivered.");
 317                           
 318                                   throw CIMException(CIM_ERR_FAILED, message);
 319                               }
 320                           
 321 chip            1.7           #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 322                               // The normalizer expects an object path embedded in instances even
 323                               // though it is not required by this operation. Use the requested
 324                               // object path is missing from the instance.
 325                               CIMInstance localInstance(cimInstance);
 326                           
 327                               if(localInstance.getPath().getKeyBindings().size() == 0)
 328                               {
 329                                   // ATTN: should clone before modification
 330                                   localInstance.setPath(static_cast<CIMGetInstanceRequestMessage *>(getRequest())->instanceName);
 331                               }
 332                           
 333                               SimpleInstanceResponseHandler::deliver(_normalizer.processInstance(localInstance));
 334                               #else
 335                               SimpleInstanceResponseHandler::deliver(cimInstance);
 336                               #endif
 337                           }
 338                           
 339 chip            1.9       void GetInstanceResponseHandler::complete(void)
 340                           {
 341 chip            1.10          if(SimpleInstanceResponseHandler::size() == 0)
 342 chip            1.9           {
 343                                   MessageLoaderParms message(
 344                                       "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
 345                                       "Too few objects delivered.");
 346                           
 347                                   throw CIMException(CIM_ERR_FAILED, message);
 348                               }
 349                           
 350                               SimpleInstanceResponseHandler::complete();
 351                           }
 352                           
 353 chip            1.7       String GetInstanceResponseHandler::getClass(void) const
 354                           {
 355                               return(String("GetInstanceResponseHandler"));
 356                           }
 357                           
 358                           void GetInstanceResponseHandler::transfer(void)
 359                           {
 360                               if(size() > 0)
 361                               {
 362                                   CIMGetInstanceResponseMessage & msg =
 363                                       *static_cast<CIMGetInstanceResponseMessage *>(getResponse());
 364                           
 365                                   msg.cimInstance = getObjects()[0];
 366                               }
 367                           }
 368                           
 369                           void GetInstanceResponseHandler::validate(void)
 370                           {
 371                               if(getResponseObjectTotal() == 0)
 372                               {
 373                                   // error? provider claims success,
 374 chip            1.7               // but did not deliver an instance.
 375                                   setStatus(CIM_ERR_NOT_FOUND);
 376                               }
 377                           }
 378                           
 379                           //
 380                           // EnumerateInstancesResponseHandler
 381                           //
 382                           
 383                           EnumerateInstancesResponseHandler::EnumerateInstancesResponseHandler(
 384                               CIMEnumerateInstancesRequestMessage * request,
 385                               CIMEnumerateInstancesResponseMessage * response)
 386                               : OperationResponseHandler(request, response)
 387                           {
 388                               #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 389                               // Attempt to get the cached class definition used to validate results of this
 390                               // operation. If it does not exist, then this feature is disabled for this
 391                               // operation.
 392                               CIMClass cimClass;
 393                           
 394                               try
 395 chip            1.7           {
 396                                   CachedClassDefinitionContainer container =
 397                                       request->operationContext.get(CachedClassDefinitionContainer::NAME);
 398                           
 399                                   cimClass = container.getClass();
 400                               }
 401                               catch(Exception &)
 402                               {
 403                                   // Do nothing. Container is missing, which implies normalization is disabled
 404                                   // for this operation.
 405                               }
 406                           
 407                               _normalizer =
 408                                   ObjectNormalizer(
 409                                       cimClass,
 410                                       request->includeQualifiers,
 411                                       request->includeClassOrigin);
 412                               #endif
 413                           }
 414                           
 415                           void EnumerateInstancesResponseHandler::deliver(const CIMInstance & cimInstance)
 416 chip            1.7       {
 417                               if(cimInstance.isUninitialized())
 418                               {
 419                                   MessageLoaderParms message(
 420                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 421                                       "The object is not initialized.");
 422                           
 423                                   throw CIMException(CIM_ERR_FAILED, message);
 424                               }
 425                           
 426                               #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 427                               SimpleInstanceResponseHandler::deliver(_normalizer.processInstance(cimInstance));
 428                               #else
 429                               SimpleInstanceResponseHandler::deliver(cimInstance);
 430                               #endif
 431                           }
 432                           
 433                           String EnumerateInstancesResponseHandler::getClass(void) const
 434                           {
 435                               return(String("EnumerateInstancesResponseHandler"));
 436                           }
 437 chip            1.7       
 438                           void EnumerateInstancesResponseHandler::transfer(void)
 439                           {
 440                               CIMEnumerateInstancesResponseMessage & msg =
 441                                   *static_cast<CIMEnumerateInstancesResponseMessage *>(getResponse());
 442                           
 443                               msg.cimNamedInstances = getObjects();
 444                           }
 445                           
 446                           //
 447                           // EnumerateInstanceNamesResponseHandler
 448                           //
 449                           
 450                           EnumerateInstanceNamesResponseHandler::EnumerateInstanceNamesResponseHandler(
 451                               CIMEnumerateInstanceNamesRequestMessage * request,
 452                               CIMEnumerateInstanceNamesResponseMessage * response)
 453                               : OperationResponseHandler(request, response)
 454                           {
 455                               #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 456                               // Attempt to get the cached class definition used to validate results of this
 457                               // operation. If it does not exist, then this feature is disabled for this
 458 chip            1.7           // operation.
 459                               CIMClass cimClass;
 460                           
 461                               try
 462                               {
 463                                   CachedClassDefinitionContainer container =
 464                                       request->operationContext.get(CachedClassDefinitionContainer::NAME);
 465                           
 466                                   cimClass = container.getClass();
 467                               }
 468                               catch(Exception &)
 469                               {
 470                                   // Do nothing. Container is missing, which implies normalization is disabled
 471                                   // for this operation.
 472                               }
 473                           
 474                               _normalizer =
 475                                   ObjectNormalizer(
 476                                       cimClass,
 477                                       false,
 478                                       false);
 479 chip            1.7           #endif
 480                           }
 481                           
 482                           void EnumerateInstanceNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 483                           {
 484                               if(cimObjectPath.getClassName().isNull())
 485                               {
 486                                   MessageLoaderParms message(
 487                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 488                                       "The object is not initialized.");
 489                           
 490                                   throw CIMException(CIM_ERR_FAILED, message);
 491                               }
 492                           
 493                               #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 494                               SimpleObjectPathResponseHandler::deliver(_normalizer.processInstanceObjectPath(cimObjectPath));
 495                               #else
 496                               SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 497                               #endif
 498                           }
 499                           
 500 chip            1.7       String EnumerateInstanceNamesResponseHandler::getClass(void) const
 501                           {
 502                               return(String("EnumerateInstanceNamesResponseHandler"));
 503                           }
 504                           
 505                           void EnumerateInstanceNamesResponseHandler::transfer(void)
 506                           {
 507                               CIMEnumerateInstanceNamesResponseMessage & msg =
 508                                   *static_cast<CIMEnumerateInstanceNamesResponseMessage *>(getResponse());
 509                           
 510                               msg.instanceNames = getObjects();
 511                           }
 512                           
 513                           //
 514                           // CreateInstanceResponseHandler
 515                           //
 516                           
 517                           CreateInstanceResponseHandler::CreateInstanceResponseHandler(
 518                               CIMCreateInstanceRequestMessage * request,
 519                               CIMCreateInstanceResponseMessage * response)
 520                               : OperationResponseHandler(request, response)
 521 chip            1.7       {
 522                           }
 523                           
 524                           void CreateInstanceResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 525                           {
 526                               if(cimObjectPath.getClassName().isNull())
 527                               {
 528                                   MessageLoaderParms message(
 529                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 530                                       "The object is not initialized.");
 531                           
 532                                   throw CIMException(CIM_ERR_FAILED, message);
 533                               }
 534                           
 535 chip            1.11          if(SimpleObjectPathResponseHandler::size() != 0)
 536                               {
 537                                   MessageLoaderParms message(
 538                                       "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
 539                                       "Too many objects delivered.");
 540                           
 541                                   throw CIMException(CIM_ERR_FAILED, message);
 542                               }
 543                           
 544 chip            1.7           SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 545                           }
 546                           
 547 chip            1.9       void CreateInstanceResponseHandler::complete(void)
 548                           {
 549 chip            1.10          if(SimpleObjectPathResponseHandler::size() == 0)
 550 chip            1.9           {
 551                                   MessageLoaderParms message(
 552                                       "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
 553                                       "Too few objects delivered.");
 554                           
 555                                   throw CIMException(CIM_ERR_FAILED, message);
 556                               }
 557                           
 558                               SimpleObjectPathResponseHandler::complete();
 559                           }
 560                           
 561 chip            1.7       String CreateInstanceResponseHandler::getClass(void) const
 562                           {
 563                               return(String("CreateInstanceResponseHandler"));
 564                           }
 565                           
 566                           #if 0
 567                           // ATTN: is it an error to not return instance name?
 568                           void CreateInstanceResponseHandler::validate(void)
 569                           {
 570                               if(getResponseObjectTotal() == 0)
 571                               {
 572                                   setStatus(CIM_ERR_NOT_FOUND);
 573                               }
 574                           }
 575                           #endif
 576                           
 577                           void CreateInstanceResponseHandler::transfer(void)
 578                           {
 579                               if(size() > 0)
 580                               {
 581                                   CIMCreateInstanceResponseMessage & msg =
 582 chip            1.7                   *static_cast<CIMCreateInstanceResponseMessage *>(getResponse());
 583                           
 584                                   msg.instanceName = getObjects()[0];
 585                               }
 586                           }
 587                           
 588                           //
 589                           // ModifyInstanceResponseHandler
 590                           //
 591                           
 592                           ModifyInstanceResponseHandler::ModifyInstanceResponseHandler(
 593                               CIMModifyInstanceRequestMessage * request,
 594                               CIMModifyInstanceResponseMessage * response)
 595                               : OperationResponseHandler(request, response)
 596                           {
 597                           }
 598                           
 599                           String ModifyInstanceResponseHandler::getClass(void) const
 600                           {
 601                               return(String("ModifyInstanceResponseHandler"));
 602                           }
 603 chip            1.7       
 604                           //
 605                           // DeleteInstanceResponseHandler
 606                           //
 607                           
 608                           DeleteInstanceResponseHandler::DeleteInstanceResponseHandler(
 609                               CIMDeleteInstanceRequestMessage * request,
 610                               CIMDeleteInstanceResponseMessage * response)
 611                               : OperationResponseHandler(request, response)
 612                           {
 613                           }
 614                           
 615                           String DeleteInstanceResponseHandler::getClass(void) const
 616                           {
 617                               return(String("DeleteInstanceResponseHandler"));
 618                           }
 619                           
 620                           //
 621                           // GetPropertyResponseHandler
 622                           //
 623                           
 624 chip            1.7       GetPropertyResponseHandler::GetPropertyResponseHandler(
 625                               CIMGetPropertyRequestMessage * request,
 626                               CIMGetPropertyResponseMessage * response)
 627                               : OperationResponseHandler(request, response)
 628                           {
 629                           }
 630                           
 631                           void GetPropertyResponseHandler::deliver(const CIMValue & cimValue)
 632                           {
 633                               if(cimValue.isNull())
 634                               {
 635                                   MessageLoaderParms message(
 636                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 637                                       "The object is not initialized.");
 638                           
 639                                   throw CIMException(CIM_ERR_FAILED, message);
 640                               }
 641                           
 642                               SimpleValueResponseHandler::deliver(cimValue);
 643                           }
 644                           
 645 chip            1.7       String GetPropertyResponseHandler::getClass(void) const
 646                           {
 647                               return(String("GetPropertyResponseHandler"));
 648                           }
 649                           
 650                           void GetPropertyResponseHandler::transfer(void)
 651                           {
 652                               if(size() > 0)
 653                               {
 654                                   CIMGetPropertyResponseMessage & msg =
 655                                       *static_cast<CIMGetPropertyResponseMessage *>(getResponse());
 656                           
 657                                   msg.value = getObjects()[0];
 658                               }
 659                           }
 660                           
 661                           void GetPropertyResponseHandler::validate(void)
 662                           {
 663                               // error? provider claims success,
 664                               // but did not deliver an instance.
 665                               if(getResponseObjectTotal() == 0)
 666 chip            1.7           {
 667                                   setStatus(CIM_ERR_NOT_FOUND);
 668                               }
 669                           }
 670                           
 671                           //
 672                           // SetPropertyResponseHandler
 673                           //
 674                           
 675                           SetPropertyResponseHandler::SetPropertyResponseHandler(
 676                               CIMSetPropertyRequestMessage * request,
 677                               CIMSetPropertyResponseMessage * response)
 678                               : OperationResponseHandler(request, response)
 679                           {
 680                           }
 681                           
 682                           String SetPropertyResponseHandler::getClass(void) const
 683                           {
 684                               return(String("SetPropertyResponseHandler"));
 685                           }
 686                           
 687 chip            1.7       //
 688                           // ExecQueryResponseHandler
 689                           //
 690                           
 691                           ExecQueryResponseHandler::ExecQueryResponseHandler(
 692                               CIMExecQueryRequestMessage * request,
 693                               CIMExecQueryResponseMessage * response)
 694                               : OperationResponseHandler(request, response)
 695                           {
 696                           }
 697                           
 698                           void ExecQueryResponseHandler::deliver(const CIMInstance & cimInstance)
 699                           {
 700                               if(cimInstance.isUninitialized())
 701                               {
 702                                   MessageLoaderParms message(
 703                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 704                                       "The object is not initialized.");
 705                           
 706                                   throw CIMException(CIM_ERR_FAILED, message);
 707                               }
 708 chip            1.7       
 709                               SimpleInstance2ObjectResponseHandler::deliver(cimInstance);
 710                           }
 711                           
 712                           String ExecQueryResponseHandler::getClass(void) const
 713                           {
 714                               return(String("ExecQueryResponseHandler"));
 715                           }
 716                           
 717                           void ExecQueryResponseHandler::transfer(void)
 718                           {
 719                               CIMExecQueryResponseMessage & msg =
 720                                   *static_cast<CIMExecQueryResponseMessage *>(getResponse());
 721                           
 722                               msg.cimObjects = getObjects();
 723                           }
 724                           
 725                           Boolean ExecQueryResponseHandler::isAsync(void) const
 726                           {
 727                               return(false);
 728                           }
 729 chip            1.7       
 730                           //
 731                           // AssociatorsResponseHandler
 732                           //
 733                           
 734                           AssociatorsResponseHandler::AssociatorsResponseHandler(
 735                               CIMAssociatorsRequestMessage * request,
 736                               CIMAssociatorsResponseMessage * response)
 737                               : OperationResponseHandler(request, response)
 738                           {
 739                           }
 740                           
 741                           void AssociatorsResponseHandler::deliver(const CIMObject & cimObject)
 742                           {
 743                               if(cimObject.isUninitialized())
 744                               {
 745                                   MessageLoaderParms message(
 746                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 747                                       "The object is not initialized.");
 748                           
 749                                   throw CIMException(CIM_ERR_FAILED, message);
 750 chip            1.7           }
 751                           
 752                               SimpleObjectResponseHandler::deliver(cimObject);
 753                           }
 754                           
 755                           String AssociatorsResponseHandler::getClass(void) const
 756                           {
 757                               return(String("AssociatorsResponseHandler"));
 758                           }
 759                           
 760                           void AssociatorsResponseHandler::transfer(void)
 761                           {
 762                               CIMAssociatorsResponseMessage & msg =
 763                                   *static_cast<CIMAssociatorsResponseMessage *>(getResponse());
 764                           
 765                               msg.cimObjects = getObjects();
 766                           }
 767                           
 768                           //
 769                           // AssociatorNamesResponseHandler
 770                           //
 771 chip            1.7       
 772                           AssociatorNamesResponseHandler::AssociatorNamesResponseHandler(
 773                               CIMAssociatorNamesRequestMessage * request,
 774                               CIMAssociatorNamesResponseMessage * response)
 775                               : OperationResponseHandler(request, response)
 776                           {
 777                           }
 778                           
 779                           void AssociatorNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 780                           {
 781                               if(cimObjectPath.getClassName().isNull())
 782                               {
 783                                   MessageLoaderParms message(
 784                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 785                                       "The object is not initialized.");
 786                           
 787                                   throw CIMException(CIM_ERR_FAILED, message);
 788                               }
 789                           
 790                               SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 791                           }
 792 chip            1.7       
 793                           String AssociatorNamesResponseHandler::getClass(void) const
 794                           {
 795                               return(String("AssociatorNamesResponseHandler"));
 796                           }
 797                           
 798                           void AssociatorNamesResponseHandler::transfer(void)
 799                           {
 800                               CIMAssociatorNamesResponseMessage & msg =
 801                                   *static_cast<CIMAssociatorNamesResponseMessage *>(getResponse());
 802                           
 803                               msg.objectNames = getObjects();
 804                           }
 805                           
 806                           //
 807                           // ReferencesResponseHandler
 808                           //
 809                           
 810                           ReferencesResponseHandler::ReferencesResponseHandler(
 811                               CIMReferencesRequestMessage * request,
 812                               CIMReferencesResponseMessage * response)
 813 chip            1.7           : OperationResponseHandler(request, response)
 814                           {
 815                           }
 816                           
 817                           void ReferencesResponseHandler::deliver(const CIMObject & cimObject)
 818                           {
 819                               if(cimObject.isUninitialized())
 820                               {
 821                                   MessageLoaderParms message(
 822                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 823                                       "The object is not initialized.");
 824                           
 825                                   throw CIMException(CIM_ERR_FAILED, message);
 826                               }
 827                           
 828                               SimpleObjectResponseHandler::deliver(cimObject);
 829                           }
 830                           
 831                           String ReferencesResponseHandler::getClass(void) const
 832                           {
 833                               return(String("ReferencesResponseHandler"));
 834 chip            1.7       }
 835                           
 836                           void ReferencesResponseHandler::transfer(void)
 837                           {
 838                               CIMReferencesResponseMessage & msg =
 839                                   *static_cast<CIMReferencesResponseMessage *>(getResponse());
 840                           
 841                               msg.cimObjects = getObjects();
 842                           }
 843                           
 844                           //
 845                           // ReferenceNamesResponseHandler
 846                           //
 847                           
 848                           ReferenceNamesResponseHandler::ReferenceNamesResponseHandler(
 849                               CIMReferenceNamesRequestMessage * request,
 850                               CIMReferenceNamesResponseMessage * response)
 851                               : OperationResponseHandler(request, response)
 852                           {
 853                           }
 854                           
 855 chip            1.7       void ReferenceNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 856                           {
 857                               if(cimObjectPath.getClassName().isNull())
 858                               {
 859                                   MessageLoaderParms message(
 860                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 861                                       "The object is not initialized.");
 862                           
 863                                   throw CIMException(CIM_ERR_FAILED, message);
 864                               }
 865                           
 866                               SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 867                           }
 868                           
 869                           String ReferenceNamesResponseHandler::getClass(void) const
 870                           {
 871                               return(String("ReferenceNamesResponseHandler"));
 872                           }
 873                           
 874                           void ReferenceNamesResponseHandler::transfer(void)
 875                           {
 876 chip            1.7           CIMReferenceNamesResponseMessage & msg =
 877                                   *static_cast<CIMReferenceNamesResponseMessage *>(getResponse());
 878                           
 879                               msg.objectNames = getObjects();
 880                           }
 881                           
 882                           //
 883                           // InvokeMethodResponseHandler
 884                           //
 885                           
 886                           InvokeMethodResponseHandler::InvokeMethodResponseHandler(
 887                               CIMInvokeMethodRequestMessage * request,
 888                               CIMInvokeMethodResponseMessage * response)
 889                               : OperationResponseHandler(request, response)
 890                           {
 891                           }
 892                           
 893                           void InvokeMethodResponseHandler::deliverParamValue(const CIMParamValue & cimParamValue)
 894                           {
 895                               if(cimParamValue.isUninitialized())
 896                               {
 897 chip            1.7               MessageLoaderParms message(
 898                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 899                                       "The object is not initialized.");
 900                           
 901                                   throw CIMException(CIM_ERR_FAILED, message);
 902                               }
 903                           
 904                               SimpleMethodResultResponseHandler::deliverParamValue(cimParamValue);
 905                           }
 906                           
 907                           void InvokeMethodResponseHandler::deliver(const CIMValue & cimValue)
 908                           {
 909                               if(cimValue.isNull())
 910                               {
 911                                   MessageLoaderParms message(
 912                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 913                                       "The object is not initialized.");
 914                           
 915                                   throw CIMException(CIM_ERR_FAILED, message);
 916                               }
 917                           
 918 chip            1.7           SimpleMethodResultResponseHandler::deliver(cimValue);
 919                           }
 920                           
 921                           String InvokeMethodResponseHandler::getClass(void) const
 922                           {
 923                               return(String("InvokeMethodResponseHandler"));
 924                           }
 925                           
 926                           void InvokeMethodResponseHandler::transfer(void)
 927                           {
 928                               CIMInvokeMethodResponseMessage & msg =
 929                                   *static_cast<CIMInvokeMethodResponseMessage *>(getResponse());
 930                           
 931                               msg.outParameters = getParamValues();
 932                           
 933                               // ATTN-RK-20020903: Is it legal for the return value to be null?
 934                               // if not, then the check must be done here since deliver() works off the
 935                               // virtual size, which refers to out parameters!
 936                               msg.retValue = getReturnValue();
 937                           }
 938                           
 939 chip            1.7       //
 940                           // EnableIndicationsResponseHandler
 941                           //
 942                           
 943                           typedef void (*PEGASUS_INDICATION_CALLBACK)(CIMProcessIndicationRequestMessage*);
 944                           
 945                           EnableIndicationsResponseHandler::EnableIndicationsResponseHandler(
 946                               CIMRequestMessage * request,
 947                               CIMResponseMessage * response,
 948                               CIMInstance & provider,
 949                               PEGASUS_INDICATION_CALLBACK indicationCallback)
 950                               : OperationResponseHandler(request, response),
 951                               _indicationCallback(indicationCallback)
 952                           {
 953                               _provider = provider;
 954                           }
 955                           
 956                           void EnableIndicationsResponseHandler::deliver(const CIMIndication & cimIndication)
 957                           {
 958                               OperationContext context;
 959                           
 960 chip            1.7           Array<CIMObjectPath> subscriptionInstanceNames;
 961                           
 962                               context.insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
 963                           
 964                               deliver(context, cimIndication);
 965                           }
 966                           
 967                           void EnableIndicationsResponseHandler::deliver(const OperationContext & context, const CIMIndication & cimIndication)
 968                           {
 969                               if(cimIndication.isUninitialized())
 970                               {
 971                                   MessageLoaderParms message(
 972                                       "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 973                                       "The object is not initialized.");
 974                           
 975                                   throw CIMException(CIM_ERR_FAILED, message);
 976                               }
 977                           
 978                               // ATTN: temporarily convert indication to instance
 979                               CIMInstance cimInstance(cimIndication);
 980                           
 981 chip            1.7           //  Get list of subscription instance names from context
 982                               Array<CIMObjectPath> subscriptionInstanceNames;
 983                           
 984                               try
 985                               {
 986                                   SubscriptionInstanceNamesContainer container =
 987                                       context.get(SubscriptionInstanceNamesContainer::NAME);
 988                           
 989                                   subscriptionInstanceNames = container.getInstanceNames();
 990                               }
 991                               catch(Exception &)
 992                               {
 993                                   subscriptionInstanceNames.clear();
 994                               }
 995                           
 996                               // l10n
 997 a.dunfey        1.11.10.1     ContentLanguageList contentLangs;
 998 chip            1.7       
 999                               try
1000                               {
1001                                   // Get the Content-Language for this indication.  The provider
1002                                   // does not have to add specify a language for the indication.
1003                                   ContentLanguageListContainer langContainer =
1004                                       context.get(ContentLanguageListContainer::NAME);
1005                           
1006                                   contentLangs = langContainer.getLanguages();
1007                               }
1008                               catch(Exception &)
1009                               {
1010                                   // The provider did not explicitly set a Content-Language for
1011                                   // the indication.  Fall back to the lang set in this object.
1012                                   contentLangs = getLanguages();
1013                               }
1014                               // l10n -end
1015                           
1016                               // create message
1017                               // l10n
1018                               CIMProcessIndicationRequestMessage * request =
1019 chip            1.7               new CIMProcessIndicationRequestMessage(
1020                                   XmlWriter::getNextMessageId(),
1021                                   cimInstance.getPath().getNameSpace(),
1022                                   cimInstance,
1023                                   subscriptionInstanceNames,
1024                                   _provider,
1025                                   QueueIdStack());  // Must be filled in by the callback function
1026                           
1027                               request->operationContext = context;
1028                           
1029                               try
1030                               {
1031                                   request->operationContext.set(ContentLanguageListContainer(contentLangs));
1032                               }
1033                               catch(Exception &)
1034                               {
1035                                   request->operationContext.insert(ContentLanguageListContainer(contentLangs));
1036                               }
1037                           
1038                               _indicationCallback(request);
1039                           }
1040 chip            1.7       
1041                           void EnableIndicationsResponseHandler::deliver(const Array<CIMIndication> & cimIndications)
1042                           {
1043                               OperationContext context;
1044                           
1045                               deliver(context, cimIndications);
1046                           }
1047                           
1048                           void EnableIndicationsResponseHandler::deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
1049                           {
1050                               for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
1051                               {
1052                                   deliver(context, cimIndications[i]);
1053                               }
1054                           }
1055                           
1056                           String EnableIndicationsResponseHandler::getClass(void) const
1057                           {
1058                               return(String("EnableIndicationsResponseHandler"));
1059                           }
1060                           
1061 chip            1.7       Boolean EnableIndicationsResponseHandler::isAsync(void) const
1062                           {
1063                               return(false);
1064                           }
1065                           
1066 schuur          1.1       PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2