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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2