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

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2