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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2