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

   1 kumpf 1.1 //%2006////////////////////////////////////////////////////////////////////////
   2           //
   3           // 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           // IBM Corp.; EMC Corporation, The Open Group.
   7           // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8           // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9           // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10           // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11           // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  12           // EMC Corporation; Symantec Corporation; The Open Group.
  13           //
  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           // 
  21           // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  22 kumpf 1.1 // 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 "ProviderMessageHandler.h"
  35           
  36           #include <Pegasus/Common/OperationContextInternal.h>
  37           #include <Pegasus/Common/Tracer.h>
  38           #include <Pegasus/Common/StatisticalData.h>
  39           #include <Pegasus/Common/Logger.h>
  40           #include <Pegasus/Common/MessageLoader.h>
  41           #include <Pegasus/Common/Constants.h>
  42           
  43 kumpf 1.1 #include <Pegasus/Provider/CIMInstanceQueryProvider.h>
  44           #include <Pegasus/Provider/CIMAssociationProvider.h>
  45           #include <Pegasus/Provider/CIMMethodProvider.h>
  46           #include <Pegasus/Provider/CIMIndicationProvider.h>
  47           #include <Pegasus/Provider/CIMIndicationConsumerProvider.h>
  48           
  49           #include <Pegasus/Query/QueryExpression/QueryExpression.h>
  50           #include <Pegasus/ProviderManager2/QueryExpressionFactory.h>
  51           
  52           #include <Pegasus/ProviderManager2/SimpleResponseHandler.h>
  53           #include <Pegasus/ProviderManager2/OperationResponseHandler.h>
  54           #include <Pegasus/ProviderManager2/AutoPThreadSecurity.h>
  55           
  56           #define HandleCatch(handler)                                                   \
  57           catch (CIMException& e)                                                        \
  58           {                                                                              \
  59               PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,                      \
  60                   "Exception: " + e.getMessage());                                       \
  61               handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage());   \
  62           }                                                                              \
  63           catch (Exception& e)                                                           \
  64 kumpf 1.1 {                                                                              \
  65               PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,                      \
  66                   "Exception: " + e.getMessage());                                       \
  67               handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage());\
  68           }                                                                              \
  69           catch (...)                                                                    \
  70           {                                                                              \
  71               PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,                      \
  72                   "Exception: Unknown");                                                 \
  73               handler.setStatus(CIM_ERR_FAILED, "Unknown error.");                       \
  74           }
  75           
  76           
  77           PEGASUS_NAMESPACE_BEGIN
  78           
  79           // auto variable to protect provider during operations
  80           class pm_service_op_lock
  81           {
  82           public:
  83               pm_service_op_lock(ProviderStatus *providerStatus)
  84               : _providerStatus(providerStatus)
  85 kumpf 1.1     {
  86                   _providerStatus->protect();
  87               }
  88           
  89               ~pm_service_op_lock()
  90               {
  91                   _providerStatus->unprotect();
  92               }
  93           
  94           private:
  95               pm_service_op_lock();
  96               pm_service_op_lock(const pm_service_op_lock&);
  97               pm_service_op_lock& operator=(const pm_service_op_lock&);
  98           
  99               ProviderStatus* _providerStatus;
 100           };
 101           
 102           class op_counter
 103           {
 104           public:
 105               op_counter(AtomicInt* counter)
 106 kumpf 1.1         : _counter(counter)
 107               {
 108                   (*_counter)++;
 109               }
 110           
 111               ~op_counter()
 112               {
 113                   (*_counter)--;
 114               }
 115           
 116           private:
 117               op_counter();
 118               op_counter(const op_counter&);
 119               op_counter& operator=(const op_counter&);
 120           
 121               AtomicInt* _counter;
 122           };
 123           
 124           template<class T>
 125           inline T* getProviderInterface(CIMProvider* provider)
 126           {
 127 kumpf 1.1     T * p = dynamic_cast<T *>(provider);
 128           
 129               if (p == 0)
 130               {
 131                   throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_NOT_SUPPORTED, MessageLoaderParms(
 132                       "ProviderManager.ProviderFacade.INVALID_PROVIDER_INTERFACE",
 133                       "Invalid provider interface."));
 134               }
 135           
 136               return p;
 137           }
 138           
 139           //
 140           // Default Provider Manager
 141           //
 142           ProviderMessageHandler::ProviderMessageHandler(
 143               const String& name,
 144               CIMProvider* provider,
 145               PEGASUS_INDICATION_CALLBACK_T indicationCallback,
 146               PEGASUS_RESPONSE_CHUNK_CALLBACK_T responseChunkCallback,
 147               Boolean subscriptionInitComplete)
 148 kumpf 1.1     : _name(name),
 149                 _provider(provider),
 150                 _indicationCallback(indicationCallback),
 151                 _responseChunkCallback(responseChunkCallback),
 152                 _subscriptionInitComplete(subscriptionInitComplete),
 153                 _indicationResponseHandler(0)
 154           {
 155           }
 156           
 157           ProviderMessageHandler::~ProviderMessageHandler()
 158           {
 159           }
 160           
 161           String ProviderMessageHandler::getName() const
 162           {
 163               return _name;
 164           }
 165           
 166           void ProviderMessageHandler::setProvider(CIMProvider* provider)
 167           {
 168               _provider = provider;
 169 kumpf 1.1 }
 170           
 171           void ProviderMessageHandler::initialize(CIMOMHandle& cimom)
 172           {
 173               _provider->initialize(cimom);
 174           }
 175           
 176           void ProviderMessageHandler::terminate()
 177           {
 178               _disableIndications();
 179               _provider->terminate();
 180           }
 181           
 182           void ProviderMessageHandler::subscriptionInitComplete()
 183           {
 184               if (status.testSubscriptions())
 185               {
 186                   _enableIndications();
 187               }
 188           
 189               _subscriptionInitComplete = true;
 190 kumpf 1.1 }
 191           
 192           CIMResponseMessage* ProviderMessageHandler::processMessage(
 193               CIMRequestMessage* request)
 194           {
 195               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 196                   "ProviderMessageHandler::processMessage()");
 197           
 198               op_counter ops(&status._currentOperations);
 199           
 200               CIMResponseMessage* response = 0;
 201           
 202               // pass the request message to a handler method based on message type
 203               switch(request->getType())
 204               {
 205               case CIM_GET_INSTANCE_REQUEST_MESSAGE:
 206                   response = _handleGetInstanceRequest(request);
 207                   break;
 208           
 209               case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
 210                   response = _handleEnumerateInstancesRequest(request);
 211 kumpf 1.1         break;
 212           
 213               case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
 214                   response = _handleEnumerateInstanceNamesRequest(request);
 215                   break;
 216           
 217               case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
 218                   response = _handleCreateInstanceRequest(request);
 219                   break;
 220           
 221               case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
 222                   response = _handleModifyInstanceRequest(request);
 223                   break;
 224           
 225               case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
 226                   response = _handleDeleteInstanceRequest(request);
 227                   break;
 228           
 229               case CIM_EXEC_QUERY_REQUEST_MESSAGE:
 230                   response = _handleExecQueryRequest(request);
 231                   break;
 232 kumpf 1.1 
 233               case CIM_ASSOCIATORS_REQUEST_MESSAGE:
 234                   response = _handleAssociatorsRequest(request);
 235                   break;
 236           
 237               case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
 238                   response = _handleAssociatorNamesRequest(request);
 239                   break;
 240           
 241               case CIM_REFERENCES_REQUEST_MESSAGE:
 242                   response = _handleReferencesRequest(request);
 243                   break;
 244           
 245               case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
 246                   response = _handleReferenceNamesRequest(request);
 247                   break;
 248           
 249               case CIM_GET_PROPERTY_REQUEST_MESSAGE:
 250                   response = _handleGetPropertyRequest(request);
 251                   break;
 252           
 253 kumpf 1.1     case CIM_SET_PROPERTY_REQUEST_MESSAGE:
 254                   response = _handleSetPropertyRequest(request);
 255                   break;
 256           
 257               case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
 258                   response = _handleInvokeMethodRequest(request);
 259                   break;
 260           
 261               case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:
 262                   response = _handleCreateSubscriptionRequest(request);
 263                   break;
 264           
 265               case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:
 266                   response = _handleModifySubscriptionRequest(request);
 267                   break;
 268           
 269               case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:
 270                   response = _handleDeleteSubscriptionRequest(request);
 271                   break;
 272           
 273               case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:
 274 kumpf 1.1         response = _handleExportIndicationRequest(request);
 275                   break;
 276           
 277               default:
 278                   PEGASUS_ASSERT(0);
 279                   break;
 280               }
 281           
 282               PEG_METHOD_EXIT();
 283           
 284               return response;
 285           }
 286           
 287           CIMResponseMessage* ProviderMessageHandler::_handleGetInstanceRequest(
 288               CIMRequestMessage* message)
 289           {
 290               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 291                   "ProviderMessageHandler::_handleGetInstanceRequest");
 292           
 293               CIMGetInstanceRequestMessage* request =
 294                   dynamic_cast<CIMGetInstanceRequestMessage*>(message);
 295 kumpf 1.1     PEGASUS_ASSERT(request != 0);
 296           
 297               CIMGetInstanceResponseMessage* response =
 298                   dynamic_cast<CIMGetInstanceResponseMessage*>(
 299                       request->buildResponse());
 300               PEGASUS_ASSERT(response != 0);
 301           
 302               // create a handler for this request
 303               GetInstanceResponseHandler handler(
 304                   request, response, _responseChunkCallback);
 305           
 306               try
 307               {
 308                   Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
 309                       "ProviderMessageHandler::_handleGetInstanceRequest - "
 310                           "Host name: $0  Name space: $1  Class name: $2",
 311                       System::getHostName(),
 312                       request->nameSpace.getString(),
 313                       request->instanceName.getClassName().getString());
 314           
 315                   // make target object path
 316 kumpf 1.1         CIMObjectPath objectPath(
 317                       System::getHostName(),
 318                       request->nameSpace,
 319                       request->instanceName.getClassName(),
 320                       request->instanceName.getKeyBindings());
 321           
 322                   // convert arguments
 323                   OperationContext context;
 324           
 325                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 326                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 327                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 328           
 329                   // forward request
 330                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 331                       "Calling provider.getInstance: " + _name);
 332           
 333                   AutoPThreadSecurity threadLevelSecurity(context);
 334           
 335                   pm_service_op_lock op_lock(&status);
 336           
 337 kumpf 1.1         StatProviderTimeMeasurement providerTime(response);
 338           
 339                   CIMInstanceProvider* provider =
 340                       getProviderInterface<CIMInstanceProvider>(_provider);
 341           
 342                   provider->getInstance(
 343                       context,
 344                       objectPath,
 345                       request->includeQualifiers,
 346                       request->includeClassOrigin,
 347                       request->propertyList,
 348                       handler);
 349               }
 350               HandleCatch(handler);
 351           
 352               PEG_METHOD_EXIT();
 353               return(response);
 354           }
 355           
 356           CIMResponseMessage* ProviderMessageHandler::_handleEnumerateInstancesRequest(
 357               CIMRequestMessage* message)
 358 kumpf 1.1 {
 359               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 360                   "ProviderMessageHandler::_handleEnumerateInstanceRequest");
 361           
 362               CIMEnumerateInstancesRequestMessage* request =
 363                   dynamic_cast<CIMEnumerateInstancesRequestMessage*>(message);
 364               PEGASUS_ASSERT(request != 0);
 365           
 366               CIMEnumerateInstancesResponseMessage* response =
 367                   dynamic_cast<CIMEnumerateInstancesResponseMessage*>(
 368                       request->buildResponse());
 369               PEGASUS_ASSERT(response != 0);
 370           
 371               // create a handler for this request
 372               EnumerateInstancesResponseHandler handler(
 373                   request, response, _responseChunkCallback);
 374           
 375               try
 376               {
 377                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 378                       Logger::TRACE,
 379 kumpf 1.1             "ProviderMessageHandler::_handleEnumerateInstancesRequest - "
 380                           "Host name: $0  Name space: $1  Class name: $2",
 381                       System::getHostName(),
 382                       request->nameSpace.getString(),
 383                       request->className.getString()));
 384           
 385                   // make target object path
 386                   CIMObjectPath objectPath(
 387                       System::getHostName(),
 388                       request->nameSpace,
 389                       request->className);
 390           
 391                   // convert arguments
 392                   OperationContext context;
 393           
 394                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 395                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 396                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 397           
 398                   // forward request
 399                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 400 kumpf 1.1             "Calling provider.enumerateInstances: " + _name);
 401           
 402                   AutoPThreadSecurity threadLevelSecurity(context);
 403           
 404                   pm_service_op_lock op_lock(&status);
 405           
 406                   StatProviderTimeMeasurement providerTime(response);
 407           
 408                   CIMInstanceProvider* provider =
 409                       getProviderInterface<CIMInstanceProvider>(_provider);
 410           
 411                   provider->enumerateInstances(
 412                       context,
 413                       objectPath,
 414                       request->includeQualifiers,
 415                       request->includeClassOrigin,
 416                       request->propertyList,
 417                       handler);
 418           
 419               }
 420               HandleCatch(handler);
 421 kumpf 1.1 
 422               PEG_METHOD_EXIT();
 423           
 424               return(response);
 425           }
 426           
 427           CIMResponseMessage* ProviderMessageHandler::_handleEnumerateInstanceNamesRequest(
 428               CIMRequestMessage* message)
 429           {
 430               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 431                   "ProviderMessageHandler::_handleEnumerateInstanceNamesRequest");
 432           
 433               CIMEnumerateInstanceNamesRequestMessage* request =
 434                   dynamic_cast<CIMEnumerateInstanceNamesRequestMessage*>(message);
 435               PEGASUS_ASSERT(request != 0);
 436           
 437               CIMEnumerateInstanceNamesResponseMessage* response =
 438                   dynamic_cast<CIMEnumerateInstanceNamesResponseMessage*>(
 439                       request->buildResponse());
 440               PEGASUS_ASSERT(response != 0);
 441           
 442 kumpf 1.1     // create a handler for this request
 443               EnumerateInstanceNamesResponseHandler handler(
 444                   request, response, _responseChunkCallback);
 445           
 446               // process the request
 447               try
 448               {
 449                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 450                   Logger::TRACE,
 451                       "ProviderMessageHandler::_handleEnumerateInstanceNamesRequest - "
 452                           "Host name: $0  Name space: $1  Class name: $2",
 453                       System::getHostName(),
 454                       request->nameSpace.getString(),
 455                       request->className.getString()));
 456           
 457                   // make target object path
 458                   CIMObjectPath objectPath(
 459                       System::getHostName(),
 460                       request->nameSpace,
 461                       request->className);
 462           
 463 kumpf 1.1         // convert arguments
 464                   OperationContext context;
 465           
 466                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 467                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 468                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 469           
 470                   // forward request
 471                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 472                       "Calling provider.enumerateInstanceNames: " + _name);
 473           
 474                   AutoPThreadSecurity threadLevelSecurity(context);
 475           
 476                   pm_service_op_lock op_lock(&status);
 477           
 478                   StatProviderTimeMeasurement providerTime(response);
 479           
 480                   CIMInstanceProvider* provider =
 481                       getProviderInterface<CIMInstanceProvider>(_provider);
 482           
 483                   provider->enumerateInstanceNames(
 484 kumpf 1.1             context,
 485                       objectPath,
 486                       handler);
 487           
 488               }
 489               HandleCatch(handler);
 490           
 491               PEG_METHOD_EXIT();
 492           
 493               return(response);
 494           }
 495           
 496           CIMResponseMessage* ProviderMessageHandler::_handleCreateInstanceRequest(
 497               CIMRequestMessage* message)
 498           {
 499               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 500                   "ProviderMessageHandler::_handleCreateInstanceRequest");
 501           
 502               CIMCreateInstanceRequestMessage* request =
 503                   dynamic_cast<CIMCreateInstanceRequestMessage*>(message);
 504               PEGASUS_ASSERT(request != 0);
 505 kumpf 1.1 
 506               // create response message
 507               CIMCreateInstanceResponseMessage* response =
 508                   dynamic_cast<CIMCreateInstanceResponseMessage*>(
 509                       request->buildResponse());
 510               PEGASUS_ASSERT(response != 0);
 511           
 512               // create a handler for this request
 513               CreateInstanceResponseHandler handler(
 514                   request, response, _responseChunkCallback);
 515           
 516               try
 517               {
 518                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 519                   Logger::TRACE,
 520                       "ProviderMessageHandler::_handleCreateInstanceRequest - "
 521                           "Host name: $0  Name space: $1  Class name: $2",
 522                       System::getHostName(),
 523                       request->nameSpace.getString(),
 524                       request->newInstance.getPath().getClassName().getString()));
 525           
 526 kumpf 1.1         // make target object path
 527                   CIMObjectPath objectPath(
 528                       System::getHostName(),
 529                       request->nameSpace,
 530                       request->newInstance.getPath().getClassName(),
 531                       request->newInstance.getPath().getKeyBindings());
 532           
 533                   // convert arguments
 534                   OperationContext context;
 535           
 536                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 537                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 538                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 539           
 540                   // forward request
 541                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 542                       "Calling provider.createInstance: " + _name);
 543           
 544                   AutoPThreadSecurity threadLevelSecurity(context);
 545           
 546                   pm_service_op_lock op_lock(&status);
 547 kumpf 1.1 
 548                   StatProviderTimeMeasurement providerTime(response);
 549           
 550                   CIMInstanceProvider* provider =
 551                       getProviderInterface<CIMInstanceProvider>(_provider);
 552           
 553                   provider->createInstance(
 554                       context,
 555                       objectPath,
 556                       request->newInstance,
 557                       handler);
 558           
 559               }
 560               HandleCatch(handler);
 561           
 562               PEG_METHOD_EXIT();
 563           
 564               return(response);
 565           }
 566           
 567           CIMResponseMessage* ProviderMessageHandler::_handleModifyInstanceRequest(
 568 kumpf 1.1     CIMRequestMessage* message)
 569           {
 570               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 571                   "ProviderMessageHandler::_handleModifyInstanceRequest");
 572           
 573               CIMModifyInstanceRequestMessage* request =
 574                   dynamic_cast<CIMModifyInstanceRequestMessage*>(message);
 575               PEGASUS_ASSERT(request != 0);
 576           
 577               // create response message
 578               CIMModifyInstanceResponseMessage* response =
 579                   dynamic_cast<CIMModifyInstanceResponseMessage*>(
 580                       request->buildResponse());
 581               PEGASUS_ASSERT(response != 0);
 582           
 583               // create a handler for this request
 584               ModifyInstanceResponseHandler handler(
 585                   request, response, _responseChunkCallback);
 586           
 587               try
 588               {
 589 kumpf 1.1         PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 590                   Logger::TRACE,
 591                       "ProviderMessageHandler::_handleModifyInstanceRequest - "
 592                           "Host name: $0  Name space: $1  Class name: $2",
 593                       System::getHostName(),
 594                       request->nameSpace.getString(),
 595                       request->modifiedInstance.getPath().getClassName().getString()));
 596           
 597                   // make target object path
 598                   CIMObjectPath objectPath(
 599                       System::getHostName(),
 600                       request->nameSpace,
 601                       request->modifiedInstance.getPath ().getClassName(),
 602                       request->modifiedInstance.getPath ().getKeyBindings());
 603           
 604                   // convert arguments
 605                   OperationContext context;
 606           
 607                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 608                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 609                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 610 kumpf 1.1 
 611                   // forward request
 612                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 613                       "Calling provider.modifyInstance: " + _name);
 614           
 615                   AutoPThreadSecurity threadLevelSecurity(context);
 616           
 617                   pm_service_op_lock op_lock(&status);
 618           
 619                   StatProviderTimeMeasurement providerTime(response);
 620           
 621                   CIMInstanceProvider* provider =
 622                       getProviderInterface<CIMInstanceProvider>(_provider);
 623           
 624                   provider->modifyInstance(
 625                       context,
 626                       objectPath,
 627                       request->modifiedInstance,
 628                       request->includeQualifiers,
 629                       request->propertyList,
 630                       handler);
 631 kumpf 1.1 
 632               }
 633               HandleCatch(handler);
 634           
 635               PEG_METHOD_EXIT();
 636           
 637               return(response);
 638           }
 639           
 640           CIMResponseMessage* ProviderMessageHandler::_handleDeleteInstanceRequest(
 641               CIMRequestMessage* message)
 642           {
 643               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 644                   "ProviderMessageHandler::_handleDeleteInstanceRequest");
 645           
 646               CIMDeleteInstanceRequestMessage* request =
 647                   dynamic_cast<CIMDeleteInstanceRequestMessage*>(message);
 648               PEGASUS_ASSERT(request != 0);
 649           
 650               // create response message
 651               CIMDeleteInstanceResponseMessage* response =
 652 kumpf 1.1         dynamic_cast<CIMDeleteInstanceResponseMessage*>(
 653                       request->buildResponse());
 654               PEGASUS_ASSERT(response != 0);
 655           
 656               // create a handler for this request
 657               DeleteInstanceResponseHandler handler(
 658                   request, response, _responseChunkCallback);
 659           
 660               try
 661               {
 662                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 663                   Logger::TRACE,
 664                       "ProviderMessageHandler::_handleDeleteInstanceRequest - "
 665                           "Host name: $0  Name space: $1  Class name: $2",
 666                       System::getHostName(),
 667                       request->nameSpace.getString(),
 668                       request->instanceName.getClassName().getString()));
 669           
 670                   // make target object path
 671                   CIMObjectPath objectPath(
 672                       System::getHostName(),
 673 kumpf 1.1             request->nameSpace,
 674                       request->instanceName.getClassName(),
 675                       request->instanceName.getKeyBindings());
 676           
 677                   // convert arguments
 678                   OperationContext context;
 679           
 680                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 681                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 682                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 683           
 684                   // forward request
 685                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 686                       "Calling provider.deleteInstance: " + _name);
 687           
 688                   AutoPThreadSecurity threadLevelSecurity(context);
 689           
 690                   pm_service_op_lock op_lock(&status);
 691           
 692                   StatProviderTimeMeasurement providerTime(response);
 693           
 694 kumpf 1.1         CIMInstanceProvider* provider =
 695                       getProviderInterface<CIMInstanceProvider>(_provider);
 696           
 697                   provider->deleteInstance(
 698                       context,
 699                       objectPath,
 700                       handler);
 701           
 702               }
 703               HandleCatch(handler);
 704           
 705               PEG_METHOD_EXIT();
 706           
 707               return(response);
 708           }
 709           
 710           CIMResponseMessage* ProviderMessageHandler::_handleExecQueryRequest(
 711               CIMRequestMessage* message)
 712           {
 713               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 714                   "ProviderMessageHandler::_handleExecQueryRequest");
 715 kumpf 1.1 
 716               CIMExecQueryRequestMessage* request =
 717                   dynamic_cast<CIMExecQueryRequestMessage*>(message);
 718               PEGASUS_ASSERT(request != 0);
 719           
 720               CIMExecQueryResponseMessage* response =
 721                   dynamic_cast<CIMExecQueryResponseMessage*>(
 722                       request->buildResponse());
 723               PEGASUS_ASSERT(response != 0);
 724           
 725               // create a handler for this request
 726               ExecQueryResponseHandler handler(
 727                   request, response, _responseChunkCallback);
 728           
 729               try
 730               {
 731                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 732                   Logger::TRACE,
 733                       "ProviderMessageHandler::_handleExecQueryRequest - "
 734                           "Host name: $0  Name space: $1  Class name: $2",
 735                       System::getHostName(),
 736 kumpf 1.1             request->nameSpace.getString(),
 737                       request->className.getString()));
 738           
 739                   // make target object path
 740                   CIMObjectPath objectPath(
 741                       System::getHostName(),
 742                       request->nameSpace,
 743                       request->className);
 744           
 745                   // convert arguments
 746                   OperationContext context;
 747           
 748                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 749                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 750                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 751           
 752                   QueryExpression qx(request->queryLanguage,request->query);
 753           
 754                   // forward request
 755                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 756                       "Calling provider.execQuery: " + _name);
 757 kumpf 1.1 
 758                   AutoPThreadSecurity threadLevelSecurity(context);
 759           
 760                   pm_service_op_lock op_lock(&status);
 761           
 762                   StatProviderTimeMeasurement providerTime(response);
 763           
 764                   CIMInstanceQueryProvider* provider =
 765                       getProviderInterface<CIMInstanceQueryProvider>(_provider);
 766           
 767                   provider->execQuery(
 768                       context,
 769                       objectPath,
 770                       qx,
 771                       handler);
 772           
 773               }
 774               HandleCatch(handler);
 775           
 776               PEG_METHOD_EXIT();
 777           
 778 kumpf 1.1     return(response);
 779           }
 780           
 781           CIMResponseMessage* ProviderMessageHandler::_handleAssociatorsRequest(
 782               CIMRequestMessage* message)
 783           {
 784               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 785                   "ProviderMessageHandler::_handleAssociatorsRequest");
 786           
 787               CIMAssociatorsRequestMessage* request =
 788                   dynamic_cast<CIMAssociatorsRequestMessage*>(message);
 789               PEGASUS_ASSERT(request != 0);
 790           
 791               CIMAssociatorsResponseMessage* response =
 792                   dynamic_cast<CIMAssociatorsResponseMessage*>(
 793                       request->buildResponse());
 794               PEGASUS_ASSERT(response != 0);
 795           
 796               // create a handler for this request
 797               AssociatorsResponseHandler handler(
 798                   request, response, _responseChunkCallback);
 799 kumpf 1.1 
 800               // process the request
 801               try
 802               {
 803                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 804                   Logger::TRACE,
 805                       "ProviderMessageHandler::_handleAssociatorsRequest - "
 806                           "Host name: $0  Name space: $1  Class name: $2",
 807                       System::getHostName(),
 808                       request->nameSpace.getString(),
 809                       request->objectName.getClassName().getString()));
 810           
 811                   // make target object path
 812                   CIMObjectPath objectPath(
 813                       System::getHostName(),
 814                       request->nameSpace,
 815                       request->objectName.getClassName());
 816           
 817                   objectPath.setKeyBindings(request->objectName.getKeyBindings());
 818           
 819                   CIMObjectPath assocPath(
 820 kumpf 1.1             System::getHostName(),
 821                       request->nameSpace,
 822                       request->assocClass.getString());
 823           
 824                   // convert arguments
 825                   OperationContext context;
 826           
 827                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 828                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 829                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 830           
 831                   AutoPThreadSecurity threadLevelSecurity(context);
 832           
 833                   StatProviderTimeMeasurement providerTime(response);
 834           
 835                   pm_service_op_lock op_lock(&status);
 836           
 837                   CIMAssociationProvider* provider =
 838                       getProviderInterface<CIMAssociationProvider>(_provider);
 839           
 840                   provider->associators(
 841 kumpf 1.1             context,
 842                       objectPath,
 843                       request->assocClass,
 844                       request->resultClass,
 845                       request->role,
 846                       request->resultRole,
 847                       request->includeQualifiers,
 848                       request->includeClassOrigin,
 849                       request->propertyList,
 850                       handler);
 851           
 852               }
 853               HandleCatch(handler);
 854           
 855               PEG_METHOD_EXIT();
 856           
 857               return(response);
 858           }
 859           
 860           CIMResponseMessage* ProviderMessageHandler::_handleAssociatorNamesRequest(
 861               CIMRequestMessage* message)
 862 kumpf 1.1 {
 863               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 864                   "ProviderMessageHandler::_handleAssociatorNamesRequest");
 865           
 866               CIMAssociatorNamesRequestMessage* request =
 867                   dynamic_cast<CIMAssociatorNamesRequestMessage*>(message);
 868               PEGASUS_ASSERT(request != 0);
 869           
 870               CIMAssociatorNamesResponseMessage* response =
 871                   dynamic_cast<CIMAssociatorNamesResponseMessage*>(
 872                       request->buildResponse());
 873               PEGASUS_ASSERT(response != 0);
 874           
 875               // create a handler for this request
 876               AssociatorNamesResponseHandler handler(
 877                   request, response, _responseChunkCallback);
 878           
 879               // process the request
 880               try
 881               {
 882                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 883 kumpf 1.1         Logger::TRACE,
 884                       "ProviderMessageHandler::_handleAssociationNamesRequest - "
 885                           "Host name: $0  Name space: $1  Class name: $2",
 886                       System::getHostName(),
 887                       request->nameSpace.getString(),
 888                       request->objectName.getClassName().getString()));
 889           
 890                   // make target object path
 891                   CIMObjectPath objectPath(
 892                       System::getHostName(),
 893                       request->nameSpace,
 894                       request->objectName.getClassName());
 895           
 896                   objectPath.setKeyBindings(request->objectName.getKeyBindings());
 897           
 898                   CIMObjectPath assocPath(
 899                       System::getHostName(),
 900                       request->nameSpace,
 901                       request->assocClass.getString());
 902           
 903                   // convert arguments
 904 kumpf 1.1         OperationContext context;
 905           
 906                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 907                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 908                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 909           
 910                   AutoPThreadSecurity threadLevelSecurity(context);
 911           
 912                   StatProviderTimeMeasurement providerTime(response);
 913           
 914                   pm_service_op_lock op_lock(&status);
 915           
 916                   CIMAssociationProvider* provider =
 917                       getProviderInterface<CIMAssociationProvider>(_provider);
 918           
 919                   provider->associatorNames(
 920                       context,
 921                       objectPath,
 922                       request->assocClass,
 923                       request->resultClass,
 924                       request->role,
 925 kumpf 1.1             request->resultRole,
 926                       handler);
 927           
 928               }
 929               HandleCatch(handler);
 930           
 931               PEG_METHOD_EXIT();
 932           
 933               return(response);
 934           }
 935           
 936           CIMResponseMessage* ProviderMessageHandler::_handleReferencesRequest(
 937               CIMRequestMessage* message)
 938           {
 939               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 940                   "ProviderMessageHandler::_handleReferencesRequest");
 941           
 942               CIMReferencesRequestMessage* request =
 943                   dynamic_cast<CIMReferencesRequestMessage*>(message);
 944               PEGASUS_ASSERT(request != 0);
 945           
 946 kumpf 1.1     CIMReferencesResponseMessage* response =
 947                   dynamic_cast<CIMReferencesResponseMessage*>(
 948                       request->buildResponse());
 949               PEGASUS_ASSERT(response != 0);
 950           
 951               // create a handler for this request
 952               ReferencesResponseHandler handler(
 953                   request, response, _responseChunkCallback);
 954           
 955               // process the request
 956               try
 957               {
 958                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
 959                   Logger::TRACE,
 960                       "ProviderMessageHandler::_handleReferencesRequest - "
 961                           "Host name: $0  Name space: $1  Class name: $2",
 962                       System::getHostName(),
 963                       request->nameSpace.getString(),
 964                       request->objectName.getClassName().getString()));
 965           
 966                   // make target object path
 967 kumpf 1.1         CIMObjectPath objectPath(
 968                       System::getHostName(),
 969                       request->nameSpace,
 970                       request->objectName.getClassName());
 971           
 972                   objectPath.setKeyBindings(request->objectName.getKeyBindings());
 973           
 974                   CIMObjectPath resultPath(
 975                       System::getHostName(),
 976                       request->nameSpace,
 977                       request->resultClass.getString());
 978           
 979                   // convert arguments
 980                   OperationContext context;
 981           
 982                   context.insert(request->operationContext.get(IdentityContainer::NAME));
 983                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
 984                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
 985           
 986                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 987                       "Calling provider.references: " + _name);
 988 kumpf 1.1 
 989                   AutoPThreadSecurity threadLevelSecurity(context);
 990           
 991                   StatProviderTimeMeasurement providerTime(response);
 992           
 993                   pm_service_op_lock op_lock(&status);
 994           
 995                   CIMAssociationProvider* provider =
 996                       getProviderInterface<CIMAssociationProvider>(_provider);
 997           
 998                   provider->references(
 999                       context,
1000                       objectPath,
1001                       request->resultClass,
1002                       request->role,
1003                       request->includeQualifiers,
1004                       request->includeClassOrigin,
1005                       request->propertyList,
1006                       handler);
1007           
1008               }
1009 kumpf 1.1     HandleCatch(handler);
1010           
1011               PEG_METHOD_EXIT();
1012           
1013               return(response);
1014           }
1015           
1016           CIMResponseMessage* ProviderMessageHandler::_handleReferenceNamesRequest(
1017               CIMRequestMessage* message)
1018           {
1019               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1020                   "ProviderMessageHandler::_handleReferenceNamesRequest");
1021           
1022               CIMReferenceNamesRequestMessage* request =
1023                   dynamic_cast<CIMReferenceNamesRequestMessage*>(message);
1024               PEGASUS_ASSERT(request != 0);
1025           
1026               CIMReferenceNamesResponseMessage* response =
1027                   dynamic_cast<CIMReferenceNamesResponseMessage*>(
1028                       request->buildResponse());
1029               PEGASUS_ASSERT(response != 0);
1030 kumpf 1.1 
1031               // create a handler for this request
1032               ReferenceNamesResponseHandler handler(
1033                   request, response, _responseChunkCallback);
1034           
1035               // process the request
1036               try
1037               {
1038                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
1039                   Logger::TRACE,
1040                       "ProviderMessageHandler::_handleReferenceNamesRequest - "
1041                           "Host name: $0  Name space: $1  Class name: $2",
1042                       System::getHostName(),
1043                       request->nameSpace.getString(),
1044                       request->objectName.getClassName().getString()));
1045           
1046                   // make target object path
1047                   CIMObjectPath objectPath(
1048                       System::getHostName(),
1049                       request->nameSpace,
1050                       request->objectName.getClassName());
1051 kumpf 1.1 
1052                   objectPath.setKeyBindings(request->objectName.getKeyBindings());
1053           
1054                   CIMObjectPath resultPath(
1055                       System::getHostName(),
1056                       request->nameSpace,
1057                       request->resultClass.getString());
1058           
1059                   // convert arguments
1060                   OperationContext context;
1061           
1062                   context.insert(request->operationContext.get(IdentityContainer::NAME));
1063                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1064                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1065           
1066                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1067                       "Calling provider.referenceNames: " + _name);
1068           
1069                   AutoPThreadSecurity threadLevelSecurity(context);
1070           
1071                   StatProviderTimeMeasurement providerTime(response);
1072 kumpf 1.1 
1073                   pm_service_op_lock op_lock(&status);
1074           
1075                   CIMAssociationProvider* provider =
1076                       getProviderInterface<CIMAssociationProvider>(_provider);
1077           
1078                   provider->referenceNames(
1079                       context,
1080                       objectPath,
1081                       request->resultClass,
1082                       request->role,
1083                       handler);
1084           
1085               }
1086               HandleCatch(handler);
1087           
1088               PEG_METHOD_EXIT();
1089           
1090               return(response);
1091           }
1092           
1093 kumpf 1.1 CIMResponseMessage* ProviderMessageHandler::_handleGetPropertyRequest(
1094               CIMRequestMessage* message)
1095           {
1096               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1097                   "ProviderMessageHandler::_handleGetPropertyRequest");
1098           
1099               CIMGetPropertyRequestMessage* request =
1100                   dynamic_cast<CIMGetPropertyRequestMessage*>(message);
1101               PEGASUS_ASSERT(request != 0);
1102           
1103               CIMGetPropertyResponseMessage* response =
1104                   dynamic_cast<CIMGetPropertyResponseMessage*>(
1105                       request->buildResponse());
1106               PEGASUS_ASSERT(response != 0);
1107           
1108               // create a handler for this request
1109               SimpleInstanceResponseHandler handler;
1110           
1111               try
1112               {
1113                   Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1114 kumpf 1.1             "ProviderMessageHandler::_handleGetPropertyRequest - "
1115                           "Host name: $0  Name space: $1  Class name: $2  Property: $3",
1116                       System::getHostName(),
1117                       request->nameSpace.getString(),
1118                       request->instanceName.getClassName().getString(),
1119                       request->propertyName.getString());
1120           
1121                   // make target object path
1122                   CIMObjectPath objectPath(
1123                       System::getHostName(),
1124                       request->nameSpace,
1125                       request->instanceName.getClassName(),
1126                       request->instanceName.getKeyBindings());
1127           
1128                   Array<CIMName> propertyList;
1129                   propertyList.append(request->propertyName);
1130           
1131                   // convert arguments
1132                   OperationContext context;
1133           
1134                   context.insert(request->operationContext.get(IdentityContainer::NAME));
1135 kumpf 1.1         context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1136                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1137           
1138                   // forward request
1139                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1140                       "Calling provider.getInstance: " + _name);
1141           
1142                   AutoPThreadSecurity threadLevelSecurity(context);
1143           
1144                   pm_service_op_lock op_lock(&status);
1145           
1146                   StatProviderTimeMeasurement providerTime(response);
1147           
1148                   CIMInstanceProvider* provider =
1149                       getProviderInterface<CIMInstanceProvider>(_provider);
1150           
1151                   provider->getInstance(
1152                       context,
1153                       objectPath,
1154                       false,  // includeQualifiers
1155                       false,  // includeClassOrigin
1156 kumpf 1.1             propertyList,
1157                       handler);
1158           
1159                   if (handler.getObjects().size())
1160                   {
1161                       CIMInstance instance = handler.getObjects()[0];
1162           
1163                       Uint32 pos = instance.findProperty(request->propertyName);
1164           
1165                       if (pos != PEG_NOT_FOUND)
1166                       {
1167                           response->value = instance.getProperty(pos).getValue();
1168                       }
1169                       else    // Property not found. Return CIM_ERR_NO_SUCH_PROPERTY.
1170                       {
1171                           response->cimException = PEGASUS_CIM_EXCEPTION(
1172                               CIM_ERR_NO_SUCH_PROPERTY,
1173                               request->propertyName.getString());
1174                       }
1175                   }
1176           
1177 kumpf 1.1         response->operationContext.set(
1178                       ContentLanguageListContainer(handler.getLanguages()));
1179               }
1180               catch (CIMException& e)
1181               {
1182                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1183                       "Exception: " + e.getMessage());
1184                   response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
1185                       e.getContentLanguages(), e.getCode(), e.getMessage());
1186               }
1187               catch (Exception& e)
1188               {
1189                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1190                       "Exception: " + e.getMessage());
1191                   response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
1192                       e.getContentLanguages(), CIM_ERR_FAILED, e.getMessage());
1193               }
1194               catch (...)
1195               {
1196                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1197                       "Exception: Unknown");
1198 kumpf 1.1         response->cimException = PEGASUS_CIM_EXCEPTION(
1199                       CIM_ERR_FAILED, "Unknown error.");
1200               }
1201           
1202               PEG_METHOD_EXIT();
1203               return(response);
1204           }
1205           
1206           CIMResponseMessage* ProviderMessageHandler::_handleSetPropertyRequest(
1207               CIMRequestMessage* message)
1208           {
1209               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1210                   "ProviderMessageHandler::_handleSetPropertyRequest");
1211           
1212               CIMSetPropertyRequestMessage* request =
1213                   dynamic_cast<CIMSetPropertyRequestMessage*>(message);
1214               PEGASUS_ASSERT(request != 0);
1215           
1216               CIMSetPropertyResponseMessage* response =
1217                   dynamic_cast<CIMSetPropertyResponseMessage*>(
1218                       request->buildResponse());
1219 kumpf 1.1     PEGASUS_ASSERT(response != 0);
1220           
1221               // create a handler for this request
1222               SimpleInstanceResponseHandler handler;
1223           
1224               try
1225               {
1226                   Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1227                       "ProviderMessageHandler::_handleSetPropertyRequest - "
1228                           "Host name: $0  Name space: $1  Class name: $2  Property: $3",
1229                       System::getHostName(),
1230                       request->nameSpace.getString(),
1231                       request->instanceName.getClassName().getString(),
1232                       request->propertyName.getString());
1233           
1234                   // make target object path
1235                   CIMObjectPath objectPath(
1236                       System::getHostName(),
1237                       request->nameSpace,
1238                       request->instanceName.getClassName(),
1239                       request->instanceName.getKeyBindings());
1240 kumpf 1.1 
1241                   CIMInstance instance(request->instanceName.getClassName());
1242                   instance.addProperty(CIMProperty(
1243                       request->propertyName, request->newValue));
1244           
1245                   Array<CIMName> propertyList;
1246                   propertyList.append(request->propertyName);
1247           
1248                   // convert arguments
1249                   OperationContext context;
1250           
1251                   context.insert(request->operationContext.get(IdentityContainer::NAME));
1252                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1253                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1254           
1255                   // forward request
1256                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1257                       "Calling provider.modifyInstance: " + _name);
1258           
1259                   AutoPThreadSecurity threadLevelSecurity(context);
1260           
1261 kumpf 1.1         pm_service_op_lock op_lock(&status);
1262           
1263                   StatProviderTimeMeasurement providerTime(response);
1264           
1265                   CIMInstanceProvider* provider =
1266                       getProviderInterface<CIMInstanceProvider>(_provider);
1267           
1268                   provider->modifyInstance(
1269                       context,
1270                       objectPath,
1271                       instance,
1272                       false,  // includeQualifiers
1273                       propertyList,
1274                       handler);
1275           
1276                   response->operationContext.set(
1277                       ContentLanguageListContainer(handler.getLanguages()));
1278               }
1279               catch (CIMException& e)
1280               {
1281                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1282 kumpf 1.1             "Exception: " + e.getMessage());
1283                   response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
1284                       e.getContentLanguages(), e.getCode(), e.getMessage());
1285               }
1286               catch (Exception& e)
1287               {
1288                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1289                       "Exception: " + e.getMessage());
1290                   response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
1291                       e.getContentLanguages(), CIM_ERR_FAILED, e.getMessage());
1292               }
1293               catch (...)
1294               {
1295                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1296                       "Exception: Unknown");
1297                   response->cimException = PEGASUS_CIM_EXCEPTION(
1298                       CIM_ERR_FAILED, "Unknown error.");
1299               }
1300           
1301               PEG_METHOD_EXIT();
1302               return(response);
1303 kumpf 1.1 }
1304           
1305           CIMResponseMessage* ProviderMessageHandler::_handleInvokeMethodRequest(
1306               CIMRequestMessage* message)
1307           {
1308               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1309                   "ProviderMessageHandler::_handleInvokeMethodRequest");
1310           
1311               CIMInvokeMethodRequestMessage* request =
1312                   dynamic_cast<CIMInvokeMethodRequestMessage*>(message);
1313               PEGASUS_ASSERT(request != 0);
1314           
1315               // create response message
1316               CIMInvokeMethodResponseMessage* response =
1317                   dynamic_cast<CIMInvokeMethodResponseMessage*>(
1318                       request->buildResponse());
1319               PEGASUS_ASSERT(response != 0);
1320           
1321               // create a handler for this request
1322               InvokeMethodResponseHandler handler(
1323                   request, response, _responseChunkCallback);
1324 kumpf 1.1 
1325               try
1326               {
1327                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
1328                   Logger::TRACE,
1329                       "ProviderMessageHandler::_handleInvokeMethodRequest - "
1330                           "Host name: $0  Name space: $1  Class name: $2",
1331                       System::getHostName(),
1332                       request->nameSpace.getString(),
1333                       request->instanceName.getClassName().getString()));
1334           
1335                   // make target object path
1336                   CIMObjectPath objectPath(
1337                       System::getHostName(),
1338                       request->nameSpace,
1339                       request->instanceName.getClassName(),
1340                       request->instanceName.getKeyBindings());
1341           
1342                   // convert arguments
1343                   OperationContext context;
1344           
1345 kumpf 1.1         context.insert(request->operationContext.get(IdentityContainer::NAME));
1346                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1347                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1348           
1349                   CIMObjectPath instanceReference(request->instanceName);
1350                   instanceReference.setNameSpace(request->nameSpace);
1351           
1352                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1353                       "Calling provider.invokeMethod: " + _name);
1354           
1355                   AutoPThreadSecurity threadLevelSecurity(context);
1356           
1357                   StatProviderTimeMeasurement providerTime(response);
1358           
1359                   pm_service_op_lock op_lock(&status);
1360           
1361                   CIMMethodProvider* provider =
1362                       getProviderInterface<CIMMethodProvider>(_provider);
1363           
1364                   provider->invokeMethod(
1365                       context,
1366 kumpf 1.1             instanceReference,
1367                       request->methodName,
1368                       request->inParameters,
1369                       handler);
1370           
1371               }
1372               HandleCatch(handler);
1373           
1374               PEG_METHOD_EXIT();
1375           
1376               return(response);
1377           }
1378           
1379           CIMResponseMessage* ProviderMessageHandler::_handleCreateSubscriptionRequest(
1380               CIMRequestMessage* message)
1381           {
1382               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1383                   "ProviderMessageHandler::_handleCreateSubscriptionRequest");
1384           
1385               CIMCreateSubscriptionRequestMessage* request =
1386                   dynamic_cast<CIMCreateSubscriptionRequestMessage*>(message);
1387 kumpf 1.1     PEGASUS_ASSERT(request != 0);
1388           
1389               CIMCreateSubscriptionResponseMessage* response =
1390                   dynamic_cast<CIMCreateSubscriptionResponseMessage*>(
1391                       request->buildResponse());
1392               PEGASUS_ASSERT(response != 0);
1393           
1394               OperationResponseHandler handler(
1395                   request, response, _responseChunkCallback);
1396           
1397               try
1398               {
1399                   String temp;
1400           
1401                   for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
1402                   {
1403                       temp.append(request->classNames[i].getString());
1404           
1405                       if (i < (n - 1))
1406                       {
1407                           temp.append(", ");
1408 kumpf 1.1             }
1409                   }
1410           
1411                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
1412                       Logger::TRACE,
1413                       "ProviderMessageHandler::_handleCreateSubscriptionRequest - "
1414                           "Host name: $0  Name space: $1  Class name(s): $2",
1415                       System::getHostName(),
1416                       request->nameSpace.getString(),
1417                       temp));
1418           
1419                   //
1420                   //  Save the provider instance from the request
1421                   //
1422                   ProviderIdContainer pidc = (ProviderIdContainer)
1423                       request->operationContext.get(ProviderIdContainer::NAME);
1424                   status.setProviderInstance(pidc.getProvider());
1425           
1426                   // convert arguments
1427                   OperationContext context;
1428           
1429 kumpf 1.1         context.insert(request->operationContext.get(IdentityContainer::NAME));
1430                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1431                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1432                   context.insert(request->operationContext.get(SubscriptionInstanceContainer::NAME));
1433                   context.insert(request->operationContext.get(SubscriptionFilterConditionContainer::NAME));
1434                   context.insert(request->operationContext.get(SubscriptionFilterQueryContainer::NAME));
1435           
1436                   Array<CIMObjectPath> classNames;
1437           
1438                   for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
1439                   {
1440                       CIMObjectPath className(
1441                           System::getHostName(),
1442                           request->nameSpace,
1443                           request->classNames[i]);
1444           
1445                       classNames.append(className);
1446                   }
1447           
1448                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1449                       "Calling provider.createSubscription: " + _name);
1450 kumpf 1.1 
1451                   AutoPThreadSecurity threadLevelSecurity(context);
1452           
1453                   pm_service_op_lock op_lock(&status);
1454           
1455                   CIMIndicationProvider* provider =
1456                       getProviderInterface<CIMIndicationProvider>(_provider);
1457           
1458                   provider->createSubscription(
1459                       context,
1460                       request->subscriptionInstance.getPath(),
1461                       classNames,
1462                       request->propertyList,
1463                       request->repeatNotificationPolicy);
1464           
1465                   //
1466                   //  Increment count of current subscriptions for this provider
1467                   //
1468                   if (status.testIfZeroAndIncrementSubscriptions())
1469                   {
1470                       PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1471 kumpf 1.1                 "First accepted subscription");
1472           
1473                       //
1474                       //  If there were no current subscriptions before the increment,
1475                       //  the first subscription has been created
1476                       //  Call the provider's enableIndications method
1477                       //
1478                       if (_subscriptionInitComplete)
1479                       {
1480                           _enableIndications();
1481                       }
1482                   }
1483               }
1484               HandleCatch(handler);
1485           
1486               PEG_METHOD_EXIT();
1487               return(response);
1488           }
1489           
1490           CIMResponseMessage* ProviderMessageHandler::_handleModifySubscriptionRequest(
1491               CIMRequestMessage* message)
1492 kumpf 1.1 {
1493               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1494                   "ProviderMessageHandler::_handleModifySubscriptionRequest");
1495           
1496               CIMModifySubscriptionRequestMessage* request =
1497                   dynamic_cast<CIMModifySubscriptionRequestMessage*>(message);
1498               PEGASUS_ASSERT(request != 0);
1499           
1500               CIMModifySubscriptionResponseMessage* response =
1501                   dynamic_cast<CIMModifySubscriptionResponseMessage*>(
1502                       request->buildResponse());
1503               PEGASUS_ASSERT(response != 0);
1504           
1505               OperationResponseHandler handler(
1506                   request, response, _responseChunkCallback);
1507           
1508               try
1509               {
1510                   String temp;
1511           
1512                   for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
1513 kumpf 1.1         {
1514                       temp.append(request->classNames[i].getString());
1515           
1516                       if (i < (n - 1))
1517                       {
1518                           temp.append(", ");
1519                       }
1520                   }
1521           
1522                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
1523                   Logger::TRACE,
1524                       "ProviderMessageHandler::_handleCreateSubscriptionRequest - "
1525                           "Host name: $0  Name space: $1  Class name(s): $2",
1526                       System::getHostName(),
1527                       request->nameSpace.getString(),
1528                       temp));
1529           
1530                   // convert arguments
1531                   OperationContext context;
1532                   context.insert(request->operationContext.get(IdentityContainer::NAME));
1533                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1534 kumpf 1.1         context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1535                   context.insert(request->operationContext.get(SubscriptionInstanceContainer::NAME));
1536                   context.insert(request->operationContext.get(SubscriptionFilterConditionContainer::NAME));
1537                   context.insert(request->operationContext.get(SubscriptionFilterQueryContainer::NAME));
1538           
1539                   Array<CIMObjectPath> classNames;
1540           
1541                   for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
1542                   {
1543                       CIMObjectPath className(
1544                           System::getHostName(),
1545                           request->nameSpace,
1546                           request->classNames[i]);
1547           
1548                       classNames.append(className);
1549                   }
1550           
1551                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1552                       "Calling provider.modifySubscription: " + _name);
1553           
1554                   AutoPThreadSecurity threadLevelSecurity(context);
1555 kumpf 1.1 
1556                   pm_service_op_lock op_lock(&status);
1557           
1558                   CIMIndicationProvider* provider =
1559                       getProviderInterface<CIMIndicationProvider>(_provider);
1560           
1561                   provider->modifySubscription(
1562                       context,
1563                       request->subscriptionInstance.getPath(),
1564                       classNames,
1565                       request->propertyList,
1566                       request->repeatNotificationPolicy);
1567           
1568               }
1569               HandleCatch(handler);
1570           
1571               PEG_METHOD_EXIT();
1572               return(response);
1573           }
1574           
1575           CIMResponseMessage* ProviderMessageHandler::_handleDeleteSubscriptionRequest(
1576 kumpf 1.1     CIMRequestMessage* message)
1577           {
1578               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1579                   "ProviderMessageHandler::_handleDeleteSubscriptionRequest");
1580           
1581               CIMDeleteSubscriptionRequestMessage* request =
1582                   dynamic_cast<CIMDeleteSubscriptionRequestMessage*>(message);
1583               PEGASUS_ASSERT(request != 0);
1584           
1585               CIMDeleteSubscriptionResponseMessage* response =
1586                   dynamic_cast<CIMDeleteSubscriptionResponseMessage*>(
1587                       request->buildResponse());
1588               PEGASUS_ASSERT(response != 0);
1589           
1590               OperationResponseHandler handler(
1591                   request, response, _responseChunkCallback);
1592           
1593               try
1594               {
1595                   String temp;
1596           
1597 kumpf 1.1         for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
1598                   {
1599                       temp.append(request->classNames[i].getString());
1600           
1601                       if (i < (n - 1))
1602                       {
1603                           temp.append(", ");
1604                       }
1605                   }
1606           
1607                   PEG_LOGGER_TRACE((Logger::STANDARD_LOG, System::CIMSERVER,
1608                   Logger::TRACE,
1609                       "ProviderMessageHandler::_handleDeleteSubscriptionRequest - "
1610                           "Host name: $0  Name space: $1  Class name(s): $2",
1611                       System::getHostName(),
1612                       request->nameSpace.getString(),
1613                       temp));
1614           
1615                   // convert arguments
1616                   OperationContext context;
1617           
1618 kumpf 1.1         context.insert(request->operationContext.get(IdentityContainer::NAME));
1619                   context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));
1620                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1621                   context.insert(request->operationContext.get(SubscriptionInstanceContainer::NAME));
1622           
1623                   Array<CIMObjectPath> classNames;
1624           
1625                   for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
1626                   {
1627                       CIMObjectPath className(
1628                           System::getHostName(),
1629                           request->nameSpace,
1630                           request->classNames[i]);
1631           
1632                       classNames.append(className);
1633                   }
1634           
1635                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1636                       "Calling provider.deleteSubscription: " + _name);
1637           
1638                   AutoPThreadSecurity threadLevelSecurity(context);
1639 kumpf 1.1 
1640                   pm_service_op_lock op_lock(&status);
1641           
1642                   CIMIndicationProvider* provider =
1643                       getProviderInterface<CIMIndicationProvider>(_provider);
1644           
1645                   provider->deleteSubscription(
1646                       context,
1647                       request->subscriptionInstance.getPath(),
1648                       classNames);
1649           
1650                   //
1651                   //  Decrement count of current subscriptions for this provider
1652                   //
1653                   if (status.decrementSubscriptionsAndTestIfZero())
1654                   {
1655                       //
1656                       //  If there are no current subscriptions after the decrement,
1657                       //  the last subscription has been deleted
1658                       //  Call the provider's disableIndications method
1659                       //
1660 kumpf 1.1             if (_subscriptionInitComplete)
1661                       {
1662                           _disableIndications();
1663                       }
1664                   }
1665               }
1666               HandleCatch(handler);
1667           
1668               PEG_METHOD_EXIT();
1669               return(response);
1670           }
1671           
1672           CIMResponseMessage* ProviderMessageHandler::_handleExportIndicationRequest(
1673               CIMRequestMessage* message)
1674           {
1675               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1676                   "ProviderMessageHandler::_handleExportIndicationRequest");
1677           
1678               CIMExportIndicationRequestMessage* request =
1679                   dynamic_cast<CIMExportIndicationRequestMessage*>(message);
1680               PEGASUS_ASSERT(request != 0);
1681 kumpf 1.1 
1682               CIMExportIndicationResponseMessage* response =
1683                   dynamic_cast<CIMExportIndicationResponseMessage*>(
1684                       request->buildResponse());
1685               PEGASUS_ASSERT(response != 0);
1686           
1687               OperationResponseHandler handler(
1688                   request, response, _responseChunkCallback);
1689           
1690               try
1691               {
1692                   OperationContext context;
1693           
1694                   context.insert(request->operationContext.get(IdentityContainer::NAME));
1695           
1696           //L10N_TODO
1697           // ATTN-CEC 06/04/03 NOTE: I can't find where the consume msg is sent.  This
1698           // does not appear to be hooked up.  When it is added, need to
1699           // make sure that Content-Language is set in the consume msg.
1700           // NOTE: A-L is not needed to be set in the consume msg.
1701           
1702 kumpf 1.1         // add the langs to the context
1703                   context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));
1704           
1705                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1706                       "Calling provider.consumeIndication: " + _name);
1707           
1708                   StatProviderTimeMeasurement providerTime(response);
1709           
1710                   pm_service_op_lock op_lock(&status);
1711           
1712                   CIMIndicationConsumerProvider* provider =
1713                       getProviderInterface<CIMIndicationConsumerProvider>(_provider);
1714           
1715                   provider->consumeIndication(
1716                       context,
1717                       request->destinationPath,
1718                       request->indicationInstance);
1719               }
1720               HandleCatch(handler);
1721           
1722               PEG_METHOD_EXIT();
1723 kumpf 1.1     return(response);
1724           }
1725           
1726           void ProviderMessageHandler::_enableIndications()
1727           {
1728               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1729                   "DefaultProviderManager::_enableIndications");
1730           
1731               try
1732               {
1733                   EnableIndicationsResponseHandler* indicationResponseHandler =
1734                       new EnableIndicationsResponseHandler(
1735                           0,    // request
1736                           0,    // response
1737                           status.getProviderInstance(),
1738                           _indicationCallback,
1739                           _responseChunkCallback);
1740           
1741                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1742                       "Calling provider.enableIndications: " + _name);
1743           
1744 kumpf 1.1         pm_service_op_lock op_lock(&status);
1745           
1746                   status.protect();
1747           
1748                   status._indicationsEnabled = true;
1749           
1750                   CIMIndicationProvider* provider =
1751                       getProviderInterface<CIMIndicationProvider>(_provider);
1752           
1753                   provider->enableIndications(*indicationResponseHandler);
1754           
1755                   _indicationResponseHandler = indicationResponseHandler;
1756               }
1757               catch (CIMException& e)
1758               {
1759                   PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2,
1760                       "CIMException: " + e.getMessage ());
1761           
1762                   Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
1763                       "ProviderManager.Default.DefaultProviderManager."
1764                           "ENABLE_INDICATIONS_FAILED",
1765 kumpf 1.1             "Failed to enable indications for provider $0: $1.",
1766                       _name, e.getMessage());
1767               }
1768               catch (Exception& e)
1769               {
1770                   PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2,
1771                       "Exception: " + e.getMessage ());
1772           
1773                   Logger::put_l (Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
1774                       "ProviderManager.Default.DefaultProviderManager."
1775                           "ENABLE_INDICATIONS_FAILED",
1776                       "Failed to enable indications for provider $0: $1.",
1777                       _name, e.getMessage());
1778               }
1779               catch(...)
1780               {
1781                   PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2,
1782                       "Unexpected error in _enableIndications");
1783           
1784                   Logger::put_l (Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
1785                       "ProviderManager.Default.DefaultProviderManager."
1786 kumpf 1.1                 "ENABLE_INDICATIONS_FAILED_UNKNOWN",
1787                       "Failed to enable indications for provider $0.",
1788                       _name);
1789               }
1790           
1791               PEG_METHOD_EXIT();
1792           }
1793           
1794           void ProviderMessageHandler::_disableIndications()
1795           {
1796               PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
1797                   "DefaultProviderManager::_disableIndications");
1798           
1799               try
1800               {
1801                   if (status._indicationsEnabled)
1802                   {
1803                       pm_service_op_lock op_lock(&status);
1804           
1805                       CIMIndicationProvider* provider =
1806                           getProviderInterface<CIMIndicationProvider>(_provider);
1807 kumpf 1.1 
1808                       provider->disableIndications();
1809           
1810                       status._indicationsEnabled = false;
1811           
1812                       status.unprotect();
1813           
1814                       status.resetSubscriptions();
1815           
1816                       PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1817                           "Destroying indication response handler for " + _name);
1818           
1819                       delete _indicationResponseHandler;
1820                       _indicationResponseHandler = 0;
1821                   }
1822               }
1823               catch(...)
1824               {
1825                   PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL3,
1826                       "Error occured disabling indications in provider " + _name);
1827               }
1828 kumpf 1.1 }
1829           
1830           PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2