(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 s.kodali       1.25.12.1 #include <Pegasus/Config/ConfigManager.h>
  41 chip           1.7       
  42 schuur         1.1       PEGASUS_NAMESPACE_BEGIN
  43                          
  44 s.kodali       1.25.12.1 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                                  CIMClass cimClass;
  56                                  CachedClassDefinitionContainer container =
  57                                      request->operationContext.get(
  58                                          CachedClassDefinitionContainer::NAME);
  59                                  cimClass = container.getClass();
  60                                  SharedPtr<NormalizerContext> tmpContext(new CIMOMHandleContext());
  61                                  ObjectNormalizer tmpNormalizer(
  62                                      cimClass,
  63                                      includeQualifiers,
  64                                      includeClassOrigin,
  65 s.kodali       1.25.12.1             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 s.kodali       1.25.12.1     _initializeNormalizer(
 317                                  request,
 318 a.dunfey       1.15              request->includeQualifiers,
 319                                  request->includeClassOrigin,
 320 s.kodali       1.25.12.1         _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 s.kodali       1.25.12.1     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 s.kodali       1.25.12.1 #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                                  msg.cimInstance = getObjects()[0];
 387                              }
 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 s.kodali       1.25.12.1     _initializeNormalizer(
 411                                  request,
 412 a.dunfey       1.15              request->includeQualifiers,
 413                                  request->includeClassOrigin,
 414 s.kodali       1.25.12.1         _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                              msg.cimNamedInstances = getObjects();
 443                          }
 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 s.kodali       1.25.12.1     _initializeNormalizer(
 456                                  request,
 457 a.dunfey       1.15              false,
 458                                  false,
 459 s.kodali       1.25.12.1         _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