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

   1 karl  1.82 //%2006////////////////////////////////////////////////////////////////////////
   2 marek 1.63 //
   3            // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
   4            // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
   5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
   6            // IBM Corp.; EMC Corporation, The Open Group.
   7            // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9            // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11 karl  1.82 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  12            // EMC Corporation; Symantec Corporation; The Open Group.
  13 marek 1.63 //
  14            // Permission is hereby granted, free of charge, to any person obtaining a copy
  15            // of this software and associated documentation files (the "Software"), to
  16            // deal in the Software without restriction, including without limitation the
  17            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  18            // sell copies of the Software, and to permit persons to whom the Software is
  19            // furnished to do so, subject to the following conditions:
  20 karl  1.82 // 
  21 marek 1.63 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  22            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  23            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  24            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  25            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  26            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  27            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29            //
  30            //==============================================================================
  31            //
  32            //%/////////////////////////////////////////////////////////////////////////////
  33            
  34            #include "CMPI_Version.h"
  35            
  36            #include "CMPIProviderManager.h"
  37            
  38            #include "CMPI_Object.h"
  39            #include "CMPI_ContextArgs.h"
  40            #include "CMPI_Instance.h"
  41            #include "CMPI_ObjectPath.h"
  42 marek 1.63 #include "CMPI_Result.h"
  43            #include "CMPI_SelectExp.h"
  44            
  45            #include <Pegasus/Common/CIMMessage.h>
  46            #include <Pegasus/Common/OperationContext.h>
  47 a.dunfey 1.85 #include <Pegasus/Common/OperationContextInternal.h>
  48 marek    1.63 #include <Pegasus/Common/Tracer.h>
  49               #include <Pegasus/Common/StatisticalData.h>
  50               #include <Pegasus/Common/Logger.h>
  51 kumpf    1.79 #include <Pegasus/Common/LanguageParser.h>
  52 marek    1.63 #include <Pegasus/Common/MessageLoader.h> //l10n
  53               #include <Pegasus/Common/Constants.h>
  54 thilo.boehm 1.89 #include <Pegasus/Common/FileSystem.h>
  55 marek       1.63 
  56                  #include <Pegasus/Config/ConfigManager.h>
  57                  
  58                  #include <Pegasus/Provider/CIMOMHandleQueryContext.h>
  59 a.dunfey    1.85 #include <Pegasus/ProviderManager2/CIMOMHandleContext.h>
  60 marek       1.63 #include <Pegasus/ProviderManager2/ProviderName.h>
  61 kumpf       1.93 #include <Pegasus/ProviderManager2/AutoPThreadSecurity.h>
  62 marek       1.63 #include <Pegasus/ProviderManager2/CMPI/CMPIProviderModule.h>
  63                  #include <Pegasus/ProviderManager2/CMPI/CMPIProvider.h>
  64                  
  65 kumpf       1.93 PEGASUS_USING_STD;
  66 marek       1.63 
  67                  PEGASUS_NAMESPACE_BEGIN
  68                  
  69 dave.sudlik 1.96 
  70 marek       1.95 ReadWriteSem    CMPIProviderManager::rwSemProvTab;
  71                  ReadWriteSem    CMPIProviderManager::rwSemSelxTab;
  72 marek       1.63 CMPIProviderManager::IndProvTab    CMPIProviderManager::provTab;
  73                  CMPIProviderManager::IndSelectTab  CMPIProviderManager::selxTab;
  74 marek       1.95 
  75 venkat.puvvada 1.108 class CMPIPropertyList
  76                      {
  77                          char **props;
  78                          int pCount;
  79                      public:
  80                          CMPIPropertyList(CIMPropertyList &propertyList) : props(0), pCount(0)
  81                          {
  82 ms.aruran      1.115         PEG_METHOD_ENTER(
  83                                  TRC_PROVIDERMANAGER,
  84                                  "CMPIPropertyList::CMPIPropertyList()");
  85 venkat.puvvada 1.108         if (!propertyList.isNull())
  86                              {
  87                                  Array<CIMName> p=propertyList.getPropertyNameArray();
  88                                  pCount=p.size();
  89                                  props = new char*[1+pCount];
  90                                  for (int i=0; i<pCount; i++)
  91                                  {
  92                                      props[i]=strdup(p[i].getString().getCString());
  93                                  }
  94                                  props[pCount]=NULL;
  95                              }
  96                              else props=NULL;
  97 ms.aruran      1.115         PEG_METHOD_EXIT();
  98 venkat.puvvada 1.108     }
  99                          ~CMPIPropertyList()
 100                          {
 101 ms.aruran      1.115         PEG_METHOD_ENTER(
 102                                  TRC_PROVIDERMANAGER,
 103                                  "CMPIPropertyList::~CMPIPropertyList()");
 104 venkat.puvvada 1.108         if (props)
 105                              {
 106                                  for (int i=0; i<pCount; i++)
 107                                      free(props[i]);
 108                                  delete [] props;
 109                              }
 110 ms.aruran      1.115         PEG_METHOD_EXIT();
 111 venkat.puvvada 1.108     }
 112                          char  **getList()
 113                          {
 114                              return props;
 115                          }
 116 marek          1.63  };
 117                      
 118                      CMPIProviderManager::CMPIProviderManager(Mode m)
 119                      {
 120 ms.aruran      1.115     PEG_METHOD_ENTER(
 121                              TRC_PROVIDERMANAGER,
 122                              "CMPIProviderManager::CMPIProviderManager()");
 123                      
 124 venkat.puvvada 1.108     mode=m;
 125                          _subscriptionInitComplete = false;
 126 ms.aruran      1.115     PEG_TRACE_CSTRING (
 127                              TRC_PROVIDERMANAGER,
 128                              Tracer::LEVEL2,
 129                              "-- CMPI Provider Manager activated");
 130                          PEG_METHOD_EXIT();
 131 marek          1.63  }
 132                      
 133 venkat.puvvada 1.108 CMPIProviderManager::~CMPIProviderManager()
 134 marek          1.63  {
 135 ms.aruran      1.115     PEG_METHOD_ENTER(
 136                              TRC_PROVIDERMANAGER,
 137                              "CMPIProviderManager::~CMPIProviderManager()");
 138 venkat.puvvada 1.108     /* Clean up the hash-tables */
 139 marek          1.63      indProvRecord *prec=NULL;
 140 marek          1.95      {
 141                              WriteLock writeLock(rwSemProvTab);
 142 venkat.puvvada 1.108         for (IndProvTab::Iterator i = provTab.start(); i; i++)
 143                              {
 144                                  provTab.lookup(i.key(),prec);
 145                                  if (prec->handler)
 146                                      delete prec->handler;
 147                                  delete prec;
 148                                  //Remove is not neccessary, since the hashtable destructor takes 
 149                                  //care of this already. But instead removing entries while 
 150                                  //iterating the hashtable sometimes causes a segmentation fault!!!
 151                                  //provTab.remove(i.key());
 152                                  prec=NULL;
 153                              }
 154 marek          1.95      }
 155                      
 156 venkat.puvvada 1.108     indSelectRecord *selx=NULL;
 157 marek          1.95      {
 158                              WriteLock writeLock(rwSemSelxTab);
 159 venkat.puvvada 1.108         for (IndSelectTab::Iterator i = selxTab.start(); i; i++)
 160                              {
 161                                  selxTab.lookup(i.key(), selx);
 162                                  if (selx->eSelx)
 163                                      delete selx->eSelx;
 164                                  if (selx->qContext)
 165                                      delete selx->qContext;
 166                                  delete selx;
 167                                  //Same as above!
 168                                  //selxTab.remove(i.key());
 169                                  selx=NULL;
 170                              }
 171 marek          1.95      }
 172 ms.aruran      1.115     PEG_METHOD_EXIT();
 173 marek          1.63  }
 174                      
 175                      Message * CMPIProviderManager::processMessage(Message * request)
 176                      {
 177 ms.aruran      1.115     PEG_METHOD_ENTER(
 178                              TRC_PROVIDERMANAGER,
 179 marek          1.63          "CMPIProviderManager::processMessage()");
 180                      
 181                          Message * response = 0;
 182                      
 183                          // pass the request message to a handler method based on message type
 184 venkat.puvvada 1.108     switch (request->getType())
 185 marek          1.63      {
 186 venkat.puvvada 1.108         case CIM_GET_INSTANCE_REQUEST_MESSAGE:
 187                                  response = handleGetInstanceRequest(request);
 188 marek          1.63  
 189 venkat.puvvada 1.108             break;
 190                              case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
 191                                  response = handleEnumerateInstancesRequest(request);
 192                      
 193                                  break;
 194                              case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
 195                                  response = handleEnumerateInstanceNamesRequest(request);
 196                      
 197                                  break;
 198                              case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
 199                                  response = handleCreateInstanceRequest(request);
 200                      
 201                                  break;
 202                              case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
 203                                  response = handleModifyInstanceRequest(request);
 204                      
 205                                  break;
 206                              case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
 207                                  response = handleDeleteInstanceRequest(request);
 208                      
 209                                  break;
 210 venkat.puvvada 1.108         case CIM_EXEC_QUERY_REQUEST_MESSAGE:
 211                                  response = handleExecQueryRequest(request);
 212                      
 213                                  break;
 214                              case CIM_ASSOCIATORS_REQUEST_MESSAGE:
 215                                  response = handleAssociatorsRequest(request);
 216                      
 217                                  break;
 218                              case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
 219                                  response = handleAssociatorNamesRequest(request);
 220                      
 221                                  break;
 222                              case CIM_REFERENCES_REQUEST_MESSAGE:
 223                                  response = handleReferencesRequest(request);
 224                      
 225                                  break;
 226                              case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
 227                                  response = handleReferenceNamesRequest(request);
 228                      
 229                                  break;
 230                              case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
 231 venkat.puvvada 1.108             response = handleInvokeMethodRequest(request);
 232                      
 233                                  break;
 234                              case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:
 235                                  response = handleCreateSubscriptionRequest(request);
 236 marek          1.63  
 237 venkat.puvvada 1.108             break;
 238 marek          1.63  /*    case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:
 239                              response = handleModifySubscriptionRequest(request);
 240                      
 241                              break;
 242 venkat.puvvada 1.108 */
 243                              case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:
 244                                  response = handleDeleteSubscriptionRequest(request);
 245 marek          1.63  
 246 venkat.puvvada 1.108             break;
 247 marek          1.63  /*    case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:
 248                              response = handleExportIndicationRequest(request);
 249                              break;
 250                      */
 251 venkat.puvvada 1.108         case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
 252                                  response = handleDisableModuleRequest(request);
 253 marek          1.63  
 254 venkat.puvvada 1.108             break;
 255                              case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
 256                                  response = handleEnableModuleRequest(request);
 257                      
 258                                  break;
 259                              case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
 260                                  response = handleStopAllProvidersRequest(request);
 261                      
 262                                  break;
 263 s.kodali       1.113 // Note: The PG_Provider AutoStart property is not yet supported
 264                      #if 0
 265 venkat.puvvada 1.108         case CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE:
 266                                  response = handleInitializeProviderRequest(request);
 267                      
 268                                  break;
 269 s.kodali       1.113 #endif
 270 venkat.puvvada 1.108         case CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE:
 271                                  response = handleSubscriptionInitCompleteRequest (request);
 272                      
 273                                  break;
 274                              case CIM_GET_PROPERTY_REQUEST_MESSAGE:
 275                                  response = handleGetPropertyRequest(request);
 276                      
 277                                  break;
 278                              case CIM_SET_PROPERTY_REQUEST_MESSAGE:
 279                                  response = handleSetPropertyRequest(request);
 280                      
 281                                  break;
 282                              default:
 283                                  response = handleUnsupportedRequest(request);
 284 marek          1.63  
 285 venkat.puvvada 1.108             break;
 286 marek          1.63      }
 287                      
 288                          PEG_METHOD_EXIT();
 289                      
 290                          return(response);
 291                      }
 292                      
 293                      Boolean CMPIProviderManager::hasActiveProviders()
 294                      {
 295 venkat.puvvada 1.108     return providerManager.hasActiveProviders();
 296 marek          1.63  }
 297                      
 298                      void CMPIProviderManager::unloadIdleProviders()
 299                      {
 300 venkat.puvvada 1.108     providerManager.unloadIdleProviders();
 301 marek          1.63  }
 302                      
 303                      
 304                      #define CHARS(cstring) (char*)(strlen(cstring)?(const char*)cstring:NULL)
 305                      
 306                      
 307 kumpf          1.92  #define HandlerIntroBase(type,type1,message,request,response,handler) \
 308 marek          1.63      CIM##type##RequestMessage * request = \
 309 venkat.puvvada 1.108         dynamic_cast<CIM##type##RequestMessage *>(const_cast<Message *> \
 310                              (message)); \
 311 marek          1.63      PEGASUS_ASSERT(request != 0); \
 312                          CIM##type##ResponseMessage * response = \
 313 kumpf          1.92          dynamic_cast<CIM##type##ResponseMessage*>(request->buildResponse()); \
 314 marek          1.63      PEGASUS_ASSERT(response != 0); \
 315 kumpf          1.84      type1##ResponseHandler handler(request, response, _responseChunkCallback);
 316 marek          1.63  
 317                      #define HandlerIntroInd(type,message,request,response,handler) \
 318 kumpf          1.92       HandlerIntroBase(type,Operation,message,request,response,handler)
 319 marek          1.63  
 320                      #define HandlerIntroInit(type,message,request,response,handler) \
 321 kumpf          1.92       HandlerIntroBase(type,Operation,message,request,response,handler)
 322 marek          1.63  
 323 kumpf          1.92  #define HandlerIntro(type,message,request,response,handler) \
 324                           HandlerIntroBase(type,type,message,request,response,handler)
 325 marek          1.63  
 326                      #define HandlerCatch(handler) \
 327 konrad.r       1.64      catch(const CIMException & e)  \
 328 marek          1.63      { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, \
 329                                      "Exception: " + e.getMessage()); \
 330 dave.sudlik    1.103         handler.setCIMException(e); \
 331 marek          1.63      } \
 332 konrad.r       1.64      catch(const Exception & e) \
 333 marek          1.63      { PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, \
 334                                      "Exception: " + e.getMessage()); \
 335 venkat.puvvada 1.108         handler.setStatus(CIM_ERR_FAILED, e.getContentLanguages(), \
 336                              e.getMessage()); \
 337 marek          1.63      } \
 338                          catch(...) \
 339 marek          1.107     { PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, \
 340 marek          1.63                  "Exception: Unknown"); \
 341                              handler.setStatus(CIM_ERR_FAILED, "Unknown error."); \
 342                          }
 343                      
 344 venkat.puvvada 1.108 Message * CMPIProviderManager::handleGetInstanceRequest(
 345                          const Message * message)
 346 marek          1.63  {
 347 ms.aruran      1.115     PEG_METHOD_ENTER(
 348                              TRC_PROVIDERMANAGER,
 349                              "CMPIProviderManager::handleGetInstanceRequest()");
 350 marek          1.63  
 351 kumpf          1.92      HandlerIntro(GetInstance,message,request,response,handler);
 352 marek          1.63  
 353 venkat.puvvada 1.108     try
 354                          {
 355 marek          1.63          Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
 356 venkat.puvvada 1.108             "CmpiProviderManager::handleGetInstanceRequest - Host name: $0 "
 357                                  "hi sure man Name space: $1  Class name: $2",
 358 marek          1.63              System::getHostName(),
 359                                  request->nameSpace.getString(),
 360                                  request->instanceName.getClassName().getString());
 361                      
 362                              // make target object path
 363                              CIMObjectPath objectPath(
 364                                  System::getHostName(),
 365                                  request->nameSpace,
 366                                  request->instanceName.getClassName(),
 367                                  request->instanceName.getKeyBindings());
 368                      
 369                              Boolean remote=false;
 370                              CMPIProvider::OpProviderHolder ph;
 371                      
 372                              // resolve provider name
 373 venkat.puvvada 1.108         ProviderIdContainer pidc = 
 374                                  request->operationContext.get(ProviderIdContainer::NAME);
 375                      
 376 marek          1.63          ProviderName name = _resolveProviderName(pidc);
 377                      
 378 venkat.puvvada 1.108         if ((remote=pidc.isRemoteNameSpace()))
 379                              {
 380                                  ph = providerManager.getRemoteProvider(
 381                                      name.getLocation(), name.getLogicalName());
 382 a.dunfey       1.85          }
 383 venkat.puvvada 1.108         else
 384                              {
 385 a.dunfey       1.85              // get cached or load new provider module
 386 venkat.puvvada 1.108             ph = providerManager.getProvider(
 387                                      name.getPhysicalName(), name.getLogicalName());
 388 marek          1.63          }
 389                      
 390                              // convert arguments
 391                              OperationContext context;
 392                      
 393                              context.insert(request->operationContext.get(IdentityContainer::NAME));
 394 venkat.puvvada 1.108         context.insert(
 395                                  request->operationContext.get(AcceptLanguageListContainer::NAME));
 396                              context.insert(
 397                                  request->operationContext.get(ContentLanguageListContainer::NAME));
 398 marek          1.63          // forward request
 399                              CMPIProvider & pr=ph.GetProvider();
 400                      
 401 a.dunfey       1.85  #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 402 venkat.puvvada 1.118.2.2         AutoPtr<NormalizerContext> tmpNormalizerContext(
 403                                      new CIMOMHandleContext(*pr._cimom_handle));
 404                                  request->operationContext.insert(
 405                                      NormalizerContextContainer(tmpNormalizerContext));
 406                          #endif
 407 a.dunfey       1.85      
 408 ms.aruran      1.115             PEG_TRACE_STRING(
 409                                      TRC_PROVIDERMANAGER,
 410                                      Tracer::LEVEL4,
 411 marek          1.63                  "Calling provider.getInstance: " + pr.getName());
 412                          
 413                                  CMPIStatus rc={CMPI_RC_OK,NULL};
 414                                  CMPI_ContextOnStack eCtx(context);
 415                                  CMPI_ObjectPathOnStack eRef(objectPath);
 416                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
 417                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
 418                          
 419                                  CMPIPropertyList props(request->propertyList);
 420                          
 421                                  CMPIFlags flgs=0;
 422                                  if (request->includeQualifiers) flgs|=CMPI_FLAG_IncludeQualifiers;
 423                                  if (request->includeClassOrigin) flgs|=CMPI_FLAG_IncludeClassOrigin;
 424 venkat.puvvada 1.108             eCtx.ft->addEntry(
 425                                      &eCtx,CMPIInvocationFlags,(CMPIValue*)&flgs,CMPI_uint32);
 426 marek          1.63      
 427                                  const IdentityContainer container =
 428 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
 429                                  eCtx.ft->addEntry(
 430                                      &eCtx,
 431                                      CMPIPrincipal,
 432                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
 433                                      CMPI_chars);
 434 marek          1.63      
 435 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
 436 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
 437 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
 438 konrad.r       1.67      
 439 kumpf          1.79              eCtx.ft->addEntry(
 440                                      &eCtx,
 441 dave.sudlik    1.99                  CMPIAcceptLanguage,
 442 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
 443 venkat.puvvada 1.108                 acceptLangs).getCString(),
 444 kumpf          1.79                  CMPI_chars);
 445 venkat.puvvada 1.108     
 446                                  if (remote)
 447                                  {
 448                                      CString info=pidc.getRemoteInfo().getCString();
 449                                      eCtx.ft->addEntry(
 450                                          &eCtx,
 451                                          "CMPIRRemoteInfo",(CMPIValue*)(const char*)info,
 452                                          CMPI_chars);
 453 marek          1.63              }
 454                          
 455                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
 456                          
 457 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
 458 marek          1.63      
 459 kumpf          1.92              {
 460                                      StatProviderTimeMeasurement providerTime(response);
 461 marek          1.63      
 462 kumpf          1.92                  rc = pr.miVector.instMI->ft->getInstance(
 463 venkat.puvvada 1.108                     pr.miVector.instMI,
 464                                          &eCtx,
 465                                          &eRes,
 466                                          &eRef,
 467 kumpf          1.92                      (const char **)props.getList());
 468                                  }
 469 marek          1.63      
 470 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
 471                          //      Do this before checking rc from provider to throw exception in case 
 472                          //      rc.msg is also localized.
 473                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
 474 venkat.puvvada 1.108             CMPIData cldata = 
 475                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
 476 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
 477                                  {
 478                                      response->operationContext.set(
 479                                          ContentLanguageListContainer(
 480 venkat.puvvada 1.108                     ContentLanguageList(
 481                                          LanguageParser::parseContentLanguageHeader(
 482                                          CMGetCharPtr(cldata.value.string)))));
 483 dave.sudlik    1.103                 handler.setContext(response->operationContext);
 484 dave.sudlik    1.99              }
 485                          
 486 marek          1.63              if (rc.rc!=CMPI_RC_OK)
 487 dave.sudlik    1.102             {
 488 venkat.puvvada 1.108                 CIMException cimException(
 489                                          (CIMStatusCode)rc.rc,
 490                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
 491                          
 492                                      if (eRes.resError)
 493                                      {
 494                                          for (CMPI_Error* currErr=eRes.resError; 
 495 dave.sudlik    1.102                         currErr!=NULL; 
 496                                              currErr=currErr->nextError)
 497 venkat.puvvada 1.108                     {
 498                                              cimException.addError(
 499                                                  ((CIMError*)currErr->hdl)->getInstance());
 500                                          }
 501                                      }
 502                                      throw cimException;
 503 dave.sudlik    1.102             }
 504 marek          1.63          }
 505                              HandlerCatch(handler);
 506                          
 507                              PEG_METHOD_EXIT();
 508                          
 509                              return(response);
 510                          }
 511                          
 512 venkat.puvvada 1.108     Message * CMPIProviderManager::handleEnumerateInstancesRequest(
 513                              const Message * message)
 514 marek          1.63      {
 515 ms.aruran      1.115         PEG_METHOD_ENTER(
 516                                  TRC_PROVIDERMANAGER,
 517                                  "CMPIProviderManager::handleEnumerateInstanceRequest()");
 518 marek          1.63      
 519 kumpf          1.92          HandlerIntro(EnumerateInstances,message,request,response,handler);
 520 venkat.puvvada 1.108         try
 521                              {
 522                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
 523                                      "CMPIProviderManager::handleEnumerateInstancesRequest - Host name:"
 524                                      " $0  Name space: $1  Class name: $2",
 525 marek          1.63                  System::getHostName(),
 526                                      request->nameSpace.getString(),
 527                                      request->className.getString());
 528                          
 529                                  // make target object path
 530                                  CIMObjectPath objectPath(
 531                                      System::getHostName(),
 532                                      request->nameSpace,
 533                                      request->className);
 534                          
 535                                  Boolean remote=false;
 536                                  CMPIProvider::OpProviderHolder ph;
 537                          
 538                                  // resolve provider name
 539 venkat.puvvada 1.108             ProviderIdContainer pidc = 
 540                                      request->operationContext.get(ProviderIdContainer::NAME);
 541 marek          1.63              ProviderName name = _resolveProviderName(pidc);
 542                          
 543 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
 544                                  {
 545                                      ph = providerManager.getRemoteProvider(
 546                                          name.getLocation(), name.getLogicalName());
 547                                  }
 548                                  else
 549                                  {
 550                                      // get cached or load new provider module
 551                                      ph = providerManager.getProvider(
 552                                          name.getPhysicalName(), name.getLogicalName());
 553 marek          1.63              }
 554                          
 555                                  // convert arguments
 556                                  OperationContext context;
 557                          
 558                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
 559 venkat.puvvada 1.108             context.insert(
 560                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
 561                                  context.insert(
 562                                      request->operationContext.get(ContentLanguageListContainer::NAME));
 563 marek          1.63      
 564                                  CIMPropertyList propertyList(request->propertyList);
 565                          
 566                                  // forward request
 567                                  CMPIProvider & pr=ph.GetProvider();
 568                          
 569 a.dunfey       1.85      #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
 570 venkat.puvvada 1.118.2.2         AutoPtr<NormalizerContext> tmpNormalizerContext(
 571                                      new CIMOMHandleContext(*pr._cimom_handle));
 572                                  request->operationContext.insert(
 573                                      NormalizerContextContainer(tmpNormalizerContext));
 574                          #endif
 575 a.dunfey       1.85      
 576 ms.aruran      1.115             PEG_TRACE_STRING(
 577                                      TRC_PROVIDERMANAGER,
 578                                      Tracer::LEVEL4,
 579 marek          1.63                  "Calling provider.enumerateInstances: " + pr.getName());
 580                          
 581                                  CMPIStatus rc={CMPI_RC_OK,NULL};
 582                                  CMPI_ContextOnStack eCtx(context);
 583                                  CMPI_ObjectPathOnStack eRef(objectPath);
 584                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
 585                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
 586                          
 587                                  CMPIPropertyList props(propertyList);
 588                          
 589                                  CMPIFlags flgs=0;
 590                                  if (request->includeQualifiers) flgs|=CMPI_FLAG_IncludeQualifiers;
 591                                  if (request->includeClassOrigin) flgs|=CMPI_FLAG_IncludeClassOrigin;
 592 venkat.puvvada 1.108             eCtx.ft->addEntry(
 593                                      &eCtx,
 594                                      CMPIInvocationFlags,
 595                                      (CMPIValue*)&flgs,
 596                                      CMPI_uint32);
 597 marek          1.63      
 598                                  const IdentityContainer container =
 599 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
 600                                  eCtx.ft->addEntry(
 601                                      &eCtx,
 602                                      CMPIPrincipal,
 603                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
 604                                      CMPI_chars);
 605 marek          1.63      
 606 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
 607 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME);
 608                          
 609 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
 610 kumpf          1.79              eCtx.ft->addEntry(
 611                                      &eCtx,
 612 dave.sudlik    1.99                  CMPIAcceptLanguage,
 613 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
 614 venkat.puvvada 1.108                 acceptLangs).getCString(),
 615 kumpf          1.79                  CMPI_chars);
 616 venkat.puvvada 1.108             if (remote)
 617                                  {
 618                                      CString info=pidc.getRemoteInfo().getCString();
 619                                      eCtx.ft->addEntry(
 620                                          &eCtx,
 621                                          "CMPIRRemoteInfo",
 622                                          (CMPIValue*)(const char*)info,
 623                                          CMPI_chars);
 624 marek          1.63              }
 625                          
 626                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
 627                          
 628 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
 629 marek          1.63      
 630 kumpf          1.92              {
 631                                      StatProviderTimeMeasurement providerTime(response);
 632 marek          1.63      
 633 kumpf          1.92                  rc = pr.miVector.instMI->ft->enumInstances(
 634 venkat.puvvada 1.108                     pr.miVector.instMI,
 635                                          &eCtx,
 636                                          &eRes,
 637                                          &eRef,
 638 kumpf          1.92                      (const char **)props.getList());
 639                                  }
 640 marek          1.63      
 641 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
 642                          //      Do this before checking rc from provider to throw exception in case 
 643                          //      rc.msg is also localized.
 644                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
 645 venkat.puvvada 1.108             CMPIData cldata = 
 646                                      eCtx.ft->getEntry(&eCtx, CMPIContentLanguage, &tmprc);
 647 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
 648                                  {
 649                                      response->operationContext.set(
 650                                          ContentLanguageListContainer(
 651 venkat.puvvada 1.108                     ContentLanguageList(
 652                                          LanguageParser::parseContentLanguageHeader(
 653                                          CMGetCharPtr(cldata.value.string)))));
 654 dave.sudlik    1.103                 handler.setContext(response->operationContext);
 655 dave.sudlik    1.99              }
 656                          
 657 marek          1.63              if (rc.rc!=CMPI_RC_OK)
 658 dave.sudlik    1.102             {
 659 venkat.puvvada 1.108                 CIMException cimException(
 660                                          (CIMStatusCode)rc.rc,
 661                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
 662                          
 663                                      if (eRes.resError)
 664                                      {
 665                                          for (CMPI_Error* currErr=eRes.resError; 
 666 dave.sudlik    1.102                         currErr!=NULL; 
 667                                              currErr=currErr->nextError)
 668 venkat.puvvada 1.108                     {
 669                                              cimException.addError(
 670                                                  ((CIMError*)currErr->hdl)->getInstance());
 671                                          }
 672                                      }
 673                                      throw cimException;
 674 dave.sudlik    1.102             }
 675                          
 676 marek          1.63          }
 677                              HandlerCatch(handler);
 678                          
 679                              PEG_METHOD_EXIT();
 680                          
 681                              return(response);
 682                          }
 683                          
 684 venkat.puvvada 1.108     Message * CMPIProviderManager::handleEnumerateInstanceNamesRequest(
 685                              const Message * message)
 686 marek          1.63      {
 687 ms.aruran      1.115         PEG_METHOD_ENTER(
 688                                  TRC_PROVIDERMANAGER,
 689                                  "CMPIProviderManager::handleEnumerateInstanceNamesRequest()");
 690 marek          1.63      
 691 kumpf          1.92          HandlerIntro(EnumerateInstanceNames,message,request,response,handler);
 692 venkat.puvvada 1.108         try
 693                              {
 694 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
 695 venkat.puvvada 1.108                 "CMPIProviderManager::handleEnumerateInstanceNamesRequest - Host "
 696                                      "name: $0  Name space: $1  Class name: $2",
 697 marek          1.63                  System::getHostName(),
 698                                      request->nameSpace.getString(),
 699                                      request->className.getString());
 700                          
 701 venkat.puvvada 1.108             // make target object path
 702 marek          1.63              CIMObjectPath objectPath(
 703                                      System::getHostName(),
 704                                      request->nameSpace,
 705                                      request->className);
 706                          
 707                                  Boolean remote=false;
 708                                  CMPIProvider::OpProviderHolder ph;
 709                          
 710                                  // resolve provider name
 711 venkat.puvvada 1.108             ProviderIdContainer pidc = 
 712                                      request->operationContext.get(ProviderIdContainer::NAME);
 713 marek          1.63              ProviderName name = _resolveProviderName(pidc);
 714                          
 715 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
 716                                  {
 717                                      ph = providerManager.getRemoteProvider(
 718                                          name.getLocation(), name.getLogicalName());
 719 marek          1.63              }
 720 venkat.puvvada 1.108             else
 721                                  {
 722                                      // get cached or load new provider module
 723                                      ph = providerManager.getProvider(
 724                                          name.getPhysicalName(), name.getLogicalName());
 725 marek          1.63              }
 726                          
 727                                  // convert arguments
 728                                  OperationContext context;
 729                          
 730                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
 731 venkat.puvvada 1.108             context.insert(
 732                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
 733                                  context.insert(
 734                                      request->operationContext.get(ContentLanguageListContainer::NAME));
 735 marek          1.63              CMPIProvider & pr=ph.GetProvider();
 736                          
 737 ms.aruran      1.115             PEG_TRACE_STRING(
 738                                      TRC_PROVIDERMANAGER,
 739                                      Tracer::LEVEL4,
 740 marek          1.63                  "Calling provider.enumerateInstanceNames: " + pr.getName());
 741                          
 742                                  CMPIStatus rc={CMPI_RC_OK,NULL};
 743                                  CMPI_ContextOnStack eCtx(context);
 744                                  CMPI_ObjectPathOnStack eRef(objectPath);
 745                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
 746                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
 747                          
 748                                  CMPIFlags flgs=0;
 749 venkat.puvvada 1.108             eCtx.ft->addEntry(
 750                                      &eCtx,
 751                                      CMPIInvocationFlags,
 752                                      (CMPIValue*)&flgs,
 753                                      CMPI_uint32);
 754 marek          1.63      
 755                                  const IdentityContainer container =
 756 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
 757                                  eCtx.ft->addEntry(
 758                                      &eCtx,
 759                                      CMPIPrincipal,
 760                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
 761                                      CMPI_chars);
 762 marek          1.63      
 763 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
 764 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME);
 765                          
 766 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
 767 kumpf          1.79              eCtx.ft->addEntry(
 768                                      &eCtx,
 769 dave.sudlik    1.99                  CMPIAcceptLanguage,
 770 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
 771 venkat.puvvada 1.108                 acceptLangs).getCString(),
 772 kumpf          1.79                  CMPI_chars);
 773 venkat.puvvada 1.108             if (remote)
 774                                  {
 775                                      CString info=pidc.getRemoteInfo().getCString();
 776                                      eCtx.ft->addEntry(
 777                                          &eCtx,
 778                                          "CMPIRRemoteInfo",
 779                                          (CMPIValue*)(const char*)info,
 780                                          CMPI_chars);
 781 marek          1.63              }
 782                          
 783                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
 784                          
 785 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
 786 venkat.puvvada 1.108     
 787 kumpf          1.92              {
 788                                      StatProviderTimeMeasurement providerTime(response);
 789 marek          1.63      
 790 kumpf          1.92                  rc = pr.miVector.instMI->ft->enumInstanceNames(
 791                                          pr.miVector.instMI,&eCtx,&eRes,&eRef);
 792                                  }
 793 marek          1.63      
 794 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
 795                          //      Do this before checking rc from provider to throw exception in case 
 796                          //      rc.msg is also localized.
 797                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
 798 venkat.puvvada 1.108             CMPIData cldata = 
 799                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
 800 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
 801                                  {
 802                                      response->operationContext.set(
 803                                          ContentLanguageListContainer(
 804 venkat.puvvada 1.108                     ContentLanguageList(
 805                                          LanguageParser::parseContentLanguageHeader(
 806                                          CMGetCharPtr(cldata.value.string)))));
 807 dave.sudlik    1.103                 handler.setContext(response->operationContext);
 808 dave.sudlik    1.99              }
 809                          
 810 marek          1.63              if (rc.rc!=CMPI_RC_OK)
 811 dave.sudlik    1.102             {
 812 venkat.puvvada 1.108                 CIMException cimException(
 813                                          (CIMStatusCode)rc.rc,
 814                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
 815                          
 816                                      if (eRes.resError)
 817                                      {
 818                                          for (CMPI_Error* currErr=eRes.resError; 
 819 dave.sudlik    1.102                         currErr!=NULL; 
 820                                              currErr=currErr->nextError)
 821 venkat.puvvada 1.108                     {
 822                                              cimException.addError(
 823                                                  ((CIMError*)currErr->hdl)->getInstance());
 824                                          }
 825                                      }
 826                                      throw cimException;
 827 dave.sudlik    1.102             }
 828 marek          1.63          }
 829                              HandlerCatch(handler);
 830                          
 831                              PEG_METHOD_EXIT();
 832                          
 833                              return(response);
 834                          }
 835                          
 836 venkat.puvvada 1.108     Message * CMPIProviderManager::handleCreateInstanceRequest(
 837                              const Message * message)
 838 marek          1.63      {
 839 ms.aruran      1.115         PEG_METHOD_ENTER(
 840                                  TRC_PROVIDERMANAGER,
 841                                  "CMPIProviderManager::handleCreateInstanceRequest()");
 842 marek          1.63      
 843 kumpf          1.92          HandlerIntro(CreateInstance,message,request,response,handler);
 844 venkat.puvvada 1.108         try
 845                              {
 846 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
 847 venkat.puvvada 1.108                 "CMPIProviderManager::handleCreateInstanceRequest - Host name: "
 848                                      "$0  Name space: $1  Class name: $2",
 849 marek          1.63                  System::getHostName(),
 850                                      request->nameSpace.getString(),
 851                                      request->newInstance.getPath().getClassName().getString());
 852                          
 853                                  // make target object path
 854                                  CIMObjectPath objectPath(
 855                                      System::getHostName(),
 856                                      request->nameSpace,
 857                                      request->newInstance.getPath().getClassName(),
 858                                      request->newInstance.getPath().getKeyBindings());
 859 venkat.puvvada 1.108             request->newInstance.setPath(objectPath);
 860 marek          1.63      
 861                                  Boolean remote=false;
 862                                  CMPIProvider::OpProviderHolder ph;
 863                          
 864                                  // resolve provider name
 865 venkat.puvvada 1.108             ProviderIdContainer pidc = 
 866                                      request->operationContext.get(ProviderIdContainer::NAME);
 867 marek          1.63              ProviderName name = _resolveProviderName(pidc);
 868                          
 869 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
 870                                  {
 871                                      ph = providerManager.getRemoteProvider(
 872                                          name.getLocation(), name.getLogicalName());
 873                                  }
 874                                  else
 875                                  {
 876                                      // get cached or load new provider module
 877                                      ph = providerManager.getProvider(
 878                                          name.getPhysicalName(), name.getLogicalName());
 879 marek          1.63              }
 880                          
 881                                  // convert arguments
 882                                  OperationContext context;
 883                          
 884                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
 885 venkat.puvvada 1.108             context.insert(
 886                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
 887                                  context.insert(
 888                                      request->operationContext.get(ContentLanguageListContainer::NAME));
 889 marek          1.63              // forward request
 890                                  CMPIProvider & pr=ph.GetProvider();
 891                          
 892 ms.aruran      1.115             PEG_TRACE_STRING(
 893                                      TRC_PROVIDERMANAGER,
 894                                      Tracer::LEVEL4,
 895 marek          1.63                  "Calling provider.createInstance: " +
 896                                      ph.GetProvider().getName());
 897                          
 898                                  CMPIStatus rc={CMPI_RC_OK,NULL};
 899                                  CMPI_ContextOnStack eCtx(context);
 900                                  CMPI_ObjectPathOnStack eRef(objectPath);
 901                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
 902                                  CMPI_InstanceOnStack eInst(request->newInstance);
 903                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
 904                          
 905                                  CMPIFlags flgs=0;
 906 venkat.puvvada 1.108             eCtx.ft->addEntry(
 907                                      &eCtx,
 908                                      CMPIInvocationFlags,
 909                                      (CMPIValue*)&flgs,
 910                                      CMPI_uint32);
 911 marek          1.63      
 912                                  const IdentityContainer container =
 913 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
 914                                  eCtx.ft->addEntry(
 915                                      &eCtx,
 916                                      CMPIPrincipal,
 917                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
 918                                      CMPI_chars);
 919 marek          1.63      
 920 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
 921 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
 922                          
 923 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
 924 kumpf          1.79              eCtx.ft->addEntry(
 925                                      &eCtx,
 926 dave.sudlik    1.99                  CMPIAcceptLanguage,
 927 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
 928 venkat.puvvada 1.108                 acceptLangs).getCString(),
 929 kumpf          1.79                  CMPI_chars);
 930 venkat.puvvada 1.108             if (remote)
 931                                  {
 932                                      CString info=pidc.getRemoteInfo().getCString();
 933                                      eCtx.ft->addEntry(
 934                                          &eCtx,
 935                                          "CMPIRRemoteInfo",
 936                                          (CMPIValue*)(const char*)info,CMPI_chars);
 937 marek          1.63              }
 938                          
 939                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
 940                          
 941 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
 942 marek          1.63      
 943 kumpf          1.92              {
 944                                      StatProviderTimeMeasurement providerTime(response);
 945 marek          1.63      
 946 kumpf          1.92                  rc = pr.miVector.instMI->ft->createInstance(
 947                                          pr.miVector.instMI,&eCtx,&eRes,&eRef,&eInst);
 948                                  }
 949 marek          1.63      
 950 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
 951                          //      Do this before checking rc from provider to throw exception in case 
 952                          //      rc.msg is also localized.
 953                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
 954 venkat.puvvada 1.108             CMPIData cldata = 
 955                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
 956 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
 957                                  {
 958                                      response->operationContext.set(
 959                                          ContentLanguageListContainer(
 960 venkat.puvvada 1.108                     ContentLanguageList(
 961                                          LanguageParser::parseContentLanguageHeader(
 962                                          CMGetCharPtr(cldata.value.string)))));
 963 dave.sudlik    1.103                 handler.setContext(response->operationContext);
 964 dave.sudlik    1.99              }
 965                          
 966 marek          1.63              if (rc.rc!=CMPI_RC_OK)
 967 dave.sudlik    1.102             {
 968 venkat.puvvada 1.108                 CIMException cimException(
 969                                          (CIMStatusCode)rc.rc,
 970                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
 971                          
 972                                      if (eRes.resError)
 973                                      {
 974                                          for (CMPI_Error* currErr=eRes.resError; 
 975 dave.sudlik    1.102                         currErr!=NULL; 
 976                                              currErr=currErr->nextError)
 977 venkat.puvvada 1.108                     {
 978                                              cimException.addError(
 979                                                  ((CIMError*)currErr->hdl)->getInstance());
 980                                          }
 981                                      }
 982                                      throw cimException;
 983 dave.sudlik    1.102             }
 984 marek          1.63          }
 985                              HandlerCatch(handler);
 986                          
 987                              PEG_METHOD_EXIT();
 988                          
 989                              return(response);
 990                          }
 991                          
 992 venkat.puvvada 1.108     Message * CMPIProviderManager::handleModifyInstanceRequest(
 993                              const Message * message)
 994 marek          1.63      {
 995 ms.aruran      1.115         PEG_METHOD_ENTER(
 996                                  TRC_PROVIDERMANAGER,
 997                                  "CMPIProviderManager::handleModifyInstanceRequest()");
 998 marek          1.63      
 999 kumpf          1.92          HandlerIntro(ModifyInstance,message,request,response,handler);
1000 venkat.puvvada 1.108         try
1001                              {
1002 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1003 venkat.puvvada 1.108                 "CMPIProviderManager::handleModifyInstanceRequest - Host name: $0"
1004                                      "  Name space: $1  Class name: $2",
1005 marek          1.63                  System::getHostName(),
1006                                      request->nameSpace.getString(),
1007                                      request->modifiedInstance.getPath().getClassName().getString());
1008                          
1009                                  // make target object path
1010                                  CIMObjectPath objectPath(
1011                                      System::getHostName(),
1012                                      request->nameSpace,
1013                                      request->modifiedInstance.getPath ().getClassName(),
1014                                      request->modifiedInstance.getPath ().getKeyBindings());
1015                          
1016                                  Boolean remote=false;
1017                                  CMPIProvider::OpProviderHolder ph;
1018                          
1019                                  // resolve provider name
1020 venkat.puvvada 1.108             ProviderIdContainer pidc = 
1021                                      request->operationContext.get(ProviderIdContainer::NAME);
1022 marek          1.63              ProviderName name = _resolveProviderName(pidc);
1023                          
1024 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
1025                                  {
1026                                      ph = providerManager.getRemoteProvider(
1027                                          name.getLocation(), name.getLogicalName());
1028 marek          1.63              }
1029 venkat.puvvada 1.108             else
1030                                  {
1031                                      // get cached or load new provider module
1032                                      ph = providerManager.getProvider(
1033                                          name.getPhysicalName(), name.getLogicalName());
1034 marek          1.63              }
1035                          
1036                                  // convert arguments
1037                                  OperationContext context;
1038                          
1039                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
1040 venkat.puvvada 1.108             context.insert(
1041                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
1042                                  context.insert(
1043                                      request->operationContext.get(ContentLanguageListContainer::NAME));
1044 marek          1.63              // forward request
1045                                  CMPIProvider & pr=ph.GetProvider();
1046                          
1047 ms.aruran      1.115             PEG_TRACE_STRING(
1048                                      TRC_PROVIDERMANAGER,
1049                                      Tracer::LEVEL4,
1050 marek          1.63                  "Calling provider.modifyInstance: " + pr.getName());
1051                          
1052                                  CMPIStatus rc={CMPI_RC_OK,NULL};
1053                                  CMPI_ContextOnStack eCtx(context);
1054                                  CMPI_ObjectPathOnStack eRef(objectPath);
1055                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
1056                                  CMPI_InstanceOnStack eInst(request->modifiedInstance);
1057                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
1058                          
1059                                  CMPIPropertyList props(request->propertyList);
1060                          
1061                                  CMPIFlags flgs=0;
1062                                  if (request->includeQualifiers) flgs|=CMPI_FLAG_IncludeQualifiers;
1063 venkat.puvvada 1.108             eCtx.ft->addEntry(
1064                                      &eCtx,
1065                                      CMPIInvocationFlags,
1066                                      (CMPIValue*)&flgs,
1067                                      CMPI_uint32);
1068 marek          1.63      
1069                                  const IdentityContainer container =
1070 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
1071 marek          1.63              eCtx.ft->addEntry(&eCtx,
1072 venkat.puvvada 1.108                 CMPIPrincipal,
1073                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
1074                                      CMPI_chars);
1075 marek          1.63      
1076 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
1077 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
1078 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
1079 kumpf          1.79              eCtx.ft->addEntry(
1080                                      &eCtx,
1081 dave.sudlik    1.99                  CMPIAcceptLanguage,
1082 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
1083 venkat.puvvada 1.108                 acceptLangs).getCString(),
1084 kumpf          1.79                  CMPI_chars);
1085 venkat.puvvada 1.108     
1086                                  if (remote)
1087                                  {
1088                                      CString info=pidc.getRemoteInfo().getCString();
1089                                      eCtx.ft->addEntry(
1090                                          &eCtx,
1091                                          "CMPIRRemoteInfo",
1092                                          (CMPIValue*)(const char*)info,
1093                                          CMPI_chars);
1094 marek          1.63              }
1095                          
1096                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
1097                          
1098 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
1099 marek          1.63      
1100 kumpf          1.92              {
1101                                      StatProviderTimeMeasurement providerTime(response);
1102 marek          1.63      
1103 kumpf          1.92                  rc = pr.miVector.instMI->ft->modifyInstance(
1104                                          pr.miVector.instMI,&eCtx,&eRes,&eRef,&eInst,
1105                                          (const char **)props.getList());
1106                                  }
1107 marek          1.63      
1108 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
1109                          //      Do this before checking rc from provider to throw exception in case 
1110                          //      rc.msg is also localized.
1111                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
1112 venkat.puvvada 1.108             CMPIData cldata = 
1113                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
1114 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
1115                                  {
1116                                      response->operationContext.set(
1117                                          ContentLanguageListContainer(
1118 venkat.puvvada 1.108                     ContentLanguageList(
1119                                          LanguageParser::parseContentLanguageHeader(
1120                                          CMGetCharPtr(cldata.value.string)))));
1121 dave.sudlik    1.103                 handler.setContext(response->operationContext);
1122 dave.sudlik    1.99              }
1123                          
1124 marek          1.63              if (rc.rc!=CMPI_RC_OK)
1125 dave.sudlik    1.102             {
1126 venkat.puvvada 1.108                 CIMException cimException(
1127                                          (CIMStatusCode)rc.rc,
1128                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
1129                          
1130                                      if (eRes.resError)
1131                                      {
1132                                          for (CMPI_Error* currErr=eRes.resError; 
1133 dave.sudlik    1.102                         currErr!=NULL; 
1134                                              currErr=currErr->nextError)
1135 venkat.puvvada 1.108                     {
1136                                              cimException.addError(
1137                                                  ((CIMError*)currErr->hdl)->getInstance());
1138                                          }
1139                                      }
1140                                      throw cimException;
1141 dave.sudlik    1.102             }
1142 marek          1.63          }
1143                              HandlerCatch(handler);
1144                          
1145                              PEG_METHOD_EXIT();
1146                          
1147                              return(response);
1148                          }
1149                          
1150 venkat.puvvada 1.108     Message * CMPIProviderManager::handleDeleteInstanceRequest(
1151                              const Message * message)
1152 marek          1.63      {
1153 ms.aruran      1.115         PEG_METHOD_ENTER(
1154                                  TRC_PROVIDERMANAGER,
1155                                  "CMPIProviderManager::handleDeleteInstanceRequest()");
1156 marek          1.63      
1157 kumpf          1.92          HandlerIntro(DeleteInstance,message,request,response,handler);
1158 venkat.puvvada 1.108         try
1159                              {
1160 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1161 venkat.puvvada 1.108                 "CMPIProviderManager::handleDeleteInstanceRequest - Host name: $0"
1162                                      "  Name space: $1  Class name: $2",
1163 marek          1.63                  System::getHostName(),
1164                                      request->nameSpace.getString(),
1165                                      request->instanceName.getClassName().getString());
1166                          
1167                                  // make target object path
1168                                  CIMObjectPath objectPath(
1169                                      System::getHostName(),
1170                                      request->nameSpace,
1171                                      request->instanceName.getClassName(),
1172                                      request->instanceName.getKeyBindings());
1173                          
1174                                  Boolean remote=false;
1175                                  CMPIProvider::OpProviderHolder ph;
1176                          
1177                                  // resolve provider name
1178 venkat.puvvada 1.108             ProviderIdContainer pidc = 
1179                                      request->operationContext.get(ProviderIdContainer::NAME);
1180 marek          1.63              ProviderName name = _resolveProviderName(pidc);
1181                          
1182 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
1183                                  {
1184                                      ph = providerManager.getRemoteProvider(
1185                                          name.getLocation(), name.getLogicalName());
1186 marek          1.63              }
1187 venkat.puvvada 1.108             else
1188                                  {
1189                                      // get cached or load new provider module
1190                                      ph = providerManager.getProvider(
1191                                          name.getPhysicalName(), name.getLogicalName());
1192 marek          1.63              }
1193                          
1194                                  // convert arguments
1195                                  OperationContext context;
1196                          
1197                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
1198 venkat.puvvada 1.108             context.insert(
1199                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
1200                                  context.insert(
1201                                      request->operationContext.get(ContentLanguageListContainer::NAME));
1202 marek          1.63              // forward request
1203                                  CMPIProvider & pr=ph.GetProvider();
1204                          
1205 ms.aruran      1.115             PEG_TRACE_STRING(
1206                                      TRC_PROVIDERMANAGER,
1207                                      Tracer::LEVEL4,
1208 marek          1.63                  "Calling provider.deleteInstance: " + pr.getName());
1209                          
1210                                  CMPIStatus rc={CMPI_RC_OK,NULL};
1211                                  CMPI_ContextOnStack eCtx(context);
1212                                  CMPI_ObjectPathOnStack eRef(objectPath);
1213                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
1214                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
1215                          
1216                                  CMPIFlags flgs=0;
1217 venkat.puvvada 1.108             eCtx.ft->addEntry(
1218                                      &eCtx,
1219                                      CMPIInvocationFlags,
1220                                      (CMPIValue*)&flgs,
1221                                      CMPI_uint32);
1222 marek          1.63      
1223                                  const IdentityContainer container =
1224 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
1225 marek          1.63              eCtx.ft->addEntry(&eCtx,
1226 venkat.puvvada 1.108                 CMPIPrincipal,
1227                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
1228                                      CMPI_chars);
1229 marek          1.63      
1230 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
1231 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
1232                          
1233 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
1234 kumpf          1.79              eCtx.ft->addEntry(
1235                                      &eCtx,
1236 dave.sudlik    1.99                  CMPIAcceptLanguage,
1237 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
1238 venkat.puvvada 1.108                 acceptLangs).getCString(),
1239 kumpf          1.79                  CMPI_chars);
1240 venkat.puvvada 1.108             if (remote)
1241                                  {
1242                                      CString info=pidc.getRemoteInfo().getCString();
1243                                      eCtx.ft->addEntry(
1244                                          &eCtx,
1245                                          "CMPIRRemoteInfo",
1246                                          (CMPIValue*)(const char*)info,
1247                                          CMPI_chars);
1248 marek          1.63              }
1249                          
1250                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
1251                          
1252 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
1253 marek          1.63      
1254 kumpf          1.92              {
1255                                      StatProviderTimeMeasurement providerTime(response);
1256 marek          1.63      
1257 kumpf          1.92                  rc = pr.miVector.instMI->ft->deleteInstance(
1258                                          pr.miVector.instMI,&eCtx,&eRes,&eRef);
1259                                  }
1260 marek          1.63      
1261 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
1262                          //      Do this before checking rc from provider to throw exception in case 
1263                          //      rc.msg is also localized.
1264                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
1265 venkat.puvvada 1.108             CMPIData cldata = 
1266                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
1267 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
1268                                  {
1269                                      response->operationContext.set(
1270                                          ContentLanguageListContainer(
1271 venkat.puvvada 1.108                     ContentLanguageList(
1272                                          LanguageParser::parseContentLanguageHeader(
1273                                          CMGetCharPtr(cldata.value.string)))));
1274 dave.sudlik    1.103                 handler.setContext(response->operationContext);
1275 dave.sudlik    1.99              }
1276                          
1277 marek          1.63              if (rc.rc!=CMPI_RC_OK)
1278 dave.sudlik    1.102             {
1279 venkat.puvvada 1.108                 CIMException cimException(
1280                                          (CIMStatusCode)rc.rc,
1281                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
1282                          
1283                                      if (eRes.resError)
1284                                      {
1285                                          for (CMPI_Error* currErr=eRes.resError; 
1286 dave.sudlik    1.102                         currErr!=NULL; 
1287                                              currErr=currErr->nextError)
1288 venkat.puvvada 1.108                     {
1289                                              cimException.addError(
1290                                                  ((CIMError*)currErr->hdl)->getInstance());
1291                                          }
1292                                      }
1293                                      throw cimException;
1294 dave.sudlik    1.102             }
1295 marek          1.63          }
1296                              HandlerCatch(handler);
1297                          
1298                              PEG_METHOD_EXIT();
1299                          
1300                              return(response);
1301                          }
1302                          
1303                          Message * CMPIProviderManager::handleExecQueryRequest(const Message * message)
1304                          {
1305 ms.aruran      1.115         PEG_METHOD_ENTER(
1306                                  TRC_PROVIDERMANAGER,
1307                                  "CMPIProviderManager::handleExecQueryRequest()");
1308 marek          1.63      
1309 kumpf          1.92          HandlerIntro(ExecQuery,message,request,response,handler);
1310 marek          1.63      
1311 venkat.puvvada 1.108         try
1312                              {
1313                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1314                                      "CMPIProviderManager::ExecQueryRequest - Host name: $0  Name "
1315                                      "space: $1  Class name: $2",
1316 marek          1.63                  System::getHostName(),
1317                                      request->nameSpace.getString(),
1318                                      request->className.getString());
1319                          
1320                                  // make target object path
1321                                  CIMObjectPath objectPath(
1322                                      System::getHostName(),
1323                                      request->nameSpace,
1324                                      request->className);
1325                          
1326                                  Boolean remote=false;
1327                          
1328                                  CMPIProvider::OpProviderHolder ph;
1329                          
1330                                  // resolve provider name
1331 venkat.puvvada 1.108             ProviderIdContainer pidc = 
1332                                      request->operationContext.get(ProviderIdContainer::NAME);
1333 marek          1.63              ProviderName name = _resolveProviderName(pidc);
1334                          
1335 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
1336                                  {
1337                                      ph = providerManager.getRemoteProvider(
1338                                          name.getLocation(), name.getLogicalName());
1339 marek          1.63              }
1340 venkat.puvvada 1.108             else
1341                                  {
1342                                      // get cached or load new provider module
1343                                      ph = providerManager.getProvider(
1344                                          name.getPhysicalName(), name.getLogicalName());
1345 marek          1.63              }
1346                          
1347                                  // convert arguments
1348                                  OperationContext context;
1349                          
1350                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
1351 venkat.puvvada 1.108             context.insert(
1352                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
1353                                  context.insert(
1354                                      request->operationContext.get(ContentLanguageListContainer::NAME));
1355 marek          1.63      
1356                                  // forward request
1357                                  CMPIProvider & pr=ph.GetProvider();
1358                          
1359 ms.aruran      1.115             PEG_TRACE_STRING(
1360                                      TRC_PROVIDERMANAGER,
1361                                      Tracer::LEVEL4,
1362 marek          1.63                  "Calling provider.execQuery: " + pr.getName());
1363                          
1364                                  const char **props=NULL;
1365                          
1366                                  CMPIStatus rc={CMPI_RC_OK,NULL};
1367                                  CMPI_ContextOnStack eCtx(context);
1368                                  CMPI_ObjectPathOnStack eRef(objectPath);
1369                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
1370                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
1371                          
1372                                  const CString queryLan=request->queryLanguage.getCString();
1373                                  const CString query=request->query.getCString();
1374                          
1375                                  CMPIFlags flgs=0;
1376 venkat.puvvada 1.108             eCtx.ft->addEntry(
1377                                      &eCtx,
1378                                      CMPIInvocationFlags,
1379                                      (CMPIValue*)&flgs,
1380                                      CMPI_uint32);
1381 marek          1.63      
1382                                  const IdentityContainer container =
1383 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
1384 marek          1.63              eCtx.ft->addEntry(&eCtx,
1385 venkat.puvvada 1.108                 CMPIPrincipal,
1386                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
1387                                      CMPI_chars);
1388                                  eCtx.ft->addEntry(
1389                                      &eCtx,
1390                                      CMPIInitNameSpace,
1391                                      (CMPIValue*)(const char*)request->
1392                                      nameSpace.getString().getCString(),
1393                                      CMPI_chars);
1394 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
1395 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
1396                          
1397 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
1398 kumpf          1.79              eCtx.ft->addEntry(
1399                                      &eCtx,
1400 dave.sudlik    1.99                  CMPIAcceptLanguage,
1401 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
1402 venkat.puvvada 1.108                 acceptLangs).getCString(),
1403 kumpf          1.79                  CMPI_chars);
1404 venkat.puvvada 1.108             if (remote)
1405                                  {
1406                                      CString info=pidc.getRemoteInfo().getCString();
1407                                      eCtx.ft->addEntry(
1408                                          &eCtx,
1409                                          "CMPIRRemoteInfo",
1410                                          (CMPIValue*)(const char*)info,
1411                                          CMPI_chars);
1412 marek          1.63              }
1413                          
1414                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
1415                          
1416 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
1417 marek          1.63      
1418 kumpf          1.92              {
1419                                      StatProviderTimeMeasurement providerTime(response);
1420 marek          1.63      
1421 kumpf          1.92                  rc = pr.miVector.instMI->ft->execQuery(
1422                                          pr.miVector.instMI,&eCtx,&eRes,&eRef,
1423                                          CHARS(queryLan),CHARS(query));
1424                                  }
1425 marek          1.63      
1426 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
1427                          //      Do this before checking rc from provider to throw exception in case 
1428                          //      rc.msg is also localized.
1429                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
1430 venkat.puvvada 1.108             CMPIData cldata = 
1431                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
1432 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
1433                                  {
1434                                      response->operationContext.set(
1435                                          ContentLanguageListContainer(
1436 venkat.puvvada 1.108                     ContentLanguageList(
1437                                          LanguageParser::parseContentLanguageHeader(
1438                                          CMGetCharPtr(cldata.value.string)))));
1439 dave.sudlik    1.103                 handler.setContext(response->operationContext);
1440 dave.sudlik    1.99              }
1441                          
1442 marek          1.63              if (rc.rc!=CMPI_RC_OK)
1443 dave.sudlik    1.102             {
1444 venkat.puvvada 1.108                 CIMException cimException(
1445                                          (CIMStatusCode)rc.rc,
1446                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
1447                          
1448                                      if (eRes.resError)
1449                                      {
1450                                          for (CMPI_Error* currErr=eRes.resError; 
1451 dave.sudlik    1.102                         currErr!=NULL; 
1452                                              currErr=currErr->nextError)
1453 venkat.puvvada 1.108                     {
1454                                              cimException.addError(
1455                                                  ((CIMError*)currErr->hdl)->getInstance());
1456                                          }
1457                                      }
1458                                      throw cimException;
1459 dave.sudlik    1.102             }
1460                          
1461 marek          1.63          }
1462                              HandlerCatch(handler);
1463                          
1464                              PEG_METHOD_EXIT();
1465                          
1466                              return(response);
1467                          }
1468                          
1469                          Message * CMPIProviderManager::handleAssociatorsRequest(const Message * message)
1470                          {
1471 ms.aruran      1.115         PEG_METHOD_ENTER(
1472                                  TRC_PROVIDERMANAGER,
1473                                  "CMPIProviderManager::handleAssociatorsRequest()");
1474 marek          1.63      
1475 kumpf          1.92          HandlerIntro(Associators,message,request,response,handler);
1476 venkat.puvvada 1.108         try
1477                              {
1478 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1479 venkat.puvvada 1.108                 "CMPIProviderManager::handleAssociatorsRequest - Host name: $0  "
1480                                      "Name space: $1  Class name: $2",
1481 marek          1.63                  System::getHostName(),
1482                                      request->nameSpace.getString(),
1483                                      request->objectName.getClassName().getString());
1484                          
1485                                  // make target object path
1486                                  CIMObjectPath objectPath(
1487                                      System::getHostName(),
1488                                      request->nameSpace,
1489                                      request->objectName.getClassName());
1490                          
1491                                  objectPath.setKeyBindings(request->objectName.getKeyBindings());
1492                          
1493                                  CIMObjectPath assocPath(
1494                                      System::getHostName(),
1495                                      request->nameSpace,
1496                                      request->assocClass.getString());
1497                          
1498                                  Boolean remote=false;
1499                          
1500                                  CMPIProvider::OpProviderHolder ph;
1501                          
1502 marek          1.63              // resolve provider name
1503 venkat.puvvada 1.108             ProviderIdContainer pidc = 
1504                                      request->operationContext.get(ProviderIdContainer::NAME);
1505 marek          1.63              ProviderName name = _resolveProviderName(pidc);
1506                          
1507 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
1508                                  {
1509                                      ph = providerManager.getRemoteProvider(
1510                                          name.getLocation(), name.getLogicalName());
1511 marek          1.63              }
1512 venkat.puvvada 1.108             else
1513                                  {
1514                                      // get cached or load new provider module
1515                                      ph = providerManager.getProvider(
1516                                          name.getPhysicalName(), name.getLogicalName());
1517 marek          1.63              }
1518                          
1519 venkat.puvvada 1.108             // convert arguments
1520 marek          1.63              OperationContext context;
1521                          
1522                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
1523 venkat.puvvada 1.108             context.insert(
1524                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
1525                                  context.insert(
1526                                      request->operationContext.get(ContentLanguageListContainer::NAME));
1527 marek          1.63      
1528                                  // forward request
1529                                  CMPIProvider & pr=ph.GetProvider();
1530                          
1531 a.dunfey       1.85      #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
1532 venkat.puvvada 1.118.2.2         AutoPtr<NormalizerContext> tmpNormalizerContext(
1533                                      new CIMOMHandleContext(*pr._cimom_handle));
1534                                  request->operationContext.insert(
1535                                      NormalizerContextContainer(tmpNormalizerContext));
1536                          #endif
1537 a.dunfey       1.85      
1538 ms.aruran      1.115             PEG_TRACE_STRING(
1539                                      TRC_PROVIDERMANAGER,
1540                                      Tracer::LEVEL4,
1541 marek          1.63                  "Calling provider.associators: " + pr.getName());
1542                          
1543 ms.aruran      1.115             PEG_TRACE_STRING(
1544                                      TRC_PROVIDERMANAGER,
1545                                      Tracer::LEVEL4,
1546                                      String("--- CMPIProviderManager::associators < role: >" ) +
1547                                      request->role +
1548                                      request->assocClass.getString());
1549 marek          1.63      
1550                                  CMPIStatus rc={CMPI_RC_OK,NULL};
1551                                  CMPI_ContextOnStack eCtx(context);
1552                                  CMPI_ObjectPathOnStack eRef(objectPath);
1553                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
1554                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
1555                                  const CString aClass=request->assocClass.getString().getCString();
1556                                  const CString rClass=request->resultClass.getString().getCString();
1557                                  const CString rRole=request->role.getCString();
1558                                  const CString resRole=request->resultRole.getCString();
1559                          
1560                                  CMPIPropertyList props(request->propertyList);
1561                          
1562                                  CMPIFlags flgs=0;
1563                                  if (request->includeQualifiers) flgs|=CMPI_FLAG_IncludeQualifiers;
1564                                  if (request->includeClassOrigin) flgs|=CMPI_FLAG_IncludeClassOrigin;
1565 venkat.puvvada 1.108             eCtx.ft->addEntry(
1566                                      &eCtx,
1567                                      CMPIInvocationFlags,
1568                                      (CMPIValue*)&flgs,
1569                                      CMPI_uint32);
1570 marek          1.63      
1571                                  const IdentityContainer container =
1572 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
1573 marek          1.63              eCtx.ft->addEntry(&eCtx,
1574 venkat.puvvada 1.108                 CMPIPrincipal,
1575                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
1576                                      CMPI_chars);
1577 marek          1.63      
1578 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
1579 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
1580 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
1581 kumpf          1.79              eCtx.ft->addEntry(
1582                                      &eCtx,
1583 dave.sudlik    1.99                  CMPIAcceptLanguage,
1584 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
1585 venkat.puvvada 1.108                 acceptLangs).getCString(),
1586 kumpf          1.79                  CMPI_chars);
1587 venkat.puvvada 1.108     
1588                                  if (remote)
1589                                  {
1590                                      CString info=pidc.getRemoteInfo().getCString();
1591                                      eCtx.ft->addEntry(
1592                                          &eCtx,
1593                                          "CMPIRRemoteInfo",
1594                                          (CMPIValue*)(const char*)info,
1595                                          CMPI_chars);
1596 marek          1.63              }
1597                          
1598                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
1599                          
1600 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
1601 marek          1.63      
1602 kumpf          1.92              {
1603                                      StatProviderTimeMeasurement providerTime(response);
1604 marek          1.63      
1605 kumpf          1.92                  rc = pr.miVector.assocMI->ft->associators(
1606                                          pr.miVector.assocMI,&eCtx,&eRes,&eRef,
1607                                          CHARS(aClass),CHARS(rClass),CHARS(rRole),CHARS(resRole),
1608                                          (const char **)props.getList());
1609                                  }
1610 marek          1.63      
1611 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
1612                          //      Do this before checking rc from provider to throw exception in case 
1613                          //      rc.msg is also localized.
1614                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
1615 venkat.puvvada 1.108             CMPIData cldata = eCtx.ft->getEntry (
1616                                      &eCtx, 
1617                                      CMPIContentLanguage, 
1618                                      &tmprc);
1619 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
1620                                  {
1621                                      response->operationContext.set(
1622                                          ContentLanguageListContainer(
1623 venkat.puvvada 1.108                     ContentLanguageList(
1624                                          LanguageParser::parseContentLanguageHeader(
1625                                          CMGetCharPtr(cldata.value.string)))));
1626 dave.sudlik    1.103                 handler.setContext(response->operationContext);
1627 dave.sudlik    1.99              }
1628                          
1629 marek          1.63              if (rc.rc!=CMPI_RC_OK)
1630 dave.sudlik    1.102             {
1631 venkat.puvvada 1.108                 CIMException cimException(
1632                                          (CIMStatusCode)rc.rc,
1633                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
1634                          
1635                                      if (eRes.resError)
1636                                      {
1637                                          for (CMPI_Error* currErr=eRes.resError; 
1638 dave.sudlik    1.102                         currErr!=NULL; 
1639                                              currErr=currErr->nextError)
1640 venkat.puvvada 1.108                     {
1641                                              cimException.addError(
1642                                                  ((CIMError*)currErr->hdl)->getInstance());
1643                                          }
1644                                      }
1645                                      throw cimException;
1646 dave.sudlik    1.102             }
1647 marek          1.63          }
1648                              HandlerCatch(handler);
1649                          
1650                              PEG_METHOD_EXIT();
1651                          
1652                              return(response);
1653                          }
1654                          
1655 venkat.puvvada 1.108     Message * CMPIProviderManager::handleAssociatorNamesRequest(
1656                              const Message * message)
1657 marek          1.63      {
1658 ms.aruran      1.115         PEG_METHOD_ENTER(
1659                                  TRC_PROVIDERMANAGER,
1660                                  "CMPIProviderManager::handleAssociatorNamesRequest()");
1661 marek          1.63      
1662 kumpf          1.92          HandlerIntro(AssociatorNames,message,request,response,handler);
1663 venkat.puvvada 1.108         try
1664                              {
1665 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1666 venkat.puvvada 1.108                 "CMPIProviderManager::handleAssociatorNamesRequest - Host name: $0"
1667                                      "  Name space: $1  Class name: $2",
1668 marek          1.63                  System::getHostName(),
1669                                      request->nameSpace.getString(),
1670                                      request->objectName.getClassName().getString());
1671                          
1672                                  // make target object path
1673                                  CIMObjectPath objectPath(
1674                                      System::getHostName(),
1675                                      request->nameSpace,
1676                                      request->objectName.getClassName());
1677                          
1678                                  objectPath.setKeyBindings(request->objectName.getKeyBindings());
1679                          
1680                                  CIMObjectPath assocPath(
1681                                      System::getHostName(),
1682                                      request->nameSpace,
1683                                      request->assocClass.getString());
1684                          
1685                                  Boolean remote=false;
1686                                  CMPIProvider::OpProviderHolder ph;
1687                          
1688                                  // resolve provider name
1689 venkat.puvvada 1.108             ProviderIdContainer pidc = 
1690                                      request->operationContext.get(ProviderIdContainer::NAME);
1691 marek          1.63              ProviderName name = _resolveProviderName(pidc);
1692                          
1693 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
1694                                  {
1695                                      ph = providerManager.getRemoteProvider(
1696                                          name.getLocation(), name.getLogicalName());
1697 marek          1.63              }
1698 venkat.puvvada 1.108             else
1699                                  {
1700                                      // get cached or load new provider module
1701                                      ph = providerManager.getProvider(
1702                                          name.getPhysicalName(), name.getLogicalName());
1703 marek          1.63              }
1704                          
1705                                  // convert arguments
1706                                  OperationContext context;
1707                          
1708                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
1709 venkat.puvvada 1.108             context.insert(
1710                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
1711                                  context.insert(
1712                                      request->operationContext.get(ContentLanguageListContainer::NAME));
1713 marek          1.63      
1714                                  // forward request
1715                                  CMPIProvider & pr=ph.GetProvider();
1716                          
1717 ms.aruran      1.115             PEG_TRACE_STRING(
1718                                      TRC_PROVIDERMANAGER,
1719                                       Tracer::LEVEL4,
1720 marek          1.63                  "Calling provider.associatorNames: " + pr.getName());
1721                          
1722 ms.aruran      1.115             PEG_TRACE_STRING(
1723                                      TRC_PROVIDERMANAGER,
1724                                      Tracer::LEVEL4,
1725                                      String("--- CMPIProviderManager::associatorNames --  role: ") + 
1726                                      request->role + "< aCls " + request->assocClass.getString());
1727 marek          1.63      
1728                                  CMPIStatus rc={CMPI_RC_OK,NULL};
1729                                  CMPI_ContextOnStack eCtx(context);
1730                                  CMPI_ObjectPathOnStack eRef(objectPath);
1731                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
1732                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
1733                                  const CString aClass=request->assocClass.getString().getCString();
1734                                  const CString rClass=request->resultClass.getString().getCString();
1735                                  const CString rRole=request->role.getCString();
1736                                  const CString resRole=request->resultRole.getCString();
1737                          
1738                                  CMPIFlags flgs=0;
1739 venkat.puvvada 1.108             eCtx.ft->addEntry(
1740                                      &eCtx,
1741                                      CMPIInvocationFlags,
1742                                      (CMPIValue*)&flgs,
1743                                      CMPI_uint32);
1744 marek          1.63      
1745                                  const IdentityContainer container =
1746 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
1747 marek          1.63              eCtx.ft->addEntry(&eCtx,
1748 venkat.puvvada 1.108                 CMPIPrincipal,
1749                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
1750                                      CMPI_chars);
1751 marek          1.63      
1752 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
1753 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
1754 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
1755 kumpf          1.79              eCtx.ft->addEntry(
1756                                      &eCtx,
1757 dave.sudlik    1.99                  CMPIAcceptLanguage,
1758 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
1759 venkat.puvvada 1.108                 acceptLangs).getCString(),
1760 kumpf          1.79                  CMPI_chars);
1761 venkat.puvvada 1.108     
1762                                  if (remote)
1763                                  {
1764                                      CString info=pidc.getRemoteInfo().getCString();
1765                                      eCtx.ft->addEntry(
1766                                          &eCtx,
1767                                          "CMPIRRemoteInfo",
1768                                          (CMPIValue*)(const char*)info,
1769                                          CMPI_chars);
1770 marek          1.63              }
1771                          
1772                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
1773                          
1774 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
1775 marek          1.63      
1776 kumpf          1.92              {
1777                                      StatProviderTimeMeasurement providerTime(response);
1778 marek          1.63      
1779 kumpf          1.92                  rc = pr.miVector.assocMI->ft->associatorNames(
1780                                          pr.miVector.assocMI,&eCtx,&eRes,&eRef,CHARS(aClass),
1781                                          CHARS(rClass),CHARS(rRole),CHARS(resRole));
1782                                  }
1783 marek          1.63      
1784 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
1785                          //      Do this before checking rc from provider to throw exception in case 
1786                          //      rc.msg is also localized.
1787                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
1788 venkat.puvvada 1.108             CMPIData cldata = 
1789                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
1790 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
1791                                  {
1792                                      response->operationContext.set(
1793                                          ContentLanguageListContainer(
1794 venkat.puvvada 1.108                     ContentLanguageList(
1795                                          LanguageParser::parseContentLanguageHeader(
1796                                          CMGetCharPtr(cldata.value.string)))));
1797 dave.sudlik    1.103                 handler.setContext(response->operationContext);
1798 dave.sudlik    1.99              }
1799                          
1800 marek          1.63              if (rc.rc!=CMPI_RC_OK)
1801 dave.sudlik    1.102             {
1802 venkat.puvvada 1.108                 CIMException cimException(
1803                                          (CIMStatusCode)rc.rc,
1804                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
1805                          
1806                                      if (eRes.resError)
1807                                      {
1808                                          for (CMPI_Error* currErr=eRes.resError; 
1809 dave.sudlik    1.102                         currErr!=NULL; 
1810                                              currErr=currErr->nextError)
1811 venkat.puvvada 1.108                     {
1812                                              cimException.addError(
1813                                                  ((CIMError*)currErr->hdl)->getInstance());
1814                                          }
1815                                      }
1816                                      throw cimException;
1817 dave.sudlik    1.102             }
1818 marek          1.63          }
1819                              HandlerCatch(handler);
1820                          
1821                              PEG_METHOD_EXIT();
1822                          
1823                              return(response);
1824                          }
1825                          
1826                          Message * CMPIProviderManager::handleReferencesRequest(const Message * message)
1827                          {
1828 ms.aruran      1.115         PEG_METHOD_ENTER(
1829                                  TRC_PROVIDERMANAGER,
1830                                  "CMPIProviderManager::handleReferencesRequest()");
1831 marek          1.63      
1832 kumpf          1.92          HandlerIntro(References,message,request,response,handler);
1833 venkat.puvvada 1.108         try
1834                              {
1835 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
1836 venkat.puvvada 1.108                 "CMPIProviderManager::handleReferencesRequest - Host name: $0  "
1837                                      "Name space: $1  Class name: $2",
1838 marek          1.63                  System::getHostName(),
1839                                      request->nameSpace.getString(),
1840                                      request->objectName.getClassName().getString());
1841                          
1842                                  // make target object path
1843                                  CIMObjectPath objectPath(
1844                                      System::getHostName(),
1845                                      request->nameSpace,
1846                                      request->objectName.getClassName());
1847                          
1848                                  objectPath.setKeyBindings(request->objectName.getKeyBindings());
1849                          
1850                                  CIMObjectPath resultPath(
1851                                      System::getHostName(),
1852                                      request->nameSpace,
1853                                      request->resultClass.getString());
1854                          
1855                                  Boolean remote=false;
1856                                  CMPIProvider::OpProviderHolder ph;
1857                          
1858                                  // resolve provider name
1859 venkat.puvvada 1.108             ProviderIdContainer pidc = 
1860                                      request->operationContext.get(ProviderIdContainer::NAME);
1861 marek          1.63              ProviderName name = _resolveProviderName(pidc);
1862                          
1863 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
1864                                  {
1865                                      ph = providerManager.getRemoteProvider(
1866                                          name.getLocation(), name.getLogicalName());
1867 marek          1.63              }
1868 venkat.puvvada 1.108             else
1869                                  {
1870                                      // get cached or load new provider module
1871                                      ph = providerManager.getProvider(
1872                                          name.getPhysicalName(), name.getLogicalName());
1873 marek          1.63              }
1874                          
1875                                  // convert arguments
1876                                  OperationContext context;
1877                          
1878                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
1879 venkat.puvvada 1.108             context.insert(
1880                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
1881                                  context.insert(
1882                                      request->operationContext.get(ContentLanguageListContainer::NAME));
1883 marek          1.63              // forward request
1884                                  CMPIProvider & pr=ph.GetProvider();
1885                          
1886 a.dunfey       1.85      #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
1887 venkat.puvvada 1.118.2.2         AutoPtr<NormalizerContext> tmpNormalizerContext(
1888                                      new CIMOMHandleContext(*pr._cimom_handle));
1889                                  request->operationContext.insert(
1890                                      NormalizerContextContainer(tmpNormalizerContext));
1891                          #endif
1892 a.dunfey       1.85      
1893 ms.aruran      1.115             PEG_TRACE_STRING(
1894                                      TRC_PROVIDERMANAGER,
1895                                      Tracer::LEVEL4,
1896 marek          1.63                  "Calling provider.references: " + pr.getName());
1897                          
1898 ms.aruran      1.115             PEG_TRACE_STRING(
1899                                      TRC_PROVIDERMANAGER, Tracer::LEVEL4,
1900                                      String("--- CMPIProviderManager::references -- role:") + 
1901                                      request->role + "< aCls " + request->resultClass.getString());
1902 marek          1.63      
1903                                  CMPIStatus rc={CMPI_RC_OK,NULL};
1904                                  CMPI_ContextOnStack eCtx(context);
1905                                  CMPI_ObjectPathOnStack eRef(objectPath);
1906                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
1907                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
1908                                  const CString rClass=request->resultClass.getString().getCString();
1909                                  const CString rRole=request->role.getCString();
1910                          
1911                                  CMPIPropertyList props(request->propertyList);
1912                          
1913                                  CMPIFlags flgs=0;
1914                                  if (request->includeQualifiers) flgs|=CMPI_FLAG_IncludeQualifiers;
1915                                  if (request->includeClassOrigin) flgs|=CMPI_FLAG_IncludeClassOrigin;
1916 venkat.puvvada 1.108             eCtx.ft->addEntry(
1917                                      &eCtx,
1918                                      CMPIInvocationFlags,
1919                                      (CMPIValue*)&flgs,
1920                                      CMPI_uint32);
1921 marek          1.63      
1922                                  const IdentityContainer container =
1923 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
1924 marek          1.63              eCtx.ft->addEntry(&eCtx,
1925 venkat.puvvada 1.108                 CMPIPrincipal,
1926                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
1927                                      CMPI_chars);
1928 marek          1.63      
1929 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
1930 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
1931 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
1932 kumpf          1.79              eCtx.ft->addEntry(
1933                                      &eCtx,
1934 dave.sudlik    1.99                  CMPIAcceptLanguage,
1935 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
1936 venkat.puvvada 1.108                 acceptLangs).getCString(),
1937 kumpf          1.79                  CMPI_chars);
1938 venkat.puvvada 1.108     
1939                                  if (remote)
1940                                  {
1941                                      CString info=pidc.getRemoteInfo().getCString();
1942                                      eCtx.ft->addEntry(
1943                                          &eCtx,
1944                                          "CMPIRRemoteInfo",
1945                                          (CMPIValue*)(const char*)info,
1946                                          CMPI_chars);
1947 marek          1.63              }
1948                          
1949                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
1950                          
1951 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
1952 marek          1.63      
1953 kumpf          1.92              {
1954                                      StatProviderTimeMeasurement providerTime(response);
1955 marek          1.63      
1956 kumpf          1.92                  rc = pr.miVector.assocMI->ft->references(
1957                                          pr.miVector.assocMI,&eCtx,&eRes,&eRef,
1958                                          CHARS(rClass),CHARS(rRole),(const char **)props.getList());
1959                                  }
1960 marek          1.63      
1961 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
1962                          //      Do this before checking rc from provider to throw exception in case 
1963                          //      rc.msg is also localized.
1964                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
1965 venkat.puvvada 1.108             CMPIData cldata = 
1966                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
1967 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
1968                                  {
1969                                      response->operationContext.set(
1970                                          ContentLanguageListContainer(
1971 venkat.puvvada 1.108                     ContentLanguageList(
1972                                          LanguageParser::parseContentLanguageHeader(
1973                                          CMGetCharPtr(cldata.value.string)))));
1974 dave.sudlik    1.103                 handler.setContext(response->operationContext);
1975 dave.sudlik    1.99              }
1976                          
1977 marek          1.63              if (rc.rc!=CMPI_RC_OK)
1978 dave.sudlik    1.102             {
1979 venkat.puvvada 1.108                 CIMException cimException(
1980                                          (CIMStatusCode)rc.rc,
1981                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
1982                          
1983                                      if (eRes.resError)
1984                                      {
1985                                          for (CMPI_Error* currErr=eRes.resError; 
1986 dave.sudlik    1.102                         currErr!=NULL; 
1987                                              currErr=currErr->nextError)
1988 venkat.puvvada 1.108                     {
1989                                              cimException.addError(
1990                                                  ((CIMError*)currErr->hdl)->getInstance());
1991                                          }
1992                                      }
1993                                      throw cimException;
1994 dave.sudlik    1.102             }
1995 marek          1.63          }
1996                              HandlerCatch(handler);
1997                          
1998                              PEG_METHOD_EXIT();
1999                          
2000                              return(response);
2001                          }
2002                          
2003 venkat.puvvada 1.108     Message * CMPIProviderManager::handleReferenceNamesRequest(
2004                              const Message * message)
2005 marek          1.63      {
2006 ms.aruran      1.115         PEG_METHOD_ENTER(
2007                                  TRC_PROVIDERMANAGER,
2008                                  "CMPIProviderManager::handleReferenceNamesRequest()");
2009 marek          1.63      
2010 kumpf          1.92          HandlerIntro(ReferenceNames,message,request,response,handler);
2011 venkat.puvvada 1.108         try
2012                              {
2013 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
2014 venkat.puvvada 1.108                 "CMPIProviderManager::handleReferenceNamesRequest - Host name: $0"
2015                                      "  Name space: $1  Class name: $2",
2016 marek          1.63                  System::getHostName(),
2017                                      request->nameSpace.getString(),
2018                                      request->objectName.getClassName().getString());
2019                          
2020                                  // make target object path
2021                                  CIMObjectPath objectPath(
2022                                      System::getHostName(),
2023                                      request->nameSpace,
2024                                      request->objectName.getClassName());
2025                          
2026                                  objectPath.setKeyBindings(request->objectName.getKeyBindings());
2027                          
2028                                  CIMObjectPath resultPath(
2029                                      System::getHostName(),
2030                                      request->nameSpace,
2031                                      request->resultClass.getString());
2032                          
2033                                  Boolean remote=false;
2034                                  CMPIProvider::OpProviderHolder ph;
2035                          
2036                                  // resolve provider name
2037 venkat.puvvada 1.108             ProviderIdContainer pidc = 
2038                                      request->operationContext.get(ProviderIdContainer::NAME);
2039 marek          1.63              ProviderName name = _resolveProviderName(pidc);
2040                          
2041 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
2042                                  {
2043                                      ph = providerManager.getRemoteProvider(
2044                                          name.getLocation(), name.getLogicalName());
2045 marek          1.63              }
2046 venkat.puvvada 1.108             else
2047                                  {
2048                                      // get cached or load new provider module
2049                                      ph = providerManager.getProvider(
2050                                          name.getPhysicalName(), name.getLogicalName());
2051 marek          1.63              }
2052                          
2053                                  // convert arguments
2054                                  OperationContext context;
2055                          
2056 venkat.puvvada 1.108             context.insert(request->operationContext.get(IdentityContainer::NAME));
2057                                  context.insert(
2058                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
2059                                  context.insert(
2060                                      request->operationContext.get(ContentLanguageListContainer::NAME));
2061 marek          1.63              CMPIProvider & pr=ph.GetProvider();
2062                          
2063 ms.aruran      1.115             PEG_TRACE_STRING(
2064                                      TRC_PROVIDERMANAGER,
2065                                      Tracer::LEVEL4,
2066 marek          1.63                  "Calling provider.referenceNames: " + pr.getName());
2067                          
2068 ms.aruran      1.115             PEG_TRACE_STRING(
2069                                      TRC_PROVIDERMANAGER,
2070                                      Tracer::LEVEL4,
2071                                      String("--- CMPIProviderManager::referenceNames -- role: ") + 
2072                                      request->role + "< aCls " + request->resultClass.getString());
2073 marek          1.63      
2074                                  CMPIStatus rc={CMPI_RC_OK,NULL};
2075                                  CMPI_ContextOnStack eCtx(context);
2076                                  CMPI_ObjectPathOnStack eRef(objectPath);
2077                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
2078                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
2079                                  const CString rClass=request->resultClass.getString().getCString();
2080                                  const CString rRole=request->role.getCString();
2081                          
2082                                  CMPIFlags flgs=0;
2083 venkat.puvvada 1.108             eCtx.ft->addEntry(
2084                                      &eCtx,
2085                                      CMPIInvocationFlags,
2086                                      (CMPIValue*)&flgs,
2087                                      CMPI_uint32);
2088 marek          1.63      
2089                                  const IdentityContainer container =
2090 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
2091 marek          1.63              eCtx.ft->addEntry(&eCtx,
2092 venkat.puvvada 1.108                 CMPIPrincipal,
2093                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
2094                                      CMPI_chars);
2095 marek          1.63      
2096 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
2097 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
2098                          
2099 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
2100 kumpf          1.79              eCtx.ft->addEntry(
2101                                      &eCtx,
2102 dave.sudlik    1.99                  CMPIAcceptLanguage,
2103 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
2104 venkat.puvvada 1.108                 acceptLangs).getCString(),
2105 kumpf          1.79                  CMPI_chars);
2106 venkat.puvvada 1.108             if (remote)
2107                                  {
2108                                      CString info=pidc.getRemoteInfo().getCString();
2109                                      eCtx.ft->addEntry(
2110                                          &eCtx,
2111                                          "CMPIRRemoteInfo",
2112                                          (CMPIValue*)(const char*)info,
2113                                          CMPI_chars);
2114 marek          1.63              }
2115                          
2116                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
2117                          
2118 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
2119 marek          1.63      
2120 kumpf          1.92              {
2121                                      StatProviderTimeMeasurement providerTime(response);
2122 marek          1.63      
2123 kumpf          1.92                  rc = pr.miVector.assocMI->ft->referenceNames(
2124                                          pr.miVector.assocMI,&eCtx,&eRes,&eRef,
2125                                          CHARS(rClass),CHARS(rRole));
2126                                  }
2127 marek          1.63      
2128 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
2129                          //      Do this before checking rc from provider to throw exception in case 
2130                          //      rc.msg is also localized.
2131                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
2132 venkat.puvvada 1.108             CMPIData cldata = 
2133                                       eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
2134 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
2135                                  {
2136                                      response->operationContext.set(
2137                                          ContentLanguageListContainer(
2138 venkat.puvvada 1.108                     ContentLanguageList(
2139                                          LanguageParser::parseContentLanguageHeader(
2140                                          CMGetCharPtr(cldata.value.string)))));
2141 dave.sudlik    1.103                 handler.setContext(response->operationContext);
2142 dave.sudlik    1.99              }
2143                          
2144 marek          1.63              if (rc.rc!=CMPI_RC_OK)
2145 dave.sudlik    1.102             {
2146 venkat.puvvada 1.108                 CIMException cimException(
2147                                          (CIMStatusCode)rc.rc,
2148                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
2149                          
2150                                      if (eRes.resError)
2151                                      {
2152                                          for (CMPI_Error* currErr=eRes.resError; 
2153 dave.sudlik    1.102                         currErr!=NULL; 
2154                                              currErr=currErr->nextError)
2155 venkat.puvvada 1.108                     {
2156                                              cimException.addError(
2157                                                  ((CIMError*)currErr->hdl)->getInstance());
2158                                          }
2159                                      }
2160                                      throw cimException;
2161 dave.sudlik    1.102             }
2162 marek          1.63          }
2163                              HandlerCatch(handler);
2164                          
2165                              PEG_METHOD_EXIT();
2166                          
2167                              return(response);
2168                          }
2169                          
2170 venkat.puvvada 1.108     Message * CMPIProviderManager::handleInvokeMethodRequest(
2171                              const Message * message)
2172 marek          1.63      {
2173 ms.aruran      1.115         PEG_METHOD_ENTER(
2174                                  TRC_PROVIDERMANAGER,
2175                                  "CMPIProviderManager::handleInvokeMethodRequest()");
2176 marek          1.63      
2177 kumpf          1.92          HandlerIntro(InvokeMethod,message,request,response,handler);
2178 venkat.puvvada 1.108         try
2179                              {
2180 marek          1.63              Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
2181 venkat.puvvada 1.108                 "CMPIProviderManager::handleInvokeMethodRequest - Host name: $0  "
2182                                      "Name space: $1  Class name: $2",
2183 marek          1.63                  System::getHostName(),
2184                                      request->nameSpace.getString(),
2185                                      request->instanceName.getClassName().getString());
2186                          
2187                                  // make target object path
2188                                  CIMObjectPath objectPath(
2189                                      System::getHostName(),
2190                                      request->nameSpace,
2191                                      request->instanceName.getClassName(),
2192                                      request->instanceName.getKeyBindings());
2193                          
2194                                  Boolean remote=false;
2195                                  CMPIProvider::OpProviderHolder ph;
2196                          
2197                                  // resolve provider name
2198 venkat.puvvada 1.108             ProviderIdContainer pidc = 
2199                                      request->operationContext.get(ProviderIdContainer::NAME);
2200 marek          1.63              ProviderName name = _resolveProviderName(pidc);
2201                          
2202 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
2203                                  {
2204                                      ph = providerManager.getRemoteProvider(
2205                                          name.getLocation(), name.getLogicalName());
2206 marek          1.63              }
2207 venkat.puvvada 1.108             else
2208                                  {
2209                                      // get cached or load new provider module
2210                                      ph = providerManager.getProvider(
2211                                          name.getPhysicalName(), name.getLogicalName());
2212 marek          1.63              }
2213                          
2214                                  // convert arguments
2215                                  OperationContext context;
2216                          
2217                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
2218 venkat.puvvada 1.108             context.insert(
2219                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
2220                                  context.insert(
2221                                      request->operationContext.get(ContentLanguageListContainer::NAME));
2222 marek          1.63      
2223                                  CIMObjectPath instanceReference(request->instanceName);
2224                          
2225                                  // ATTN: propagate namespace
2226                                  instanceReference.setNameSpace(request->nameSpace);
2227                          
2228                                  // forward request
2229                                  CMPIProvider & pr=ph.GetProvider();
2230                          
2231 a.dunfey       1.85      #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
2232 venkat.puvvada 1.118.2.2         AutoPtr<NormalizerContext> tmpNormalizerContext(
2233                                      new CIMOMHandleContext(*pr._cimom_handle));
2234                                  request->operationContext.insert(
2235                                      NormalizerContextContainer(tmpNormalizerContext));
2236                          #endif
2237 a.dunfey       1.85      
2238 ms.aruran      1.115             PEG_TRACE_STRING(
2239                                      TRC_PROVIDERMANAGER,
2240                                      Tracer::LEVEL4,
2241 marek          1.63                  "Calling provider.invokeMethod: " + pr.getName());
2242                          
2243                                  CMPIStatus rc={CMPI_RC_OK,NULL};
2244                                  CMPI_ContextOnStack eCtx(context);
2245                                  CMPI_ObjectPathOnStack eRef(objectPath);
2246                                  CMPI_ResultOnStack eRes(handler,&pr.broker);
2247                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
2248                                  CMPI_ArgsOnStack eArgsIn(request->inParameters);
2249                                  Array<CIMParamValue> outArgs;
2250                                  CMPI_ArgsOnStack eArgsOut(outArgs);
2251                                  CString mName=request->methodName.getString().getCString();
2252                          
2253                                  CMPIFlags flgs=0;
2254 venkat.puvvada 1.108             eCtx.ft->addEntry(
2255                                      &eCtx,
2256                                      CMPIInvocationFlags,
2257                                      (CMPIValue*)&flgs,
2258                                      CMPI_uint32);
2259 marek          1.63      
2260                                  const IdentityContainer container =
2261 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
2262 marek          1.63              eCtx.ft->addEntry(&eCtx,
2263 venkat.puvvada 1.108                 CMPIPrincipal,
2264                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
2265                                      CMPI_chars);
2266 marek          1.63      
2267 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
2268 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
2269                          
2270 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
2271 kumpf          1.79              eCtx.ft->addEntry(
2272                                      &eCtx,
2273 dave.sudlik    1.99                  CMPIAcceptLanguage,
2274 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
2275 venkat.puvvada 1.108                 acceptLangs).getCString(),
2276 kumpf          1.79                  CMPI_chars);
2277 venkat.puvvada 1.108             if (remote)
2278                                  {
2279                                      CString info=pidc.getRemoteInfo().getCString();
2280                                      eCtx.ft->addEntry(
2281                                          &eCtx,
2282                                          "CMPIRRemoteInfo",
2283                                          (CMPIValue*)(const char*)info,
2284                                          CMPI_chars);
2285 marek          1.63              }
2286                          
2287                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
2288                          
2289 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
2290 venkat.puvvada 1.108     
2291 kumpf          1.92              {
2292                                      StatProviderTimeMeasurement providerTime(response);
2293 marek          1.63      
2294 kumpf          1.92                  rc = pr.miVector.methMI->ft->invokeMethod(
2295                                          pr.miVector.methMI,&eCtx,&eRes,&eRef,
2296                                          CHARS(mName),&eArgsIn,&eArgsOut);
2297                                  }
2298 marek          1.63      
2299 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
2300                          //      Do this before checking rc from provider to throw exception in case 
2301                          //      rc.msg is also localized.
2302                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
2303 venkat.puvvada 1.108             CMPIData cldata = 
2304                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
2305 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
2306                                  {
2307                                      response->operationContext.set(
2308                                          ContentLanguageListContainer(
2309 venkat.puvvada 1.108                     ContentLanguageList(
2310                                          LanguageParser::parseContentLanguageHeader(
2311                                          CMGetCharPtr(cldata.value.string)))));
2312 dave.sudlik    1.103                 handler.setContext(response->operationContext);
2313 dave.sudlik    1.99              }
2314                          
2315 marek          1.63              if (rc.rc!=CMPI_RC_OK)
2316 dave.sudlik    1.102             {
2317 venkat.puvvada 1.108                 CIMException cimException(
2318                                          (CIMStatusCode)rc.rc,
2319                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
2320                          
2321                                      if (eRes.resError)
2322                                      {
2323                                          for (CMPI_Error* currErr=eRes.resError; 
2324 dave.sudlik    1.102                         currErr!=NULL; 
2325                                              currErr=currErr->nextError)
2326 venkat.puvvada 1.108                     {
2327                                              cimException.addError(
2328                                                  ((CIMError*)currErr->hdl)->getInstance());
2329                                          }
2330                                      }
2331                                      throw cimException;
2332 dave.sudlik    1.102             }
2333                          
2334 a.dunfey       1.85      #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
2335 venkat.puvvada 1.118.2.2         // Even if external normalization is enabled we don't normalize the 
2336                                  // Embedded instances present in output args. Normalize them here.
2337 a.dunfey       1.85              {
2338                                      // There is no try catch here because if there is no external
2339                                      // normalization, then these containers were added by this method.
2340                                      const CachedClassDefinitionContainer * classCont =
2341                                          dynamic_cast<const CachedClassDefinitionContainer *>(
2342 venkat.puvvada 1.108                     &request->operationContext.get(
2343                                          CachedClassDefinitionContainer::NAME));
2344 kumpf          1.106                 PEGASUS_ASSERT(classCont != 0);
2345 a.dunfey       1.85                  const NormalizerContextContainer * contextCont =
2346                                          dynamic_cast<const NormalizerContextContainer*>(
2347 venkat.puvvada 1.108                     &request->operationContext.get(
2348                                          NormalizerContextContainer::NAME));
2349 kumpf          1.106                 PEGASUS_ASSERT(contextCont != 0);
2350                          
2351 a.dunfey       1.85                  CIMClass classDef(classCont->getClass());
2352                                      Uint32 methodIndex = classDef.findMethod(request->methodName);
2353                                      PEGASUS_ASSERT(methodIndex != PEG_NOT_FOUND);
2354                                      CIMMethod methodDef(classDef.getMethod(methodIndex));
2355 venkat.puvvada 1.108                 for (unsigned int i = 0, n = outArgs.size(); i < n; ++i)
2356 a.dunfey       1.85                  {
2357                                          CIMParamValue currentParam(outArgs[i]);
2358                                          CIMValue paramValue(currentParam.getValue());
2359                                          // If the parameter value is an EmbeddedObject type, we have
2360                                          // to check against the type of the parameter definition.
2361                                          // CMPI does not distinguish between EmbeddedObjects and
2362                                          // EmbeddedInstances, so if the parameter definition has a type
2363                                          // of EmbeddedInstance, the type of the output parameter must
2364                                          // be changed.
2365 venkat.puvvada 1.108                     if (paramValue.getType() == CIMTYPE_OBJECT)
2366 a.dunfey       1.85                      {
2367                                              CIMObject paramObject;
2368                                              paramValue.get(paramObject);
2369                                              CIMInstance paramInst(paramObject);
2370                                              resolveEmbeddedInstanceTypes(&handler, paramInst);
2371                                              String currentParamName(currentParam.getParameterName());
2372                                              Uint32 paramIndex = methodDef.findParameter(
2373                                                  CIMName(currentParamName));
2374 venkat.puvvada 1.108                         if (paramIndex == PEG_NOT_FOUND)
2375 a.dunfey       1.85                          {
2376                                                  MessageLoaderParms msg("ProviderManager.CMPI."
2377                                                      "CMPIProviderManager.PARAMETER_NOT_FOUND",
2378 dave.sudlik    1.117                                 "Parameter $0 not found in definition for "
2379                                                      "method $1.", currentParamName,
2380 a.dunfey       1.85                                  request->methodName.getString());
2381                                                  PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
2382 dave.sudlik    1.117                                 MessageLoader::getMessage(msg));
2383 a.dunfey       1.85                              handler.setStatus(CIM_ERR_FAILED,
2384 dave.sudlik    1.117                                 MessageLoader::getMessage(msg));
2385 a.dunfey       1.85                          }
2386                                              else
2387                                              {
2388                                                  CIMConstParameter paramDef(
2389                                                      methodDef.getParameter(paramIndex));
2390 venkat.puvvada 1.108                             if (paramDef.findQualifier(CIMName("EmbeddedInstance"))
2391 a.dunfey       1.85                                  != PEG_NOT_FOUND)
2392                                                  {
2393                                                      currentParam = CIMParamValue(currentParamName,
2394                                                          CIMValue(paramInst));
2395                                                  }
2396                                                  else
2397                                                  {
2398                                                      currentParam = CIMParamValue(currentParamName,
2399                                                          CIMValue(paramObject));
2400                                                  }
2401                          
2402                                                  handler.deliverParamValue(currentParam);
2403                                              }
2404                                          }
2405                                          else
2406                                          {
2407                                              handler.deliverParamValue(currentParam);
2408                                          }
2409                                      }
2410                                  }
2411                          #else
2412 a.dunfey       1.85              for (int i=0,s=outArgs.size(); i<s; i++)
2413                                  {
2414                                      handler.deliverParamValue(outArgs[i]);
2415                                  }
2416                          #endif // PEGASUS_EMBEDDED_INSTANCE_SUPPORT
2417 venkat.puvvada 1.108             handler.complete();
2418 marek          1.63          }
2419                              HandlerCatch(handler);
2420                          
2421                              PEG_METHOD_EXIT();
2422                          
2423                              return(response);
2424                          }
2425                          
2426 venkat.puvvada 1.108     int LocateIndicationProviderNames(
2427                              const CIMInstance& pInstance,
2428                              const CIMInstance& pmInstance,
2429                              String& providerName, 
2430                              String& location)
2431 marek          1.63      {
2432 ms.aruran      1.115        PEG_METHOD_ENTER(
2433                                  TRC_PROVIDERMANAGER,
2434                                  "CMPIProviderManager:LocateIndicationProviderNames()");
2435 marek          1.63          Uint32 pos = pInstance.findProperty(CIMName ("Name"));
2436                              pInstance.getProperty(pos).getValue().get(providerName);
2437                          
2438                              pos = pmInstance.findProperty(CIMName ("Location"));
2439                              pmInstance.getProperty(pos).getValue().get(location);
2440 ms.aruran      1.115         PEG_METHOD_EXIT();
2441 marek          1.63          return 0;
2442                          }
2443                          
2444 venkat.puvvada 1.108     Message * CMPIProviderManager::handleCreateSubscriptionRequest(
2445                              const Message * message)
2446 marek          1.63      {
2447 ms.aruran      1.115         PEG_METHOD_ENTER(
2448                                  TRC_PROVIDERMANAGER,
2449                                  "CMPIProviderManager::handleCreateSubscriptionRequest()");
2450 marek          1.63      
2451                              HandlerIntroInd(CreateSubscription,message,request,response,
2452 venkat.puvvada 1.108             handler);
2453                              try
2454                              {
2455 marek          1.63              CIMInstance req_provider, req_providerModule;
2456 venkat.puvvada 1.108             ProviderIdContainer pidc = 
2457                                      (ProviderIdContainer)request->operationContext.get(
2458                                      ProviderIdContainer::NAME);
2459 marek          1.63              req_provider = pidc.getProvider();
2460                                  req_providerModule = pidc.getModule();
2461                          
2462                                  String providerName,providerLocation;
2463                                  LocateIndicationProviderNames(req_provider, req_providerModule,
2464 venkat.puvvada 1.108                 providerName,providerLocation);
2465 marek          1.63      
2466                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
2467 venkat.puvvada 1.108                 "CMPIProviderManager::handleCreateSubscriptionRequest - Host name:"
2468                                      " $0  Name space: $1  Provider name(s): $2",
2469 marek          1.63                  System::getHostName(),
2470                                      request->nameSpace.getString(),
2471                                      providerName);
2472                          
2473                                  Boolean remote=false;
2474                                  CMPIProvider::OpProviderHolder ph;
2475                          
2476 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
2477                                  {
2478                                      ph = providerManager.getRemoteProvider(
2479                                          providerLocation, providerName);
2480 marek          1.63              }
2481 venkat.puvvada 1.108             else
2482                                  {
2483                                      // get cached or load new provider module
2484                                      ph = providerManager.getProvider(
2485                                          providerLocation, providerName);
2486 marek          1.63              }
2487                          
2488                                  indProvRecord *prec=NULL;
2489 marek          1.95              {
2490                                      WriteLock writeLock(rwSemProvTab);
2491 venkat.puvvada 1.108                 provTab.lookup(ph.GetProvider().getName(),prec);
2492                                      if (prec) prec->count++;
2493                                      else
2494                                      {
2495                                          prec=new indProvRecord();
2496 venkat.puvvada 1.110     #ifdef PEGASUS_ENABLE_REMOTE_CMPI
2497                                          if (remote)
2498                                          {
2499                                              prec->remoteInfo = pidc.getRemoteInfo();
2500                                          }
2501                          #endif
2502 venkat.puvvada 1.108                     provTab.insert(ph.GetProvider().getName(),prec);
2503                                      }
2504 marek          1.95              }
2505 marek          1.63      
2506                                  //
2507                                  //  Save the provider instance from the request
2508                                  //
2509                                  ph.GetProvider ().setProviderInstance (req_provider);
2510                          
2511                                  const CIMObjectPath &sPath=request->subscriptionInstance.getPath();
2512                          
2513 marek          1.95              indSelectRecord *srec=NULL;
2514                          
2515                                  {
2516                                      WriteLock writeLock(rwSemSelxTab);
2517                                      selxTab.lookup(sPath,srec);
2518                                      if (srec) srec->count++;
2519 venkat.puvvada 1.108                 else
2520                                      {
2521                                          srec=new indSelectRecord();
2522                                          selxTab.insert(sPath,srec);
2523 marek          1.95                  }
2524                                  }
2525 marek          1.63      
2526                                  // convert arguments
2527                                  OperationContext context;
2528                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
2529 venkat.puvvada 1.108             context.insert(
2530                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
2531                                  context.insert(
2532                                      request->operationContext.get(ContentLanguageListContainer::NAME));
2533                                  context.insert(
2534                                      request->operationContext.get(SubscriptionInstanceContainer::NAME));
2535                                  context.insert(
2536                                      request->operationContext.get(
2537                                      SubscriptionFilterConditionContainer::NAME));
2538 marek          1.63      
2539 venkat.puvvada 1.108             CIMObjectPath subscriptionName = 
2540                                      request->subscriptionInstance.getPath();
2541 marek          1.63      
2542                                  CMPIProvider & pr=ph.GetProvider();
2543                          
2544                                  CMPIStatus rc={CMPI_RC_OK,NULL};
2545                                  CMPI_ContextOnStack eCtx(context);
2546 venkat.puvvada 1.108             SubscriptionFilterConditionContainer sub_cntr =  
2547                                      request->operationContext.get(
2548                                      SubscriptionFilterConditionContainer::NAME);
2549                          
2550                                  CIMOMHandleQueryContext *_context= 
2551                                      new CIMOMHandleQueryContext(
2552                                      CIMNamespaceName(
2553                                      request->nameSpace.getString()),
2554                                      *pr._cimom_handle);
2555                          
2556                                  CMPI_SelectExp *eSelx=new CMPI_SelectExp(
2557                                      context,
2558                                      _context,
2559                                      request->query,
2560                                      sub_cntr.getQueryLanguage());
2561 marek          1.63      
2562                                  srec->eSelx=eSelx;
2563 venkat.puvvada 1.108             srec->qContext=_context;
2564 marek          1.63      
2565                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
2566                          
2567 ms.aruran      1.115             PEG_TRACE_STRING(
2568                                      TRC_PROVIDERMANAGER,
2569                                      Tracer::LEVEL4,
2570 marek          1.63                  "Calling provider.createSubscriptionRequest: " + pr.getName());
2571                          
2572 venkat.puvvada 1.108             for (Uint32 i = 0, n = request->classNames.size(); i < n; i++)
2573                                  {
2574 marek          1.63                  CIMObjectPath className(
2575                                          System::getHostName(),
2576                                          request->nameSpace,
2577                                          request->classNames[i]);
2578                                      eSelx->classNames.append(className);
2579                                  }
2580                                  CMPI_ObjectPathOnStack eRef(eSelx->classNames[0]);
2581                          
2582                                  CIMPropertyList propertyList = request->propertyList;
2583 venkat.puvvada 1.108             if (!propertyList.isNull())
2584                                  {
2585                                      Array<CIMName> p=propertyList.getPropertyNameArray();
2586                                      int pCount=p.size();
2587                                      eSelx->props = new const char*[1+pCount];
2588                                      for (int i=0; i<pCount; i++)
2589                                      {
2590                                          eSelx->props[i]=strdup(p[i].getString().getCString());
2591                                      }
2592                                      eSelx->props[pCount]=NULL;
2593 marek          1.63              }
2594                          
2595                                  Uint16 repeatNotificationPolicy = request->repeatNotificationPolicy;
2596                          
2597                                  const IdentityContainer container =
2598 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
2599                                  eCtx.ft->addEntry(&eCtx,
2600                                      CMPIPrincipal,
2601                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
2602                                      CMPI_chars);
2603                          
2604 marek          1.63              eCtx.ft->addEntry(&eCtx,
2605 venkat.puvvada 1.108                 CMPIInitNameSpace,
2606                                      (CMPIValue*)(const char*)request->
2607                                      nameSpace.getString().getCString(),
2608                                      CMPI_chars);
2609 marek          1.63      
2610 konrad.r       1.65              const AcceptLanguageListContainer accept_language=            
2611 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME);
2612                          
2613 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
2614 kumpf          1.79              eCtx.ft->addEntry(
2615                                      &eCtx,
2616 dave.sudlik    1.99                  CMPIAcceptLanguage,
2617 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
2618 venkat.puvvada 1.108                 acceptLangs).getCString(),
2619 kumpf          1.79                  CMPI_chars);
2620 dave.sudlik    1.100             CString info;
2621 venkat.puvvada 1.108             if (remote)
2622                                  {
2623                                      info=pidc.getRemoteInfo().getCString();
2624                                      eCtx.ft->addEntry(
2625                                          &eCtx,
2626                                          "CMPIRRemoteInfo",
2627                                          (CMPIValue*)(const char*)info,
2628                                          CMPI_chars);
2629 marek          1.63              }
2630                          
2631                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
2632                          
2633 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
2634 venkat.puvvada 1.108     
2635 kumpf          1.92              {
2636                                      StatProviderTimeMeasurement providerTime(response);
2637                          
2638 venkat.puvvada 1.108                 if (pr.miVector.indMI->ft->ftVersion >= 100)
2639 kumpf          1.92                  {
2640                                          rc = pr.miVector.indMI->ft->activateFilter(
2641                                              pr.miVector.indMI,&eCtx,eSelx,
2642                                              CHARS(eSelx->classNames[0].getClassName().getString().
2643 dave.sudlik    1.96                          getCString()),&eRef,false);
2644 kumpf          1.92                  }
2645                                      else
2646                                      {
2647 venkat.puvvada 1.108                     // Older version of (pre 1.00) also pass in a CMPIResult
2648 marek          1.63      
2649 kumpf          1.92                      rc = ((CMPIStatus (*)(CMPIIndicationMI*, CMPIContext*,
2650 venkat.puvvada 1.108                         CMPIResult*, CMPISelectExp*,
2651                                              const char *, CMPIObjectPath*, CMPIBoolean))
2652 dave.sudlik    1.96                          pr.miVector.indMI->ft->activateFilter)
2653 venkat.puvvada 1.108                     (pr.miVector.indMI,&eCtx,NULL,eSelx,
2654                                              CHARS(eSelx->classNames[0].getClassName().getString().
2655 dave.sudlik    1.96                          getCString()),&eRef,false);
2656 kumpf          1.92                  }
2657                                  }
2658 marek          1.63      
2659 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
2660                          //      Do this before checking rc from provider to throw exception in case 
2661                          //      rc.msg is also localized.
2662                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
2663 venkat.puvvada 1.108             CMPIData cldata = 
2664                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
2665 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
2666                                  {
2667                                      response->operationContext.set(
2668                                          ContentLanguageListContainer(
2669 venkat.puvvada 1.108                     ContentLanguageList(
2670                                          LanguageParser::parseContentLanguageHeader(
2671                                          CMGetCharPtr(cldata.value.string)))));
2672 dave.sudlik    1.99              }
2673                          
2674 marek          1.63              if (rc.rc!=CMPI_RC_OK)
2675                                  {
2676 marek          1.95                  //  Removed the select expression from the cache
2677                                      WriteLock lock(rwSemSelxTab);
2678                                      if (--srec->count<=0)
2679                                      {
2680                                          selxTab.remove(sPath);
2681                                          delete _context;
2682                                          delete eSelx;
2683                                          delete srec;
2684                                      }
2685 venkat.puvvada 1.108                 throw CIMException((CIMStatusCode)rc.rc,
2686                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
2687 marek          1.63              }
2688                                  else
2689                                  {
2690                                      //
2691                                      //  Increment count of current subscriptions for this provider
2692                                      //
2693                                      if (ph.GetProvider ().testIfZeroAndIncrementSubscriptions ())
2694                                      {
2695                                          //
2696                                          //  If there were no current subscriptions before the increment,
2697                                          //  the first subscription has been created
2698                                          //  Call the provider's enableIndications method
2699                                          //
2700                                          if (_subscriptionInitComplete)
2701                                          {
2702                                              _callEnableIndications (req_provider, _indicationCallback,
2703 dave.sudlik    1.100                             ph, (const char*)info);
2704 marek          1.63                      }
2705                                      }
2706                                  }
2707                              }
2708                              HandlerCatch(handler);
2709                          
2710                              PEG_METHOD_EXIT();
2711                          
2712                              return(response);
2713                          }
2714                          
2715 venkat.puvvada 1.108     Message * CMPIProviderManager::handleDeleteSubscriptionRequest(
2716                              const Message * message)
2717 marek          1.63      {
2718 ms.aruran      1.115         PEG_METHOD_ENTER(
2719                                  TRC_PROVIDERMANAGER,
2720                                  "CMPIProviderManager::handleDeleteSubscriptionRequest()");
2721 marek          1.63      
2722                              HandlerIntroInd(DeleteSubscription,message,request,response,
2723 venkat.puvvada 1.108             handler);
2724                              try
2725                              {
2726 marek          1.63              String providerName,providerLocation;
2727                          
2728                                  CIMInstance req_provider, req_providerModule;
2729 venkat.puvvada 1.108             ProviderIdContainer pidc = 
2730                                      (ProviderIdContainer)request->operationContext.get(
2731                                      ProviderIdContainer::NAME);
2732 marek          1.63              req_provider = pidc.getProvider();
2733                                  req_providerModule = pidc.getModule();
2734                          
2735                                  LocateIndicationProviderNames(req_provider, req_providerModule,
2736 venkat.puvvada 1.108                 providerName,providerLocation);
2737 marek          1.63      
2738                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
2739 venkat.puvvada 1.108                 "CMPIProviderManager::handleDeleteSubscriptionRequest - Host name:"
2740                                      " $0  Name space: $1  Provider name(s): $2",
2741 marek          1.63                  System::getHostName(),
2742                                      request->nameSpace.getString(),
2743                                      providerName);
2744                          
2745                                  Boolean remote=false;
2746                                  CMPIProvider::OpProviderHolder ph;
2747                          
2748 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
2749                                  {
2750                                      ph = providerManager.getRemoteProvider(
2751                                          providerLocation, providerName);
2752 marek          1.63              }
2753 venkat.puvvada 1.108             else
2754                                  {
2755                                      // get cached or load new provider module
2756                                      ph = providerManager.getProvider(
2757                                          providerLocation, providerName);
2758 marek          1.63              }
2759                          
2760                          
2761                                  indProvRecord *prec=NULL;
2762 marek          1.95              {
2763                                      WriteLock writeLock(rwSemProvTab);
2764 venkat.puvvada 1.108                 provTab.lookup(ph.GetProvider().getName(),prec);
2765                                      if (--prec->count<=0)
2766                                      {
2767                                          if (prec->handler)
2768                                              delete prec->handler;
2769                                          delete prec;
2770                                          provTab.remove(ph.GetProvider().getName());
2771                                          prec=NULL;
2772                                      }
2773 marek          1.95              }
2774 marek          1.63      
2775                                  indSelectRecord *srec=NULL;
2776                                  const CIMObjectPath &sPath=request->subscriptionInstance.getPath();
2777 r.kieninger    1.81      
2778 marek          1.95              WriteLock writeLock(rwSemSelxTab);
2779 venkat.puvvada 1.108             if (!selxTab.lookup(sPath,srec))
2780                                  {
2781 dave.sudlik    1.117                 MessageLoaderParms parms(
2782                                          "ProviderManager.CMPI.CMPIProviderManager."
2783                                          "FAILED_LOCATE_SUBSCRIPTION_FILTER",
2784                                          "Failed to locate the subscription filter.");
2785 venkat.puvvada 1.108                 // failed to get select expression from hash table
2786 dave.sudlik    1.117                 throw CIMException(CIM_ERR_FAILED, parms);
2787 venkat.puvvada 1.108             };
2788 marek          1.63      
2789                                  CMPI_SelectExp *eSelx=srec->eSelx;
2790 venkat.puvvada 1.108             CIMOMHandleQueryContext *qContext=srec->qContext;
2791 marek          1.63      
2792                                  CMPI_ObjectPathOnStack eRef(eSelx->classNames[0]);
2793 marek          1.95              if (--srec->count<=0)
2794                                  {
2795 venkat.puvvada 1.108                 selxTab.remove(sPath);
2796 marek          1.95              }
2797 marek          1.63      
2798                                  // convert arguments
2799                                  OperationContext context;
2800                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
2801 venkat.puvvada 1.108             context.insert(
2802                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
2803                                  context.insert(
2804                                      request->operationContext.get(ContentLanguageListContainer::NAME));
2805                                  context.insert(
2806                                      request->operationContext.get(SubscriptionInstanceContainer::NAME));
2807 marek          1.63      
2808 venkat.puvvada 1.108             CIMObjectPath subscriptionName = 
2809                                      request->subscriptionInstance.getPath();
2810 marek          1.63      
2811                                  CMPIProvider & pr=ph.GetProvider();
2812                          
2813                                  CMPIStatus rc={CMPI_RC_OK,NULL};
2814                                  CMPI_ContextOnStack eCtx(context);
2815                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
2816                          
2817 ms.aruran      1.115             PEG_TRACE_STRING(
2818                                      TRC_PROVIDERMANAGER,
2819                                      Tracer::LEVEL4,
2820 marek          1.63                  "Calling provider.deleteSubscriptionRequest: " + pr.getName());
2821                          
2822                                  const IdentityContainer container =
2823 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
2824 marek          1.63              eCtx.ft->addEntry(&eCtx,
2825 venkat.puvvada 1.108                 CMPIPrincipal,
2826                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
2827                                      CMPI_chars);
2828                          
2829                                  eCtx.ft->addEntry(
2830                                      &eCtx,
2831                                      CMPIInitNameSpace,
2832                                      (CMPIValue*)(const char*)request->
2833                                      nameSpace.getString().getCString(),
2834                                      CMPI_chars);
2835 konrad.r       1.65      
2836                                  const AcceptLanguageListContainer accept_language=            
2837 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME);
2838 kumpf          1.80              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
2839 kumpf          1.79              eCtx.ft->addEntry(
2840                                      &eCtx,
2841 dave.sudlik    1.99                  CMPIAcceptLanguage,
2842 kumpf          1.79                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
2843 venkat.puvvada 1.108                 acceptLangs).getCString(),
2844 kumpf          1.79                  CMPI_chars);
2845 dave.sudlik    1.100             CString info;
2846 venkat.puvvada 1.108             if (remote)
2847                                  {
2848                                      info=pidc.getRemoteInfo().getCString();
2849                                      eCtx.ft->addEntry(
2850                                          &eCtx,
2851                                          "CMPIRRemoteInfo",
2852                                          (CMPIValue*)(const char*)info,
2853                                          CMPI_chars);
2854 marek          1.63              }
2855                          
2856                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
2857                          
2858 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
2859 venkat.puvvada 1.108     
2860 kumpf          1.92              {
2861                                      StatProviderTimeMeasurement providerTime(response);
2862                          
2863 venkat.puvvada 1.108                 if (pr.miVector.indMI->ft->ftVersion >= 100)
2864 kumpf          1.92                  {
2865                                          rc = pr.miVector.indMI->ft->deActivateFilter(
2866                                              pr.miVector.indMI,&eCtx,eSelx,
2867                                              CHARS(eSelx->classNames[0].getClassName().getString().
2868 dave.sudlik    1.96                          getCString()),&eRef,prec==NULL);
2869 kumpf          1.92                  }
2870                                      else
2871                                      {
2872                                          // Older version of (pre 1.00) also pass in a CMPIResult
2873 marek          1.63      
2874 kumpf          1.92                      rc = ((CMPIStatus (*)(CMPIIndicationMI*, CMPIContext*,
2875                                              CMPIResult*, CMPISelectExp*,
2876 venkat.puvvada 1.108                         const char *, CMPIObjectPath*, CMPIBoolean))
2877 dave.sudlik    1.96                          pr.miVector.indMI->ft->deActivateFilter)
2878 venkat.puvvada 1.108                     (pr.miVector.indMI,&eCtx,NULL,eSelx,
2879                                              CHARS(eSelx->classNames[0].getClassName().getString().
2880 dave.sudlik    1.96                          getCString()),&eRef,prec==NULL);
2881 kumpf          1.92                  }
2882                                  }
2883 marek          1.63      
2884 marek          1.95              if (srec->count<=0)
2885                                  {
2886 venkat.puvvada 1.108                 delete qContext;
2887                                      delete eSelx;
2888                                      delete srec;
2889 marek          1.95              }
2890 marek          1.63      
2891 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
2892                          //      Do this before checking rc from provider to throw exception in case 
2893                          //      rc.msg is also localized.
2894                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
2895 venkat.puvvada 1.108             CMPIData cldata = 
2896                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
2897 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
2898                                  {
2899                                      response->operationContext.set(
2900                                          ContentLanguageListContainer(
2901 venkat.puvvada 1.108                     ContentLanguageList(
2902                                          LanguageParser::parseContentLanguageHeader(
2903                                          CMGetCharPtr(cldata.value.string)))));
2904 dave.sudlik    1.99              }
2905                          
2906 marek          1.63              if (rc.rc!=CMPI_RC_OK)
2907                                  {
2908 venkat.puvvada 1.108                 throw CIMException((CIMStatusCode)rc.rc,
2909                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
2910 marek          1.63              }
2911                                  else
2912                                  {
2913                                      //
2914                                      //  Decrement count of current subscriptions for this provider
2915                                      //
2916                                      if (ph.GetProvider ().decrementSubscriptionsAndTestIfZero ())
2917                                      {
2918                                          //
2919                                          //  If there are no current subscriptions after the decrement,
2920                                          //  the last subscription has been deleted
2921                                          //  Call the provider's disableIndications method
2922                                          //
2923                                          if (_subscriptionInitComplete)
2924                                          {
2925 dave.sudlik    1.100                         _callDisableIndications (ph, (const char*)info);
2926 marek          1.63                      }
2927                                      }
2928                                  }
2929                              }
2930                              HandlerCatch(handler);
2931                          
2932                              PEG_METHOD_EXIT();
2933                          
2934                              return(response);
2935                          }
2936                          
2937 venkat.puvvada 1.108     Message * CMPIProviderManager::handleDisableModuleRequest(
2938                              const Message * message)
2939 marek          1.63      {
2940 ms.aruran      1.115         PEG_METHOD_ENTER(
2941                                  TRC_PROVIDERMANAGER,
2942                                  "CMPIProviderManager::handleDisableModuleRequest()");
2943 marek          1.63      
2944                              CIMDisableModuleRequestMessage * request =
2945 venkat.puvvada 1.108             dynamic_cast<CIMDisableModuleRequestMessage *>(
2946                                  const_cast<Message *>(message));
2947 marek          1.63      
2948                              PEGASUS_ASSERT(request != 0);
2949                          
2950                              // get provider module name
2951                              Boolean disableProviderOnly = request->disableProviderOnly;
2952                          
2953                              Array<Uint16> operationalStatus;
2954                              // Assume success.
2955                              operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_STOPPED);
2956                          
2957                              //
2958                              // Unload providers
2959                              //
2960                              Array<CIMInstance> _pInstances = request->providers;
2961                              Array <Boolean> _indicationProviders = request->indicationProviders;
2962 venkat.puvvada 1.108         /* The CIMInstances on request->providers array is completly _different_ 
2963                                 than the request->providerModule CIMInstance. Hence  */
2964 marek          1.63      
2965 konrad.r       1.69          String physicalName=(request->providerModule.getProperty(
2966 venkat.puvvada 1.108             request->
2967                                  providerModule.findProperty("Location")).getValue().toString());
2968 marek          1.63      
2969 venkat.puvvada 1.108         for (Uint32 i = 0, n = _pInstances.size(); i < n; i++)
2970 marek          1.63          {
2971                                  String providerName;
2972                                  _pInstances [i].getProperty (_pInstances [i].findProperty
2973                                      (CIMName ("Name"))).getValue ().get (providerName);
2974                          
2975 venkat.puvvada 1.108             Uint32 pos = _pInstances[i].findProperty("Name");
2976 marek          1.63      
2977                                  //
2978                                  //  Reset the indication provider's count of current
2979                                  //  subscriptions since it has been disabled
2980                                  //
2981                                  if (_indicationProviders [i])
2982                                  {
2983                                      if (physicalName.size () > 0)
2984                                      {
2985 venkat.puvvada 1.108                     try
2986                                          {
2987                                              CMPIProvider::OpProviderHolder ph = 
2988                                                  providerManager.getProvider(
2989                                                  physicalName, 
2990                                                  providerName);
2991                                              ph.GetProvider ().resetSubscriptions ();
2992                                          }
2993                                          catch (const Exception &e)
2994                                          {
2995                                              PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
2996                                                  e.getMessage());
2997                                          }
2998 marek          1.63                  }
2999                                  }
3000 venkat.puvvada 1.108             providerManager.unloadProvider(
3001                                      physicalName, 
3002                                      _pInstances[i].getProperty(
3003                                      _pInstances[i].findProperty("Name")
3004                                      ).getValue ().toString ());
3005 marek          1.63          }
3006                          
3007                              CIMDisableModuleResponseMessage * response =
3008                                  new CIMDisableModuleResponseMessage(
3009                                  request->messageId,
3010                                  CIMException(),
3011                                  request->queueIds.copyAndPop(),
3012                                  operationalStatus);
3013                          
3014                              PEGASUS_ASSERT(response != 0);
3015                          
3016                              //
3017                              //  Set HTTP method in response from request
3018                              //
3019                              response->setHttpMethod (request->getHttpMethod ());
3020                          
3021                              PEG_METHOD_EXIT();
3022                          
3023                              return(response);
3024                          }
3025                          
3026 venkat.puvvada 1.108     Message * CMPIProviderManager::handleEnableModuleRequest(
3027                              const Message * message)
3028 marek          1.63      {
3029 ms.aruran      1.115         PEG_METHOD_ENTER(
3030                                  TRC_PROVIDERMANAGER,
3031                                  "CMPIProviderManager::handleEnableModuleRequest()");
3032 marek          1.63      
3033                              CIMEnableModuleRequestMessage * request =
3034 venkat.puvvada 1.108             dynamic_cast<CIMEnableModuleRequestMessage *>(
3035                                  const_cast<Message *>(message));
3036 marek          1.63      
3037                              PEGASUS_ASSERT(request != 0);
3038                          
3039                              Array<Uint16> operationalStatus;
3040                              operationalStatus.append(CIM_MSE_OPSTATUS_VALUE_OK);
3041                          
3042                              CIMEnableModuleResponseMessage * response =
3043                                  new CIMEnableModuleResponseMessage(
3044                                  request->messageId,
3045                                  CIMException(),
3046                                  request->queueIds.copyAndPop(),
3047                                  operationalStatus);
3048                          
3049                              PEGASUS_ASSERT(response != 0);
3050                          
3051                              //  Set HTTP method in response from request
3052                              response->setHttpMethod (request->getHttpMethod ());
3053                          
3054                              PEG_METHOD_EXIT();
3055                          
3056                              return(response);
3057 marek          1.63      }
3058                          
3059 venkat.puvvada 1.108     Message * CMPIProviderManager::handleStopAllProvidersRequest(
3060                              const Message * message)
3061 marek          1.63      {
3062 ms.aruran      1.115         PEG_METHOD_ENTER(
3063                                  TRC_PROVIDERMANAGER,
3064                                  "CMPIProviderManager::handleStopAllProvidersRequest()");
3065 marek          1.63      
3066                              CIMStopAllProvidersRequestMessage * request =
3067 venkat.puvvada 1.108             dynamic_cast<CIMStopAllProvidersRequestMessage *>(
3068                                  const_cast<Message *>(message));
3069 marek          1.63      
3070                              PEGASUS_ASSERT(request != 0);
3071                          
3072                              CIMStopAllProvidersResponseMessage * response =
3073                                  new CIMStopAllProvidersResponseMessage(
3074                                  request->messageId,
3075                                  CIMException(),
3076                                  request->queueIds.copyAndPop());
3077                          
3078                              PEGASUS_ASSERT(response != 0);
3079                          
3080                              //  Set HTTP method in response from request
3081                              response->setHttpMethod (request->getHttpMethod ());
3082                          
3083                              // tell the provider manager to shutdown all the providers
3084                              providerManager.shutdownAllProviders();
3085                          
3086                              PEG_METHOD_EXIT();
3087                          
3088                              return(response);
3089                          }
3090 marek          1.63      
3091 s.kodali       1.113     // Note: The PG_Provider AutoStart property is not yet supported
3092                          #if 0
3093                              Message * CMPIProviderManager::handleInitializeProviderRequest(
3094                                  const Message * message)
3095                              {
3096                                  PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, 
3097                                      "CMPIProviderManager::handleInitializeProviderRequest");
3098 marek          1.63      
3099 s.kodali       1.113             HandlerIntroInit(InitializeProvider,message,request,response,handler);
3100 marek          1.63      
3101 s.kodali       1.113             try
3102                                  {
3103                                      // resolve provider name
3104                                      ProviderName name = _resolveProviderName(
3105                                           request->operationContext.get(ProviderIdContainer::NAME));
3106 marek          1.63      
3107 s.kodali       1.113                 // get cached or load new provider module
3108                                      CMPIProvider::OpProviderHolder ph =
3109                                          providerManager.getProvider(
3110                                              name.getPhysicalName(), name.getLogicalName());
3111 marek          1.63      
3112 s.kodali       1.113             }
3113                                  HandlerCatch(handler);
3114 marek          1.63      
3115 s.kodali       1.113             PEG_METHOD_EXIT();
3116 marek          1.63      
3117 s.kodali       1.113             return(response);
3118                              }
3119                          #endif
3120 marek          1.63      
3121 venkat.puvvada 1.108     Message * CMPIProviderManager::handleSubscriptionInitCompleteRequest(
3122                              const Message * message)
3123 marek          1.63      {
3124 ms.aruran      1.115         PEG_METHOD_ENTER(
3125                                  TRC_PROVIDERMANAGER,
3126                                  "CMPIProviderManager::handleSubscriptionInitCompleteRequest()");
3127 marek          1.63      
3128                              CIMSubscriptionInitCompleteRequestMessage * request =
3129                                  dynamic_cast <CIMSubscriptionInitCompleteRequestMessage *>
3130 venkat.puvvada 1.108             (const_cast <Message *> (message));
3131 marek          1.63      
3132                              PEGASUS_ASSERT (request != 0);
3133                          
3134                              CIMSubscriptionInitCompleteResponseMessage * response =
3135                                  dynamic_cast <CIMSubscriptionInitCompleteResponseMessage *>
3136 venkat.puvvada 1.108             (request->buildResponse ());
3137 marek          1.63      
3138                              PEGASUS_ASSERT (response != 0);
3139                          
3140                              //
3141                              //  Set indicator
3142                              //
3143                              _subscriptionInitComplete = true;
3144                          
3145                              //
3146                              //  For each provider that has at least one subscription, call
3147                              //  provider's enableIndications method
3148                              //
3149                              Array <CMPIProvider *> enableProviders;
3150                              enableProviders = providerManager.getIndicationProvidersToEnable ();
3151                          
3152                              Uint32 numProviders = enableProviders.size ();
3153                              for (Uint32 i = 0; i < numProviders; i++)
3154                              {
3155                                  try
3156                                  {
3157                                      CIMInstance provider;
3158 marek          1.63                  provider = enableProviders [i]->getProviderInstance ();
3159                          
3160 venkat.puvvada 1.110                 CString info;
3161                          #ifdef PEGASUS_ENABLE_REMOTE_CMPI
3162                                      indProvRecord *provRec = 0;
3163                                      if (provTab.lookup (enableProviders [i]->getName(), provRec))
3164                                      {
3165                                          if (provRec->remoteInfo != String::EMPTY)
3166                                          {
3167                                              info = provRec->remoteInfo.getCString();
3168                                          }
3169                                      }
3170                          #endif
3171 marek          1.63                  //
3172                                      //  Get cached or load new provider module
3173                                      //
3174 venkat.puvvada 1.110                 CMPIProvider::OpProviderHolder ph;
3175                                      if ((const char*)info)
3176                                      {
3177                                          ph = providerManager.getRemoteProvider
3178                                              (enableProviders [i]->getModule ()->getFileName (),
3179                                              enableProviders [i]->getName ());
3180                                      }
3181                                      else
3182                                      {
3183                                          ph = providerManager.getProvider
3184                                              (enableProviders [i]->getModule ()->getFileName (),
3185                                              enableProviders [i]->getName ());
3186                                      }
3187 venkat.puvvada 1.108                 _callEnableIndications(
3188                                          provider, 
3189                                          _indicationCallback, 
3190                                          ph, 
3191                                          (const char*)info);
3192 marek          1.63              }
3193 konrad.r       1.64              catch (const CIMException & e)
3194 marek          1.63              {
3195 ms.aruran      1.115                 PEG_TRACE_STRING(
3196                                          TRC_PROVIDERMANAGER,
3197                                          Tracer::LEVEL2,
3198 marek          1.63                      "CIMException: " + e.getMessage ());
3199                                  }
3200 konrad.r       1.64              catch (const Exception & e)
3201 marek          1.63              {
3202 ms.aruran      1.115                 PEG_TRACE_STRING(
3203                                          TRC_PROVIDERMANAGER,
3204                                          Tracer::LEVEL2,
3205 marek          1.63                      "Exception: " + e.getMessage ());
3206                                  }
3207 venkat.puvvada 1.108             catch (...)
3208 marek          1.63              {
3209 ms.aruran      1.115                 PEG_TRACE_CSTRING(
3210                                          TRC_PROVIDERMANAGER,
3211                                          Tracer::LEVEL2,
3212 marek          1.63                      "Unknown error in handleSubscriptionInitCompleteRequest");
3213                                  }
3214                              }
3215                          
3216                              PEG_METHOD_EXIT ();
3217 venkat.puvvada 1.108         return(response);
3218 marek          1.63      }
3219                          
3220 venkat.puvvada 1.108     Message * CMPIProviderManager::handleGetPropertyRequest(
3221                              const Message * message)
3222 dave.sudlik    1.98      {
3223 ms.aruran      1.115         PEG_METHOD_ENTER(
3224                                  TRC_PROVIDERMANAGER,
3225                                  "CMPIProviderManager::handleGetPropertyRequest()");
3226 dave.sudlik    1.98      
3227                              HandlerIntro(GetProperty,message,request,response,handler);
3228                          
3229                              // We're only going to be interested in the specific property from this
3230                              // instance.
3231                              Array<CIMName> localPropertyListArray;
3232                              localPropertyListArray.append(request->propertyName);
3233                              CIMPropertyList localPropertyList(localPropertyListArray);
3234                          
3235                              // NOTE: GetProperty will use the CIMInstanceProvider interface, so we
3236                              // must manually define a request, response, and handler (emulate 
3237                              // HandlerIntro macro)
3238                              CIMGetInstanceRequestMessage * GI_request = 
3239                                  new CIMGetInstanceRequestMessage(
3240 venkat.puvvada 1.108             request->messageId, 
3241                                  request->nameSpace,
3242                                  request->instanceName,
3243                                  false,
3244                                  false,
3245                                  false,
3246                                  localPropertyList,
3247                                  request->queueIds,
3248                                  request->authType,
3249                                  request->userName
3250                                  );
3251 dave.sudlik    1.98      
3252                              PEGASUS_ASSERT(GI_request != 0); 
3253                          
3254                              CIMGetInstanceResponseMessage * GI_response = 
3255 venkat.puvvada 1.108             dynamic_cast<CIMGetInstanceResponseMessage*>
3256                                  (GI_request->buildResponse());
3257 dave.sudlik    1.98      
3258                              PEGASUS_ASSERT(GI_response != 0); 
3259                          
3260 venkat.puvvada 1.108         GetInstanceResponseHandler GI_handler(
3261                                  GI_request, 
3262                                  GI_response, 
3263                                  _responseChunkCallback);
3264 dave.sudlik    1.98      
3265 venkat.puvvada 1.108         try
3266 dave.sudlik    1.98          {
3267                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
3268 venkat.puvvada 1.108                 "CmpiProviderManager::handleGetPropertyRequest - Host name: $0  "
3269                                      "Name space: $1  Class name: $2  Property name: $3",
3270 dave.sudlik    1.98                  System::getHostName(),
3271                                      request->nameSpace.getString(),
3272                                      request->instanceName.getClassName().getString(),
3273                                      request->propertyName.getString());
3274                          
3275                                  // make target object path
3276                                  CIMObjectPath objectPath(
3277                                      System::getHostName(),
3278                                      request->nameSpace,
3279                                      request->instanceName.getClassName(),
3280                                      request->instanceName.getKeyBindings());
3281                          
3282                                  Boolean remote=false;
3283                                  CMPIProvider::OpProviderHolder ph;
3284                          
3285                                  // resolve provider name
3286 venkat.puvvada 1.108             ProviderIdContainer pidc = 
3287                                      request->operationContext.get(ProviderIdContainer::NAME);
3288 dave.sudlik    1.98              ProviderName name = _resolveProviderName(pidc);
3289                          
3290 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
3291                                  {
3292                                      ph = providerManager.getRemoteProvider(
3293                                          name.getLocation(), name.getLogicalName());
3294 dave.sudlik    1.98              }
3295 venkat.puvvada 1.108             else
3296                                  {
3297                                      // get cached or load new provider module
3298                                      ph = providerManager.getProvider(
3299                                          name.getPhysicalName(), name.getLogicalName());
3300 dave.sudlik    1.98              }
3301                          
3302                                  // convert arguments
3303                                  OperationContext context;
3304                          
3305                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
3306 venkat.puvvada 1.108             context.insert(
3307                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
3308                                  context.insert(
3309                                      request->operationContext.get(ContentLanguageListContainer::NAME));
3310 dave.sudlik    1.98              // forward request
3311                                  CMPIProvider & pr=ph.GetProvider();
3312                          
3313                          #ifdef PEGASUS_EMBEDDED_INSTANCE_SUPPORT
3314 venkat.puvvada 1.118.2.2         AutoPtr<NormalizerContext> tmpNormalizerContext(
3315                                      new CIMOMHandleContext(*pr._cimom_handle));
3316                                  request->operationContext.insert(
3317                                      NormalizerContextContainer(tmpNormalizerContext));
3318                          #endif
3319 dave.sudlik    1.98      
3320 ms.aruran      1.115             PEG_TRACE_STRING(
3321                                      TRC_PROVIDERMANAGER,
3322                                      Tracer::LEVEL4,
3323 dave.sudlik    1.98                  "Calling provider.getInstance via getProperty: " + pr.getName());
3324                          
3325                                  CMPIStatus rc={CMPI_RC_OK,NULL};
3326                                  CMPI_ContextOnStack eCtx(context);
3327                                  CMPI_ObjectPathOnStack eRef(objectPath);
3328                                  CMPI_ResultOnStack eRes(GI_handler,&pr.broker);
3329                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
3330                          
3331                                  // For the getInstance provider call, use the property list that we 
3332                                  // created containing the single property from the getProperty call.
3333                                  CMPIPropertyList props(localPropertyList);
3334                          
3335                                  CMPIFlags flgs=0;
3336 venkat.puvvada 1.108             // Leave includeQualifiers and includeClassOrigin as false for this 
3337                                  // call to getInstance
3338                                  eCtx.ft->addEntry(
3339                                      &eCtx,
3340                                      CMPIInvocationFlags,
3341                                      (CMPIValue*)&flgs,
3342                                      CMPI_uint32);
3343 dave.sudlik    1.98      
3344                                  const IdentityContainer container =
3345 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
3346 dave.sudlik    1.98              eCtx.ft->addEntry(&eCtx,
3347 venkat.puvvada 1.108                 CMPIPrincipal,
3348                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
3349                                      CMPI_chars);
3350 dave.sudlik    1.98      
3351                                  const AcceptLanguageListContainer accept_language=            
3352 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
3353 dave.sudlik    1.98              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
3354                          
3355                                  eCtx.ft->addEntry(
3356                                      &eCtx,
3357 dave.sudlik    1.99                  CMPIAcceptLanguage,
3358 dave.sudlik    1.98                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
3359 venkat.puvvada 1.108                 acceptLangs).getCString(),
3360 dave.sudlik    1.98                  CMPI_chars);
3361 venkat.puvvada 1.108     
3362                                  if (remote)
3363                                  {
3364                                      CString info=pidc.getRemoteInfo().getCString();
3365                                      eCtx.ft->addEntry(
3366                                          &eCtx,
3367                                          "CMPIRRemoteInfo",
3368                                          (CMPIValue*)(const char*)info,
3369                                          CMPI_chars);
3370 dave.sudlik    1.98              }
3371                          
3372                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
3373                          
3374 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
3375 dave.sudlik    1.98      
3376                                  {
3377                                      StatProviderTimeMeasurement providerTime(response);
3378                          
3379                                      rc = pr.miVector.instMI->ft->getInstance(
3380                                          pr.miVector.instMI,&eCtx,&eRes,&eRef,
3381                                          (const char **)props.getList());
3382                                  }
3383                          
3384 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
3385                          //      Do this before checking rc from provider to throw exception in case 
3386                          //      rc.msg is also localized.
3387                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
3388 venkat.puvvada 1.108             CMPIData cldata = 
3389                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
3390 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
3391                                  {
3392                                      response->operationContext.set(
3393                                          ContentLanguageListContainer(
3394 venkat.puvvada 1.108                     ContentLanguageList(
3395                                          LanguageParser::parseContentLanguageHeader(
3396                                          CMGetCharPtr(cldata.value.string)))));
3397 dave.sudlik    1.103                 handler.setContext(response->operationContext);
3398 dave.sudlik    1.99              }
3399                          
3400 dave.sudlik    1.98              if (rc.rc!=CMPI_RC_OK)
3401 dave.sudlik    1.102             {
3402 venkat.puvvada 1.108                 CIMException cimException(
3403                                          (CIMStatusCode)rc.rc,
3404                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
3405                          
3406                                      if (eRes.resError)
3407                                      {
3408                                          for (CMPI_Error* currErr=eRes.resError; 
3409 dave.sudlik    1.102                         currErr!=NULL; 
3410                                              currErr=currErr->nextError)
3411 venkat.puvvada 1.108                     {
3412                                              cimException.addError(
3413                                                  ((CIMError*)currErr->hdl)->getInstance());
3414                                          }
3415                                      }
3416                                      throw cimException;
3417 dave.sudlik    1.102             }
3418 dave.sudlik    1.98      
3419                                  // Copy property value from instance to getProperty response
3420 venkat.puvvada 1.108             if (!(GI_response->cimInstance.isUninitialized()))
3421 dave.sudlik    1.98              {
3422 venkat.puvvada 1.108                 Uint32 pos = 
3423                                          GI_response->cimInstance.findProperty(request->propertyName);
3424 dave.sudlik    1.98      
3425 venkat.puvvada 1.108                 if (pos != PEG_NOT_FOUND)
3426 dave.sudlik    1.98                  {
3427 venkat.puvvada 1.108                     response->value = 
3428                                              GI_response->cimInstance.getProperty(pos).getValue();
3429 dave.sudlik    1.98                  }
3430                                      // Else property not found. Return CIM_ERR_NO_SUCH_PROPERTY.
3431                                      else
3432                                      {
3433                                          throw PEGASUS_CIM_EXCEPTION(
3434                                              CIM_ERR_NO_SUCH_PROPERTY,
3435                                              request->propertyName.getString()
3436                                              );
3437                                      }
3438                                  }
3439                              }
3440                              HandlerCatch(handler);
3441                          
3442                              delete GI_request;
3443                              delete GI_response;
3444                          
3445                              PEG_METHOD_EXIT();
3446                          
3447                              return(response);
3448                          }
3449                          
3450 venkat.puvvada 1.108     Message * CMPIProviderManager::handleSetPropertyRequest(
3451                              const Message * message)
3452 dave.sudlik    1.98      {
3453 ms.aruran      1.115         PEG_METHOD_ENTER(
3454                                  TRC_PROVIDERMANAGER,
3455                                  "CMPIProviderManager::handleSetPropertyRequest()");
3456 dave.sudlik    1.98      
3457                              HandlerIntro(SetProperty,message,request,response,handler);
3458                          
3459 venkat.puvvada 1.108         // We're only going to be interested in the specific property from this 
3460                              // instance.
3461 dave.sudlik    1.98          Array<CIMName> localPropertyListArray;
3462                              localPropertyListArray.append(request->propertyName);
3463                              CIMPropertyList localPropertyList(localPropertyListArray);
3464                          
3465 venkat.puvvada 1.108         // Build a modified instance with just the specific property and its 
3466                              // new value.
3467 dave.sudlik    1.98          CIMInstance localModifiedInstance(request->instanceName.getClassName());
3468                              localModifiedInstance.setPath(request->instanceName);
3469 venkat.puvvada 1.108         localModifiedInstance.addProperty(
3470                                  CIMProperty(request->propertyName, request->newValue));
3471 dave.sudlik    1.98      
3472 venkat.puvvada 1.108         // NOTE: SetProperty will use the CIMInstanceProvider interface, so we must
3473                              // manually define a request, response, and handler.
3474 dave.sudlik    1.98          CIMModifyInstanceRequestMessage * MI_request = 
3475                                  new CIMModifyInstanceRequestMessage(
3476 venkat.puvvada 1.108             request->messageId, 
3477                                  request->nameSpace,
3478                                  localModifiedInstance,
3479                                  false,
3480                                  localPropertyList,
3481                                  request->queueIds,
3482                                  request->authType,
3483                                  request->userName
3484                                  );
3485 dave.sudlik    1.98      
3486                              PEGASUS_ASSERT(MI_request != 0); 
3487                          
3488                              CIMModifyInstanceResponseMessage * MI_response = 
3489 venkat.puvvada 1.108             dynamic_cast<CIMModifyInstanceResponseMessage*>(
3490                                  MI_request->buildResponse());
3491 dave.sudlik    1.98      
3492                              PEGASUS_ASSERT(MI_response != 0); 
3493                          
3494 venkat.puvvada 1.108         ModifyInstanceResponseHandler MI_handler(
3495                                  MI_request, 
3496                                  MI_response, 
3497                                  _responseChunkCallback);
3498 dave.sudlik    1.98      
3499 venkat.puvvada 1.108         try
3500 dave.sudlik    1.98          {
3501                                  Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE,
3502 venkat.puvvada 1.108                 "CmpiProviderManager::handleSetPropertyRequest - Host name: $0  "
3503                                      "Name space: $1  Class name: $2  Property name: $3",
3504 dave.sudlik    1.98                  System::getHostName(),
3505                                      request->nameSpace.getString(),
3506                                      request->instanceName.getClassName().getString(),
3507                                      request->propertyName.getString());
3508                          
3509                                  // make target object path
3510                                  CIMObjectPath objectPath(
3511                                      System::getHostName(),
3512                                      request->nameSpace,
3513                                      request->instanceName.getClassName(),
3514                                      request->instanceName.getKeyBindings());
3515                          
3516                                  Boolean remote=false;
3517                                  CMPIProvider::OpProviderHolder ph;
3518                          
3519                                  // resolve provider name
3520 venkat.puvvada 1.108             ProviderIdContainer pidc = 
3521                                      request->operationContext.get(ProviderIdContainer::NAME);
3522 dave.sudlik    1.98              ProviderName name = _resolveProviderName(pidc);
3523                          
3524 venkat.puvvada 1.108             if ((remote=pidc.isRemoteNameSpace()))
3525                                  {
3526                                      ph = providerManager.getRemoteProvider(
3527                                          name.getLocation(), name.getLogicalName());
3528 dave.sudlik    1.98              }
3529 venkat.puvvada 1.108             else
3530                                  {
3531                                      // get cached or load new provider module
3532                                      ph = providerManager.getProvider(
3533                                          name.getPhysicalName(), name.getLogicalName());
3534 dave.sudlik    1.98              }
3535                          
3536                                  // convert arguments
3537                                  OperationContext context;
3538                          
3539                                  context.insert(request->operationContext.get(IdentityContainer::NAME));
3540 venkat.puvvada 1.108             context.insert(
3541                                      request->operationContext.get(AcceptLanguageListContainer::NAME));
3542                                  context.insert(
3543                                      request->operationContext.get(ContentLanguageListContainer::NAME));
3544 dave.sudlik    1.98              // forward request
3545                                  CMPIProvider & pr=ph.GetProvider();
3546                          
3547 ms.aruran      1.115             PEG_TRACE_STRING(
3548                                      TRC_PROVIDERMANAGER,
3549                                      Tracer::LEVEL4,
3550 dave.sudlik    1.98                  "Calling provider.modifyInstance via setProperty: " + pr.getName());
3551                          
3552                                  CMPIStatus rc={CMPI_RC_OK,NULL};
3553                                  CMPI_ContextOnStack eCtx(context);
3554                                  CMPI_ObjectPathOnStack eRef(objectPath);
3555                                  CMPI_ResultOnStack eRes(MI_handler,&pr.broker);
3556                                  CMPI_InstanceOnStack eInst(localModifiedInstance);
3557                                  CMPI_ThreadContext thr(&pr.broker,&eCtx);
3558                          
3559                                  CMPIPropertyList props(localPropertyList);
3560                          
3561                                  CMPIFlags flgs=0;
3562                                  // Leave includeQualifiers as false for this call to modifyInstance
3563 venkat.puvvada 1.108             eCtx.ft->addEntry(
3564                                      &eCtx,
3565                                      CMPIInvocationFlags,
3566                                      (CMPIValue*)&flgs,
3567                                      CMPI_uint32);
3568 dave.sudlik    1.98      
3569                                  const IdentityContainer container =
3570 venkat.puvvada 1.108                 request->operationContext.get(IdentityContainer::NAME);
3571 dave.sudlik    1.98              eCtx.ft->addEntry(&eCtx,
3572 venkat.puvvada 1.108                 CMPIPrincipal,
3573                                      (CMPIValue*)(const char*)container.getUserName().getCString(),
3574                                      CMPI_chars);
3575 dave.sudlik    1.98      
3576                                  const AcceptLanguageListContainer accept_language=            
3577 venkat.puvvada 1.108                 request->operationContext.get(AcceptLanguageListContainer::NAME); 
3578 dave.sudlik    1.98              const AcceptLanguageList acceptLangs = accept_language.getLanguages();
3579                                  eCtx.ft->addEntry(
3580                                      &eCtx,
3581 dave.sudlik    1.99                  CMPIAcceptLanguage,
3582 dave.sudlik    1.98                  (CMPIValue*)(const char*)LanguageParser::buildAcceptLanguageHeader(
3583 venkat.puvvada 1.108                 acceptLangs).getCString(),
3584 dave.sudlik    1.98                  CMPI_chars);
3585 venkat.puvvada 1.108     
3586                                  if (remote)
3587                                  {
3588                                      CString info=pidc.getRemoteInfo().getCString();
3589                                      eCtx.ft->addEntry(
3590                                          &eCtx,
3591                                          "CMPIRRemoteInfo",
3592                                          (CMPIValue*)(const char*)info,
3593                                          CMPI_chars);
3594 dave.sudlik    1.98              }
3595                          
3596                                  CMPIProvider::pm_service_op_lock op_lock(&pr);
3597                          
3598 r.kieninger    1.118.2.1         AutoPThreadSecurity threadLevelSecurity(request->operationContext);
3599 dave.sudlik    1.98      
3600                                  {
3601                                      StatProviderTimeMeasurement providerTime(response);
3602                          
3603                                      rc = pr.miVector.instMI->ft->modifyInstance(
3604                                          pr.miVector.instMI,&eCtx,&eRes,&eRef,&eInst,
3605                                          (const char **)props.getList());
3606                                  }
3607                          
3608 dave.sudlik    1.99      //      Need to save ContentLanguage value into operation context of response
3609                          //      Do this before checking rc from provider to throw exception in case 
3610                          //      rc.msg is also localized.
3611                                  CMPIStatus tmprc={CMPI_RC_OK,NULL};
3612 venkat.puvvada 1.108             CMPIData cldata = 
3613                                      eCtx.ft->getEntry (&eCtx, CMPIContentLanguage, &tmprc);
3614 dave.sudlik    1.99              if (tmprc.rc == CMPI_RC_OK)
3615                                  {
3616                                      response->operationContext.set(
3617                                          ContentLanguageListContainer(
3618 venkat.puvvada 1.108                     ContentLanguageList(
3619                                          LanguageParser::parseContentLanguageHeader(
3620                                          CMGetCharPtr(cldata.value.string)))));
3621 dave.sudlik    1.103                 handler.setContext(response->operationContext);
3622 dave.sudlik    1.99              }
3623                          
3624 dave.sudlik    1.98              if (rc.rc!=CMPI_RC_OK)
3625 dave.sudlik    1.102             {
3626 venkat.puvvada 1.108                 CIMException cimException(
3627                                          (CIMStatusCode)rc.rc,
3628                                          rc.msg ? CMGetCharsPtr(rc.msg,NULL) : String::EMPTY);
3629                          
3630                                      if (eRes.resError)
3631                                      {
3632                                          for (CMPI_Error* currErr=eRes.resError; 
3633 dave.sudlik    1.102                         currErr!=NULL; 
3634                                              currErr=currErr->nextError)
3635 venkat.puvvada 1.108                     {
3636                                              cimException.addError(
3637                                                  ((CIMError*)currErr->hdl)->getInstance());
3638                                          }
3639                                      }
3640                                      throw cimException;
3641 dave.sudlik    1.102             }
3642 dave.sudlik    1.98          }
3643                              HandlerCatch(handler);
3644                          
3645                              delete MI_request;
3646                              delete MI_response;
3647                          
3648                              PEG_METHOD_EXIT();
3649                          
3650                              return(response);
3651                          }
3652                          
3653 venkat.puvvada 1.108     Message * CMPIProviderManager::handleUnsupportedRequest(
3654                              const Message * message)
3655 marek          1.63      {
3656 ms.aruran      1.115         PEG_METHOD_ENTER(
3657                                  TRC_PROVIDERMANAGER,
3658                                  "CMPIProviderManager::handleUnsupportedRequest()");
3659 marek          1.63          CIMRequestMessage* request =
3660                                  dynamic_cast<CIMRequestMessage *>(const_cast<Message *>(message));
3661                              PEGASUS_ASSERT(request != 0 );
3662                          
3663                              CIMResponseMessage* response = request->buildResponse();
3664                              response->cimException =
3665                                  PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY);
3666                          
3667                              PEG_METHOD_EXIT();
3668                              return response;
3669                          }
3670                          
3671                          ProviderName CMPIProviderManager::_resolveProviderName(
3672                              const ProviderIdContainer & providerId)
3673                          {
3674                              String providerName;
3675                              String fileName;
3676                              String location;
3677 dmitry.mikulin 1.114         String moduleName;
3678 marek          1.63          CIMValue genericValue;
3679                          
3680 ms.aruran      1.115         PEG_METHOD_ENTER(
3681                                  TRC_PROVIDERMANAGER,
3682                                  "CMPIProviderManager::_resolveProviderName()");
3683                          
3684 dmitry.mikulin 1.114         genericValue = providerId.getModule().getProperty(
3685                                  providerId.getModule().findProperty("Name")).getValue();
3686                              genericValue.get(moduleName);
3687                          
3688 marek          1.63          genericValue = providerId.getProvider().getProperty(
3689                                  providerId.getProvider().findProperty("Name")).getValue();
3690                              genericValue.get(providerName);
3691                          
3692                              genericValue = providerId.getModule().getProperty(
3693                                  providerId.getModule().findProperty("Location")).getValue();
3694                              genericValue.get(location);
3695                              fileName = _resolvePhysicalName(location);
3696                          
3697 thilo.boehm    1.89          // An empty file name is only for interest if we are in the 
3698                              // local name space. So the message is only issued if not
3699                              // in the remote Name Space.
3700                              if (fileName == String::EMPTY && (!providerId.isRemoteNameSpace()))
3701                              {
3702 venkat.puvvada 1.108             genericValue.get(location);
3703                                  String fullName = FileSystem::buildLibraryFileName(location);
3704                                  Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
3705                                      "ProviderManager.CMPI.CMPIProviderManager.CANNOT_FIND_LIBRARY",
3706                                      "For provider $0 library $1 was not found.", 
3707                                      providerName, fullName);
3708 thilo.boehm    1.89      
3709                              }
3710 dmitry.mikulin 1.114         ProviderName name(moduleName, providerName, fileName);
3711 marek          1.63          name.setLocation(location);
3712 ms.aruran      1.115         PEG_METHOD_EXIT();
3713 marek          1.63          return name;
3714                          }
3715                          
3716                          void CMPIProviderManager::_callEnableIndications
3717                              (CIMInstance & req_provider,
3718 venkat.puvvada 1.108         PEGASUS_INDICATION_CALLBACK_T _indicationCallback,
3719                              CMPIProvider::OpProviderHolder & ph,
3720                              const char* remoteInfo)
3721 marek          1.63      {
3722 ms.aruran      1.115         PEG_METHOD_ENTER(
3723                                  TRC_PROVIDERMANAGER,
3724                                  "CMPIProviderManager::_callEnableIndications()");
3725 marek          1.63      
3726                              try
3727                              {
3728 w.otsuka       1.86              indProvRecord *provRec =0;
3729 marek          1.95              {
3730                                      WriteLock lock(rwSemProvTab);
3731                          
3732 venkat.puvvada 1.108                 if (provTab.lookup (ph.GetProvider ().getName (), provRec))
3733                                      {
3734                                          provRec->enabled = true;
3735                                          CIMRequestMessage * request = 0;
3736                                          CIMResponseMessage * response = 0;
3737                                          provRec->handler=new EnableIndicationsResponseHandler(
3738                                              request,
3739                                              response,
3740                                              req_provider,
3741                                              _indicationCallback,
3742                                              _responseChunkCallback);
3743                                      }
3744 marek          1.95              }
3745 marek          1.63      
3746                                  CMPIProvider & pr=ph.GetProvider();
3747                          
3748                                  //
3749                                  //  Versions prior to 86 did not include enableIndications routine
3750                                  //
3751                                  if (pr.miVector.indMI->ft->ftVersion >= 86)
3752                                  {
3753                                      OperationContext context;
3754 kumpf          1.112     #ifdef PEGASUS_ZOS_THREADLEVEL_SECURITY
3755 venkat.puvvada 1.108                 // For the z/OS security model we always need an Identity container
3756                                      // in the operation context. Since we don't have a client request 
3757                                      // ID here we have to use the cim servers identity for the time 
3758                                      // being.
3759                                      IdentityContainer idContainer(System::getEffectiveUserName());
3760                                      context.insert(idContainer);
3761 kumpf          1.112     #endif
3762 marek          1.90      
3763 marek          1.63                  CMPIStatus rc={CMPI_RC_OK,NULL};
3764                                      CMPI_ContextOnStack eCtx(context);
3765                                      CMPI_ThreadContext thr(&pr.broker,&eCtx);
3766                          
3767 dave.sudlik    1.100                 // Add RemoteInformation -V 5245
3768                                      if (remoteInfo)
3769                                      {
3770                                          eCtx.ft->addEntry(&eCtx,"CMPIRRemoteInfo",
3771 venkat.puvvada 1.108                         (CMPIValue*)(const char*)remoteInfo,CMPI_chars);
3772 dave.sudlik    1.100                 }
3773                          
3774 ms.aruran      1.115                 PEG_TRACE_STRING(
3775                                          TRC_PROVIDERMANAGER,
3776                                          Tracer::LEVEL4,
3777 marek          1.63                      "Calling provider.enableIndications: " + pr.getName());
3778                          
3779 venkat.puvvada 1.111                 pr.protect();
3780 marek          1.63      
3781 dave.sudlik    1.101                 // enableIndications() is defined by the CMPI standard as
3782                                      // returning a CMPIStatus return value. Unfortunately, Pegasus
3783                                      // originally implemented enableIndications() with a void
3784                                      // return type, and this incompatibility was not detected for 
3785                                      // some time. Since exceptions thrown from enableIndications() 
3786                                      // are not reported (other than via logging), it was decided to
3787                                      // discard the returned CMPIStatus here. This will prevent us from
3788                                      // breaking existing CMPI Indication providers. This is ok since
3789                                      // there really isn't a user to which the problem should be
3790                                      // reported.
3791 konrad.r       1.64                  pr.miVector.indMI->ft->enableIndications(pr.miVector.indMI,&eCtx);
3792 marek          1.63              }
3793                                  else
3794                                  {
3795 ms.aruran      1.115                 PEG_TRACE_STRING(
3796                                          TRC_PROVIDERMANAGER,
3797                                          Tracer::LEVEL4,
3798 marek          1.63                      "Not calling provider.enableIndications: " + pr.getName() +
3799 venkat.puvvada 1.108                     " routine as it is an earlier version that does not support " \
3800                                          "this function");
3801 marek          1.63              }
3802                              }
3803 konrad.r       1.64          catch (const Exception & e)
3804 marek          1.63          {
3805 ms.aruran      1.115             PEG_TRACE_STRING(
3806                                      TRC_PROVIDERMANAGER,
3807                                      Tracer::LEVEL2,
3808 dave.sudlik    1.101                 "Exception in _callEnableIndications: " + e.getMessage ());
3809 marek          1.63      
3810                                  Logger::put_l (Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3811                                      "ProviderManager.CMPI.CMPIProviderManager."
3812 venkat.puvvada 1.108                 "ENABLE_INDICATIONS_FAILED",
3813 marek          1.63                  "Failed to enable indications for provider $0: $1.",
3814                                      ph.GetProvider ().getName (), e.getMessage ());
3815                              }
3816 venkat.puvvada 1.108         catch (...)
3817 marek          1.63          {
3818 ms.aruran      1.115             PEG_TRACE_CSTRING(
3819                                      TRC_PROVIDERMANAGER,
3820                                      Tracer::LEVEL2,
3821 marek          1.63                  "Unexpected error in _callEnableIndications");
3822                          
3823                                  Logger::put_l (Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3824                                      "ProviderManager.CMPI.CMPIProviderManager."
3825 venkat.puvvada 1.108                 "ENABLE_INDICATIONS_FAILED_UNKNOWN",
3826 marek          1.63                  "Failed to enable indications for provider $0.",
3827                                      ph.GetProvider ().getName ());
3828                              }
3829                          
3830                              PEG_METHOD_EXIT ();
3831                          }
3832                          
3833                          void CMPIProviderManager::_callDisableIndications
3834 dave.sudlik    1.100         (CMPIProvider::OpProviderHolder & ph, const char *remoteInfo)
3835 marek          1.63      {
3836 ms.aruran      1.115         PEG_METHOD_ENTER(
3837                                  TRC_PROVIDERMANAGER,
3838                                  "CMPIProviderManager::_callDisableIndications()");
3839 marek          1.63      
3840 dave.sudlik    1.101         try
3841 marek          1.95          {
3842 dave.sudlik    1.101             indProvRecord * provRec = 0;
3843                                  {
3844                                      WriteLock writeLock(rwSemProvTab);
3845 venkat.puvvada 1.108                 if (provTab.lookup (ph.GetProvider ().getName (), provRec))
3846                                      {
3847                                          provRec->enabled = false;
3848                                          if (provRec->handler) delete provRec->handler;
3849                                          provRec->handler = NULL;
3850                                      }
3851 dave.sudlik    1.101             }
3852                          
3853                                  CMPIProvider & pr=ph.GetProvider();
3854 marek          1.63      
3855 dave.sudlik    1.101             //
3856                                  //  Versions prior to 86 did not include disableIndications routine
3857                                  //
3858                                  if (pr.miVector.indMI->ft->ftVersion >= 86)
3859                                  {
3860                                      OperationContext context;
3861                                      CMPIStatus rc={CMPI_RC_OK,NULL};
3862                                      CMPI_ContextOnStack eCtx(context);
3863                          
3864                                      if (remoteInfo)
3865                                      {
3866 venkat.puvvada 1.108                     eCtx.ft->addEntry(&eCtx,"CMPIRRemoteInfo",
3867                                              (CMPIValue*)(const char*)remoteInfo,CMPI_chars);
3868 dave.sudlik    1.101                 }
3869                                      CMPI_ThreadContext thr(&pr.broker,&eCtx);
3870 dave.sudlik    1.96      
3871 ms.aruran      1.115                 PEG_TRACE_STRING(
3872                                          TRC_PROVIDERMANAGER,
3873                                          Tracer::LEVEL4,
3874 dave.sudlik    1.101                     "Calling provider.disableIndications: " + pr.getName());
3875 dave.sudlik    1.100     
3876 dave.sudlik    1.101                 // disableIndications() is defined by the CMPI standard as
3877                                      // returning a CMPIStatus return value. Unfortunately, Pegasus
3878                                      // originally implemented disableIndications() with a void
3879                                      // return type, and this incompatibility was not detected for 
3880                                      // some time. For consistency with the enableIndications()
3881                                      // interface, it was decided to discard the returned CMPIStatus 
3882                                      // here. This will prevent us from breaking existing CMPI 
3883                                      // Indication providers. This is ok since there really isn't a 
3884                                      // user to which the problem should be reported.
3885 venkat.puvvada 1.108                 pr.miVector.indMI->ft->disableIndications(
3886                                          pr.miVector.indMI, 
3887                                          &eCtx);
3888 marek          1.63      
3889 venkat.puvvada 1.111                 pr.unprotect();
3890 dave.sudlik    1.101             }
3891                                  else
3892                                  {
3893 ms.aruran      1.115                 PEG_TRACE_STRING(
3894                                          TRC_PROVIDERMANAGER,
3895                                          Tracer::LEVEL4,
3896 dave.sudlik    1.101                     "Not calling provider.disableIndications: "
3897                                          + pr.getName() +
3898 venkat.puvvada 1.108                     " routine as it is an earlier version that does not support" \
3899                                          " this function");
3900 dave.sudlik    1.101             }
3901                              }
3902                              catch (const Exception & e)
3903                              {
3904 ms.aruran      1.115             PEG_TRACE_STRING(
3905                                      TRC_PROVIDERMANAGER,
3906                                      Tracer::LEVEL2,
3907 dave.sudlik    1.101                 "Exception in _callDisableIndications: " + e.getMessage ());
3908 marek          1.63      
3909 dave.sudlik    1.101             Logger::put_l (Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3910                                      "ProviderManager.CMPI.CMPIProviderManager."
3911 venkat.puvvada 1.108                 "DISABLE_INDICATIONS_FAILED",
3912 dave.sudlik    1.101                 "Failed to disable indications for provider $0: $1.",
3913                                      ph.GetProvider ().getName (), e.getMessage ());
3914 marek          1.63          }
3915 venkat.puvvada 1.108         catch (...)
3916 marek          1.63          {
3917 ms.aruran      1.115             PEG_TRACE_CSTRING(
3918                                      TRC_PROVIDERMANAGER,
3919                                      Tracer::LEVEL2,
3920 dave.sudlik    1.101                 "Unexpected error in _callDisableIndications");
3921                          
3922                                  Logger::put_l (Logger::ERROR_LOG, System::CIMSERVER, Logger::WARNING,
3923                                      "ProviderManager.CMPI.CMPIProviderManager."
3924 venkat.puvvada 1.108                 "DISABLE_INDICATIONS_FAILED_UNKNOWN",
3925 dave.sudlik    1.101                 "Failed to disable indications for provider $0.",
3926                                      ph.GetProvider ().getName ());
3927 marek          1.63          }
3928                          
3929                              PEG_METHOD_EXIT ();
3930                          }
3931                          
3932                          PEGASUS_NAMESPACE_END
3933 venkat.puvvada 1.108         

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2