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

Diff for /pegasus/src/Pegasus/ProviderManager2/Default/DefaultProviderManager.cpp between version 1.34 and 1.84

version 1.34, 2004/06/10 08:57:32 version 1.84, 2008/05/12 09:14:55
Line 1 
Line 1 
 //%2003////////////////////////////////////////////////////////////////////////  //%2006////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002  BMC Software, Hewlett-Packard Development  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
 // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
 // IBM Corp.; EMC Corporation, The Open Group. // IBM Corp.; EMC Corporation, The Open Group.
   // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; Symantec Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 23 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // Author: Chip Vincent (cvincent@us.ibm.com)  
 //  
 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company  
 //                  (carolann_graves@hp.com)  
 //              Mike Day, IBM (mdday@us.ibm.com)  
 //              Karl Schopmeyer(k.schopmeyer@opengroup.org) - Fix associators.  
 //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)  
 //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)  
 //                              Seema Gupta (gseema@in.ibm.com) for PEP135  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
 #include "DefaultProviderManager.h" #include "DefaultProviderManager.h"
  
 #include <Pegasus/Common/CIMMessage.h> #include <Pegasus/Common/CIMMessage.h>
 #include <Pegasus/Common/OperationContext.h> #include <Pegasus/Common/OperationContext.h>
 #include <Pegasus/Common/Destroyer.h>  #include <Pegasus/Common/Time.h>
 #include <Pegasus/Common/Tracer.h> #include <Pegasus/Common/Tracer.h>
 #include <Pegasus/Common/StatisticalData.h> #include <Pegasus/Common/StatisticalData.h>
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.h>
 #include <Pegasus/Common/MessageLoader.h> //l10n  #include <Pegasus/Common/MessageLoader.h>
   #include <Pegasus/Common/FileSystem.h>
   #include <Pegasus/Common/PegasusVersion.h>
   #include <Pegasus/Common/Constants.h>
  
 #include <Pegasus/Common/QueryExpression.h>  #include <Pegasus/Query/QueryExpression/QueryExpression.h>
 #include <Pegasus/ProviderManager2/QueryExpressionFactory.h> #include <Pegasus/ProviderManager2/QueryExpressionFactory.h>
  
 #include <Pegasus/ProviderManager2/Default/Provider.h>  
 #include <Pegasus/ProviderManager2/OperationResponseHandler.h> #include <Pegasus/ProviderManager2/OperationResponseHandler.h>
  
 #include <Pegasus/ProviderManager2/ProviderManagerService.h>  
 #include <Pegasus/ProviderManager2/ProviderType.h>  
   
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
  
 // auto variable to protect provider during operations  //
 class pm_service_op_lock  // Default Provider Manager
 {  //
 private:  DefaultProviderManager::DefaultProviderManager()
     pm_service_op_lock(void);  
   
 public:  
     pm_service_op_lock(Provider *provider) : _provider(provider)  
     {     {
         _provider->protect();      _subscriptionInitComplete = false;
     }     }
  
     ~pm_service_op_lock(void)  DefaultProviderManager::~DefaultProviderManager()
     {     {
         _provider->unprotect();      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
     }          "DefaultProviderManager::~DefaultProviderManager");
   
     Provider * _provider;  
 };  
   
 //  
 // Provider module status  
 //  
 static const Uint16 _MODULE_OK       = 2;  
 static const Uint16 _MODULE_STOPPING = 9;  
 static const Uint16 _MODULE_STOPPED  = 10;  
  
       _shutdownAllProviders();
  
 //      for (ProviderTable::Iterator i = _providers.start(); i != 0; i++)
 // Default Provider Manager  
 //  
 DefaultProviderManager::DefaultProviderManager(void)  
 { {
           ProviderMessageHandler* provider = i.value();
           delete provider;
 } }
  
 DefaultProviderManager::~DefaultProviderManager(void)      for (ModuleTable::Iterator j = _modules.start(); j != 0; j++)
 { {
           ProviderModule* module = j.value();
           delete module;
       }
   
       PEG_METHOD_EXIT();
 } }
  
 Message * DefaultProviderManager::processMessage(Message * request)  Message* DefaultProviderManager::processMessage(Message* message)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
         "DefaultProviderManager::processMessage()");         "DefaultProviderManager::processMessage()");
  
     Message * response = 0;      CIMRequestMessage* request = dynamic_cast<CIMRequestMessage*>(message);
       PEGASUS_ASSERT(request != 0);
   
       CIMResponseMessage* response = 0;
  
       try
       {
     // pass the request message to a handler method based on message type     // pass the request message to a handler method based on message type
     switch(request->getType())     switch(request->getType())
     {     {
     case CIM_GET_INSTANCE_REQUEST_MESSAGE:     case CIM_GET_INSTANCE_REQUEST_MESSAGE:
         response = handleGetInstanceRequest(request);  
   
         break;  
     case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:     case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
         response = handleEnumerateInstancesRequest(request);  
   
         break;  
     case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:     case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
         response = handleEnumerateInstanceNamesRequest(request);  
   
         break;  
     case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:     case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
         response = handleCreateInstanceRequest(request);  
   
         break;  
     case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:     case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
         response = handleModifyInstanceRequest(request);  
   
         break;  
     case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:     case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
         response = handleDeleteInstanceRequest(request);  
   
         break;  
     case CIM_EXEC_QUERY_REQUEST_MESSAGE:     case CIM_EXEC_QUERY_REQUEST_MESSAGE:
         response = handleExecQueryRequest(request);  
   
         break;  
     case CIM_ASSOCIATORS_REQUEST_MESSAGE:     case CIM_ASSOCIATORS_REQUEST_MESSAGE:
         response = handleAssociatorsRequest(request);  
   
         break;  
     case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:     case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
         response = handleAssociatorNamesRequest(request);  
   
         break;  
     case CIM_REFERENCES_REQUEST_MESSAGE:     case CIM_REFERENCES_REQUEST_MESSAGE:
         response = handleReferencesRequest(request);  
   
         break;  
     case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:     case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
         response = handleReferenceNamesRequest(request);  
   
         break;  
     case CIM_GET_PROPERTY_REQUEST_MESSAGE:     case CIM_GET_PROPERTY_REQUEST_MESSAGE:
         response = handleGetPropertyRequest(request);  
   
         break;  
     case CIM_SET_PROPERTY_REQUEST_MESSAGE:     case CIM_SET_PROPERTY_REQUEST_MESSAGE:
         response = handleSetPropertyRequest(request);  
   
         break;  
     case CIM_INVOKE_METHOD_REQUEST_MESSAGE:     case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
         response = handleInvokeMethodRequest(request);  
   
         break;  
     case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:     case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:
         response = handleCreateSubscriptionRequest(request);  
   
         break;  
     case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:     case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:
         response = handleModifySubscriptionRequest(request);  
   
         break;  
     case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:     case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:
         response = handleDeleteSubscriptionRequest(request);          case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:
           {
               ProviderIdContainer providerId =
                   request->operationContext.get(ProviderIdContainer::NAME);
  
         break;              // resolve provider name
     case CIM_ENABLE_INDICATIONS_REQUEST_MESSAGE:              ProviderName name = _resolveProviderName(providerId);
         response = handleEnableIndicationsRequest(request);  
  
         break;              // get cached or load new provider module
     case CIM_DISABLE_INDICATIONS_REQUEST_MESSAGE:              ProviderOperationCounter poc(
         response = handleDisableIndicationsRequest(request);                  _getProvider(
                       name.getPhysicalName(),
                       name.getModuleName(),
                       name.getLogicalName()));
  
               response = poc.GetProvider().processMessage(request);
         break;         break;
     case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:          }
         response = handleExportIndicationRequest(request);  
         break;  
  
     case CIM_DISABLE_MODULE_REQUEST_MESSAGE:     case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
         response = handleDisableModuleRequest(request);              response = _handleDisableModuleRequest(request);
   
         break;         break;
     case CIM_ENABLE_MODULE_REQUEST_MESSAGE:  
         response = handleEnableModuleRequest(request);  
  
           case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
               response = _handleEnableModuleRequest(request);
         break;         break;
     case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:  
         response = handleStopAllProvidersRequest(request);  
  
           case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
               // tell the provider manager to shutdown all the providers
               _shutdownAllProviders();
               response = request->buildResponse();
         break;         break;
     case CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE:  
         response = handleInitializeProviderRequest(request);  
  
           case CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE:
               response = _handleSubscriptionInitCompleteRequest(request);
         break;         break;
     default:  
         response = handleUnsupportedRequest(request);  
  
           default:
               PEGASUS_ASSERT(0);
         break;         break;
     }     }
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 } }
       catch (CIMException& e)
 Message * DefaultProviderManager::handleUnsupportedRequest(const Message * message)      {
           PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
               "CIMException: " + e.getMessage());
           response = request->buildResponse();
           response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
               e.getContentLanguages(), e.getCode(), e.getMessage());
       }
       catch (Exception& e)
       {
           PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
               "Exception: " + e.getMessage());
           response = request->buildResponse();
           response->cimException = PEGASUS_CIM_EXCEPTION_LANG(
               e.getContentLanguages(), CIM_ERR_FAILED, e.getMessage());
       }
       catch (...)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleUnsupportedRequest");          PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
               "Exception: Unknown");
           response = request->buildResponse();
           response->cimException = PEGASUS_CIM_EXCEPTION(
               CIM_ERR_FAILED, "Unknown error.");
       }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
       return response;
     // a null response implies unsupported or unknown operation  
     return(0);  
 } }
  
 Message * DefaultProviderManager::handleInitializeProviderRequest(  CIMResponseMessage* DefaultProviderManager::_handleDisableModuleRequest(
     const Message * message)      CIMRequestMessage* message)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
         "DefaultProviderManager::handleInitializeProviderRequest");          "DefaultProviderManager::_handleDisableModuleRequest");
   
     CIMInitializeProviderRequestMessage * request =  
         dynamic_cast<CIMInitializeProviderRequestMessage *>  
             (const_cast<Message *>(message));  
  
       CIMDisableModuleRequestMessage* request =
           dynamic_cast<CIMDisableModuleRequestMessage*>(message);
     PEGASUS_ASSERT(request != 0);     PEGASUS_ASSERT(request != 0);
  
     CIMInitializeProviderResponseMessage * response =      Array<Uint16> operationalStatus;
         new CIMInitializeProviderResponseMessage(      CIMException cimException;
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     // preserve message key  
     response->setKey(request->getKey());  
  
     //  Set HTTP method in response from request      try
     response->setHttpMethod(request->getHttpMethod());      {
           // get provider module name
           String moduleName;
           CIMInstance mInstance = request->providerModule;
           Uint32 pos = mInstance.findProperty(CIMName("Name"));
           PEGASUS_ASSERT(pos != PEG_NOT_FOUND);
           mInstance.getProperty(pos).getValue().get(moduleName);
  
     OperationResponseHandler handler(request, response);          //
           // Unload providers
           //
           Array<CIMInstance> providerInstances = request->providers;
  
     try          for (Uint32 i = 0, n = providerInstances.size(); i < n; i++)
     {     {
         // resolve provider name              String pName;
         ProviderName name = _resolveProviderName(              providerInstances[i].getProperty(
             request->operationContext.get(ProviderIdContainer::NAME));                  providerInstances[i].findProperty("Name")).
                       getValue().get(pName);
  
         // get cached or load new provider module              Sint16 ret_value = _disableProvider(moduleName, pName);
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(),  
                 name.getLogicalName(), String::EMPTY);  
  
               if (ret_value == 0)
               {
                   // disable failed since there are pending requests,
                   // stop trying to disable other providers in this module.
                   operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK);
                   break;
               }
               else if (ret_value != 1)  // Not success
               {
                   // disable failed for other reason, throw exception
                   throw PEGASUS_CIM_EXCEPTION_L(
                       CIM_ERR_FAILED,
                       MessageLoaderParms(
                           "ProviderManager.ProviderManagerService."
                               "DISABLE_PROVIDER_FAILED",
                           "Failed to disable the provider."));
               }
           }
     }     }
     catch(CIMException & e)     catch(CIMException & e)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL3,          PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "CIMException: " + e.getMessage());                           "Exception: " + e.getMessage());
           cimException = e;
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage());  
     }     }
     catch(Exception & e)     catch(Exception & e)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL3,          PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());             "Exception: " + e.getMessage());
           cimException = CIMException(CIM_ERR_FAILED, e.getMessage());
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage());  
     }     }
     catch(...)     catch(...)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL3,          PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: Unknown");             "Exception: Unknown");
           cimException = PEGASUS_CIM_EXCEPTION_L(
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");              CIM_ERR_FAILED,
               MessageLoaderParms(
                   "ProviderManager.ProviderManagerService.UNKNOWN_ERROR",
                   "Unknown Error"));
     }     }
  
     PEG_METHOD_EXIT();      if (cimException.getCode() == CIM_ERR_SUCCESS)
       {
     return(response);          // Status is set to OK if a provider was busy
           if (operationalStatus.size() == 0)
           {
               operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_STOPPED);
 } }
       }
 Message * DefaultProviderManager::handleGetInstanceRequest(const Message * message)      else
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleGetInstanceRequest");          // If exception occurs, module is not stopped
           operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK);
     CIMGetInstanceRequestMessage * request =      }
         dynamic_cast<CIMGetInstanceRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMGetInstanceResponseMessage * response =  
         new CIMGetInstanceResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         CIMInstance());  
  
       CIMDisableModuleResponseMessage* response =
           dynamic_cast<CIMDisableModuleResponseMessage*>(
               request->buildResponse());
     PEGASUS_ASSERT(response != 0);     PEGASUS_ASSERT(response != 0);
  
     // preserve message key      response->operationalStatus = operationalStatus;
     response->setKey(request->getKey());  
  
     //  Set HTTP method in response from request      PEG_METHOD_EXIT();
     response->setHttpMethod(request->getHttpMethod());  
  
     // create a handler for this request      return response;
     GetInstanceResponseHandler handler(request, response);  }
  
     try  CIMResponseMessage* DefaultProviderManager::_handleEnableModuleRequest(
       CIMRequestMessage* message)
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
             "DefaultProviderManager::handleGetInstanceRequest - Host name: $0  Name space: $1  Class name: $2",          "DefaultProviderManager::_handleEnableModuleRequest");
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->instanceName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->instanceName.getClassName(),  
             request->instanceName.getKeyBindings());  
  
         // resolve provider name      CIMEnableModuleRequestMessage* request =
         ProviderName name = _resolveProviderName(          dynamic_cast<CIMEnableModuleRequestMessage*>(message);
             request->operationContext.get(ProviderIdContainer::NAME));      PEGASUS_ASSERT(request != 0);
  
         // get cached or load new provider module      Array<Uint16> operationalStatus;
         OpProviderHolder ph =      operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK);
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
  
         // convert arguments      CIMEnableModuleResponseMessage* response =
         OperationContext context;          dynamic_cast<CIMEnableModuleResponseMessage*>(
               request->buildResponse());
       PEGASUS_ASSERT(response != 0);
  
                 context.insert(request->operationContext.get(IdentityContainer::NAME));      response->operationalStatus = operationalStatus;
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
  
         CIMPropertyList propertyList(request->propertyList);      PEG_METHOD_EXIT();
       return response;
   }
  
         // forward request  CIMResponseMessage*
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  DefaultProviderManager::_handleSubscriptionInitCompleteRequest(
             "Calling provider.getInstance: " +      CIMRequestMessage* message)
             ph.GetProvider().getName());  {
       PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::_handleSubscriptionInitCompleteRequest");
  
         pm_service_op_lock op_lock(&ph.GetProvider());      CIMSubscriptionInitCompleteRequestMessage* request =
           dynamic_cast<CIMSubscriptionInitCompleteRequestMessage*>(message);
       PEGASUS_ASSERT(request != 0);
  
         STAT_GETSTARTTIME;      CIMSubscriptionInitCompleteResponseMessage* response =
           dynamic_cast<CIMSubscriptionInitCompleteResponseMessage*>(
               request->buildResponse());
       PEGASUS_ASSERT(response != 0);
  
         ph.GetProvider().getInstance(      _subscriptionInitComplete = true;
             context,  
             objectPath,  
             request->includeQualifiers,  
             request->includeClassOrigin,  
             propertyList,  
             handler);  
  
         STAT_PMS_PROVIDEREND;      // Make a copy of the table so it is not locked during the provider calls
     }      Array<ProviderMessageHandler*> providerList;
     catch(CIMException & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          AutoMutex lock(_providerTableMutex);
             "Exception: " + e.getMessage());  
  
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n          for (ProviderTable::Iterator i = _providers.start(); i != 0; i++)
     }  
     catch(Exception & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,              providerList.append(i.value());
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(...)      }
   
       //
       // Notify all providers that subscription initialization is complete
       //
       for (Uint32 j = 0; j < providerList.size(); j++)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          AutoMutex lock(providerList[j]->status.getStatusMutex());
             "Exception: Unknown");  
  
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");          if (providerList[j]->status.isInitialized())
           {
               providerList[j]->subscriptionInitComplete();
           }
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
       return response;
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleEnumerateInstancesRequest(const Message * message)  ProviderName DefaultProviderManager::_resolveProviderName(
       const ProviderIdContainer& providerId)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleEnumerateInstanceRequest");      String providerName;
       String fileName;
       String moduleName;
       CIMValue genericValue;
  
     CIMEnumerateInstancesRequestMessage * request =      genericValue = providerId.getModule().getProperty(
         dynamic_cast<CIMEnumerateInstancesRequestMessage *>(const_cast<Message *>(message));          providerId.getModule().findProperty("Name")).getValue();
       genericValue.get(moduleName);
  
     PEGASUS_ASSERT(request != 0);      genericValue = providerId.getProvider().getProperty(
           providerId.getProvider().findProperty("Name")).getValue();
       genericValue.get(providerName);
  
     CIMEnumerateInstancesResponseMessage * response =      genericValue = providerId.getModule().getProperty(
         new CIMEnumerateInstancesResponseMessage(          providerId.getModule().findProperty("Location")).getValue();
         request->messageId,      genericValue.get(fileName);
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMInstance>());  
  
     PEGASUS_ASSERT(response != 0);      String resolvedFileName = _resolvePhysicalName(fileName);
  
     // preserve message key      if (resolvedFileName == String::EMPTY)
     response->setKey(request->getKey());      {
           // Provider library not found
           String moduleName;
           genericValue = providerId.getModule().getProperty(
               providerId.getModule().findProperty("Name")).getValue();
           genericValue.get(moduleName);
  
     //  Set HTTP method in response from request          throw Exception(MessageLoaderParms(
     response->setHttpMethod (request->getHttpMethod ());              "ProviderManager.ProviderManagerService.PROVIDER_FILE_NOT_FOUND",
               "File \"$0\" was not found for provider module \"$1\".",
               FileSystem::buildLibraryFileName(fileName), moduleName));
       }
  
     // create a handler for this request      return ProviderName(moduleName, providerName, resolvedFileName);
     EnumerateInstancesResponseHandler handler(request, response);  }
  
     try  ProviderOperationCounter DefaultProviderManager::_getProvider(
       const String& moduleFileName,
       const String& moduleName,
       const String& providerName)
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
             "DefaultProviderManager::handleEnumerateInstancesRequest - Host name: $0  Name space: $1  Class name: $2",          "DefaultProviderManager::_getProvider");
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->className.getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->className);  
  
         // resolve provider name      ProviderMessageHandler* pr = _lookupProvider(moduleName, providerName);
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
  
         // get cached or load new provider module      if (!pr->status.isInitialized())
         OpProviderHolder ph = providerManager.getProvider(name.getPhysicalName(),      {
                 name.getLogicalName(), String::EMPTY);          _initProvider(pr, moduleFileName);
       }
  
         // convert arguments      AutoMutex lock(pr->status.getStatusMutex());
         OperationContext context;  
  
                 context.insert(request->operationContext.get(IdentityContainer::NAME));      if (!pr->status.isInitialized())
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));      {
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));          PEG_METHOD_EXIT();
           throw PEGASUS_CIM_EXCEPTION(
               CIM_ERR_FAILED, "provider initialization failed");
       }
  
         CIMPropertyList propertyList(request->propertyList);      ProviderOperationCounter poc(pr);
  
         // forward request  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Calling provider.enumerateInstances: " +          "Returning Provider " + providerName);
             ph.GetProvider().getName());  
  
         pm_service_op_lock op_lock(&ph.GetProvider());      PEG_METHOD_EXIT();
       return poc;
   }
  
         STAT_GETSTARTTIME;  ProviderMessageHandler* DefaultProviderManager::_lookupProvider(
       const String& moduleName,
       const String& providerName)
   {
       PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::_lookupProvider");
  
         ph.GetProvider().enumerateInstances(      // lock the providerTable mutex
             context,      AutoMutex lock(_providerTableMutex);
             objectPath,  
             request->includeQualifiers,  
             request->includeClassOrigin,  
             propertyList,  
             handler);  
  
         STAT_PMS_PROVIDEREND;      // Construct the lookup key. We need a compound key to differentiate
     }      // providers with the same name from different modules. The size field is
     catch(CIMException & e)      // added to handle the unlikely case when moduleName+providerName
     {      // produce identical strings but define different providers.
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,      char buffer[12];
             "Exception: " + e.getMessage());      sprintf(buffer, "%u:", providerName.size());
       const String key = buffer + moduleName + ":" + providerName;
  
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n      // look up provider in cache
     }      ProviderMessageHandler* pr = 0;
     catch(Exception & e)      if (_providers.lookup(key, pr))
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());              "Found Provider " + providerName + " in Provider Manager Cache");
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(...)      else
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          // create provider
             "Exception: Unknown");          pr = new ProviderMessageHandler(
               moduleName, providerName,
               0, _indicationCallback, _responseChunkCallback,
               _subscriptionInitComplete);
   
           // insert provider in provider table
           _providers.insert(key, pr);
  
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");          PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
               "Created provider " + pr->getName());
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
       return pr;
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleEnumerateInstanceNamesRequest(const Message * message)  ProviderMessageHandler* DefaultProviderManager::_initProvider(
       ProviderMessageHandler* provider,
       const String& moduleFileName)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleEnumerateInstanceNamesRequest");      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::_initProvider");
     CIMEnumerateInstanceNamesRequestMessage * request =  
         dynamic_cast<CIMEnumerateInstanceNamesRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
  
     CIMEnumerateInstanceNamesResponseMessage * response =      ProviderModule* module = 0;
         new CIMEnumerateInstanceNamesResponseMessage(      CIMProvider* base;
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMObjectPath>());  
  
     PEGASUS_ASSERT(response != 0);      // lookup provider module
       module = _lookupModule(moduleFileName);
  
     // preserve message key      // lock the provider status mutex
     response->setKey(request->getKey());      AutoMutex lock(provider->status.getStatusMutex());
  
     //set HTTP method in response from request      if (provider->status.isInitialized())
     response->setHttpMethod(request->getHttpMethod());;      {
           // Initialization is already complete
           return provider;
       }
  
     // create a handler for this request      PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
     EnumerateInstanceNamesResponseHandler handler(request, response);          "Loading/Linking Provider Module " + moduleFileName);
  
     // process the request      // load the provider
     try     try
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,          base = module->load(provider->getName());
             "DefaultProviderManager::handleEnumerateInstanceNamesRequest - Host name: $0  Name space: $1  Class name: $2",      }
             System::getHostName(),      catch (...)
             request->nameSpace.getString(),      {
             request->className.getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->className);  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName());  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         // forward request  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Calling provider.enumerateInstanceNames: " +              "Exception caught Loading/Linking Provider Module " +
             ph.GetProvider().getName());              moduleFileName);
           PEG_METHOD_EXIT();
         pm_service_op_lock op_lock(&ph.GetProvider());          throw;
       }
  
         STAT_GETSTARTTIME;      // initialize the provider
       PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
           "Initializing Provider " + provider->getName());
  
         ph.GetProvider().enumerateInstanceNames(      CIMOMHandle* cimomHandle = new CIMOMHandle();
             context,      provider->status.setCIMOMHandle(cimomHandle);
             objectPath,      provider->status.setModule(module);
             handler);      provider->setProvider(base);
  
         STAT_PMS_PROVIDEREND;      Boolean initializeError = false;
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
  
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n      try
     }  
     catch(Exception & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          provider->initialize(*cimomHandle);
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(...)     catch(...)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          initializeError = true;
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }     }
  
     PEG_METHOD_EXIT();      // The cleanup code executed when an exception occurs was previously
       // included in the catch block above. Unloading the provider module
     return(response);      // from inside the catch block resulted in a crash when an exception
 }      // was thrown from a provider's initialize() method. The issue is that
       // when an exception is thrown, the program maintains internal
       // pointers related to the code that threw the exception. In the case
       // of an exception thrown from a provider during the initialize()
       // method, those pointers point into the provider library, so when
       // the DefaultProviderManager unloads the library, the pointers into
       // the library that the program was holding are invalid.
  
 Message * DefaultProviderManager::handleCreateInstanceRequest(const Message * message)      if (initializeError == true)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleCreateInstanceRequest");          // Allow the provider to clean up
           provider->terminate();
     CIMCreateInstanceRequestMessage * request =  
         dynamic_cast<CIMCreateInstanceRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
  
     // create response message          // delete the cimom handle
     CIMCreateInstanceResponseMessage * response =          delete cimomHandle;
         new CIMCreateInstanceResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         CIMObjectPath());  
  
     PEGASUS_ASSERT(response != 0);          provider->setProvider(0);
  
     // preserve message key          // unload provider module
     response->setKey(request->getKey());          module->unloadModule();
       }
  
     //  Set HTTP method in response from request      provider->status.setInitialized(!initializeError);
     response->setHttpMethod (request->getHttpMethod ());  
  
     // create a handler for this request      PEG_METHOD_EXIT();
     CreateInstanceResponseHandler handler(request, response);      return provider;
   }
  
     try  ProviderModule* DefaultProviderManager::_lookupModule(
       const String& moduleFileName)
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
             "DefaultProviderManager::handleCreateInstanceRequest - Host name: $0  Name space: $1  Class name: $2",          "DefaultProviderManager::_lookupModule");
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->newInstance.getPath().getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->newInstance.getPath().getClassName(),  
             request->newInstance.getPath().getKeyBindings());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         // forward request  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.createInstance: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
  
         STAT_GETSTARTTIME;      // lock the providerTable mutex
       AutoMutex lock(_providerTableMutex);
  
         ph.GetProvider().createInstance(      // look up provider module in cache
             context,      ProviderModule* module = 0;
             objectPath,  
             request->newInstance,  
             handler);  
  
         STAT_PMS_PROVIDEREND;      if (_modules.lookup(moduleFileName, module))
     }  
     catch(CIMException & e)  
     {     {
           // found provider module in cache
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());              "Found Provider Module " + moduleFileName +
               " in Provider Manager Cache");
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(Exception & e)      else
     {     {
           // provider module not found in cache, create provider module
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());              "Creating Provider Module " + moduleFileName);
  
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n          module = new ProviderModule(moduleFileName);
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
  
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");          // insert provider module in module table
           _modules.insert(moduleFileName, module);
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
       return module;
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleModifyInstanceRequest(const Message * message)  Boolean DefaultProviderManager::hasActiveProviders()
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleModifyInstanceRequest");      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::hasActiveProviders");
     CIMModifyInstanceRequestMessage * request =  
         dynamic_cast<CIMModifyInstanceRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     // create response message  
     CIMModifyInstanceResponseMessage * response =  
         new CIMModifyInstanceResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     // create a handler for this request  
     ModifyInstanceResponseHandler handler(request, response);  
  
     try     try
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,          AutoMutex lock(_providerTableMutex);
             "DefaultProviderManager::handleModifyInstanceRequest - Host name: $0  Name space: $1  Class name: $2",          PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             System::getHostName(),              "Number of providers in _providers table = %d", _providers.size()));
             request->nameSpace.getString(),  
             request->modifiedInstance.getPath().getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->modifiedInstance.getPath ().getClassName(),  
             request->modifiedInstance.getPath ().getKeyBindings());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         CIMPropertyList propertyList(request->propertyList);  
   
         // forward request  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.modifyInstance: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         STAT_GETSTARTTIME;  
   
         ph.GetProvider().modifyInstance(  
             context,  
             objectPath,  
             request->modifiedInstance,  
             request->includeQualifiers,  
             propertyList,  
             handler);  
  
         STAT_PMS_PROVIDEREND;          // Iterate through the _providers table looking for an active provider
     }          for (ProviderTable::Iterator i = _providers.start(); i != 0; i++)
     catch(CIMException & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,              if (i.value()->status.isInitialized())
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,                  PEG_METHOD_EXIT();
             "Exception: " + e.getMessage());                  return true;
               }
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n          }
     }     }
     catch(...)     catch(...)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          // Unexpected exception; do not assume that no providers are loaded
             "Exception: Unknown");          PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
               "Unexpected Exception in hasActiveProviders.");
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");          PEG_METHOD_EXIT();
           return true;
     }     }
  
       // No active providers were found in the _providers table
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
       return false;
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleDeleteInstanceRequest(const Message * message)  void DefaultProviderManager::unloadIdleProviders()
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDeleteInstanceRequest");      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::unloadIdleProviders");
     CIMDeleteInstanceRequestMessage * request =  
         dynamic_cast<CIMDeleteInstanceRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     // create response message  
     CIMDeleteInstanceResponseMessage * response =  
         new CIMDeleteInstanceResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     // create a handler for this request  
     DeleteInstanceResponseHandler handler(request, response);  
  
     try     try
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,          struct timeval now;
             "DefaultProviderManager::handleDeleteInstanceRequest - Host name: $0  Name space: $1  Class name: $2",          Time::gettimeofday(&now);
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->instanceName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->instanceName.getClassName(),  
             request->instanceName.getKeyBindings());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
  
         // convert arguments          // Make a copy of the table so it is not locked during provider calls
         OperationContext context;          Array<ProviderMessageHandler*> providerList;
           {
               AutoMutex lock(_providerTableMutex);
  
                 context.insert(request->operationContext.get(IdentityContainer::NAME));              for (ProviderTable::Iterator i = _providers.start(); i != 0; i++)
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));              {
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));                  providerList.append(i.value());
               }
           }
  
         // forward request          for (Uint32 i = 0; i < providerList.size(); i++)
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          {
             "Calling provider.deleteInstance: " +              ProviderMessageHandler* provider = providerList[i];
             ph.GetProvider().getName());  
  
         pm_service_op_lock op_lock(&ph.GetProvider());              AutoMutex lock(provider->status.getStatusMutex());
  
         STAT_GETSTARTTIME;              if (!provider->status.isInitialized())
               {
                   continue;
               }
  
         ph.GetProvider().deleteInstance(              struct timeval providerTime = {0, 0};
             context,              provider->status.getLastOperationEndTime(&providerTime);
             objectPath,  
             handler);  
  
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());                  "provider->status.isIdle() returns: " +
                   CIMValue(provider->status.isIdle()).toString());
  
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n              if (provider->status.isIdle() &&
     }                  ((now.tv_sec - providerTime.tv_sec) >
     catch(Exception & e)                   ((Sint32)PEGASUS_PROVIDER_IDLE_TIMEOUT_SECONDS)))
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,                  PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
             "Exception: " + e.getMessage());                      "Unloading idle provider: " + provider->getName());
                   _unloadProvider(provider);
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n              }
           }
     }     }
     catch(...)     catch(...)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
             "Exception: Unknown");              "Caught unexpected exception in unloadIdleProviders.");
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
   
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleExecQueryRequest(const Message * message)  void DefaultProviderManager::_shutdownAllProviders()
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleExecQueryRequest");      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::_shutdownAllProviders");
     CIMExecQueryRequestMessage * request =  
         dynamic_cast<CIMExecQueryRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMExecQueryResponseMessage * response =  
         new CIMExecQueryResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMObject>());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     // create a handler for this request  
     ExecQueryResponseHandler handler(request, response);  
  
     try     try
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,          AutoMutex lock(_providerTableMutex);
             "DefaultProviderManager::handleExecQueryRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->className.getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->className);  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(),  
                                         name.getLogicalName(), String::EMPTY);  
   
         if (dynamic_cast<CIMInstanceQueryProvider*>(ph.GetCIMProvider()) == 0) {  
            String errorString = " instance provider is registered supporting execQuery "  
                                 "but is not a CIMQueryInstanceProvider subclass.";  
            throw CIMException(CIM_ERR_FAILED,"ProviderLoadFailure (" + name.getPhysicalName() + ":" +  
                             name.getLogicalName() + "):" + errorString);  
         }  
  
         // convert arguments          PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4,
         OperationContext context;              "providers in cache = %d", _providers.size()));
  
                 context.insert(request->operationContext.get(IdentityContainer::NAME));          for (ProviderTable::Iterator i = _providers.start(); i != 0; i++)
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));          {
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));              ProviderMessageHandler* provider = i.value();
               PEGASUS_ASSERT(provider != 0);
         QueryExpression qx(QueryExpressionFactory::routeBuildQueryExpressionRep  
            (request->queryLanguage,request->query));  
   
         // forward request  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.executeQueryRequest: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         STAT_GETSTARTTIME;  
  
         ph.GetProvider().execQuery(              AutoMutex lock(provider->status.getStatusMutex());
             context,  
             objectPath,  
             qx,  
             handler);  
  
         STAT_PMS_PROVIDEREND;              if (provider->status.isInitialized())
     }  
     catch(CIMException & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,                  _unloadProvider(provider);
             "Exception: " + e.getMessage());              }
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(...)     catch(...)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: Unknown");              "Unexpected Exception in _shutdownAllProviders().");
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
   
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleAssociatorsRequest(const Message * message)  Sint16 DefaultProviderManager::_disableProvider(
       const String& moduleName,
       const String& providerName)
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleAssociatorsRequest");      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
           "DefaultProviderManager::_disableProvider");
     CIMAssociatorsRequestMessage * request =  
         dynamic_cast<CIMAssociatorsRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMAssociatorsResponseMessage * response =  
         new CIMAssociatorsResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMObject>());  
  
     PEGASUS_ASSERT(response != 0);      ProviderMessageHandler* pr = _lookupProvider(moduleName, providerName);
       if (!pr->status.isInitialized())
       {
           PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
               "Provider " + providerName + " is not loaded");
           PEG_METHOD_EXIT();
           return 1;
       }
  
     // preserve message key      PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
     response->setKey(request->getKey());          "Disable Provider " + pr->getName());
       //
       // Check to see if there are pending requests. If there are pending
       // requests and the disable timeout has not expired, loop and wait one
       // second until either there is no pending requests or until timeout
       // expires.
       //
       Uint32 waitTime = PROVIDER_DISABLE_TIMEOUT;
       while ((pr->status.numCurrentOperations() > 0) && (waitTime > 0))
       {
           Threads::sleep(1000);
           waitTime = waitTime - 1;
       }
  
     // create a handler for this request      // There are still pending requests, do not disable
     AssociatorsResponseHandler handler(request, response);      if (pr->status.numCurrentOperations() > 0)
       {
           PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
               "Disable failed since there are pending requests.");
           PEG_METHOD_EXIT();
           return 0;
       }
  
     // process the request  
     try     try
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,          AutoMutex lock(pr->status.getStatusMutex());
             "DefaultProviderManager::handleAssociatorsRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->objectName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->objectName.getClassName());  
   
         objectPath.setKeyBindings(request->objectName.getKeyBindings());  
   
         CIMObjectPath assocPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->assocClass.getString());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
  
         // get cached or load new provider module          if (pr->status.isInitialized())
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         // ATTN KS STAT_GETSTARTTIME;  
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().associators(  
             context,  
             objectPath,  
             request->assocClass,  
             request->resultClass,  
             request->role,  
             request->resultRole,  
             request->includeQualifiers,  
             request->includeClassOrigin,  
             request->propertyList.getPropertyNameArray(),  
             handler);  
   
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());                  "Unloading Provider " + pr->getName());
               _unloadProvider(pr);
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(...)     catch(...)
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: Unknown");              "Unload provider failed " + pr->getName());
           PEG_METHOD_EXIT();
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");          return -1;
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
       return 1;
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleAssociatorNamesRequest(const Message * message)  void DefaultProviderManager::_unloadProvider(ProviderMessageHandler* provider)
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleAssociatorNamesRequest");  
   
     CIMAssociatorNamesRequestMessage * request =  
         dynamic_cast<CIMAssociatorNamesRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMAssociatorNamesResponseMessage * response =  
         new CIMAssociatorNamesResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMObjectPath>());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod(request->getHttpMethod());  
   
     // create a handler for this request  
     AssociatorNamesResponseHandler handler(request, response);  
   
     // process the request  
     try  
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,      //
             "DefaultProviderManager::handleAssociationNamesRequest - Host name: $0  Name space: $1  Class name: $2",      // NOTE:  It is the caller's responsibility to make sure that the
             System::getHostName(),      // provider->status.getStatusMutex() mutex is locked before calling
             request->nameSpace.getString(),      // this method.
             request->objectName.getClassName().getString());      //
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->objectName.getClassName());  
   
         objectPath.setKeyBindings(request->objectName.getKeyBindings());  
   
         CIMObjectPath assocPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->assocClass.getString());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
  
                 context.insert(request->operationContext.get(IdentityContainer::NAME));      PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));          "DefaultProviderManager::_unloadProvider");
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().associatorNames(  
             context,  
             objectPath,  
             request->assocClass,  
             request->resultClass,  
             request->role,  
             request->resultRole,  
             handler);  
  
         STAT_PMS_PROVIDEREND;      if (provider->status.numCurrentOperations() > 0)
     }  
     catch(CIMException & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());              "Provider cannot be unloaded due to pending operations: " +
               provider->getName());
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }     }
     catch(Exception & e)      else
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: " + e.getMessage());              "Terminating Provider " + provider->getName());
  
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n          provider->terminate();
     }  
     catch(...)          // unload provider module
     {          PEGASUS_ASSERT(provider->status.getModule() != 0);
           PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL3,
               "Unloading provider module: " + provider->getName());
           provider->status.getModule()->unloadModule();
   
           PEG_TRACE((
               TRC_PROVIDERMANAGER,
               Tracer::LEVEL3,
               "DefaultProviderManager:  Unloaded provider %s",
               (const char*) provider->getName().getCString()));
   
           // NOTE: The "delete provider->status.getCIMOMHandle()" operation
           //   was moved to be called after the unloadModule() call above
           //   as part of a fix for bugzilla 3669. For some providers
           //   run out-of-process on Windows platforms (i.e. running
           //   the cimserver with the forceProviderProcesses config option
           //   set to "true"), deleting the provider's CIMOMHandle before
           //   unloading the provider library caused the unload mechanism
           //   to deadlock, making that provider unavailable and preventing
           //   the cimserver from shutting down. It should NOT be moved back
           //   above the unloadModule() call. See bugzilla 3669 for details.
   
           // delete the cimom handle
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
             "Exception: Unknown");              "Destroying provider's CIMOMHandle: " + provider->getName());
           delete provider->status.getCIMOMHandle();
  
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");          // set provider status to uninitialized
           provider->status.setInitialized(false);
     }     }
  
     PEG_METHOD_EXIT();     PEG_METHOD_EXIT();
   
     return(response);  
 } }
  
 Message * DefaultProviderManager::handleReferencesRequest(const Message * message)  ProviderManager* DefaultProviderManager::createDefaultProviderManagerCallback()
 { {
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleReferencesRequest");      return new DefaultProviderManager();
   }
     CIMReferencesRequestMessage * request =  
         dynamic_cast<CIMReferencesRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMReferencesResponseMessage * response =  
         new CIMReferencesResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMObject>());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
  
     //  Set HTTP method in response from request  PEGASUS_NAMESPACE_END
     response->setHttpMethod (request->getHttpMethod ());  
  
     // create a handler for this request  PEGASUS_USING_PEGASUS;
     ReferencesResponseHandler handler(request, response);  
  
     // process the request  // This entry point is not needed because the DefaultProviderManager is created
     try  // using DefaultProviderManager::createDefaultProviderManagerCallback().
   #if 0
   extern "C" PEGASUS_EXPORT ProviderManager* PegasusCreateProviderManager(
       const String& providerManagerName)
     {     {
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,      if (String::equalNoCase(providerManagerName, "Default"))
             "DefaultProviderManager::handleReferencesRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->objectName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->objectName.getClassName());  
   
         objectPath.setKeyBindings(request->objectName.getKeyBindings());  
   
         CIMObjectPath resultPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->resultClass.getString());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         STAT_GETSTARTTIME;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.references: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().references(  
             context,  
             objectPath,  
             request->resultClass,  
             request->role,  
             request->includeQualifiers,  
             request->includeClassOrigin,  
             request->propertyList.getPropertyNameArray(),  
             handler);  
   
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleReferenceNamesRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleReferenceNamesRequest");  
   
     CIMReferenceNamesRequestMessage * request =  
         dynamic_cast<CIMReferenceNamesRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMReferenceNamesResponseMessage * response =  
         new CIMReferenceNamesResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         Array<CIMObjectPath>());  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     // create a handler for this request  
     ReferenceNamesResponseHandler handler(request, response);  
   
     // process the request  
     try  
     {  
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleReferenceNamesRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->objectName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->objectName.getClassName());  
   
         objectPath.setKeyBindings(request->objectName.getKeyBindings());  
   
         CIMObjectPath resultPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->resultClass.getString());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         STAT_GETSTARTTIME;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.referenceNames: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().referenceNames(  
             context,  
             objectPath,  
             request->resultClass,  
             request->role,  
             handler);  
   
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleGetPropertyRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleGetPropertyRequest");  
   
     CIMGetPropertyRequestMessage * request =  
         dynamic_cast<CIMGetPropertyRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     // create response message  
     CIMGetPropertyResponseMessage * response =  
         new CIMGetPropertyResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         CIMValue());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod(request->getHttpMethod());  
   
     GetPropertyResponseHandler handler(request, response);  
   
     try  
     {  
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleGetPropertyRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->instanceName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->instanceName.getClassName(),  
             request->instanceName.getKeyBindings());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         CIMName propertyName = request->propertyName;  
   
         STAT_GETSTARTTIME;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.getProperty: " +  
             ph.GetProvider().getName());  
   
         // forward request  
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().getProperty(  
             context,  
             objectPath,  
             propertyName,  
             handler);  
   
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleSetPropertyRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleSetPropertyRequest");  
   
     CIMSetPropertyRequestMessage * request =  
         dynamic_cast<CIMSetPropertyRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     // create response message  
     //l10n  
     CIMSetPropertyResponseMessage * response =  
         new CIMSetPropertyResponseMessage(  
         request->messageId,  
         PEGASUS_CIM_EXCEPTION_L(CIM_ERR_FAILED, MessageLoaderParms(  
         "ProviderManager.DefaultProviderManager.NOT_IMPLEMENTED",  
         "not implemented")),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod(request->getHttpMethod());  
   
     SetPropertyResponseHandler handler(request, response);  
   
     try  
     {  
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleSetPropertyRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->instanceName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->instanceName.getClassName(),  
             request->instanceName.getKeyBindings());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         CIMName propertyName = request->propertyName;  
         CIMValue propertyValue = request->newValue;  
   
         STAT_GETSTARTTIME;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.setProperty: " +  
             ph.GetProvider().getName());  
   
         // forward request  
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().setProperty(  
             context,  
             objectPath,  
             propertyName,  
             propertyValue,  
             handler);  
   
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleInvokeMethodRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleInvokeMethodRequest");  
   
     CIMInvokeMethodRequestMessage * request =  
         dynamic_cast<CIMInvokeMethodRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     // create response message  
     CIMInvokeMethodResponseMessage * response =  
         new CIMInvokeMethodResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop(),  
         CIMValue(),  
         Array<CIMParamValue>(),  
         request->methodName);  
   
     PEGASUS_ASSERT(response != 0);  
   
     // propagate message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     // create a handler for this request  
     InvokeMethodResponseHandler handler(request, response);  
   
     try  
     {  
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleInvokeMethodRequest - Host name: $0  Name space: $1  Class name: $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             request->instanceName.getClassName().getString());  
   
         // make target object path  
         CIMObjectPath objectPath(  
             System::getHostName(),  
             request->nameSpace,  
             request->instanceName.getClassName(),  
             request->instanceName.getKeyBindings());  
   
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
         CIMObjectPath instanceReference(request->instanceName);  
   
         // ATTN: propagate namespace  
         instanceReference.setNameSpace(request->nameSpace);  
   
         // forward request  
         STAT_GETSTARTTIME;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.invokeMethod: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().invokeMethod(  
             context,  
             instanceReference,  
             request->methodName,  
             request->inParameters,  
             handler);  
   
         STAT_PMS_PROVIDEREND;  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown error.");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleCreateSubscriptionRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleCreateSubscriptionRequest");  
   
     CIMCreateSubscriptionRequestMessage * request =  
         dynamic_cast<CIMCreateSubscriptionRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMCreateSubscriptionResponseMessage * response =  
         new CIMCreateSubscriptionResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     OperationResponseHandler handler(request, response);  
   
     try  
     {  
         String temp;  
   
         for(Uint32 i = 0, n = request->classNames.size(); i < n; i++)  
         {  
             temp.append(request->classNames[i].getString());  
   
             if(i == (n - 1))  
             {  
                 temp.append(", ");  
             }  
         }  
   
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleCreateSubscriptionRequest - Host name: $0  Name space: $1  Class name(s): $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             temp);  
   
                 CIMInstance req_provider, req_providerModule;  
                 ProviderIdContainer pidc = (ProviderIdContainer)request->operationContext.get(ProviderIdContainer::NAME);  
                 req_provider = pidc.getProvider();  
                 req_providerModule = pidc.getModule();  
   
         String physicalName=_resolvePhysicalName( req_providerModule.getProperty(  
                                                   req_providerModule.findProperty("Location")).getValue().toString());  
   
         ProviderName name(req_provider.getProperty(req_provider.findProperty("Name")).getValue ().toString (),  
                                   physicalName,  
                                   req_providerModule.getProperty(req_providerModule.findProperty  
                                   ("InterfaceType")).getValue().toString(),  
                                    0);  
                 // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionInstanceContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionFilterConditionContainer::NAME));  
   
         CIMObjectPath subscriptionName = request->subscriptionInstance.getPath();  
   
         Array<CIMObjectPath> classNames;  
   
         for(Uint32 i = 0, n = request->classNames.size(); i < n; i++)  
         {  
             CIMObjectPath className(  
                 System::getHostName(),  
                 request->nameSpace,  
                 request->classNames[i]);  
   
             classNames.append(className);  
         }  
   
         CIMPropertyList propertyList = request->propertyList;  
   
         Uint16 repeatNotificationPolicy = request->repeatNotificationPolicy;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.createSubscription: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().createSubscription(  
             context,  
             subscriptionName,  
             classNames,  
             propertyList,  
             repeatNotificationPolicy);  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown Error");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleModifySubscriptionRequest( const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleModifySubscriptionRequest");  
   
     CIMModifySubscriptionRequestMessage * request =  
         dynamic_cast<CIMModifySubscriptionRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMModifySubscriptionResponseMessage * response =  
         new CIMModifySubscriptionResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     OperationResponseHandler handler(request, response);  
   
     try  
     {  
         String temp;  
   
         for(Uint32 i = 0, n = request->classNames.size(); i < n; i++)  
         {  
             temp.append(request->classNames[i].getString());  
   
             if(i == (n - 1))  
             {  
                 temp.append(", ");  
             }  
         }  
   
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleCreateSubscriptionRequest - Host name: $0  Name space: $1  Class name(s): $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             temp);  
   
                 CIMInstance req_provider, req_providerModule;  
                 ProviderIdContainer pidc = (ProviderIdContainer)request->operationContext.get(ProviderIdContainer::NAME);  
                 req_provider = pidc.getProvider();  
                 req_providerModule = pidc.getModule();  
   
         String physicalName=_resolvePhysicalName( req_providerModule.getProperty(  
                                                   req_providerModule.findProperty("Location")).getValue().toString());  
   
         ProviderName name(req_provider.getProperty(req_provider.findProperty("Name")).getValue ().toString (),  
                                   physicalName,  
                                   req_providerModule.getProperty(req_providerModule.findProperty  
                                   ("InterfaceType")).getValue().toString(),  
                                    0);  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionInstanceContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionFilterConditionContainer::NAME));  
   
         CIMObjectPath subscriptionName = request->subscriptionInstance.getPath();  
   
         Array<CIMObjectPath> classNames;  
   
         for(Uint32 i = 0, n = request->classNames.size(); i < n; i++)  
         {  
             CIMObjectPath className(  
                 System::getHostName(),  
                 request->nameSpace,  
                 request->classNames[i]);  
   
             classNames.append(className);  
         }  
   
         CIMPropertyList propertyList = request->propertyList;  
   
         Uint16 repeatNotificationPolicy = request->repeatNotificationPolicy;  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.modifySubscription: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().modifySubscription(  
             context,  
             subscriptionName,  
             classNames,  
             propertyList,  
             repeatNotificationPolicy);  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown Error");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleDeleteSubscriptionRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDeleteSubscriptionRequest");  
   
     CIMDeleteSubscriptionRequestMessage * request =  
         dynamic_cast<CIMDeleteSubscriptionRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMDeleteSubscriptionResponseMessage * response =  
         new CIMDeleteSubscriptionResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod(request->getHttpMethod());  
   
     OperationResponseHandler handler(request, response);  
   
     try  
     {  
         String temp;  
   
         for(Uint32 i = 0, n = request->classNames.size(); i < n; i++)  
         {  
             temp.append(request->classNames[i].getString());  
   
             if(i == (n - 1))  
             {  
                 temp.append(", ");  
             }  
         }  
   
         Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,  
             "DefaultProviderManager::handleDeleteSubscriptionRequest - Host name: $0  Name space: $1  Class name(s): $2",  
             System::getHostName(),  
             request->nameSpace.getString(),  
             temp);  
   
                 CIMInstance req_provider, req_providerModule;  
                 ProviderIdContainer pidc = (ProviderIdContainer)request->operationContext.get(ProviderIdContainer::NAME);  
   
                 req_provider = pidc.getProvider();  
                 req_providerModule = pidc.getModule();  
   
               String physicalName=_resolvePhysicalName( req_providerModule.getProperty(  
                                                   req_providerModule.findProperty("Location")).getValue().toString());  
   
               ProviderName name(req_provider.getProperty(req_provider.findProperty("Name")).getValue ().toString (),  
                                   physicalName,  
                                   req_providerModule.getProperty(req_providerModule.findProperty  
                                   ("InterfaceType")).getValue().toString(),  
                                    0);  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         // convert arguments  
         OperationContext context;  
   
                 context.insert(request->operationContext.get(IdentityContainer::NAME));  
                 context.insert(request->operationContext.get(AcceptLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionInstanceContainer::NAME));  
             context.insert(request->operationContext.get(SubscriptionLanguageListContainer::NAME));  
   
         CIMObjectPath subscriptionName = request->subscriptionInstance.getPath();  
   
         Array<CIMObjectPath> classNames;  
   
         for(Uint32 i = 0, n = request->classNames.size(); i < n; i++)  
         {  
             CIMObjectPath className(  
                 System::getHostName(),  
                 request->nameSpace,  
                 request->classNames[i]);  
   
             classNames.append(className);  
         }  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.deleteSubscription: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
   
         ph.GetProvider().deleteSubscription(  
             context,  
             subscriptionName,  
             classNames);  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown Error");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleEnableIndicationsRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager:: handleEnableIndicationsRequest");  
   
     CIMEnableIndicationsRequestMessage * request =  
         dynamic_cast<CIMEnableIndicationsRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMEnableIndicationsResponseMessage * response =  
         new CIMEnableIndicationsResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod(request->getHttpMethod());  
   
     response->dest = request->queueIds.top();  
   
     EnableIndicationsResponseHandler *handler =  
         new EnableIndicationsResponseHandler(  
             request, response, request->provider, _indicationCallback);  
   
         CIMInstance req_provider, req_providerModule;  
         ProviderIdContainer pidc = (ProviderIdContainer)request->operationContext.get(ProviderIdContainer::NAME);  
   
         req_provider = pidc.getProvider();  
         req_providerModule = pidc.getModule();  
   
     try  
     {  
           String physicalName=_resolvePhysicalName( req_providerModule.getProperty(  
                                                     req_providerModule.findProperty("Location")).getValue().toString());  
   
           ProviderName name(req_provider.getProperty(req_provider.findProperty("Name")).getValue ().toString (),  
                                   physicalName,  
                                   req_providerModule.getProperty(req_providerModule.findProperty  
                                   ("InterfaceType")).getValue().toString(),  
                                    0);  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.enableIndications: " +  
             ph.GetProvider().getName());  
   
         pm_service_op_lock op_lock(&ph.GetProvider());  
         ph.GetProvider().protect();  
   
         ph.GetProvider().enableIndications(*handler);  
   
   
         // if no exception, store the handler so it is persistent for as  
         // long as the provider has indications enabled.  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Storing indication handler for " + ph.GetProvider().getName());  
   
         _insertEntry(ph.GetProvider(), handler);  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         response->cimException = CIMException(e);  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
         response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms(  
             "ProviderManager.DefaultProviderManager.INTERNAL_ERROR",  
             "Internal Error"));  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
         response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms(  
             "ProviderManager.DefaultProviderManager.UNKNOWN_ERROR",  
             "Unknown Error"));  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleDisableIndicationsRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDisableIndicationsRequest");  
   
     CIMDisableIndicationsRequestMessage * request =  
         dynamic_cast<CIMDisableIndicationsRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMDisableIndicationsResponseMessage * response =  
         new CIMDisableIndicationsResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     OperationResponseHandler handler(request, response);  
   
         CIMInstance req_provider, req_providerModule;  
         ProviderIdContainer pidc = (ProviderIdContainer)request->operationContext.get(ProviderIdContainer::NAME);  
   
         req_provider = pidc.getProvider();  
         req_providerModule = pidc.getModule();  
   
     try  
     {  
        String physicalName=_resolvePhysicalName(  
               req_providerModule.getProperty(  
                 req_providerModule.findProperty("Location")).getValue().toString());  
   
        ProviderName name(  
                req_provider.getProperty(req_provider.findProperty  
                    ("Name")).getValue ().toString (),  
                physicalName,  
                 req_providerModule.getProperty(req_providerModule.findProperty  
                     ("InterfaceType")).getValue().toString(),  
             0);  
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Calling provider.disableIndications: " +  
             ph.GetProvider().getName());  
   
         ph.GetProvider().disableIndications();  
   
         ph.GetProvider().unprotect();  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Removing and Destroying indication handler for " +  
             ph.GetProvider().getName());  
   
         delete _removeEntry(_generateKey(ph.GetProvider()));  
     }  
   
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         response->cimException = CIMException(e);  
     }  
     catch(Exception & e)  
     {     {
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,          return new DefaultProviderManager();
             "Exception: " + e.getMessage());  
             response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms(  
             "ProviderManager.DefaultProviderManager.INTERNAL_ERROR",  
             "Internal Error"));  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
             response->cimException = CIMException(CIM_ERR_FAILED, MessageLoaderParms(  
             "ProviderManager.DefaultProviderManager.UNKNOWN_ERROR",  
             "Unknown Error"));  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message *DefaultProviderManager::handleExportIndicationRequest(const Message *message)  
 {  
    PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManagerService::handlExportIndicationRequest");  
   
     CIMExportIndicationRequestMessage * request =  
         dynamic_cast<CIMExportIndicationRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMExportIndicationResponseMessage * response =  
         new CIMExportIndicationResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     OperationResponseHandler handler(request, response);  
   
     try  
     {  
         // resolve provider name  
         ProviderName name = _resolveProviderName(  
             request->operationContext.get(ProviderIdContainer::NAME));  
   
         // get cached or load new provider module  
         OpProviderHolder ph =  
             providerManager.getProvider(name.getPhysicalName(), name.getLogicalName(), String::EMPTY);  
   
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
                        "Calling provider.: " +  
                        ph.GetProvider().getName());  
   
         OperationContext context;  
   
 //L10N_TODO  
 //l10n  
 // ATTN-CEC 06/04/03 NOTE: I can't find where the consume msg is sent.  This  
 // does not appear to be hooked-up.  When it is added, need to  
 // make sure that Content-Language is set in the consume msg.  
 // NOTE: A-L is not needed to be set in the consume msg.  
       // add the langs to the context  
   
       context.insert(request->operationContext.get(ContentLanguageListContainer::NAME));  
   
       CIMInstance indication_copy = request->indicationInstance;  
       pm_service_op_lock op_lock(&ph.GetProvider());  
   
       ph.GetProvider().consumeIndication(context,  
                                 request->destinationPath,  
                                 indication_copy);  
   
     }  
   
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(e.getCode(), e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: " + e.getMessage());  
   
         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), e.getMessage()); // l10n  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
             "Exception: Unknown");  
   
         handler.setStatus(CIM_ERR_FAILED, "Unknown Error");  
     }  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
   
   
   
 //  
 // This function disables a provider module if disableProviderOnly is not true,  
 // otherwise, disables a provider. Disable provider module means that  
 // block all the providers which contain in the module and unload the  
 // providers.  
 // Disable provider means unload the provider and the provider is not blocked.  
 //  
 // ATTN-YZ-P2-20030519: Provider needs to be blocked when disable a provider.  
 //  
 Message * DefaultProviderManager::handleDisableModuleRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleDisableModuleRequest");  
   
     CIMDisableModuleRequestMessage * request =  
         dynamic_cast<CIMDisableModuleRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     Array<Uint16> operationalStatus;  
     CIMException cimException;  
   
     try  
     {  
         // get provider module name  
         String moduleName;  
         CIMInstance mInstance = request->providerModule;  
         Uint32 pos = mInstance.findProperty(CIMName ("Name"));  
         PEGASUS_ASSERT(pos != PEG_NOT_FOUND);  
         mInstance.getProperty(pos).getValue().get(moduleName);  
   
         Boolean disableProviderOnly = request->disableProviderOnly;  
   
         //  
         // Unload providers  
         //  
         Array<CIMInstance> _pInstances = request->providers;  
         Array<Boolean> _indicationProviders = request->indicationProviders;  
   
         String physicalName=_resolvePhysicalName(  
            mInstance.getProperty(  
               mInstance.findProperty("Location")).getValue().toString());  
   
         for(Uint32 i = 0, n = _pInstances.size(); i < n; i++)  
         {  
             String pName(_pInstances[i].getProperty(  
                _pInstances[i].findProperty("Name")).getValue().toString());  
   
             Sint16 ret_value = providerManager.disableProvider(physicalName,pName);  
   
             if (ret_value == 0)  
             {  
                 // disable failed since there are pending requests,  
                 // stop trying to disable other providers in this module.  
                 operationalStatus.append(_MODULE_OK);  
                 break;  
             }  
             else if (ret_value == 1)  // Success  
             {  
                 // if It is an indication provider  
                 // remove the entry from the table since the  
                 // provider has been disabled  
                 if (_indicationProviders[i])  
                 {  
                     delete _removeEntry(_generateKey(pName,physicalName));  
                 }  
             }  
             else  
             {  
                 // disable failed for other reason, throw exception  
                 throw PEGASUS_CIM_EXCEPTION_L(  
                     CIM_ERR_FAILED,  
                     MessageLoaderParms(  
                         "ProviderManager.ProviderManagerService."  
                             "DISABLE_PROVIDER_FAILED",  
                         "Failed to disable the provider."));  
             }  
         }  
     }  
     catch(CIMException & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
                          "Exception: " + e.getMessage());  
         cimException = e;  
     }  
     catch(Exception & e)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
                          "Exception: " + e.getMessage());  
         cimException = CIMException(CIM_ERR_FAILED, e.getMessage());  
     }  
     catch(...)  
     {  
         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,  
                          "Exception: Unknown");  
         //l10n  
         //response->cimException = CIMException(CIM_ERR_FAILED, "Unknown Error");  
         cimException = PEGASUS_CIM_EXCEPTION_L(  
             CIM_ERR_FAILED,  
             MessageLoaderParms(  
                 "ProviderManager.ProviderManagerService.UNKNOWN_ERROR",  
                 "Unknown Error"));  
     }  
   
     if (cimException.getCode() == CIM_ERR_SUCCESS)  
     {  
         // Status is set to OK if a provider was busy  
         if (operationalStatus.size() == 0)  
         {  
             operationalStatus.append(_MODULE_STOPPED);  
         }  
     }  
     else  
     {  
         // If exception occurs, module is not stopped  
         operationalStatus.append(_MODULE_OK);  
     }  
   
     CIMDisableModuleResponseMessage * response =  
         new CIMDisableModuleResponseMessage(  
             request->messageId,  
             CIMException(),  
             request->queueIds.copyAndPop(),  
             operationalStatus);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleEnableModuleRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleEnableModuleRequest");  
   
     CIMEnableModuleRequestMessage * request =  
         dynamic_cast<CIMEnableModuleRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     Array<Uint16> operationalStatus;  
     operationalStatus.append(_MODULE_OK);  
   
     CIMEnableModuleResponseMessage * response =  
         new CIMEnableModuleResponseMessage(  
             request->messageId,  
             CIMException(),  
             request->queueIds.copyAndPop(),  
             operationalStatus);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     PEG_METHOD_EXIT();  
     return(response);  
 }  
   
 Message * DefaultProviderManager::handleStopAllProvidersRequest(const Message * message)  
 {  
     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "DefaultProviderManager::handleStopAllProvidersRequest");  
   
     CIMStopAllProvidersRequestMessage * request =  
         dynamic_cast<CIMStopAllProvidersRequestMessage *>(const_cast<Message *>(message));  
   
     PEGASUS_ASSERT(request != 0);  
   
     CIMStopAllProvidersResponseMessage * response =  
         new CIMStopAllProvidersResponseMessage(  
         request->messageId,  
         CIMException(),  
         request->queueIds.copyAndPop());  
   
     PEGASUS_ASSERT(response != 0);  
   
     // preserve message key  
     response->setKey(request->getKey());  
   
     //  Set HTTP method in response from request  
     response->setHttpMethod (request->getHttpMethod ());  
   
     // tell the provider manager to shutdown all the providers  
     providerManager.shutdownAllProviders();  
   
     PEG_METHOD_EXIT();  
   
     return(response);  
 }  
   
 void DefaultProviderManager::_insertEntry (  
     const Provider & provider,  
     const EnableIndicationsResponseHandler *handler)  
 {  
     PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,  
         "DefaultProviderManager::_insertEntry");  
   
     String tableKey = _generateKey  
         (provider);  
   
     _responseTable.insert (tableKey, const_cast<EnableIndicationsResponseHandler *>(handler));  
   
     PEG_METHOD_EXIT();  
 }  
   
 EnableIndicationsResponseHandler * DefaultProviderManager::_removeEntry(  
     const String & key)  
 {  
     PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,  
         "DefaultProviderManager::_removeEntry");  
     EnableIndicationsResponseHandler *ret = 0;  
   
     _responseTable.lookup(key, ret);  
     _responseTable.remove(key);         // why is this needed ? - we get killed when removed...  
   
     PEG_METHOD_EXIT();  
   
     return(ret);  
 }  
   
 String DefaultProviderManager::_generateKey (  
     const Provider & provider)  
 {  
     String tableKey;  
   
     PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,  
         "DefaultProviderManager::_generateKey");  
   
     //  
     //  Append provider key values to key  
     //  
     String providerName = provider.getName();  
     String providerFileName = provider.getModule()->getFileName();  
     tableKey.append (providerName);  
     tableKey.append (providerFileName);  
   
     PEG_METHOD_EXIT();  
   
     return(tableKey);  
 }  
   
 String DefaultProviderManager::_generateKey (  
     const String & providerName,  
     const String & providerFileName)  
 {  
     String tableKey;  
   
     PEG_METHOD_ENTER (TRC_INDICATION_SERVICE,  
                       "DefaultProviderManagerService::_generateKey");  
   
     //  
     //  Append providerName and providerFileName to key  
     //  
     tableKey.append (providerName);  
     tableKey.append (providerFileName);  
   
     PEG_METHOD_EXIT ();  
     return tableKey;  
 }  
   
 ProviderName DefaultProviderManager::_resolveProviderName(  
     const ProviderIdContainer & providerId)  
 {  
     String providerName;  
     String fileName;  
     String interfaceName;  
     CIMValue genericValue;  
   
     genericValue = providerId.getProvider().getProperty(  
         providerId.getProvider().findProperty("Name")).getValue();  
     genericValue.get(providerName);  
   
     genericValue = providerId.getModule().getProperty(  
         providerId.getModule().findProperty("Location")).getValue();  
     genericValue.get(fileName);  
     fileName = _resolvePhysicalName(fileName);  
   
     // ATTN: This attribute is probably not required  
     genericValue = providerId.getModule().getProperty(  
         providerId.getModule().findProperty("InterfaceType")).getValue();  
     genericValue.get(interfaceName);  
   
     // Check if the provider module is blocked  
     Array<Uint16> operationalStatus;  
     Uint32 pos = providerId.getModule().findProperty(  
         CIMName("OperationalStatus"));  
     PEGASUS_ASSERT(pos != PEG_NOT_FOUND);  
     providerId.getModule().getProperty(pos).getValue().get(operationalStatus);  
   
     for(Uint32 i = 0; i < operationalStatus.size(); i++)  
     {  
         if(operationalStatus[i] == _MODULE_STOPPED ||  
            operationalStatus[i] == _MODULE_STOPPING)  
         {  
             throw PEGASUS_CIM_EXCEPTION_L(CIM_ERR_ACCESS_DENIED,  
                 MessageLoaderParms(  
                     "ProviderManager.ProviderManagerService.PROVIDER_BLOCKED",  
                     "provider blocked."));  
         }  
     }  
   
     return ProviderName(providerName, fileName, interfaceName, 0);  
 } }
  
 Boolean DefaultProviderManager::hasActiveProviders()      return 0;
 {  
     return providerManager.hasActiveProviders();  
 }  
   
 void DefaultProviderManager::unloadIdleProviders()  
 {  
     providerManager.unloadIdleProviders();  
 } }
   #endif
 PEGASUS_NAMESPACE_END  


Legend:
Removed from v.1.34  
changed lines
  Added in v.1.84

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2