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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2