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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2