(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                         const ContentLanguages & langs,
 116                         const String & message)
 117 chip            1.7 {
 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 a.dunfey        1.11.8.1     
 279                              CIMRepository * repository = 0;
 280 chip            1.7      
 281                              try
 282                              {
 283                                  CachedClassDefinitionContainer container =
 284                                      request->operationContext.get(CachedClassDefinitionContainer::NAME);
 285                          
 286                                  cimClass = container.getClass();
 287 a.dunfey        1.11.8.1 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 288                                  RepositoryContainer repContainer =
 289                                      request->operationContext.get(RepositoryContainer::NAME);
 290                                  repository = repContainer.getRepository();
 291                          #endif //PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 292 chip            1.7          }
 293                              catch(Exception &)
 294                              {
 295                                  // Do nothing. Container is missing, which implies normalization is disabled
 296                                  // for this operation.
 297                              }
 298                          
 299                              _normalizer =
 300                                  ObjectNormalizer(
 301                                      cimClass,
 302                                      request->includeQualifiers,
 303 a.dunfey        1.11.8.1             request->includeClassOrigin,
 304                                      request->nameSpace,
 305                                      repository);
 306 chip            1.7          #endif
 307                          }
 308                          
 309                          void GetInstanceResponseHandler::deliver(const CIMInstance & cimInstance)
 310                          {
 311                              if(cimInstance.isUninitialized())
 312                              {
 313                                  MessageLoaderParms message(
 314                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 315                                      "The object is not initialized.");
 316                          
 317                                  throw CIMException(CIM_ERR_FAILED, message);
 318                              }
 319                          
 320 chip            1.9          if(SimpleInstanceResponseHandler::size() != 0)
 321                              {
 322                                  MessageLoaderParms message(
 323                                      "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
 324                                      "Too many objects delivered.");
 325                          
 326                                  throw CIMException(CIM_ERR_FAILED, message);
 327                              }
 328                          
 329 chip            1.7          #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 330                              // The normalizer expects an object path embedded in instances even
 331                              // though it is not required by this operation. Use the requested
 332                              // object path is missing from the instance.
 333                              CIMInstance localInstance(cimInstance);
 334                          
 335                              if(localInstance.getPath().getKeyBindings().size() == 0)
 336                              {
 337                                  // ATTN: should clone before modification
 338                                  localInstance.setPath(static_cast<CIMGetInstanceRequestMessage *>(getRequest())->instanceName);
 339                              }
 340                          
 341                              SimpleInstanceResponseHandler::deliver(_normalizer.processInstance(localInstance));
 342                              #else
 343                              SimpleInstanceResponseHandler::deliver(cimInstance);
 344                              #endif
 345                          }
 346                          
 347 chip            1.9      void GetInstanceResponseHandler::complete(void)
 348                          {
 349 chip            1.10         if(SimpleInstanceResponseHandler::size() == 0)
 350 chip            1.9          {
 351                                  MessageLoaderParms message(
 352                                      "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
 353                                      "Too few objects delivered.");
 354                          
 355                                  throw CIMException(CIM_ERR_FAILED, message);
 356                              }
 357                          
 358                              SimpleInstanceResponseHandler::complete();
 359                          }
 360                          
 361 chip            1.7      String GetInstanceResponseHandler::getClass(void) const
 362                          {
 363                              return(String("GetInstanceResponseHandler"));
 364                          }
 365                          
 366                          void GetInstanceResponseHandler::transfer(void)
 367                          {
 368                              if(size() > 0)
 369                              {
 370                                  CIMGetInstanceResponseMessage & msg =
 371                                      *static_cast<CIMGetInstanceResponseMessage *>(getResponse());
 372                          
 373                                  msg.cimInstance = getObjects()[0];
 374                              }
 375                          }
 376                          
 377                          void GetInstanceResponseHandler::validate(void)
 378                          {
 379                              if(getResponseObjectTotal() == 0)
 380                              {
 381                                  // error? provider claims success,
 382 chip            1.7              // but did not deliver an instance.
 383                                  setStatus(CIM_ERR_NOT_FOUND);
 384                              }
 385                          }
 386                          
 387                          //
 388                          // EnumerateInstancesResponseHandler
 389                          //
 390                          
 391                          EnumerateInstancesResponseHandler::EnumerateInstancesResponseHandler(
 392                              CIMEnumerateInstancesRequestMessage * request,
 393                              CIMEnumerateInstancesResponseMessage * response)
 394                              : OperationResponseHandler(request, response)
 395                          {
 396                              #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 397                              // Attempt to get the cached class definition used to validate results of this
 398                              // operation. If it does not exist, then this feature is disabled for this
 399                              // operation.
 400                              CIMClass cimClass;
 401 a.dunfey        1.11.8.1     CIMRepository * repository = 0;
 402 chip            1.7      
 403                              try
 404                              {
 405                                  CachedClassDefinitionContainer container =
 406                                      request->operationContext.get(CachedClassDefinitionContainer::NAME);
 407                          
 408                                  cimClass = container.getClass();
 409 a.dunfey        1.11.8.1 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 410                                  RepositoryContainer repContainer =
 411                                      request->operationContext.get(RepositoryContainer::NAME);
 412                                  repository = repContainer.getRepository();
 413                          #endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 414 chip            1.7          }
 415                              catch(Exception &)
 416                              {
 417                                  // Do nothing. Container is missing, which implies normalization is disabled
 418                                  // for this operation.
 419                              }
 420                          
 421                              _normalizer =
 422                                  ObjectNormalizer(
 423                                      cimClass,
 424                                      request->includeQualifiers,
 425 a.dunfey        1.11.8.1             request->includeClassOrigin,
 426                                      request->nameSpace,
 427                                      repository);
 428 chip            1.7          #endif
 429                          }
 430                          
 431                          void EnumerateInstancesResponseHandler::deliver(const CIMInstance & cimInstance)
 432                          {
 433                              if(cimInstance.isUninitialized())
 434                              {
 435                                  MessageLoaderParms message(
 436                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 437                                      "The object is not initialized.");
 438                          
 439                                  throw CIMException(CIM_ERR_FAILED, message);
 440                              }
 441                          
 442                              #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 443                              SimpleInstanceResponseHandler::deliver(_normalizer.processInstance(cimInstance));
 444                              #else
 445                              SimpleInstanceResponseHandler::deliver(cimInstance);
 446                              #endif
 447                          }
 448                          
 449 chip            1.7      String EnumerateInstancesResponseHandler::getClass(void) const
 450                          {
 451                              return(String("EnumerateInstancesResponseHandler"));
 452                          }
 453                          
 454                          void EnumerateInstancesResponseHandler::transfer(void)
 455                          {
 456                              CIMEnumerateInstancesResponseMessage & msg =
 457                                  *static_cast<CIMEnumerateInstancesResponseMessage *>(getResponse());
 458                          
 459                              msg.cimNamedInstances = getObjects();
 460                          }
 461                          
 462                          //
 463                          // EnumerateInstanceNamesResponseHandler
 464                          //
 465                          
 466                          EnumerateInstanceNamesResponseHandler::EnumerateInstanceNamesResponseHandler(
 467                              CIMEnumerateInstanceNamesRequestMessage * request,
 468                              CIMEnumerateInstanceNamesResponseMessage * response)
 469                              : OperationResponseHandler(request, response)
 470 chip            1.7      {
 471                              #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 472                              // Attempt to get the cached class definition used to validate results of this
 473                              // operation. If it does not exist, then this feature is disabled for this
 474                              // operation.
 475                              CIMClass cimClass;
 476 a.dunfey        1.11.8.1     CIMRepository * repository = 0;
 477 chip            1.7      
 478                              try
 479                              {
 480                                  CachedClassDefinitionContainer container =
 481                                      request->operationContext.get(CachedClassDefinitionContainer::NAME);
 482                          
 483                                  cimClass = container.getClass();
 484 a.dunfey        1.11.8.1 #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 485                                  RepositoryContainer repContainer =
 486                                      request->operationContext.get(RepositoryContainer::NAME);
 487                                  repository = repContainer.getRepository();
 488                          #endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 489 chip            1.7          }
 490                              catch(Exception &)
 491                              {
 492                                  // Do nothing. Container is missing, which implies normalization is disabled
 493                                  // for this operation.
 494                              }
 495                          
 496                              _normalizer =
 497                                  ObjectNormalizer(
 498                                      cimClass,
 499                                      false,
 500 a.dunfey        1.11.8.1             false,
 501                                      request->nameSpace,
 502                                      repository);
 503 chip            1.7          #endif
 504                          }
 505                          
 506                          void EnumerateInstanceNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 507                          {
 508                              if(cimObjectPath.getClassName().isNull())
 509                              {
 510                                  MessageLoaderParms message(
 511                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 512                                      "The object is not initialized.");
 513                          
 514                                  throw CIMException(CIM_ERR_FAILED, message);
 515                              }
 516                          
 517                              #ifdef PEGASUS_ENABLE_OBJECT_NORMALIZATION
 518                              SimpleObjectPathResponseHandler::deliver(_normalizer.processInstanceObjectPath(cimObjectPath));
 519                              #else
 520                              SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 521                              #endif
 522                          }
 523                          
 524 chip            1.7      String EnumerateInstanceNamesResponseHandler::getClass(void) const
 525                          {
 526                              return(String("EnumerateInstanceNamesResponseHandler"));
 527                          }
 528                          
 529                          void EnumerateInstanceNamesResponseHandler::transfer(void)
 530                          {
 531                              CIMEnumerateInstanceNamesResponseMessage & msg =
 532                                  *static_cast<CIMEnumerateInstanceNamesResponseMessage *>(getResponse());
 533                          
 534                              msg.instanceNames = getObjects();
 535                          }
 536                          
 537                          //
 538                          // CreateInstanceResponseHandler
 539                          //
 540                          
 541                          CreateInstanceResponseHandler::CreateInstanceResponseHandler(
 542                              CIMCreateInstanceRequestMessage * request,
 543                              CIMCreateInstanceResponseMessage * response)
 544                              : OperationResponseHandler(request, response)
 545 chip            1.7      {
 546                          }
 547                          
 548                          void CreateInstanceResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 549                          {
 550                              if(cimObjectPath.getClassName().isNull())
 551                              {
 552                                  MessageLoaderParms message(
 553                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 554                                      "The object is not initialized.");
 555                          
 556                                  throw CIMException(CIM_ERR_FAILED, message);
 557                              }
 558                          
 559 chip            1.11         if(SimpleObjectPathResponseHandler::size() != 0)
 560                              {
 561                                  MessageLoaderParms message(
 562                                      "Server.OperationResponseHandler.TOO_MANY_OBJECTS_DELIVERED",
 563                                      "Too many objects delivered.");
 564                          
 565                                  throw CIMException(CIM_ERR_FAILED, message);
 566                              }
 567                          
 568 chip            1.7          SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 569                          }
 570                          
 571 chip            1.9      void CreateInstanceResponseHandler::complete(void)
 572                          {
 573 chip            1.10         if(SimpleObjectPathResponseHandler::size() == 0)
 574 chip            1.9          {
 575                                  MessageLoaderParms message(
 576                                      "Server.OperationResponseHandler.TOO_FEW_OBJECTS_DELIVERED",
 577                                      "Too few objects delivered.");
 578                          
 579                                  throw CIMException(CIM_ERR_FAILED, message);
 580                              }
 581                          
 582                              SimpleObjectPathResponseHandler::complete();
 583                          }
 584                          
 585 chip            1.7      String CreateInstanceResponseHandler::getClass(void) const
 586                          {
 587                              return(String("CreateInstanceResponseHandler"));
 588                          }
 589                          
 590                          #if 0
 591                          // ATTN: is it an error to not return instance name?
 592                          void CreateInstanceResponseHandler::validate(void)
 593                          {
 594                              if(getResponseObjectTotal() == 0)
 595                              {
 596                                  setStatus(CIM_ERR_NOT_FOUND);
 597                              }
 598                          }
 599                          #endif
 600                          
 601                          void CreateInstanceResponseHandler::transfer(void)
 602                          {
 603                              if(size() > 0)
 604                              {
 605                                  CIMCreateInstanceResponseMessage & msg =
 606 chip            1.7                  *static_cast<CIMCreateInstanceResponseMessage *>(getResponse());
 607                          
 608                                  msg.instanceName = getObjects()[0];
 609                              }
 610                          }
 611                          
 612                          //
 613                          // ModifyInstanceResponseHandler
 614                          //
 615                          
 616                          ModifyInstanceResponseHandler::ModifyInstanceResponseHandler(
 617                              CIMModifyInstanceRequestMessage * request,
 618                              CIMModifyInstanceResponseMessage * response)
 619                              : OperationResponseHandler(request, response)
 620                          {
 621                          }
 622                          
 623                          String ModifyInstanceResponseHandler::getClass(void) const
 624                          {
 625                              return(String("ModifyInstanceResponseHandler"));
 626                          }
 627 chip            1.7      
 628                          //
 629                          // DeleteInstanceResponseHandler
 630                          //
 631                          
 632                          DeleteInstanceResponseHandler::DeleteInstanceResponseHandler(
 633                              CIMDeleteInstanceRequestMessage * request,
 634                              CIMDeleteInstanceResponseMessage * response)
 635                              : OperationResponseHandler(request, response)
 636                          {
 637                          }
 638                          
 639                          String DeleteInstanceResponseHandler::getClass(void) const
 640                          {
 641                              return(String("DeleteInstanceResponseHandler"));
 642                          }
 643                          
 644                          //
 645                          // GetPropertyResponseHandler
 646                          //
 647                          
 648 chip            1.7      GetPropertyResponseHandler::GetPropertyResponseHandler(
 649                              CIMGetPropertyRequestMessage * request,
 650                              CIMGetPropertyResponseMessage * response)
 651                              : OperationResponseHandler(request, response)
 652                          {
 653                          }
 654                          
 655                          void GetPropertyResponseHandler::deliver(const CIMValue & cimValue)
 656                          {
 657                              if(cimValue.isNull())
 658                              {
 659                                  MessageLoaderParms message(
 660                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 661                                      "The object is not initialized.");
 662                          
 663                                  throw CIMException(CIM_ERR_FAILED, message);
 664                              }
 665                          
 666                              SimpleValueResponseHandler::deliver(cimValue);
 667                          }
 668                          
 669 chip            1.7      String GetPropertyResponseHandler::getClass(void) const
 670                          {
 671                              return(String("GetPropertyResponseHandler"));
 672                          }
 673                          
 674                          void GetPropertyResponseHandler::transfer(void)
 675                          {
 676                              if(size() > 0)
 677                              {
 678                                  CIMGetPropertyResponseMessage & msg =
 679                                      *static_cast<CIMGetPropertyResponseMessage *>(getResponse());
 680                          
 681                                  msg.value = getObjects()[0];
 682                              }
 683                          }
 684                          
 685                          void GetPropertyResponseHandler::validate(void)
 686                          {
 687                              // error? provider claims success,
 688                              // but did not deliver an instance.
 689                              if(getResponseObjectTotal() == 0)
 690 chip            1.7          {
 691                                  setStatus(CIM_ERR_NOT_FOUND);
 692                              }
 693                          }
 694                          
 695                          //
 696                          // SetPropertyResponseHandler
 697                          //
 698                          
 699                          SetPropertyResponseHandler::SetPropertyResponseHandler(
 700                              CIMSetPropertyRequestMessage * request,
 701                              CIMSetPropertyResponseMessage * response)
 702                              : OperationResponseHandler(request, response)
 703                          {
 704                          }
 705                          
 706                          String SetPropertyResponseHandler::getClass(void) const
 707                          {
 708                              return(String("SetPropertyResponseHandler"));
 709                          }
 710                          
 711 chip            1.7      //
 712                          // ExecQueryResponseHandler
 713                          //
 714                          
 715                          ExecQueryResponseHandler::ExecQueryResponseHandler(
 716                              CIMExecQueryRequestMessage * request,
 717                              CIMExecQueryResponseMessage * response)
 718                              : OperationResponseHandler(request, response)
 719                          {
 720                          }
 721                          
 722                          void ExecQueryResponseHandler::deliver(const CIMInstance & cimInstance)
 723                          {
 724                              if(cimInstance.isUninitialized())
 725                              {
 726                                  MessageLoaderParms message(
 727                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 728                                      "The object is not initialized.");
 729                          
 730                                  throw CIMException(CIM_ERR_FAILED, message);
 731                              }
 732 chip            1.7      
 733                              SimpleInstance2ObjectResponseHandler::deliver(cimInstance);
 734                          }
 735                          
 736                          String ExecQueryResponseHandler::getClass(void) const
 737                          {
 738                              return(String("ExecQueryResponseHandler"));
 739                          }
 740                          
 741                          void ExecQueryResponseHandler::transfer(void)
 742                          {
 743                              CIMExecQueryResponseMessage & msg =
 744                                  *static_cast<CIMExecQueryResponseMessage *>(getResponse());
 745                          
 746                              msg.cimObjects = getObjects();
 747                          }
 748                          
 749                          Boolean ExecQueryResponseHandler::isAsync(void) const
 750                          {
 751                              return(false);
 752                          }
 753 chip            1.7      
 754                          //
 755                          // AssociatorsResponseHandler
 756                          //
 757                          
 758                          AssociatorsResponseHandler::AssociatorsResponseHandler(
 759                              CIMAssociatorsRequestMessage * request,
 760                              CIMAssociatorsResponseMessage * response)
 761                              : OperationResponseHandler(request, response)
 762                          {
 763                          }
 764                          
 765                          void AssociatorsResponseHandler::deliver(const CIMObject & cimObject)
 766                          {
 767                              if(cimObject.isUninitialized())
 768                              {
 769                                  MessageLoaderParms message(
 770                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 771                                      "The object is not initialized.");
 772                          
 773                                  throw CIMException(CIM_ERR_FAILED, message);
 774 chip            1.7          }
 775                          
 776                              SimpleObjectResponseHandler::deliver(cimObject);
 777                          }
 778                          
 779                          String AssociatorsResponseHandler::getClass(void) const
 780                          {
 781                              return(String("AssociatorsResponseHandler"));
 782                          }
 783                          
 784                          void AssociatorsResponseHandler::transfer(void)
 785                          {
 786                              CIMAssociatorsResponseMessage & msg =
 787                                  *static_cast<CIMAssociatorsResponseMessage *>(getResponse());
 788                          
 789                              msg.cimObjects = getObjects();
 790                          }
 791                          
 792                          //
 793                          // AssociatorNamesResponseHandler
 794                          //
 795 chip            1.7      
 796                          AssociatorNamesResponseHandler::AssociatorNamesResponseHandler(
 797                              CIMAssociatorNamesRequestMessage * request,
 798                              CIMAssociatorNamesResponseMessage * response)
 799                              : OperationResponseHandler(request, response)
 800                          {
 801                          }
 802                          
 803                          void AssociatorNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 804                          {
 805                              if(cimObjectPath.getClassName().isNull())
 806                              {
 807                                  MessageLoaderParms message(
 808                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 809                                      "The object is not initialized.");
 810                          
 811                                  throw CIMException(CIM_ERR_FAILED, message);
 812                              }
 813                          
 814                              SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 815                          }
 816 chip            1.7      
 817                          String AssociatorNamesResponseHandler::getClass(void) const
 818                          {
 819                              return(String("AssociatorNamesResponseHandler"));
 820                          }
 821                          
 822                          void AssociatorNamesResponseHandler::transfer(void)
 823                          {
 824                              CIMAssociatorNamesResponseMessage & msg =
 825                                  *static_cast<CIMAssociatorNamesResponseMessage *>(getResponse());
 826                          
 827                              msg.objectNames = getObjects();
 828                          }
 829                          
 830                          //
 831                          // ReferencesResponseHandler
 832                          //
 833                          
 834                          ReferencesResponseHandler::ReferencesResponseHandler(
 835                              CIMReferencesRequestMessage * request,
 836                              CIMReferencesResponseMessage * response)
 837 chip            1.7          : OperationResponseHandler(request, response)
 838                          {
 839                          }
 840                          
 841                          void ReferencesResponseHandler::deliver(const CIMObject & cimObject)
 842                          {
 843                              if(cimObject.isUninitialized())
 844                              {
 845                                  MessageLoaderParms message(
 846                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 847                                      "The object is not initialized.");
 848                          
 849                                  throw CIMException(CIM_ERR_FAILED, message);
 850                              }
 851                          
 852                              SimpleObjectResponseHandler::deliver(cimObject);
 853                          }
 854                          
 855                          String ReferencesResponseHandler::getClass(void) const
 856                          {
 857                              return(String("ReferencesResponseHandler"));
 858 chip            1.7      }
 859                          
 860                          void ReferencesResponseHandler::transfer(void)
 861                          {
 862                              CIMReferencesResponseMessage & msg =
 863                                  *static_cast<CIMReferencesResponseMessage *>(getResponse());
 864                          
 865                              msg.cimObjects = getObjects();
 866                          }
 867                          
 868                          //
 869                          // ReferenceNamesResponseHandler
 870                          //
 871                          
 872                          ReferenceNamesResponseHandler::ReferenceNamesResponseHandler(
 873                              CIMReferenceNamesRequestMessage * request,
 874                              CIMReferenceNamesResponseMessage * response)
 875                              : OperationResponseHandler(request, response)
 876                          {
 877                          }
 878                          
 879 chip            1.7      void ReferenceNamesResponseHandler::deliver(const CIMObjectPath & cimObjectPath)
 880                          {
 881                              if(cimObjectPath.getClassName().isNull())
 882                              {
 883                                  MessageLoaderParms message(
 884                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 885                                      "The object is not initialized.");
 886                          
 887                                  throw CIMException(CIM_ERR_FAILED, message);
 888                              }
 889                          
 890                              SimpleObjectPathResponseHandler::deliver(cimObjectPath);
 891                          }
 892                          
 893                          String ReferenceNamesResponseHandler::getClass(void) const
 894                          {
 895                              return(String("ReferenceNamesResponseHandler"));
 896                          }
 897                          
 898                          void ReferenceNamesResponseHandler::transfer(void)
 899                          {
 900 chip            1.7          CIMReferenceNamesResponseMessage & msg =
 901                                  *static_cast<CIMReferenceNamesResponseMessage *>(getResponse());
 902                          
 903                              msg.objectNames = getObjects();
 904                          }
 905                          
 906                          //
 907                          // InvokeMethodResponseHandler
 908                          //
 909                          
 910                          InvokeMethodResponseHandler::InvokeMethodResponseHandler(
 911                              CIMInvokeMethodRequestMessage * request,
 912                              CIMInvokeMethodResponseMessage * response)
 913                              : OperationResponseHandler(request, response)
 914                          {
 915                          }
 916                          
 917                          void InvokeMethodResponseHandler::deliverParamValue(const CIMParamValue & cimParamValue)
 918                          {
 919                              if(cimParamValue.isUninitialized())
 920                              {
 921 chip            1.7              MessageLoaderParms message(
 922                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 923                                      "The object is not initialized.");
 924                          
 925                                  throw CIMException(CIM_ERR_FAILED, message);
 926                              }
 927                          
 928                              SimpleMethodResultResponseHandler::deliverParamValue(cimParamValue);
 929                          }
 930                          
 931                          void InvokeMethodResponseHandler::deliver(const CIMValue & cimValue)
 932                          {
 933                              if(cimValue.isNull())
 934                              {
 935                                  MessageLoaderParms message(
 936                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 937                                      "The object is not initialized.");
 938                          
 939                                  throw CIMException(CIM_ERR_FAILED, message);
 940                              }
 941                          
 942 chip            1.7          SimpleMethodResultResponseHandler::deliver(cimValue);
 943                          }
 944                          
 945                          String InvokeMethodResponseHandler::getClass(void) const
 946                          {
 947                              return(String("InvokeMethodResponseHandler"));
 948                          }
 949                          
 950                          void InvokeMethodResponseHandler::transfer(void)
 951                          {
 952                              CIMInvokeMethodResponseMessage & msg =
 953                                  *static_cast<CIMInvokeMethodResponseMessage *>(getResponse());
 954                          
 955                              msg.outParameters = getParamValues();
 956                          
 957                              // ATTN-RK-20020903: Is it legal for the return value to be null?
 958                              // if not, then the check must be done here since deliver() works off the
 959                              // virtual size, which refers to out parameters!
 960                              msg.retValue = getReturnValue();
 961                          }
 962                          
 963 chip            1.7      //
 964                          // EnableIndicationsResponseHandler
 965                          //
 966                          
 967                          typedef void (*PEGASUS_INDICATION_CALLBACK)(CIMProcessIndicationRequestMessage*);
 968                          
 969                          EnableIndicationsResponseHandler::EnableIndicationsResponseHandler(
 970                              CIMRequestMessage * request,
 971                              CIMResponseMessage * response,
 972                              CIMInstance & provider,
 973                              PEGASUS_INDICATION_CALLBACK indicationCallback)
 974                              : OperationResponseHandler(request, response),
 975                              _indicationCallback(indicationCallback)
 976                          {
 977                              _provider = provider;
 978                          }
 979                          
 980                          void EnableIndicationsResponseHandler::deliver(const CIMIndication & cimIndication)
 981                          {
 982                              OperationContext context;
 983                          
 984 chip            1.7          Array<CIMObjectPath> subscriptionInstanceNames;
 985                          
 986                              context.insert(SubscriptionInstanceNamesContainer(subscriptionInstanceNames));
 987                          
 988                              deliver(context, cimIndication);
 989                          }
 990                          
 991                          void EnableIndicationsResponseHandler::deliver(const OperationContext & context, const CIMIndication & cimIndication)
 992                          {
 993                              if(cimIndication.isUninitialized())
 994                              {
 995                                  MessageLoaderParms message(
 996                                      "Common.Exception.UNINITIALIZED_OBJECT_EXCEPTION",
 997                                      "The object is not initialized.");
 998                          
 999                                  throw CIMException(CIM_ERR_FAILED, message);
1000                              }
1001                          
1002                              // ATTN: temporarily convert indication to instance
1003                              CIMInstance cimInstance(cimIndication);
1004                          
1005 chip            1.7          //  Get list of subscription instance names from context
1006                              Array<CIMObjectPath> subscriptionInstanceNames;
1007                          
1008                              try
1009                              {
1010                                  SubscriptionInstanceNamesContainer container =
1011                                      context.get(SubscriptionInstanceNamesContainer::NAME);
1012                          
1013                                  subscriptionInstanceNames = container.getInstanceNames();
1014                              }
1015                              catch(Exception &)
1016                              {
1017                                  subscriptionInstanceNames.clear();
1018                              }
1019                          
1020                              // l10n
1021                              ContentLanguages contentLangs;
1022                          
1023                              try
1024                              {
1025                                  // Get the Content-Language for this indication.  The provider
1026 chip            1.7              // does not have to add specify a language for the indication.
1027                                  ContentLanguageListContainer langContainer =
1028                                      context.get(ContentLanguageListContainer::NAME);
1029                          
1030                                  contentLangs = langContainer.getLanguages();
1031                              }
1032                              catch(Exception &)
1033                              {
1034                                  // The provider did not explicitly set a Content-Language for
1035                                  // the indication.  Fall back to the lang set in this object.
1036                                  contentLangs = getLanguages();
1037                              }
1038                              // l10n -end
1039                          
1040                              // create message
1041                              // l10n
1042                              CIMProcessIndicationRequestMessage * request =
1043                                  new CIMProcessIndicationRequestMessage(
1044                                  XmlWriter::getNextMessageId(),
1045                                  cimInstance.getPath().getNameSpace(),
1046                                  cimInstance,
1047 chip            1.7              subscriptionInstanceNames,
1048                                  _provider,
1049                                  QueueIdStack());  // Must be filled in by the callback function
1050                          
1051                              request->operationContext = context;
1052                          
1053                              try
1054                              {
1055                                  request->operationContext.set(ContentLanguageListContainer(contentLangs));
1056                              }
1057                              catch(Exception &)
1058                              {
1059                                  request->operationContext.insert(ContentLanguageListContainer(contentLangs));
1060                              }
1061                          
1062                              _indicationCallback(request);
1063                          }
1064                          
1065                          void EnableIndicationsResponseHandler::deliver(const Array<CIMIndication> & cimIndications)
1066                          {
1067                              OperationContext context;
1068 chip            1.7      
1069                              deliver(context, cimIndications);
1070                          }
1071                          
1072                          void EnableIndicationsResponseHandler::deliver(const OperationContext & context, const Array<CIMIndication> & cimIndications)
1073                          {
1074                              for(Uint32 i = 0, n = cimIndications.size(); i < n; i++)
1075                              {
1076                                  deliver(context, cimIndications[i]);
1077                              }
1078                          }
1079                          
1080                          String EnableIndicationsResponseHandler::getClass(void) const
1081                          {
1082                              return(String("EnableIndicationsResponseHandler"));
1083                          }
1084                          
1085                          Boolean EnableIndicationsResponseHandler::isAsync(void) const
1086                          {
1087                              return(false);
1088                          }
1089 chip            1.7      
1090 schuur          1.1      PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2