(file) Return to CIMOperationRequestDispatcher.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Server

   1 kumpf 1.106 //%/////////////////////////////////////////////////////////////////////////////
   2 mike  1.2   //
   3 kumpf 1.106 // Copyright (c) 2000, 2001, 2002 BMC Software, Hewlett-Packard Company, IBM,
   4 mike  1.2   // The Open Group, Tivoli Systems
   5             //
   6             // Permission is hereby granted, free of charge, to any person obtaining a copy
   7             // of this software and associated documentation files (the "Software"), to
   8             // deal in the Software without restriction, including without limitation the
   9             // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  10             // sell copies of the Software, and to permit persons to whom the Software is
  11             // furnished to do so, subject to the following conditions:
  12 kumpf 1.106 // 
  13 mike  1.2   // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  14             // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
  15             // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
  16             // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
  17             // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  18             // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  19             // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  20             // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  21             //
  22             //==============================================================================
  23             //
  24             // Author: Mike Brasher (mbrasher@bmc.com)
  25             //
  26             // Modified By:  Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com)
  27             //               Chip Vincent (cvincent@us.ibm.com)
  28             //               Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
  29             //               Nitin Upasani, Hewlett-Packard Company (Nitin_Upasani@hp.com)
  30             //               Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
  31 chip  1.6   //               Mike Day (mdday@us.ibm.com)
  32 mike  1.2   //               Carol Ann Krug Graves, Hewlett-Packard Company
  33             //                   (carolann_graves@hp.com)
  34 sage  1.77  //               Arthur Pichlkostner (via Markus: sedgewick_de@yahoo.de)
  35 kumpf 1.80  //               Jenny Yu, Hewlett-Packard Company (jenny_yu@hp.com)
  36 kumpf 1.105 //               Karl Schopmeyer (k.schopmeyer@opengroup.org)
  37 mike  1.2   //
  38             //%/////////////////////////////////////////////////////////////////////////////
  39             
  40 chip  1.17  #include "CIMOperationRequestDispatcher.h"
  41 mday  1.89  #include <Pegasus/suballoc/suballoc.h>
  42 kumpf 1.66  #include <Pegasus/Common/Constants.h>
  43 kumpf 1.30  #include <Pegasus/Common/XmlReader.h> // stringToValue(), stringArrayToValue()
  44 sage  1.77  #include <Pegasus/Common/StatisticalData.h>
  45 kumpf 1.40  #include <Pegasus/Common/Tracer.h>
  46 karl  1.97  #include <Pegasus/Common/Formatter.h>
  47 kumpf 1.30  
  48 mike  1.2   PEGASUS_NAMESPACE_BEGIN
  49             
  50 chip  1.14  PEGASUS_USING_STD;
  51 kumpf 1.109 //#define LIMIT_ENUM_TO_ONE_LEVEL
  52 karl  1.96  
  53 mday  1.89  namespace 
  54             {
  55 kumpf 1.90     static peg_suballocator::SUBALLOC_HANDLE *dq_handle = new peg_suballocator::SUBALLOC_HANDLE();
  56 mday  1.89  }
  57             
  58 chip  1.39  CIMOperationRequestDispatcher::CIMOperationRequestDispatcher(
  59                 CIMRepository* repository,
  60 kumpf 1.64      ProviderRegistrationManager* providerRegistrationManager)
  61 mday  1.36        :
  62 kumpf 1.74        Base(PEGASUS_QUEUENAME_OPREQDISPATCHER),
  63 mday  1.36        _repository(repository),
  64 kumpf 1.64        _providerRegistrationManager(providerRegistrationManager)
  65 mike  1.2   {
  66 mday  1.89  
  67 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
  68 kumpf 1.104          "CIMOperationRequestDispatcher::CIMOperationRequestDispatcher");
  69             
  70                // Check whether or not AssociationTraversal is supported.
  71                //
  72                ConfigManager* configManager = ConfigManager::getInstance();
  73                _enableAssociationTraversal = String::equal(
  74                     configManager->getCurrentValue("enableAssociationTraversal"), "true");
  75 kumpf 1.111    _enableIndicationService = String::equal(
  76                     configManager->getCurrentValue("enableIndicationService"), "true");
  77 kumpf 1.104 
  78 kumpf 1.59     PEG_METHOD_EXIT();
  79 chip  1.39  }
  80 mike  1.2   
  81 karl  1.81  CIMOperationRequestDispatcher::~CIMOperationRequestDispatcher(void)
  82 mike  1.2   {
  83 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
  84 kumpf 1.73        "CIMOperationRequestDispatcher::~CIMOperationRequestDispatcher");
  85 mday  1.36     _dying = 1;
  86 kumpf 1.59     PEG_METHOD_EXIT();
  87 mike  1.2   }
  88             
  89 mday  1.23  void CIMOperationRequestDispatcher::_handle_async_request(AsyncRequest *req)
  90             {
  91 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
  92 kumpf 1.73        "CIMOperationRequestDispatcher::_handle_async_request");
  93 kumpf 1.59  
  94 chip  1.39     	// pass legacy operations to handleEnqueue
  95             	if(req->getType() == async_messages::ASYNC_LEGACY_OP_START)
  96             	{
  97             	   req->op->processing();
  98 kumpf 1.25  
  99 chip  1.39  	   Message * message = (static_cast<AsyncLegacyOperationStart *>(req)->get_action());
 100             
 101             	   handleEnqueue(message);
 102             
 103 kumpf 1.59  	   PEG_METHOD_EXIT();
 104 chip  1.39  	   return;
 105             	}
 106 mday  1.23  
 107 chip  1.39  	// pass all other operations to the default handler
 108             	Base::_handle_async_request(req);
 109 kumpf 1.59  	PEG_METHOD_EXIT();
 110 mday  1.23  }
 111             
 112 kumpf 1.57  Boolean CIMOperationRequestDispatcher::_lookupInternalProvider(
 113                const String& nameSpace,
 114                const String& className,
 115                String& service,
 116                String& provider)
 117             {
 118 kumpf 1.59      PEG_METHOD_ENTER(TRC_DISPATCHER,
 119 kumpf 1.73          "CIMOperationRequestDispatcher::_lookupInternalProvider");
 120 karl  1.81      // Clear the strings since used as test later. Poor code but true now
 121                 service =  String::EMPTY;
 122                 provider = String::EMPTY;
 123 kumpf 1.59  
 124 kumpf 1.107     if (String::equalNoCase(className, PEGASUS_CLASSNAME_CONFIGSETTING) &&
 125                     String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_CONFIG))
 126 kumpf 1.61      {
 127 kumpf 1.74          service = PEGASUS_QUEUENAME_CONTROLSERVICE;
 128 kumpf 1.66          provider = PEGASUS_MODULENAME_CONFIGPROVIDER;
 129 karl  1.81  	PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 130 kumpf 1.105 	    "Internal provider  Service = " + service + " provider " + provider + " found.");
 131 kumpf 1.61          PEG_METHOD_EXIT();
 132                     return true;
 133                 }
 134 kumpf 1.107     if ((String::equalNoCase(className, PEGASUS_CLASSNAME_AUTHORIZATION) &&
 135                      String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_AUTHORIZATION)) ||
 136                     (String::equalNoCase(className, PEGASUS_CLASSNAME_USER) &&
 137                      String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_USER)))
 138 kumpf 1.63      {
 139 kumpf 1.74          service = PEGASUS_QUEUENAME_CONTROLSERVICE;
 140 kumpf 1.66          provider = PEGASUS_MODULENAME_USERAUTHPROVIDER;
 141 karl  1.81  	PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 142 kumpf 1.105 	    "Internal provider  Service = " + service + " provider " + provider + " found.");
 143 kumpf 1.80          PEG_METHOD_EXIT();
 144                     return true;
 145                 }
 146 kumpf 1.107     if (String::equalNoCase(className, PEGASUS_CLASSNAME_SHUTDOWN) &&
 147                     String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_SHUTDOWN))
 148 kumpf 1.80      {
 149                     service = PEGASUS_QUEUENAME_CONTROLSERVICE;
 150                     provider = PEGASUS_MODULENAME_SHUTDOWNPROVIDER;
 151 karl  1.81  	PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 152 kumpf 1.105 	    "Internal provider  Service = " + service + " provider " + provider + " found.");
 153 kumpf 1.63          PEG_METHOD_EXIT();
 154                     return true;
 155                 }
 156 karl  1.81      if (String::equalNoCase(className, PEGASUS_CLASSNAME___NAMESPACE) ||
 157             	String::equalNoCase(className, PEGASUS_CLASSNAME_NAMESPACE))
 158                 {
 159                     service = PEGASUS_QUEUENAME_CONTROLSERVICE;
 160                     provider = PEGASUS_MODULENAME_NAMESPACEPROVIDER;
 161             	PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 162 kumpf 1.105 	    "Internal provider  Service = " + service + " provider " + provider + " found.");
 163 karl  1.81          PEG_METHOD_EXIT();
 164                     return true;
 165                 }
 166             
 167 kumpf 1.107     if ((String::equalNoCase(className, PEGASUS_CLASSNAME_PROVIDERMODULE) ||
 168                      String::equalNoCase(className, PEGASUS_CLASSNAME_PROVIDER) ||
 169                      String::equalNoCase(className, PEGASUS_CLASSNAME_PROVIDERCAPABILITIES)) &&
 170                     String::equalNoCase(nameSpace, PEGASUS_NAMESPACENAME_PROVIDERREG))
 171 kumpf 1.57      {
 172 kumpf 1.74          service = PEGASUS_QUEUENAME_CONTROLSERVICE;
 173 kumpf 1.66          provider = PEGASUS_MODULENAME_PROVREGPROVIDER;
 174 karl  1.81  	PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 175 kumpf 1.105 	    "Internal provider  Service = " + service + " provider " + provider + " found.");
 176 kumpf 1.59          PEG_METHOD_EXIT();
 177 kumpf 1.57          return true;
 178                 }
 179 kumpf 1.111     if (_enableIndicationService &&
 180                     (String::equalNoCase(className, PEGASUS_CLASSNAME_INDSUBSCRIPTION) ||
 181                      String::equalNoCase(className, PEGASUS_CLASSNAME_INDHANDLER) ||
 182                      String::equalNoCase(className, PEGASUS_CLASSNAME_INDHANDLER_CIMXML) ||
 183                      String::equalNoCase(className, PEGASUS_CLASSNAME_INDHANDLER_SNMP) ||
 184                      String::equalNoCase(className, PEGASUS_CLASSNAME_INDFILTER)))
 185 kumpf 1.57      {
 186 kumpf 1.74          service = PEGASUS_QUEUENAME_INDICATIONSERVICE;
 187 kumpf 1.57          provider = String::EMPTY;
 188 karl  1.81  	PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 189 kumpf 1.105 	    "Internal provider  Service = "
 190 karl  1.81  	     + service + " provider " + provider + " found.");
 191 kumpf 1.59          PEG_METHOD_EXIT();
 192 kumpf 1.57          return true;
 193                 }
 194 kumpf 1.59      PEG_METHOD_EXIT();
 195 kumpf 1.57      return false;
 196             }
 197 karl  1.96  
 198             /* _getSubClassNames - Gets the names of all subclasses of the defined
 199                 class (including the class) and returns it in an array of strings. Uses a similar
 200 karl  1.97      function in the repository class to get the names.  Note that this prepends
 201                 the result with the input classname.
 202 karl  1.96      @param namespace
 203                 @param className
 204                 @return Array of strings with class names.  Note that there should be at least
 205                 one classname in the array (the input name)
 206                 Note that there is a special exception to this function, the __namespace class
 207                 which does not have any representation in the class repository.
 208                 @exception CIMException(CIM_ERR_INVALID_CLASS)
 209             */
 210             Array<String> CIMOperationRequestDispatcher::_getSubClassNames(
 211             		    String& nameSpace,
 212             		    String& className) throw(CIMException)
 213             {
 214                 PEG_METHOD_ENTER(TRC_DISPATCHER,
 215                    "CIMOperationRequestDispatcher::_getSubClassNames");
 216 karl  1.97  
 217 karl  1.96      Array<String> subClassNames;
 218                 //
 219                 // Get names of descendent classes:
 220                 //
 221                 if(!String::equalNoCase(className, PEGASUS_CLASSNAME___NAMESPACE))
 222                 {
 223 karl  1.97      	try
 224                 	{
 225                 	    // Get the complete list of subclass names
 226                 	    _repository->getSubClassNames(nameSpace,
 227                 			 className, true, subClassNames);
 228                 	}
 229                 	catch(CIMException& e)
 230                 	{
 231                 	    // Gets exception back from the getSubClasses if class does not exist
 232                 	    PEG_METHOD_EXIT();
 233                 	    throw e;
 234                 	}
 235 karl  1.96      }
 236 karl  1.97      // Prepend the array with the classname that formed the array.
 237 karl  1.96      subClassNames.prepend(className);
 238                 return subClassNames;
 239             }
 240             
 241             
 242 karl  1.86  /* _lookupInstanceProvider - Looks up the instance provider for the
 243                 classname and namespace.
 244                 Returns the name of the provider.
 245 karl  1.96      ATTN KS: P0 8 May 2002QUESTION: Why are we getting the name of the provider.  
 246 karl  1.97      ATTN: This needs to be combined with lookupnewinstanceprovider to form a single
 247                 function
 248 karl  1.86      be satisfied with the existance and not need the name.
 249                 Shouldn't we be able to change this to a binary return???
 250             */
 251 kumpf 1.43  String CIMOperationRequestDispatcher::_lookupInstanceProvider(
 252 mday  1.36     const String& nameSpace,
 253                const String& className)
 254 mike  1.2   {
 255 kumpf 1.43      CIMInstance pInstance;
 256                 CIMInstance pmInstance;
 257                 String providerName;
 258 chip  1.12  
 259 karl  1.81      PEG_METHOD_ENTER(TRC_DISPATCHER,
 260 kumpf 1.52                       "CIMOperationRequestDispatcher::_lookupInstanceProvider");
 261 kumpf 1.54      if (_providerRegistrationManager->lookupInstanceProvider(
 262 sage  1.75  	nameSpace, className, pInstance, pmInstance, false))
 263 kumpf 1.43      {
 264             	// get the provder name
 265             	Uint32 pos = pInstance.findProperty("Name");
 266             
 267             	if ( pos != PEG_NOT_FOUND )
 268             	{
 269             	    pInstance.getProperty(pos).getValue().get(providerName);
 270             
 271 karl  1.81              PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 272 kumpf 1.52                               "providerName = " + providerName + " found.");
 273                         PEG_METHOD_EXIT();
 274 kumpf 1.43  	    return (providerName);
 275             	}
 276             	else
 277             	{
 278 karl  1.96              PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 279                                "providerName = " + providerName + ". Provider name not found.");
 280 kumpf 1.52              PEG_METHOD_EXIT();
 281 kumpf 1.43     	    return(String::EMPTY);
 282             	}
 283                 }
 284                 else
 285                 {
 286 karl  1.96          PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 287 kumpf 1.102                    "Provider for " + className + " not found.");
 288 kumpf 1.52          PEG_METHOD_EXIT();
 289 kumpf 1.43     	return(String::EMPTY);
 290                 }
 291             }
 292             
 293 karl  1.86  /* _lookupNewInstanceProvider - Looks up the internal and/or instance provider
 294                 for the defined namespace and class and returns the serviceName and
 295                 control provider name if a provider is found
 296                 @return true if an service, control provider, or instance provider is found
 297                 for the defined class and namespace.
 298                 This should be combined with the lookupInstanceProvider code eventually but
 299                 the goal now was to simplify the handlers.
 300 karl  1.97      ATTN: KS P3 20 May 2002 Merge this with lookupinstnaceprovider
 301 karl  1.86  */
 302             Boolean CIMOperationRequestDispatcher::_lookupNewInstanceProvider(
 303             				 const String& nameSpace,
 304                                              const String& className,
 305             				 String& serviceName,
 306             				 String& controlProviderName)
 307             {
 308                 PEG_METHOD_ENTER(TRC_DISPATCHER,
 309                                  "CIMOperationRequestDispatcher::_lookupNewInstanceProvider");
 310                //cout << "KSTEST lookupnewinstanceprovider "
 311                //    << " namespace " << nameSpace
 312                //    << " class " << className << endl;
 313                Boolean hasProvider = false;
 314                String providerName = String::EMPTY;
 315             
 316                // Check for class provided by an internal provider
 317                if (_lookupInternalProvider(nameSpace, className, serviceName,
 318                        controlProviderName))
 319                    hasProvider = true;
 320                else
 321                {
 322 karl  1.86         // get provider for class
 323                    providerName = _lookupInstanceProvider(nameSpace, className);
 324                }
 325             
 326                if(providerName != String::EMPTY)
 327                {
 328                    
 329                    serviceName = PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP;
 330                    hasProvider = true;
 331                }
 332                PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 333                    "Lookup Provider = "
 334             	+ serviceName + " provider " + providerName + " found."
 335                     + " return= " + (hasProvider? "true" : "false"));
 336             
 337                PEG_METHOD_EXIT();
 338             
 339                return hasProvider;
 340             
 341             }
 342             
 343 kumpf 1.43  String CIMOperationRequestDispatcher::_lookupMethodProvider(
 344                const String& nameSpace,
 345                const String& className,
 346                const String& methodName)
 347             {
 348 karl  1.81      PEG_METHOD_ENTER(TRC_DISPATCHER,
 349 kumpf 1.73          "CIMOperationRequestDispatcher::_lookupMethodProvider");
 350 kumpf 1.59  
 351 kumpf 1.43      CIMInstance pInstance;
 352                 CIMInstance pmInstance;
 353                 String providerName;
 354 chip  1.12  
 355 kumpf 1.54      if (_providerRegistrationManager->lookupMethodProvider(
 356 kumpf 1.43  	nameSpace, className, methodName, pInstance, pmInstance))
 357                 {
 358             	// get the provder name
 359             	Uint32 pos = pInstance.findProperty("Name");
 360 chip  1.12  
 361 kumpf 1.43  	if ( pos != PEG_NOT_FOUND )
 362             	{
 363             	    pInstance.getProperty(pos).getValue().get(providerName);
 364             
 365 kumpf 1.59  	    PEG_METHOD_EXIT();
 366 kumpf 1.43  	    return (providerName);
 367             	}
 368             	else
 369             	{
 370 kumpf 1.59  	    PEG_METHOD_EXIT();
 371 kumpf 1.43     	    return(String::EMPTY);
 372             	}
 373                 }
 374                 else
 375                 {
 376 kumpf 1.59  	PEG_METHOD_EXIT();
 377             	return(String::EMPTY);
 378 kumpf 1.43      }
 379             }
 380 kumpf 1.16  
 381 chip  1.46  // ATTN-YZ-P1-20020305: Implement this interface
 382 sage  1.75  //
 383             // ATTN Markus:
 384             // algorithm: enumerateClassnames, find all association providers
 385             // registered for classes and give back this list
 386             
 387             Array<String> CIMOperationRequestDispatcher::_lookupAssociationProvider(
 388 kumpf 1.43     const String& nameSpace,
 389 sage  1.75     const String& className,
 390 kumpf 1.76     const String& assocClassName,
 391                const String& resultClassName)
 392 kumpf 1.43  {
 393 sage  1.75      Array<CIMInstance> pInstances; // Provider
 394                 Array<CIMInstance> pmInstances; // ProviderModule
 395             
 396                 Array<String> providerNames;
 397                 String providerName;
 398             
 399 karl  1.81      PEG_METHOD_ENTER(TRC_DISPATCHER,
 400 kumpf 1.73          "CIMOperationRequestDispatcher::_lookupAssociationProvider");
 401 kumpf 1.59  
 402 sage  1.75          // assume assocClassName is empty
 403                 // algorithm: enumerateClassnames, find all association providers
 404                 // registered for classes and give back this list
 405             
 406                 if (_providerRegistrationManager->lookupAssociationProvider(
 407                         nameSpace, className, assocClassName, resultClassName,
 408                             pInstances, pmInstances))
 409                 {
 410             
 411                     for(Uint32 i=0,n=pInstances.size(); i<n; i++)
 412                     {
 413                         // get the provider name
 414                         Uint32 pos = pInstances[i].findProperty("Name");
 415             
 416                         if ( pos != PEG_NOT_FOUND )
 417                         {
 418                             pInstances[i].getProperty(pos).getValue().get(providerName);
 419             
 420 karl  1.81                  PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 421 sage  1.75                               "providerName = " + providerName + " found.");
 422                             providerNames.append(providerName);
 423                         }
 424                     }
 425                 }
 426             
 427 kumpf 1.59      PEG_METHOD_EXIT();
 428 sage  1.75  
 429                 return providerNames;
 430 mike  1.2   }
 431             
 432 kumpf 1.109 /*  Common Dispatcher callback for response aggregation.
 433             */
 434             void CIMOperationRequestDispatcher::_forwardForAggregationCallback(
 435                 AsyncOpNode *op,
 436                 MessageQueue *q,
 437                 void *parm)
 438 mday  1.70  {
 439 karl  1.81      PEG_METHOD_ENTER(TRC_DISPATCHER,
 440 kumpf 1.109         "CIMOperationRequestDispatcher::_forwardForAggregationCallback");
 441             
 442                 CIMOperationRequestDispatcher *service =
 443                     static_cast<CIMOperationRequestDispatcher *>(q);
 444             
 445                 AsyncRequest *asyncRequest = static_cast<AsyncRequest *>(op->get_request());
 446                 AsyncReply *asyncReply = static_cast<AsyncReply *>(op->get_response());
 447 kumpf 1.73  
 448 kumpf 1.109     OperationAggregate* poA = reinterpret_cast<OperationAggregate*>(parm);
 449                 PEGASUS_ASSERT(poA != 0);
 450 mday  1.70  
 451 kumpf 1.109     // Verify that the aggregator is valid.
 452                 PEGASUS_ASSERT(poA->valid());
 453             
 454                 CIMResponseMessage *response;
 455             
 456                 Uint32 msgType = asyncReply->getType();
 457             
 458                 if (msgType == async_messages::ASYNC_LEGACY_OP_RESULT)
 459                 {
 460                     response = reinterpret_cast<CIMResponseMessage *>
 461                         ((static_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
 462                 }
 463                 else if (msgType == async_messages::ASYNC_MODULE_OP_RESULT)
 464                 {
 465                     response = reinterpret_cast<CIMResponseMessage *>
 466                         ((static_cast<AsyncModuleOperationResult *>(asyncReply))->get_result());
 467                 }
 468                 else
 469                 {
 470                     // Error
 471                 }
 472 mday  1.82  
 473 kumpf 1.109     PEGASUS_ASSERT(response != 0);
 474                 PEGASUS_ASSERT(response->messageId == poA->_messageId);
 475 karl  1.96  
 476 kumpf 1.109     poA->appendResponse(response);
 477                 /*cout << "KSTEST counts " 
 478                       << "total issued = " << poA->totalIssued()
 479                       << "number responses = " <<  poA->numberResponses()
 480                       << " Total Operations outstanding = " << size
 481                       << endl;*/
 482 karl  1.96  
 483 kumpf 1.109     delete asyncRequest;
 484                 delete asyncReply;
 485                 op->release();
 486                 service->return_op(op);
 487 karl  1.96  
 488 kumpf 1.109     // If all responses received, call the postProcessor
 489                 if (poA->totalIssued() == poA->numberResponses())
 490                 {
 491                     service->handleOperationResponseAggregation(poA);
 492                 }
 493 karl  1.96  
 494 kumpf 1.109     PEG_METHOD_EXIT();
 495 mday  1.70  }
 496             
 497 kumpf 1.109 
 498             /*  Common Dispatcher callback.
 499 karl  1.97  */
 500 kumpf 1.109 void CIMOperationRequestDispatcher::_forwardRequestCallback(
 501                 AsyncOpNode *op,
 502                 MessageQueue *q,
 503                 void *parm)
 504 karl  1.96  {
 505                 PEG_METHOD_ENTER(TRC_DISPATCHER,
 506 kumpf 1.109         "CIMOperationRequestDispatcher::_forwardRequestCallback");
 507 karl  1.96  
 508 kumpf 1.109     CIMOperationRequestDispatcher *service =
 509                     static_cast<CIMOperationRequestDispatcher *>(q);
 510 karl  1.96  
 511 kumpf 1.109     AsyncRequest *asyncRequest = static_cast<AsyncRequest *>(op->get_request());
 512                 AsyncReply *asyncReply = static_cast<AsyncReply *>(op->get_response());
 513 karl  1.96  
 514 kumpf 1.109     CIMResponseMessage *response;
 515 karl  1.96  
 516 kumpf 1.109     Uint32 msgType =  asyncReply->getType();
 517 karl  1.96  
 518 kumpf 1.109     if(msgType == async_messages::ASYNC_LEGACY_OP_RESULT)
 519                 {
 520                     response = reinterpret_cast<CIMResponseMessage *>
 521                         ((static_cast<AsyncLegacyOperationResult *>(asyncReply))->get_result());
 522                 }
 523                 else if(msgType == async_messages::ASYNC_MODULE_OP_RESULT)
 524                 {
 525                     response = reinterpret_cast<CIMResponseMessage *>
 526                         ((static_cast<AsyncModuleOperationResult *>(asyncReply))->get_result());
 527                 }
 528                 else
 529                 {
 530                     // Error
 531                 }
 532 karl  1.96  
 533 kumpf 1.109     PEGASUS_ASSERT(response != 0);
 534 karl  1.96        
 535 kumpf 1.109     // ensure that the destination queue is in response->dest
 536 karl  1.96  #ifdef PEGASUS_ARCHITECTURE_IA64
 537 kumpf 1.109     response->dest = (Uint64)parm;
 538 karl  1.96  #else
 539 kumpf 1.109     response->dest = (Uint32)parm;
 540 karl  1.96  #endif
 541             
 542 kumpf 1.109     PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 543                     "Forwarding " + String(MessageTypeToString(response->getType())) + 
 544                     " via Callback to " + 
 545                     ((MessageQueue::lookup(response->dest)) ? 
 546                      String( ((MessageQueue::lookup(response->dest))->getQueueName()) ) : 
 547                      String("BAD queue name")));
 548             
 549                 if(parm != 0 )
 550                     service->SendForget(response);
 551                 else 
 552                     delete response;
 553             
 554                 delete asyncRequest;
 555                 delete asyncReply;
 556                 op->release();
 557                 service->return_op(op);
 558 karl  1.96  
 559 kumpf 1.109     PEG_METHOD_EXIT();
 560 karl  1.96  }
 561             
 562             
 563 kumpf 1.61  void CIMOperationRequestDispatcher::_forwardRequestToService(
 564                 const String& serviceName,
 565                 CIMRequestMessage* request,
 566                 CIMResponseMessage*& response)
 567             {
 568                 PEG_METHOD_ENTER(TRC_DISPATCHER,
 569 kumpf 1.73          "CIMOperationRequestDispatcher::_forwardRequestToService");
 570 kumpf 1.61  
 571                 Array<Uint32> serviceIds;
 572                 find_services(serviceName, 0, 0, &serviceIds);
 573                 PEGASUS_ASSERT(serviceIds.size() != 0);
 574             
 575                 AsyncOpNode * op = this->get_op();
 576             
 577                 AsyncLegacyOperationStart * asyncRequest =
 578                     new AsyncLegacyOperationStart(
 579             	    get_next_xid(),
 580             	    op,
 581             	    serviceIds[0],
 582             	    request,
 583             	    this->getQueueId());
 584 karl  1.96  
 585 mday  1.82      asyncRequest->dest = serviceIds[0];
 586                 
 587                 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 588 kumpf 1.109         "Forwarding " + String(MessageTypeToString(request->getType())) + 
 589                     " to service " + serviceName + ". Response should go to queue " + 
 590                     ((MessageQueue::lookup(request->queueIds.top())) ? 
 591                      String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) : 
 592                      String("BAD queue name")));
 593             
 594 mday  1.82      SendAsync(op, 
 595 mday  1.70  	      serviceIds[0],
 596 kumpf 1.109 	      CIMOperationRequestDispatcher::_forwardRequestCallback,
 597 mday  1.70  	      this,
 598             	      (void *)request->queueIds.top());
 599 karl  1.81  
 600 kumpf 1.109     PEG_METHOD_EXIT();
 601 kumpf 1.61  }
 602             
 603 karl  1.84  /* Send a OperationsRequest message to a Control provider - Forwards the message
 604                defined in request to the Control Provider defined in controlProviderName.
 605                This is an internal function.
 606             */
 607 kumpf 1.61  void CIMOperationRequestDispatcher::_forwardRequestToControlProvider(
 608                 const String& serviceName,
 609                 const String& controlProviderName,
 610                 CIMRequestMessage* request,
 611                 CIMResponseMessage*& response)
 612             {
 613 kumpf 1.109     PEG_METHOD_ENTER(TRC_DISPATCHER,
 614 kumpf 1.73          "CIMOperationRequestDispatcher::_forwardRequestToControlProvider");
 615 kumpf 1.61  
 616                 Array<Uint32> serviceIds;
 617                 find_services(serviceName, 0, 0, &serviceIds);
 618                 PEGASUS_ASSERT(serviceIds.size() != 0);
 619             
 620                 AsyncOpNode * op = this->get_op();
 621             
 622                 AsyncModuleOperationStart * moduleControllerRequest =
 623                     new AsyncModuleOperationStart(
 624             	    get_next_xid(),
 625             	    op,
 626             	    serviceIds[0],
 627             	    this->getQueueId(),
 628             	    true,
 629             	    controlProviderName,
 630             	    request);
 631 mday  1.82      
 632                 PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 633 kumpf 1.109         "Forwarding " + String(MessageTypeToString(request->getType())) + 
 634                     " to service " + serviceName +
 635                     ", control provider " + controlProviderName +
 636                     ". Response should go to queue " + 
 637                     ((MessageQueue::lookup(request->queueIds.top())) ? 
 638                      String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) : 
 639                      String("BAD queue name")));
 640             
 641                 // Send to the Control provider
 642 mday  1.82      SendAsync(op, 
 643              	      serviceIds[0],
 644 kumpf 1.109  	      CIMOperationRequestDispatcher::_forwardRequestCallback,
 645 mday  1.82   	      this,
 646              	      (void *)request->queueIds.top());
 647 kumpf 1.61  
 648                 PEG_METHOD_EXIT();
 649             }
 650 karl  1.96  
 651             
 652 karl  1.84  /* This function simply decides based on the controlProviderNameField
 653                 whether to forward to Service or ControlProvider.
 654 kumpf 1.109     If controlProviderName String empty, ToService, else toControlProvider.
 655                 This function specifically forwards requests for response aggregation.
 656             */
 657             void CIMOperationRequestDispatcher::_forwardRequestForAggregation(
 658                 const String& serviceName,
 659                 const String& controlProviderName,
 660                 CIMRequestMessage* request,
 661                 OperationAggregate* poA)
 662             {
 663                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 664                     "CIMOperationRequestDispatcher::_forwardRequestForAggregation");
 665             
 666                 Array<Uint32> serviceIds;
 667                 find_services(serviceName, 0, 0, &serviceIds);
 668                 PEGASUS_ASSERT(serviceIds.size() != 0);
 669             
 670                 AsyncOpNode * op = this->get_op();
 671             
 672                 // If ControlProviderName empty, forward to service.
 673                 if (controlProviderName == String::EMPTY)
 674                 {
 675 kumpf 1.109 	AsyncLegacyOperationStart * asyncRequest =
 676             	    new AsyncLegacyOperationStart(
 677             		get_next_xid(),
 678             		op,
 679             		serviceIds[0],
 680             		request,
 681             		this->getQueueId());
 682             
 683                     PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 684                         "Forwarding " + String(MessageTypeToString(request->getType())) + 
 685                         " to service " + serviceName + ". Response should go to queue " + 
 686                         ((MessageQueue::lookup(request->queueIds.top())) ? 
 687                          String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) : 
 688                          String("BAD queue name")));
 689             
 690             	SendAsync(op, 
 691             		  serviceIds[0],
 692             		  CIMOperationRequestDispatcher::_forwardForAggregationCallback,
 693             		  this,
 694             		  poA);
 695                 }
 696 kumpf 1.109     else
 697                 {
 698                    AsyncModuleOperationStart * moduleControllerRequest =
 699             	   new AsyncModuleOperationStart(
 700             	       get_next_xid(),
 701             	       op,
 702             	       serviceIds[0],
 703             	       this->getQueueId(),
 704             	       true,
 705             	       controlProviderName,
 706             	       request);
 707             
 708                     PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 709                         "Forwarding " + String(MessageTypeToString(request->getType())) + 
 710                         " to service " + serviceName +
 711                         ", control provider " + controlProviderName +
 712                         ". Response should go to queue " + 
 713                         ((MessageQueue::lookup(request->queueIds.top())) ? 
 714                          String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) : 
 715                          String("BAD queue name")));
 716             
 717 kumpf 1.109        SendAsync(op, 
 718             		 serviceIds[0],
 719             		 CIMOperationRequestDispatcher::_forwardForAggregationCallback,
 720             		 this,
 721             		 poA);
 722                 }
 723             
 724                 PEG_METHOD_EXIT();
 725             }
 726             
 727             /* This function simply decides based on the controlProviderNameField
 728                 whether to forward to Service or ControlProvider.
 729 karl  1.84      If controlProviderName String empty, ToService, else toControlProvider
 730 karl  1.97      Convience coding to simply other functions.
 731                 ATTN:  KS 28 MayWe want to move to use this call exclusively but with the other problems
 732                 I did not make the change universal. 
 733 karl  1.84  */
 734             void CIMOperationRequestDispatcher::_forwardRequest(
 735                 const String& className,        // only for diagnostic
 736                 const String& serviceName,
 737                 const String& controlProviderName,
 738 karl  1.96      CIMRequestMessage* request)
 739 karl  1.84  {
 740                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 741                     "CIMOperationRequestDispatcher::_forwardRequest");
 742 karl  1.96  
 743                 Array<Uint32> serviceIds;
 744                 find_services(serviceName, 0, 0, &serviceIds);
 745                 PEGASUS_ASSERT(serviceIds.size() != 0);
 746             
 747                 AsyncOpNode * op = this->get_op();
 748             
 749                 // If ControlProviderName empty, forward to service.
 750 karl  1.84      if (controlProviderName == String::EMPTY)
 751                 {
 752 karl  1.96  	AsyncLegacyOperationStart * asyncRequest =
 753             	    new AsyncLegacyOperationStart(
 754             		get_next_xid(),
 755             		op,
 756             		serviceIds[0],
 757             		request,
 758             		this->getQueueId());
 759             
 760             	asyncRequest->dest = serviceIds[0];
 761             
 762 kumpf 1.109         PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 763                         "Forwarding " + String(MessageTypeToString(request->getType())) + 
 764                         " on class " + className + " to service " + serviceName +
 765                         ". Response should go to queue " + 
 766                         ((MessageQueue::lookup(request->queueIds.top())) ? 
 767                          String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) : 
 768                          String("BAD queue name")));
 769             
 770 karl  1.96  	SendAsync(op, 
 771             		  serviceIds[0],
 772 kumpf 1.109 		  CIMOperationRequestDispatcher::_forwardRequestCallback,
 773 karl  1.96  		  this,
 774             		  (void *)request->queueIds.top());
 775 karl  1.84      }
 776                 else
 777                 {
 778 karl  1.96         AsyncModuleOperationStart * moduleControllerRequest =
 779             	   new AsyncModuleOperationStart(
 780             	       get_next_xid(),
 781             	       op,
 782             	       serviceIds[0],
 783             	       this->getQueueId(),
 784             	       true,
 785             	       controlProviderName,
 786             	       request);
 787             
 788 kumpf 1.109         PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL3, 
 789                         "Forwarding " + String(MessageTypeToString(request->getType())) + 
 790                         " on class " + className + " to service " + serviceName +
 791                         ", control provider " + controlProviderName +
 792                         ". Response should go to queue " + 
 793                         ((MessageQueue::lookup(request->queueIds.top())) ? 
 794                          String( ((MessageQueue::lookup(request->queueIds.top()))->getQueueName()) ) : 
 795                          String("BAD queue name")));
 796 karl  1.96  
 797 kumpf 1.109        // Send to the Control provider
 798 karl  1.96         SendAsync(op, 
 799             		 serviceIds[0],
 800 kumpf 1.109 		 CIMOperationRequestDispatcher::_forwardRequestCallback,
 801 karl  1.96  		 this,
 802             		 (void *)request->queueIds.top());
 803 karl  1.84      }
 804             
 805                 PEG_METHOD_EXIT();
 806             }
 807             
 808 karl  1.96  /*********************************************************************/
 809             //
 810             //   Temp hack to get responses back to post processors. KS
 811 karl  1.97  //   ATTN: This was temporary to isolate the aggregation processing.
 812             //   We need to combine this with the other callbacks to create a single
 813             //   set of functions
 814             //
 815             //   The aggregator includes an aggregation object that is used to 
 816             //   accumulate responses.  It is attached to each request sent and
 817             //   received back as part of the response call back in the "parm"
 818             //   Responses are aggregated until the count reaches the sent count and
 819             //   then the aggregation code is called to create a single response from
 820             //   the accumulated responses.
 821 karl  1.96  //
 822             /*********************************************************************/
 823             
 824 karl  1.97  /* aggregate the responses for enumerateinstancenames into a single response
 825             */
 826 kumpf 1.109 void CIMOperationRequestDispatcher::handleEnumerateInstanceNamesResponse(OperationAggregate* poA)
 827 karl  1.97  {
 828                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 829                     "CIMOperationRequestDispatcher::handleEnumerateInstanceNamesResponse");
 830                 CIMEnumerateInstanceNamesResponseMessage * toResponse = 
 831 kumpf 1.109 	(CIMEnumerateInstanceNamesResponseMessage *) poA->getResponse(0);
 832             
 833                 // Work backward and delete each response off the end of the array
 834                 for(Uint32 i = poA->numberResponses() - 1; i > 0; i--)
 835 karl  1.97      {
 836                 	CIMEnumerateInstanceNamesResponseMessage *fromResponse = 
 837                 	    (CIMEnumerateInstanceNamesResponseMessage *)poA->getResponse(i);
 838 kumpf 1.109     
 839 karl  1.97      	for (Uint32 j = 0; j < fromResponse->instanceNames.size(); j++)
 840                 	{
 841 kumpf 1.109     	    // Duplicate test goes here. 
 842 karl  1.97              // If the from response already contains the name, do not put it.
 843                         /* ATTN: KS 28 May 2002 - Temporarily disable the duplicate delete code.
 844                         if (!Contains( toResponse->instanceNames, fromResponse->instanceNames[j]))
 845                         {
 846                             toResponse->instanceNames.append(fromResponse->instanceNames[j]);
 847                         }
 848                         */
 849                         toResponse->instanceNames.append(fromResponse->instanceNames[j]);
 850                 	}
 851 kumpf 1.109     	poA->deleteResponse(i);
 852 karl  1.97      }
 853 kumpf 1.109 
 854                 toResponse->dest = poA->dest;
 855 karl  1.97      PEG_METHOD_EXIT();
 856             }
 857 kumpf 1.109 
 858 karl  1.97  /* The function aggregates individual EnumerateInstance Responses into a single response
 859                for return to the client. It simply aggregates the responses into the
 860                first response (0).  
 861                ATTN: KS 28 May 2002 - At this time we do not do the following:
 862                1. eliminate duplicates.
 863                2. Order so we eliminate duplicates from top down
 864                3. prune the properties if localOnly or deepInheritance are set.
 865                This function does not send any responses. 
 866             */
 867 kumpf 1.109 void CIMOperationRequestDispatcher::handleEnumerateInstancesResponse(OperationAggregate* poA)
 868 karl  1.97  {
 869                 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
 870                     "CIMOperationRequestDispatcher::handleEnumerateInstancesResponse");
 871                 
 872                 CIMEnumerateInstancesResponseMessage * toResponse = 
 873 kumpf 1.109 	(CIMEnumerateInstancesResponseMessage *) poA->getResponse(0);
 874             
 875                 // Work backward and delete each response off the end of the array
 876                 for(Uint32 i = poA->numberResponses() - 1; i > 0; i--)
 877 karl  1.97      {
 878                 	CIMEnumerateInstancesResponseMessage *fromResponse = 
 879                 	    (CIMEnumerateInstancesResponseMessage *)poA->getResponse(i);
 880                 
 881                 	for (Uint32 j = 0; j < fromResponse->cimNamedInstances.size(); j++)
 882                 	{
 883                 	    toResponse->cimNamedInstances.append(fromResponse->cimNamedInstances[j]);
 884                 	}
 885                 	poA->deleteResponse(i);
 886                 }
 887                 PEG_METHOD_EXIT();
 888             }
 889             
 890             /* handleOperationResponseAggregation - handles all of the general functions of
 891 kumpf 1.109    aggregation including:
 892 karl  1.97     1. checking for good responses and eliminating any error responses
 893                2. issuing an error if all responses are bad.
 894                3. calling the proper function for merging
 895                4. Issuing the single merged response.
 896             */
 897             void CIMOperationRequestDispatcher::handleOperationResponseAggregation(
 898 kumpf 1.109    OperationAggregate* poA)
 899 karl  1.96  {
 900                 PEG_METHOD_ENTER(TRC_DISPATCHER,
 901 karl  1.97          "CIMOperationRequestDispatcher::handleOperationResponseAggregation");
 902             
 903                Uint32 totalResponses = poA->numberResponses();
 904 karl  1.96  
 905 karl  1.97     PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4, 
 906 kumpf 1.109             Formatter::format(" Response Aggregation  type $1 responses $0",
 907 karl  1.97                 totalResponses,
 908                            String(MessageTypeToString(poA->getRequestType()))));
 909 karl  1.96      
 910                /* If there was only one response, simply forward it on.
 911                */
 912 karl  1.97     // Add the destination queue ID to the first response.
 913             
 914                CIMResponseMessage* response = poA->getResponse(0);
 915             
 916 kumpf 1.109    response->dest = poA->dest;
 917             
 918 karl  1.96     if(totalResponses == 1)
 919                {
 920 karl  1.97         SendForget(poA->getResponse(0));
 921             
 922                    delete poA;
 923             
 924 karl  1.96         PEG_METHOD_EXIT();
 925                    return;
 926                }
 927             
 928                 /* Determine if there any "good" responses. If all responses are error
 929                    we return CIMException.
 930                 */
 931                Uint32 errorCount = 0;
 932                for(Uint32 i = 0; i < totalResponses; i++)
 933                {
 934 karl  1.97         CIMResponseMessage *response = poA->getResponse(i);
 935 karl  1.96         if (response->cimException.getCode() != CIM_ERR_SUCCESS)
 936             	   errorCount++;
 937                }
 938             
 939 karl  1.97     PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
 940 kumpf 1.109             Formatter::format("Post Processor $0 total responses $1 errors"
 941 karl  1.97                                , totalResponses, errorCount));
 942             
 943                //cout << "KSTEST error count = " << errorCount 
 944                //     << " total Responses = " << totalResponses << endl;
 945                
 946 karl  1.96     // If all responses are in error
 947                if(errorCount == totalResponses)
 948                {
 949             	// Here we need to send some other response error message because
 950             	// which one we pick is a crapshoot.  They could all be different
 951             	// ATTN: For the moment, simply send the first and delete all others.
 952 kumpf 1.109         SendForget(poA->getResponse(0));
 953                     for(Uint32 j = totalResponses - 1; j > 0; j--)
 954                     {
 955                         poA->deleteResponse(j);
 956                     }
 957                     delete poA;
 958 karl  1.97  
 959 kumpf 1.109         PEG_METHOD_EXIT();
 960                     return;
 961 karl  1.96     }
 962             
 963                 /* We have at least one good response.  Now delete the error responses.  We will
 964             	not pass them back to the client.
 965             	We remove them from the array. Note that this means that the
 966             	size must be repeatedly recalculated.
 967                 */
 968                if(errorCount > 0)
 969                {
 970 karl  1.97         for(Uint32 j = 0; j < poA->numberResponses(); j++)
 971 karl  1.96         {
 972 karl  1.97      	   CIMResponseMessage* response = poA->getResponse(j);
 973                 	   if (response->cimException.getCode() != CIM_ERR_SUCCESS)
 974                 	   {
 975                 	       poA->deleteResponse(j);
 976 kumpf 1.109                j--;
 977 karl  1.97             }
 978 karl  1.96         }
 979                }
 980 karl  1.97     /* Merge the responses into a single CIMEnumerateInstanceNamesResponse
 981                */
 982                 //cout << "KSTEST total Responses " << totalResponses 
 983 kumpf 1.109     //    << " total Good Responses " << poA->numberResponses()<< endl;
 984 karl  1.97  
 985                 // If more than one response, go to proper aggregation function
 986                 if(poA->numberResponses() > 1)
 987                 {
 988 karl  1.96      // Multiple responses. Merge them by appending the response components
 989                 // to the first entry
 990             
 991 karl  1.97          // Call the appropriate function for merging.
 992                     if (poA->getRequestType() == CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE)
 993                     {
 994                         handleEnumerateInstanceNamesResponse(poA);
 995                     }
 996                     else if (poA->getRequestType() == CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE)
 997                     {
 998                         handleEnumerateInstancesResponse(poA);
 999                     }
1000                 }
1001             
1002                 // Send the remaining response and delete the aggregator.
1003                 SendForget(poA->getResponse(0));
1004                 delete poA;
1005              
1006                 PEG_METHOD_EXIT();
1007             }
1008             /*******End of the functions hacked for aggregation***************************/
1009 kumpf 1.61  
1010 mike  1.2   void CIMOperationRequestDispatcher::_enqueueResponse(
1011 mday  1.36     CIMRequestMessage* request,
1012                CIMResponseMessage* response)
1013 mike  1.2   {
1014 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1015 kumpf 1.73        "CIMOperationRequestDispatcher::_enqueueResponse");
1016 kumpf 1.59  
1017 mday  1.36     // Use the same key as used in the request:
1018 mike  1.2   
1019 mday  1.36     response->setKey(request->getKey());
1020 mday  1.79     response->dest = request->queueIds.top();
1021 karl  1.81  
1022 mday  1.36     if( true == Base::_enqueueResponse(request, response))
1023 kumpf 1.59     {
1024                   PEG_METHOD_EXIT();
1025 mday  1.36        return;
1026 kumpf 1.59     }
1027 karl  1.81  
1028 mday  1.36     MessageQueue * queue = MessageQueue::lookup(request->queueIds.top());
1029                PEGASUS_ASSERT(queue != 0 );
1030 karl  1.81  
1031 mday  1.36     queue->enqueue(response);
1032 kumpf 1.59  
1033                PEG_METHOD_EXIT();
1034 mday  1.36  }
1035 mday  1.48  
1036 mday  1.36  void CIMOperationRequestDispatcher::handleEnqueue(Message *request)
1037             {
1038 kumpf 1.40     PEG_METHOD_ENTER(TRC_DISPATCHER,
1039                   "CIMOperationRequestDispatcher::handleEnqueue(Message *request)");
1040 mday  1.89     PEGASUS_START_LEAK_CHECK();
1041 mday  1.36     if(!request)
1042 kumpf 1.40     {
1043                   PEG_METHOD_EXIT();
1044 mday  1.36        return;
1045 kumpf 1.40     }
1046 karl  1.81  
1047 mday  1.36     switch(request->getType())
1048                {
1049 karl  1.81  
1050 mday  1.36        case CIM_GET_CLASS_REQUEST_MESSAGE:
1051             	 handleGetClassRequest((CIMGetClassRequestMessage*)request);
1052             	 break;
1053             
1054                   case CIM_GET_INSTANCE_REQUEST_MESSAGE:
1055             	 handleGetInstanceRequest((CIMGetInstanceRequestMessage*)request);
1056             	 break;
1057             
1058                   case CIM_DELETE_CLASS_REQUEST_MESSAGE:
1059             	 handleDeleteClassRequest(
1060             	    (CIMDeleteClassRequestMessage*)request);
1061             	 break;
1062             
1063                   case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
1064             	 handleDeleteInstanceRequest(
1065             	    (CIMDeleteInstanceRequestMessage*)request);
1066             	 break;
1067             
1068                   case CIM_CREATE_CLASS_REQUEST_MESSAGE:
1069             	 handleCreateClassRequest((CIMCreateClassRequestMessage*)request);
1070             	 break;
1071 mday  1.36  
1072                   case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
1073             	 handleCreateInstanceRequest(
1074             	    (CIMCreateInstanceRequestMessage*)request);
1075             	 break;
1076             
1077                   case CIM_MODIFY_CLASS_REQUEST_MESSAGE:
1078             	 handleModifyClassRequest((CIMModifyClassRequestMessage*)request);
1079             	 break;
1080             
1081                   case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
1082             	 handleModifyInstanceRequest(
1083             	    (CIMModifyInstanceRequestMessage*)request);
1084             	 break;
1085             
1086                   case CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE:
1087             	 handleEnumerateClassesRequest(
1088             	    (CIMEnumerateClassesRequestMessage*)request);
1089             	 break;
1090             
1091                   case CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE:
1092 mday  1.36  	 handleEnumerateClassNamesRequest(
1093             	    (CIMEnumerateClassNamesRequestMessage*)request);
1094             	 break;
1095             
1096                   case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
1097             	 handleEnumerateInstancesRequest(
1098             	    (CIMEnumerateInstancesRequestMessage*)request);
1099             	 break;
1100             
1101                   case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
1102             	 handleEnumerateInstanceNamesRequest(
1103             	    (CIMEnumerateInstanceNamesRequestMessage*)request);
1104             	 break;
1105             
1106                   case CIM_EXEC_QUERY_REQUEST_MESSAGE:
1107 kumpf 1.68  	 handleExecQueryRequest(
1108             	    (CIMExecQueryRequestMessage*)request);
1109 mday  1.36  	 break;
1110             
1111                   case CIM_ASSOCIATORS_REQUEST_MESSAGE:
1112             	 handleAssociatorsRequest((CIMAssociatorsRequestMessage*)request);
1113             	 break;
1114             
1115                   case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
1116             	 handleAssociatorNamesRequest(
1117             	    (CIMAssociatorNamesRequestMessage*)request);
1118             	 break;
1119             
1120                   case CIM_REFERENCES_REQUEST_MESSAGE:
1121             	 handleReferencesRequest((CIMReferencesRequestMessage*)request);
1122             	 break;
1123             
1124                   case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
1125             	 handleReferenceNamesRequest(
1126             	    (CIMReferenceNamesRequestMessage*)request);
1127             	 break;
1128             
1129                   case CIM_GET_PROPERTY_REQUEST_MESSAGE:
1130 mday  1.36  	 handleGetPropertyRequest(
1131             	    (CIMGetPropertyRequestMessage*)request);
1132             	 break;
1133             
1134                   case CIM_SET_PROPERTY_REQUEST_MESSAGE:
1135             	 handleSetPropertyRequest(
1136             	    (CIMSetPropertyRequestMessage*)request);
1137             	 break;
1138             
1139                   case CIM_GET_QUALIFIER_REQUEST_MESSAGE:
1140             	 handleGetQualifierRequest((CIMGetQualifierRequestMessage*)request);
1141             	 break;
1142             
1143                   case CIM_SET_QUALIFIER_REQUEST_MESSAGE:
1144             	 handleSetQualifierRequest((CIMSetQualifierRequestMessage*)request);
1145             	 break;
1146             
1147                   case CIM_DELETE_QUALIFIER_REQUEST_MESSAGE:
1148             	 handleDeleteQualifierRequest(
1149             	    (CIMDeleteQualifierRequestMessage*)request);
1150             	 break;
1151 mday  1.36  
1152                   case CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE:
1153             	 handleEnumerateQualifiersRequest(
1154             	    (CIMEnumerateQualifiersRequestMessage*)request);
1155             	 break;
1156             
1157                   case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
1158             	 handleInvokeMethodRequest(
1159             	    (CIMInvokeMethodRequestMessage*)request);
1160             	 break;
1161                }
1162             
1163                delete request;
1164 mday  1.89  
1165 mike  1.2   }
1166             
1167             // allocate a CIM Operation_async,  opnode, context, and response handler
1168             // initialize with pointers to async top and async bottom
1169             // link to the waiting q
1170             void CIMOperationRequestDispatcher::handleEnqueue()
1171             {
1172 kumpf 1.40     PEG_METHOD_ENTER(TRC_DISPATCHER,
1173 kumpf 1.73        "CIMOperationRequestDispatcher::handleEnqueue");
1174 kumpf 1.40  
1175 mday  1.36     Message* request = dequeue();
1176             
1177                if(request)
1178                   handleEnqueue(request);
1179 kumpf 1.40  
1180                PEG_METHOD_EXIT();
1181 mday  1.36  }
1182             
1183             void CIMOperationRequestDispatcher::handleGetClassRequest(
1184                CIMGetClassRequestMessage* request)
1185             {
1186 chip  1.46     PEG_METHOD_ENTER(TRC_DISPATCHER,
1187 kumpf 1.73        "CIMOperationRequestDispatcher::handleGetClassRequest");
1188 kumpf 1.40  
1189 sage  1.77     STAT_PROVIDERSTART
1190             
1191 mday  1.36     // ATTN: Need code here to expand partial class!
1192             
1193 kumpf 1.72     CIMException cimException;
1194 mday  1.36     CIMClass cimClass;
1195 chip  1.39  
1196 mday  1.36     _repository->read_lock();
1197 chip  1.39  
1198 mday  1.36     try
1199                {
1200                   cimClass = _repository->getClass(
1201 karl  1.97      	 request->nameSpace,
1202                 	 request->className,
1203                 	 request->localOnly,
1204                 	 request->includeQualifiers,
1205                 	 request->includeClassOrigin,
1206                 	 request->propertyList.getPropertyNameArray());
1207 mday  1.36     }
1208                catch(CIMException& exception)
1209                {
1210 kumpf 1.72        cimException = exception;
1211 mday  1.36     }
1212                catch(Exception& exception)
1213                {
1214 kumpf 1.72        cimException =
1215                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1216 mday  1.36     }
1217                catch(...)
1218                {
1219 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1220 mday  1.36     }
1221             
1222                _repository->read_unlock();
1223             
1224 sage  1.77     STAT_PROVIDEREND
1225             
1226 mday  1.36     CIMGetClassResponseMessage* response = new CIMGetClassResponseMessage(
1227                   request->messageId,
1228 kumpf 1.72        cimException,
1229 mday  1.36        request->queueIds.copyAndPop(),
1230                   cimClass);
1231             
1232 sage  1.77     STAT_COPYDISPATCHER_REP
1233             
1234 mday  1.36     _enqueueResponse(request, response);
1235 kumpf 1.40     PEG_METHOD_EXIT();
1236 mday  1.36  }
1237             
1238 karl  1.86  
1239 mday  1.36  void CIMOperationRequestDispatcher::handleGetInstanceRequest(
1240                CIMGetInstanceRequestMessage* request)
1241             {
1242 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1243 kumpf 1.73        "CIMOperationRequestDispatcher::handleGetInstanceRequest");
1244 kumpf 1.59  
1245 karl  1.86     // ATTN: Need code here to expand partial instance!
1246 mday  1.36  
1247                // get the class name
1248                String className = request->instanceName.getClassName();
1249 kumpf 1.113 
1250                CIMException checkClassException;
1251                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1252                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1253                {
1254                   CIMGetInstanceResponseMessage* response =
1255                      new CIMGetInstanceResponseMessage(
1256                         request->messageId,
1257                         checkClassException,
1258                         request->queueIds.copyAndPop(),
1259                         CIMInstance());
1260             
1261                   _enqueueResponse(request, response);
1262                   PEG_METHOD_EXIT();
1263                   return;
1264                }
1265             
1266 karl  1.86     //String NameSpace = request->nameSpace;
1267 karl  1.96     // ATTNKSDELETE CIMResponseMessage * response;
1268 kumpf 1.61     String serviceName = String::EMPTY;
1269                String controlProviderName = String::EMPTY;
1270 karl  1.85     String providerName = String::EMPTY;
1271 karl  1.86  // Temp to save old code until we confirm everything runs 7 May ks ATTN P0
1272             #define NEWTEST
1273             #ifdef NEWTEST
1274                if(_lookupNewInstanceProvider(request->nameSpace, className, serviceName,
1275             	    controlProviderName))
1276                 {
1277             	CIMGetInstanceRequestMessage* requestCopy =
1278             	    new CIMGetInstanceRequestMessage(*request);
1279             
1280             	_forwardRequest(className, serviceName, controlProviderName,
1281 karl  1.96  	    requestCopy);
1282 karl  1.86  	PEG_METHOD_EXIT();
1283             	return;
1284                 }
1285             #else
1286 mday  1.36  
1287 kumpf 1.57     // Check for class provided by an internal provider
1288 karl  1.86     if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1289                        controlProviderName))
1290                    hasProvider = true;
1291                else
1292 mday  1.36     {
1293 karl  1.86         // get provider for class
1294                    providerName = _lookupInstanceProvider(request->nameSpace, className);
1295 karl  1.85     }
1296 karl  1.86  
1297                if(providerName != String::EMPTY)
1298 karl  1.85     {
1299 karl  1.86         serviceName = PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP;
1300                    hasProvider = true;
1301 mday  1.36     }
1302 karl  1.86     if(hasProvider)
1303 mday  1.36     {
1304 karl  1.86        CIMGetInstanceRequestMessage* requestCopy =
1305                       new CIMGetInstanceRequestMessage(*request);
1306 chip  1.39  
1307 karl  1.86             _forwardRequest(className, serviceName, controlProviderName,
1308                            requestCopy, response);
1309 chip  1.39  
1310 karl  1.86        PEG_METHOD_EXIT();
1311                   return;
1312 mday  1.36     }
1313 kumpf 1.109 #endif
1314 karl  1.86  
1315                // not internal or found provider, go to default
1316 karl  1.84     if (_repository->isDefaultInstanceProvider())
1317 kumpf 1.47     {
1318 kumpf 1.72        CIMException cimException;
1319 kumpf 1.47        CIMInstance cimInstance;
1320             
1321 sage  1.77        STAT_PROVIDERSTART
1322             
1323 kumpf 1.47        _repository->read_lock();
1324             
1325                   try
1326                   {
1327                      cimInstance = _repository->getInstance(
1328 kumpf 1.109 	    request->nameSpace,
1329             	    request->instanceName,
1330             	    request->localOnly,
1331             	    request->includeQualifiers,
1332             	    request->includeClassOrigin,
1333             	    request->propertyList.getPropertyNameArray());
1334 kumpf 1.47        }
1335                   catch(CIMException& exception)
1336                   {
1337 kumpf 1.72           cimException = exception;
1338 kumpf 1.47        }
1339                   catch(Exception& exception)
1340                   {
1341 kumpf 1.72           cimException =
1342                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1343 kumpf 1.47        }
1344                   catch(...)
1345                   {
1346 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1347 kumpf 1.47        }
1348 mday  1.36  
1349 kumpf 1.47        _repository->read_unlock();
1350 mday  1.36  
1351 sage  1.77        STAT_PROVIDEREND
1352             
1353 kumpf 1.47        CIMGetInstanceResponseMessage* response =
1354                      new CIMGetInstanceResponseMessage(
1355                         request->messageId,
1356 kumpf 1.72              cimException,
1357 kumpf 1.47              request->queueIds.copyAndPop(),
1358                         cimInstance);
1359 mday  1.36  
1360 sage  1.77        STAT_COPYDISPATCHER_REP
1361             
1362 kumpf 1.47        _enqueueResponse(request, response);
1363 mday  1.36     }
1364 kumpf 1.47     else // No provider is registered and the repository isn't the default
1365 mday  1.36     {
1366 kumpf 1.47        CIMGetInstanceResponseMessage* response =
1367                      new CIMGetInstanceResponseMessage(
1368                         request->messageId,
1369 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
1370 kumpf 1.47              request->queueIds.copyAndPop(),
1371                         CIMInstance());
1372             
1373 sage  1.77        STAT_COPYDISPATCHER
1374             
1375 kumpf 1.47        _enqueueResponse(request, response);
1376 mday  1.36     }
1377 kumpf 1.59     PEG_METHOD_EXIT();
1378 mday  1.36  }
1379             
1380             void CIMOperationRequestDispatcher::handleDeleteClassRequest(
1381                CIMDeleteClassRequestMessage* request)
1382             {
1383 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1384 kumpf 1.73        "CIMOperationRequestDispatcher::handleDeleteClassRequest");
1385 kumpf 1.59  
1386 sage  1.77     STAT_PROVIDERSTART
1387             
1388 kumpf 1.72     CIMException cimException;
1389 mday  1.36  
1390                _repository->write_lock();
1391             
1392                try
1393                {
1394                   _repository->deleteClass(
1395             	 request->nameSpace,
1396             	 request->className);
1397                }
1398             
1399                catch(CIMException& exception)
1400                {
1401 kumpf 1.72        cimException = exception;
1402 mday  1.36     }
1403                catch(Exception& exception)
1404                {
1405 kumpf 1.72        cimException =
1406                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1407 mday  1.36     }
1408                catch(...)
1409                {
1410 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1411 mday  1.36     }
1412             
1413                _repository->write_unlock();
1414             
1415 sage  1.77     STAT_PROVIDEREND
1416             
1417 mday  1.36     CIMDeleteClassResponseMessage* response =
1418                   new CIMDeleteClassResponseMessage(
1419             	 request->messageId,
1420 kumpf 1.72  	 cimException,
1421 mday  1.36  	 request->queueIds.copyAndPop());
1422             
1423 sage  1.77     STAT_COPYDISPATCHER_REP
1424             
1425 mday  1.36     _enqueueResponse(request, response);
1426 kumpf 1.59  
1427                PEG_METHOD_EXIT();
1428 mday  1.36  }
1429             
1430             void CIMOperationRequestDispatcher::handleDeleteInstanceRequest(
1431                CIMDeleteInstanceRequestMessage* request)
1432             {
1433 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1434 kumpf 1.73        "CIMOperationRequestDispatcher::handleDeleteInstanceRequest");
1435 kumpf 1.59  
1436 mday  1.36     // get the class name
1437                String className = request->instanceName.getClassName();
1438 kumpf 1.61     CIMResponseMessage * response;
1439 mday  1.82     
1440 kumpf 1.113    CIMException checkClassException;
1441                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1442                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1443                {
1444                   CIMDeleteInstanceResponseMessage* response =
1445                      new CIMDeleteInstanceResponseMessage(
1446                         request->messageId,
1447                         checkClassException,
1448                         request->queueIds.copyAndPop());
1449             
1450                   _enqueueResponse(request, response);
1451                   PEG_METHOD_EXIT();
1452                   return;
1453                }
1454             
1455 kumpf 1.61     String serviceName = String::EMPTY;
1456                String controlProviderName = String::EMPTY;
1457 mday  1.36  
1458 kumpf 1.57     // Check for class provided by an internal provider
1459 kumpf 1.61     if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1460                        controlProviderName))
1461 mday  1.36     {
1462 kumpf 1.61        CIMDeleteInstanceRequestMessage* requestCopy =
1463                      new CIMDeleteInstanceRequestMessage(*request);
1464 chip  1.53  
1465 karl  1.84        _forwardRequest(className,serviceName, controlProviderName,
1466 karl  1.96            requestCopy);
1467 chip  1.53  
1468 kumpf 1.61        PEG_METHOD_EXIT();
1469                   return;
1470 mday  1.36     }
1471             
1472 kumpf 1.43     String providerName = _lookupInstanceProvider(request->nameSpace, className);
1473 mday  1.36  
1474                if(providerName.size() != 0)
1475                {
1476 kumpf 1.61        CIMDeleteInstanceRequestMessage* requestCopy =
1477                       new CIMDeleteInstanceRequestMessage(*request);
1478 chip  1.53  
1479 kumpf 1.61        _forwardRequestToService(
1480 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
1481 chip  1.53  
1482             
1483 kumpf 1.61        PEG_METHOD_EXIT();
1484                   return;
1485 mday  1.36     }
1486 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
1487                {
1488 kumpf 1.72        CIMException cimException;
1489 kumpf 1.47  
1490 sage  1.77        STAT_PROVIDERSTART
1491             
1492 kumpf 1.47        _repository->write_lock();
1493 mday  1.36  
1494 kumpf 1.47        try
1495                   {
1496                      _repository->deleteInstance(
1497             	    request->nameSpace,
1498             	    request->instanceName);
1499                   }
1500                   catch(CIMException& exception)
1501                   {
1502 kumpf 1.72           cimException = exception;
1503 kumpf 1.47        }
1504                   catch(Exception& exception)
1505                   {
1506 kumpf 1.72           cimException =
1507                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1508 kumpf 1.47        }
1509                   catch(...)
1510                   {
1511 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1512 kumpf 1.47        }
1513             
1514                   _repository->write_unlock();
1515 mday  1.36  
1516 sage  1.77        STAT_PROVIDEREND
1517             
1518 kumpf 1.47        CIMDeleteInstanceResponseMessage* response =
1519                      new CIMDeleteInstanceResponseMessage(
1520             	    request->messageId,
1521 kumpf 1.72  	    cimException,
1522 kumpf 1.47  	    request->queueIds.copyAndPop());
1523 mday  1.36  
1524 sage  1.77        STAT_COPYDISPATCHER_REP
1525             
1526 kumpf 1.47        _enqueueResponse(request, response);
1527 mday  1.36     }
1528 kumpf 1.47     else // No provider is registered and the repository isn't the default
1529 mday  1.36     {
1530 kumpf 1.47        CIMDeleteInstanceResponseMessage* response =
1531                      new CIMDeleteInstanceResponseMessage(
1532                         request->messageId,
1533 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
1534 kumpf 1.47              request->queueIds.copyAndPop());
1535             
1536 sage  1.77        STAT_COPYDISPATCHER
1537             
1538 kumpf 1.47        _enqueueResponse(request, response);
1539 mday  1.36     }
1540 kumpf 1.59  
1541                PEG_METHOD_EXIT();
1542 mday  1.36  }
1543             
1544             void CIMOperationRequestDispatcher::handleCreateClassRequest(
1545                CIMCreateClassRequestMessage* request)
1546             {
1547 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1548 kumpf 1.73        "CIMOperationRequestDispatcher::handleCreateClassRequest");
1549 kumpf 1.59  
1550 kumpf 1.72     CIMException cimException;
1551 mday  1.36  
1552 sage  1.77     STAT_PROVIDERSTART
1553             
1554 mday  1.36     _repository->write_lock();
1555             
1556                try
1557                {
1558                   _repository->createClass(
1559             	 request->nameSpace,
1560             	 request->newClass);
1561                }
1562             
1563                catch(CIMException& exception)
1564                {
1565 kumpf 1.72        cimException = exception;
1566 mday  1.36     }
1567                catch(Exception& exception)
1568                {
1569 kumpf 1.72        cimException =
1570                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1571 mday  1.36     }
1572                catch(...)
1573                {
1574 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1575 mday  1.36     }
1576             
1577                _repository->write_unlock();
1578             
1579 sage  1.77     STAT_PROVIDERSTART
1580             
1581 mday  1.36     CIMCreateClassResponseMessage* response =
1582                   new CIMCreateClassResponseMessage(
1583             	 request->messageId,
1584 kumpf 1.72  	 cimException,
1585 mday  1.36  	 request->queueIds.copyAndPop());
1586             
1587 sage  1.77     STAT_COPYDISPATCHER_REP
1588             
1589 mday  1.36     _enqueueResponse(request, response);
1590 kumpf 1.59  
1591                PEG_METHOD_EXIT();
1592 mday  1.36  }
1593             
1594             void CIMOperationRequestDispatcher::handleCreateInstanceRequest(
1595                CIMCreateInstanceRequestMessage* request)
1596             {
1597 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1598                   "CIMOperationRequestDispatcher::handleCreateInstanceRequest()");
1599             
1600 mday  1.36     // get the class name
1601                String className = request->newInstance.getClassName();
1602 kumpf 1.61     CIMResponseMessage * response;
1603             
1604 kumpf 1.113    CIMException checkClassException;
1605                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1606                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1607                {
1608                   CIMCreateInstanceResponseMessage* response =
1609                      new CIMCreateInstanceResponseMessage(
1610                         request->messageId,
1611                         checkClassException,
1612                         request->queueIds.copyAndPop(),
1613                         CIMObjectPath());
1614             
1615                   _enqueueResponse(request, response);
1616                   PEG_METHOD_EXIT();
1617                   return;
1618                }
1619             
1620 kumpf 1.61     String serviceName = String::EMPTY;
1621                String controlProviderName = String::EMPTY;
1622 mday  1.36  
1623 kumpf 1.57     // Check for class provided by an internal provider
1624 kumpf 1.61     if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1625                        controlProviderName))
1626 mday  1.36     {
1627 kumpf 1.61        CIMCreateInstanceRequestMessage* requestCopy =
1628                      new CIMCreateInstanceRequestMessage(*request);
1629 chip  1.53  
1630 karl  1.96        _forwardRequest(className,serviceName, controlProviderName, requestCopy);
1631 chip  1.53  
1632 kumpf 1.61        PEG_METHOD_EXIT();
1633                   return;
1634 mday  1.36     }
1635             
1636 kumpf 1.43     String providerName = _lookupInstanceProvider(request->nameSpace, className);
1637 chip  1.53  
1638 mday  1.36     if(providerName.size() != 0)
1639                {
1640 kumpf 1.61        CIMCreateInstanceRequestMessage* requestCopy =
1641                       new CIMCreateInstanceRequestMessage(*request);
1642 chip  1.53  
1643 kumpf 1.61        _forwardRequestToService(
1644 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
1645 chip  1.39  
1646             
1647 kumpf 1.61        PEG_METHOD_EXIT();
1648                   return;
1649 mday  1.36     }
1650 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
1651                {
1652 kumpf 1.72        CIMException cimException;
1653 kumpf 1.92        CIMObjectPath instanceName;
1654 kumpf 1.47  
1655 sage  1.77        STAT_PROVIDERSTART
1656             
1657 kumpf 1.47        _repository->write_lock();
1658             
1659                   try
1660                   {
1661                      instanceName = _repository->createInstance(
1662             	    request->nameSpace,
1663             	    request->newInstance);
1664                   }
1665                   catch(CIMException& exception)
1666                   {
1667 kumpf 1.72           cimException = exception;
1668 kumpf 1.47        }
1669                   catch(Exception& exception)
1670                   {
1671 kumpf 1.72           cimException =
1672                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1673 kumpf 1.47        }
1674                   catch(...)
1675                   {
1676 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1677 kumpf 1.47        }
1678 mday  1.36  
1679 kumpf 1.47        _repository->write_unlock();
1680 mday  1.36  
1681 sage  1.77        STAT_PROVIDEREND
1682             
1683 kumpf 1.47        CIMCreateInstanceResponseMessage* response =
1684                      new CIMCreateInstanceResponseMessage(
1685             	    request->messageId,
1686 kumpf 1.72  	    cimException,
1687 kumpf 1.47  	    request->queueIds.copyAndPop(),
1688             	    instanceName);
1689 mday  1.36  
1690 sage  1.77        STAT_COPYDISPATCHER_REP
1691             
1692 kumpf 1.47        _enqueueResponse(request, response);
1693 mday  1.36     }
1694 kumpf 1.47     else // No provider is registered and the repository isn't the default
1695 mday  1.36     {
1696 kumpf 1.47        CIMCreateInstanceResponseMessage* response =
1697                      new CIMCreateInstanceResponseMessage(
1698                         request->messageId,
1699 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
1700 kumpf 1.47              request->queueIds.copyAndPop(),
1701 kumpf 1.92              CIMObjectPath());
1702 kumpf 1.47  
1703 sage  1.77        STAT_COPYDISPATCHER
1704             
1705 kumpf 1.47        _enqueueResponse(request, response);
1706 mday  1.36     }
1707 kumpf 1.59  
1708                PEG_METHOD_EXIT();
1709 mike  1.2   }
1710             
1711 mday  1.36  void CIMOperationRequestDispatcher::handleModifyClassRequest(
1712                CIMModifyClassRequestMessage* request)
1713             {
1714 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1715 kumpf 1.73        "CIMOperationRequestDispatcher::handleModifyClassRequest");
1716 kumpf 1.59  
1717 kumpf 1.72     CIMException cimException;
1718 mday  1.36  
1719 sage  1.77     STAT_PROVIDERSTART
1720             
1721 mday  1.36     _repository->write_lock();
1722             
1723                try
1724                {
1725                   _repository->modifyClass(
1726             	 request->nameSpace,
1727             	 request->modifiedClass);
1728                }
1729             
1730                catch(CIMException& exception)
1731                {
1732 kumpf 1.72        cimException = exception;
1733 mday  1.36     }
1734                catch(Exception& exception)
1735                {
1736 kumpf 1.72        cimException =
1737                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1738 mday  1.36     }
1739                catch(...)
1740                {
1741 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1742 mday  1.36     }
1743             
1744                _repository->write_unlock();
1745             
1746 sage  1.77     STAT_PROVIDEREND
1747             
1748 mday  1.36     CIMModifyClassResponseMessage* response =
1749                   new CIMModifyClassResponseMessage(
1750             	 request->messageId,
1751 kumpf 1.72  	 cimException,
1752 mday  1.36  	 request->queueIds.copyAndPop());
1753             
1754 sage  1.77     STAT_COPYDISPATCHER_REP
1755             
1756 mday  1.36     _enqueueResponse(request, response);
1757 kumpf 1.59  
1758                PEG_METHOD_EXIT();
1759 mday  1.36  }
1760             
1761             void CIMOperationRequestDispatcher::handleModifyInstanceRequest(
1762                CIMModifyInstanceRequestMessage* request)
1763             {
1764 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1765 kumpf 1.73        "CIMOperationRequestDispatcher::handleModifyInstanceRequest");
1766 kumpf 1.59  
1767 mday  1.36     // ATTN: Who makes sure the instance name and the instance match?
1768 karl  1.97     // ATTN: KS May 28. Change following to reflect new instancelookup
1769 mday  1.36     // get the class name
1770 kumpf 1.102    String className = request->modifiedInstance.getClassName();
1771 kumpf 1.61     CIMResponseMessage * response;
1772             
1773 kumpf 1.113    CIMException checkClassException;
1774                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
1775                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
1776                {
1777                   CIMModifyInstanceResponseMessage* response =
1778                      new CIMModifyInstanceResponseMessage(
1779                         request->messageId,
1780                         checkClassException,
1781                         request->queueIds.copyAndPop());
1782             
1783                   _enqueueResponse(request, response);
1784                   PEG_METHOD_EXIT();
1785                   return;
1786                }
1787             
1788 kumpf 1.61     String serviceName = String::EMPTY;
1789                String controlProviderName = String::EMPTY;
1790 mday  1.36  
1791 kumpf 1.57     // Check for class provided by an internal provider
1792 kumpf 1.61     if (_lookupInternalProvider(request->nameSpace, className, serviceName,
1793                        controlProviderName))
1794 mday  1.36     {
1795 kumpf 1.61        CIMModifyInstanceRequestMessage* requestCopy =
1796                      new CIMModifyInstanceRequestMessage(*request);
1797 chip  1.53  
1798 karl  1.84        _forwardRequest(className, serviceName, controlProviderName,
1799 karl  1.96            requestCopy);
1800 chip  1.53  
1801 kumpf 1.61        PEG_METHOD_EXIT();
1802                   return;
1803 mday  1.36     }
1804             
1805                // check the class name for an "external provider"
1806 kumpf 1.43     String providerName = _lookupInstanceProvider(request->nameSpace, className);
1807 mday  1.36  
1808                if(providerName.size() != 0)
1809                {
1810 kumpf 1.61        CIMModifyInstanceRequestMessage* requestCopy =
1811                       new CIMModifyInstanceRequestMessage(*request);
1812 chip  1.53  
1813 kumpf 1.61        _forwardRequestToService(
1814 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
1815 chip  1.53  
1816 kumpf 1.61        PEG_METHOD_EXIT();
1817                   return;
1818 mday  1.36     }
1819 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
1820                {
1821                   // translate and forward request to repository
1822 kumpf 1.72        CIMException cimException;
1823 kumpf 1.47  
1824 sage  1.77        STAT_PROVIDERSTART
1825             
1826 kumpf 1.47        _repository->write_lock();
1827 mday  1.36  
1828 kumpf 1.47        try
1829                   {
1830                      _repository->modifyInstance(
1831 karl  1.97      	    request->nameSpace,
1832                 	    request->modifiedInstance,
1833                 	    request->includeQualifiers,request->propertyList);
1834 kumpf 1.47        }
1835                   catch(CIMException& exception)
1836                   {
1837 kumpf 1.72           cimException = exception;
1838 kumpf 1.47        }
1839                   catch(Exception& exception)
1840                   {
1841 kumpf 1.72           cimException =
1842                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1843 kumpf 1.47        }
1844                   catch(...)
1845                   {
1846 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1847 kumpf 1.47        }
1848             
1849                   _repository->write_unlock();
1850 mday  1.36  
1851 sage  1.77        STAT_PROVIDEREND
1852             
1853 kumpf 1.47        CIMModifyInstanceResponseMessage* response =
1854                      new CIMModifyInstanceResponseMessage(
1855             	    request->messageId,
1856 kumpf 1.72  	    cimException,
1857 kumpf 1.47  	    request->queueIds.copyAndPop());
1858 mday  1.36  
1859 sage  1.77        STAT_COPYDISPATCHER_REP
1860             
1861 kumpf 1.47        _enqueueResponse(request, response);
1862 mday  1.36     }
1863 kumpf 1.47     else // No provider is registered and the repository isn't the default
1864 mday  1.36     {
1865 kumpf 1.47        CIMModifyInstanceResponseMessage* response =
1866                      new CIMModifyInstanceResponseMessage(
1867             	    request->messageId,
1868 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
1869 kumpf 1.47  	    request->queueIds.copyAndPop());
1870             
1871 sage  1.77        STAT_COPYDISPATCHER
1872             
1873 kumpf 1.47        _enqueueResponse(request, response);
1874 mday  1.36     }
1875 kumpf 1.59  
1876                PEG_METHOD_EXIT();
1877 mday  1.36  }
1878             
1879             void CIMOperationRequestDispatcher::handleEnumerateClassesRequest(
1880                CIMEnumerateClassesRequestMessage* request)
1881             {
1882 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1883 kumpf 1.73        "CIMOperationRequestDispatcher::handleEnumerateClassesRequest");
1884 kumpf 1.59  
1885 kumpf 1.72     CIMException cimException;
1886 sage  1.77  
1887                STAT_PROVIDERSTART
1888             
1889 mday  1.36     Array<CIMClass> cimClasses;
1890             
1891                _repository->read_lock();
1892             
1893                try
1894                {
1895                   cimClasses = _repository->enumerateClasses(
1896 karl  1.97      	 request->nameSpace,
1897                 	 request->className,
1898                 	 request->deepInheritance,
1899                 	 request->localOnly,
1900                 	 request->includeQualifiers,
1901                 	 request->includeClassOrigin);
1902 mday  1.36     }
1903             
1904                catch(CIMException& exception)
1905                {
1906 kumpf 1.72        cimException = exception;
1907 mday  1.36     }
1908                catch(Exception& exception)
1909                {
1910 kumpf 1.72        cimException =
1911                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1912 mday  1.36     }
1913                catch(...)
1914                {
1915 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1916 mday  1.36     }
1917             
1918                _repository->read_unlock();
1919             
1920 sage  1.77     STAT_PROVIDEREND
1921             
1922 mday  1.36     CIMEnumerateClassesResponseMessage* response =
1923                   new CIMEnumerateClassesResponseMessage(
1924             	 request->messageId,
1925 kumpf 1.72  	 cimException,
1926 mday  1.36  	 request->queueIds.copyAndPop(),
1927             	 cimClasses);
1928             
1929 sage  1.77     STAT_COPYDISPATCHER_REP
1930             
1931 mday  1.36     _enqueueResponse(request, response);
1932 kumpf 1.59  
1933                PEG_METHOD_EXIT();
1934 mday  1.36  }
1935             
1936             void CIMOperationRequestDispatcher::handleEnumerateClassNamesRequest(
1937                CIMEnumerateClassNamesRequestMessage* request)
1938             {
1939 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1940 kumpf 1.73        "CIMOperationRequestDispatcher::handleEnumerateClassNamesRequest");
1941 kumpf 1.59  
1942 kumpf 1.72     CIMException cimException;
1943 sage  1.77  
1944                STAT_PROVIDERSTART
1945             
1946 mday  1.36     Array<String> classNames;
1947             
1948                _repository->read_lock();
1949             
1950                try
1951                {
1952                   classNames = _repository->enumerateClassNames(
1953             	 request->nameSpace,
1954             	 request->className,
1955             	 request->deepInheritance);
1956                }
1957             
1958                catch(CIMException& exception)
1959                {
1960 kumpf 1.72        cimException = exception;
1961 mday  1.36     }
1962                catch(Exception& exception)
1963                {
1964 kumpf 1.72        cimException =
1965                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
1966 mday  1.36     }
1967                catch(...)
1968                {
1969 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
1970 mday  1.36     }
1971             
1972                _repository->read_unlock();
1973             
1974 sage  1.77     STAT_PROVIDEREND
1975             
1976 mday  1.36     CIMEnumerateClassNamesResponseMessage* response =
1977                   new CIMEnumerateClassNamesResponseMessage(
1978             	 request->messageId,
1979 kumpf 1.72  	 cimException,
1980 mday  1.36  	 request->queueIds.copyAndPop(),
1981             	 classNames);
1982             
1983 sage  1.77     STAT_COPYDISPATCHER_REP
1984             
1985 mday  1.36     _enqueueResponse(request, response);
1986 kumpf 1.59  
1987                PEG_METHOD_EXIT();
1988 mday  1.36  }
1989             
1990             void CIMOperationRequestDispatcher::handleEnumerateInstancesRequest(
1991                CIMEnumerateInstancesRequestMessage* request)
1992             {
1993 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
1994 kumpf 1.73        "CIMOperationRequestDispatcher::handleEnumerateInstancesRequest");
1995 kumpf 1.59  
1996 mday  1.36     // get the class name
1997                String className = request->className;
1998 kumpf 1.113 
1999                CIMException checkClassException;
2000                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
2001                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
2002                {
2003                   CIMEnumerateInstancesResponseMessage* response =
2004                      new CIMEnumerateInstancesResponseMessage(
2005                         request->messageId,
2006                         checkClassException,
2007                         request->queueIds.copyAndPop(),
2008                         Array<CIMInstance>());
2009             
2010                   _enqueueResponse(request, response);
2011                   PEG_METHOD_EXIT();
2012                   return;
2013                }
2014             
2015 karl  1.97     /***** ATTN: KS 28 May 2002 - localonly and deepinheritance processing
2016                     temporarily removed until testing complete.
2017                // If localonly or deepinheritance, build propertylist.
2018                // unless there is specific propertylist. Assume that
2019                // specific property list has priority over that generated
2020                // from localOnly
2021                Array<String> classProperties;
2022                if (!request->deepInheritance || request->localOnly)
2023 karl  1.86     {
2024 karl  1.97         if (request->propertyList.isNull())
2025                    {
2026                        CIMClass cl;
2027                        // add try here
2028                        // get the class.
2029                        cl = _repository->getClass(
2030                            request->nameSpace,
2031                            request->className,
2032                            true, false, false);
2033                        for (Uint32 i = 0; i < cl.getPropertyCount(); i++)
2034                        {
2035                             CIMProperty p = cl.getProperty(i);
2036                             if (request->localOnly)
2037                             {
2038                                 if (!p.getPropagated())
2039                                     classProperties.append(p.getName());
2040                             }
2041                             else
2042                                 classProperties.append(p.getName());
2043                        }
2044                     // We now have property list and can either send it to 
2045 karl  1.97          // the provider or save for review of the responses.
2046                     }
2047                   
2048 karl  1.86     }
2049 karl  1.97     NOTE: See the piece below that puts it into the PoA
2050                **************************************************/
2051                //
2052                // Get names of descendent classes:
2053                //
2054                Array<String> subClassNames;
2055                CIMException cimException;
2056                try
2057 karl  1.86     {
2058 karl  1.97         subClassNames = _getSubClassNames(request->nameSpace,className);
2059 karl  1.86     }
2060 kumpf 1.98     catch(CIMException& cimException)
2061 karl  1.86     {
2062 karl  1.97         // Return exception response if exception from getSubClasses
2063 kumpf 1.98         CIMEnumerateInstancesResponseMessage* response =
2064                       new CIMEnumerateInstancesResponseMessage(
2065                          request->messageId,
2066                          cimException,
2067                          request->queueIds.copyAndPop(),
2068 kumpf 1.102              Array<CIMInstance>());
2069 karl  1.97         _enqueueResponse(request, response);
2070                    PEG_METHOD_EXIT();
2071                    return;
2072                }
2073                STAT_PROVIDERSTART
2074                 
2075                //
2076                // Find all providers for these classes and modify the subclass list.
2077                // The following arrays represent the list of subclasses with
2078                // valid providers
2079                Array<String> subClassNameList;
2080                Array<String> serviceNames;
2081                Array<String> controlProviderNames;
2082 karl  1.86  
2083 karl  1.97     for(Uint32 i = 0; i < subClassNames.size(); i++)
2084 mday  1.36     {
2085 karl  1.97         String serviceName = String::EMPTY;
2086                    String controlProviderName = String::EMPTY;
2087                 
2088                    // Lookup any instance providers and add to send list
2089                    if(_lookupNewInstanceProvider(request->nameSpace, subClassNames[i],
2090                        serviceName, controlProviderName))
2091 kumpf 1.109        {
2092                        // Append the returned values to the list to send.
2093                        subClassNameList.append(subClassNames[i]); 
2094                        serviceNames.append(serviceName);
2095                        controlProviderNames.append(controlProviderName);
2096             
2097 mday  1.112           //  cout << "KSTEST class list Output. Class = " << subClassNames[i] 
2098             //            << " servicename = " << serviceName
2099             //            << " controlProviderName = " 
2100             //            << ((controlProviderName != String::EMPTY)  ? controlProviderName : "None") 
2101             //            << " i = " << i << endl;
2102 karl  1.97  
2103                        PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
2104 kumpf 1.109                "Provider found for Class = " + subClassNames[i] 
2105                            + " servicename = " + serviceName
2106                            + " controlProviderName = " 
2107                            + ((controlProviderName != String::EMPTY)  ? controlProviderName : "None"));
2108                    }
2109 mday  1.36     }
2110             
2111 karl  1.97     Uint32 ps = serviceNames.size();
2112 mday  1.36  
2113 karl  1.97     // Test for "enumerate to Broad" and if so, execute exception.
2114                // Simply limits the subclass depth to some max, not number
2115                // of instances returned.
2116                // ATTN: KS P3 May 28 2002add size and limit to this message.
2117                if(ps > MAX_ENUMERATE_BREADTH)
2118 mday  1.36     {
2119 karl  1.97         CIMEnumerateInstancesResponseMessage* response =
2120                      new CIMEnumerateInstancesResponseMessage(
2121                         request->messageId,
2122 kumpf 1.109             PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "Enumerate request too broad"),
2123 karl  1.97              request->queueIds.copyAndPop(),
2124 kumpf 1.102             Array<CIMInstance>());
2125 chip  1.53  
2126 karl  1.97        STAT_COPYDISPATCHER
2127 chip  1.53  
2128 karl  1.97        _enqueueResponse(request, response);
2129 kumpf 1.61        PEG_METHOD_EXIT();
2130                   return;
2131 mday  1.36     }
2132 karl  1.97     // Set up an aggregate object for the information and save request in it.
2133                // With the original request message.
2134 kumpf 1.109    OperationAggregate *poA= new OperationAggregate(
2135                    new CIMEnumerateInstancesRequestMessage(*request),
2136                    request->getType(),
2137                    request->messageId);
2138                poA->dest = request->queueIds.top();
2139 karl  1.97  
2140                Boolean staticInstancesExist = false;
2141                // ATTN: KS 28 May 2002 P3 - This code to process property lists and
2142                // localonly, etc. has not been tested yet. Temporarily removed.
2143                /************************* Removed along with rest of property list code above
2144                if (classProperties.size() != 0)
2145                {
2146                    poA->propertyList = classProperties;
2147                }
2148                **********************************/
2149 kumpf 1.102    if ((ps == 0) && (_repository->isDefaultInstanceProvider()))
2150 kumpf 1.47     {
2151 kumpf 1.102       Tracer::trace(TRC_DISPATCHER, Tracer::LEVEL4,
2152             	 "Repository being used as THE default instance provider");
2153 kumpf 1.72        CIMException cimException;
2154 sage  1.77  
2155                   STAT_PROVIDERSTART
2156             
2157 kumpf 1.102       Array<CIMInstance> cimNamedInstances;
2158 kumpf 1.47  
2159                   _repository->read_lock();
2160             
2161                   try
2162                   {
2163 karl  1.96           cimNamedInstances = _repository->enumerateInstancesForClass(
2164 karl  1.97      	    request->nameSpace,
2165                 	    request->className,
2166                 	    request->deepInheritance,
2167                 	    request->localOnly,
2168                 	    request->includeQualifiers,
2169                 	    request->includeClassOrigin,
2170                 	    true,
2171                 	    request->propertyList.getPropertyNameArray());
2172 kumpf 1.47        }
2173                   catch(CIMException& exception)
2174                   {
2175 kumpf 1.72           cimException = exception;
2176 kumpf 1.47        }
2177                   catch(Exception& exception)
2178                   {
2179 kumpf 1.72           cimException =
2180                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
2181 kumpf 1.47        }
2182                   catch(...)
2183                   {
2184 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
2185 kumpf 1.47        }
2186 mday  1.36  
2187 kumpf 1.47        _repository->read_unlock();
2188 mday  1.36  
2189 sage  1.77        STAT_PROVIDEREND
2190             
2191 kumpf 1.47        CIMEnumerateInstancesResponseMessage* response =
2192 karl  1.97          new CIMEnumerateInstancesResponseMessage(
2193                     request->messageId,
2194                     cimException,
2195                     request->queueIds.copyAndPop(),
2196                     cimNamedInstances);
2197 mday  1.36  
2198 sage  1.77        STAT_COPYDISPATCHER_REP
2199             
2200 kumpf 1.109 #if 0
2201                   // if there will be other responses, put this on the response list.
2202                   // else, simply issue it.
2203                   if (ps > 0)
2204                   {
2205                       poA->appendResponse(response);
2206                       staticInstancesExist = true;
2207                   }
2208                   else
2209                   {
2210                       delete poA;
2211 kumpf 1.102           _enqueueResponse(request, response);
2212                       PEG_METHOD_EXIT();
2213                       return;
2214 kumpf 1.109       }
2215             #else
2216                   delete poA;
2217                   _enqueueResponse(request, response);
2218                   PEG_METHOD_EXIT();
2219                   return;
2220             #endif
2221 mday  1.36     }
2222 karl  1.97  
2223                if(ps > 0)
2224 mday  1.36     {
2225 karl  1.97         //************* Limit to one response if we have problems with more.
2226             #ifdef LIMIT_ENUM_TO_ONE_LEVEL
2227                    ps = 1;
2228 kumpf 1.109 #endif
2229 karl  1.97         // Simply takes the top level request and ignores the others.
2230                    // decomment the ps = 1 to generate only one request.
2231                    //*******************/
2232                    poA->setTotalIssued(ps);
2233             
2234                    for(Uint32 i = 0; i < ps; i++ )
2235                    {
2236                        poA->classes.append(subClassNameList[i]);
2237                        poA->serviceNames.append(serviceNames[i]);
2238                        poA->controlProviderNames.append(controlProviderNames[i]);
2239             
2240                        // Note that current may not be same as i if there is a response
2241                        // from the repository.
2242                        Uint32 current = poA->classes.size() - 1;
2243             
2244                        CIMEnumerateInstancesRequestMessage* requestCopy =
2245                 	     new CIMEnumerateInstancesRequestMessage(*request);
2246                        requestCopy->className = poA->classes[current];
2247             
2248                 	   PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4, 
2249                            Formatter::format(
2250 karl  1.97                 "Enumerate instance Req. class $0 to svc $1 for control provider $2 No $3 of $4",
2251                            poA->classes[current], poA->serviceNames[current],
2252                            ((poA->controlProviderNames[current] != String::EMPTY)  ?
2253                                 poA->controlProviderNames[current] : "None"),
2254                            i, ps));
2255             
2256 kumpf 1.109            _forwardRequestForAggregation(poA->serviceNames[current],
2257 karl  1.97                  poA->controlProviderNames[current], requestCopy, poA);
2258                    }
2259                    PEG_METHOD_EXIT();
2260                    return;
2261                }
2262                // No provider is registered and the repository isn't the default. Error response
2263                // ATTN: KS 28 May 2002 - Rethink this error. What if there are simply no instances
2264                // Is this what we generate?
2265 kumpf 1.110    if ((ps == 0) && !(_repository->isDefaultInstanceProvider()))
2266 karl  1.97     {         
2267                    PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4, 
2268 kumpf 1.110                         "No provider for " + className + " and subclasses."); 
2269 karl  1.97  
2270                    CIMEnumerateInstancesResponseMessage* response =
2271                       new CIMEnumerateInstancesResponseMessage(
2272                          request->messageId,
2273                          PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2274                          request->queueIds.copyAndPop(),
2275 kumpf 1.102              Array<CIMInstance>());
2276 kumpf 1.47  
2277 sage  1.77        STAT_COPYDISPATCHER
2278             
2279 kumpf 1.109       delete poA;
2280 kumpf 1.47        _enqueueResponse(request, response);
2281 mday  1.36     }
2282 kumpf 1.59  
2283                PEG_METHOD_EXIT();
2284 mday  1.36  }
2285             
2286 karl  1.87  
2287 mday  1.36  void CIMOperationRequestDispatcher::handleEnumerateInstanceNamesRequest(
2288                CIMEnumerateInstanceNamesRequestMessage* request)
2289             {
2290 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
2291 kumpf 1.73        "CIMOperationRequestDispatcher::handleEnumerateInstanceNamesRequest");
2292 karl  1.97  
2293 mday  1.36     // get the class name
2294                String className = request->className;
2295 karl  1.97  
2296 kumpf 1.113    CIMException checkClassException;
2297                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
2298                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
2299                {
2300                   CIMEnumerateInstanceNamesResponseMessage* response =
2301                      new CIMEnumerateInstanceNamesResponseMessage(
2302                         request->messageId,
2303                         checkClassException,
2304                         request->queueIds.copyAndPop(),
2305                         Array<CIMObjectPath>());
2306             
2307                   _enqueueResponse(request, response);
2308                   PEG_METHOD_EXIT();
2309                   return;
2310                }
2311             
2312 karl  1.86     //
2313                // Get names of descendent classes:
2314                //
2315                Array<String> subClassNames;
2316                CIMException cimException;
2317                try
2318 mday  1.36     {
2319 karl  1.86         subClassNames = _getSubClassNames(request->nameSpace,className);
2320 mday  1.36     }
2321 karl  1.86     catch(CIMException& exception)
2322 mday  1.36     {
2323 karl  1.86         // Return exception response if exception from getSubClasses
2324                    cimException = exception;
2325 kumpf 1.92         Array<CIMObjectPath> instanceNames;
2326 karl  1.86         CIMEnumerateInstanceNamesResponseMessage* response =
2327                    new CIMEnumerateInstanceNamesResponseMessage(
2328             	     request->messageId,
2329             	     cimException,
2330             	     request->queueIds.copyAndPop(),
2331             	     instanceNames);
2332                    _enqueueResponse(request, response);
2333                    PEG_METHOD_EXIT();
2334                    return;
2335                }
2336 chip  1.53  
2337 karl  1.86     STAT_PROVIDERSTART
2338                 
2339 karl  1.97     //
2340                //Find all providers for these classes and modify the subclass list.
2341                //
2342                // The following arrays represent the list of subclasses with
2343                // valid providers
2344                Array<String> subClassNameList;
2345 karl  1.86     Array<String> serviceNames;
2346                Array<String> controlProviderNames;
2347             
2348                for(Uint32 i = 0; i < subClassNames.size(); i++)
2349                {
2350                    String serviceName = String::EMPTY;
2351                    String controlProviderName = String::EMPTY;
2352                 
2353                    // Lookup any instance providers and add to send list
2354                    if(_lookupNewInstanceProvider(request->nameSpace, subClassNames[i],
2355 karl  1.97             serviceName, controlProviderName))
2356             		{
2357             		   // Append the returned values to the list to send.
2358             		   subClassNameList.append(subClassNames[i]); 
2359             		   serviceNames.append(serviceName);
2360             		   controlProviderNames.append(controlProviderName);
2361             	
2362                         PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4,
2363                            "Provider found for Class = " + subClassNames[i] 
2364             			   + " servicename = " + serviceName
2365             			   + " controlProviderName = " 
2366                            + ((controlProviderName != String::EMPTY)  ? controlProviderName : "None"));
2367             		}
2368 karl  1.86     }
2369 chip  1.39  
2370 karl  1.86     Uint32 ps = serviceNames.size();
2371 karl  1.87  
2372                // Test for "enumerate to Broad" and if so, execute exception.
2373 karl  1.97     // Simply limits the subclass depth to some max, not number
2374                // of instances returned.
2375 karl  1.96     // ATTN: add size and limit to the message.
2376 kumpf 1.88     if(ps > MAX_ENUMERATE_BREADTH)
2377 karl  1.87     {
2378                    CIMEnumerateInstanceNamesResponseMessage* response =
2379                      new CIMEnumerateInstanceNamesResponseMessage(
2380                         request->messageId,
2381 kumpf 1.109             PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "Enumerate request too Broad"),
2382 karl  1.87              request->queueIds.copyAndPop(),
2383 kumpf 1.92              Array<CIMObjectPath>());
2384 karl  1.87  
2385                   STAT_COPYDISPATCHER
2386             
2387                   _enqueueResponse(request, response);
2388 karl  1.96        PEG_METHOD_EXIT();
2389                   return;
2390 karl  1.87         
2391                }
2392 karl  1.97     // Set up an aggregate object for the information and save request in it.
2393                // With the original request message.
2394             
2395 kumpf 1.109    OperationAggregate *poA= new OperationAggregate(
2396                    new CIMEnumerateInstanceNamesRequestMessage(*request),
2397                    request->getType(),
2398                    request->messageId);
2399                poA->dest = request->queueIds.top();
2400 karl  1.97  
2401                Boolean staticInstancesExist = false;
2402 karl  1.86  
2403 kumpf 1.102    if ((ps == 0) && (_repository->isDefaultInstanceProvider()))
2404 kumpf 1.47     {
2405 kumpf 1.102       Tracer::trace(TRC_DISPATCHER, Tracer::LEVEL4,
2406             	 "Repository being used as THE default instance provider");
2407 kumpf 1.72        CIMException cimException;
2408 sage  1.77        STAT_PROVIDERSTART
2409 kumpf 1.92        Array<CIMObjectPath> instanceNames;
2410 kumpf 1.47        _repository->read_lock();
2411                   try
2412                   {
2413 karl  1.96           instanceNames = _repository->enumerateInstanceNamesForClass(
2414 karl  1.97              request->nameSpace,
2415                         request->className,
2416                         true);
2417 kumpf 1.47        }
2418                   catch(CIMException& exception)
2419                   {
2420 kumpf 1.72           cimException = exception;
2421 kumpf 1.47        }
2422                   catch(Exception& exception)
2423                   {
2424 kumpf 1.72           cimException =
2425                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
2426 kumpf 1.47        }
2427                   catch(...)
2428                   {
2429 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
2430 kumpf 1.47        }
2431 karl  1.97        _repository->read_unlock();
2432 kumpf 1.47  
2433 sage  1.77        STAT_PROVIDEREND
2434             
2435 kumpf 1.47        CIMEnumerateInstanceNamesResponseMessage* response =
2436 karl  1.97          new CIMEnumerateInstanceNamesResponseMessage(
2437                     request->messageId,
2438                     cimException,
2439                     request->queueIds.copyAndPop(),
2440                     instanceNames);
2441 mday  1.36  
2442 sage  1.77        STAT_COPYDISPATCHER_REP
2443             
2444 kumpf 1.102 #if 0
2445             //ATTN-DME-P1-20020529: If providers exist then the repository should not
2446             //     be called.
2447 karl  1.97        // If there will be other responses, put this on the response list.
2448                   // else, simply issue it.
2449                   if (ps > 0)
2450                   {
2451                       poA->appendResponse(response);
2452                       staticInstancesExist = true;
2453                   }
2454                   else
2455                   {
2456 kumpf 1.109           delete poA;
2457 karl  1.97            _enqueueResponse(request, response);
2458                       PEG_METHOD_EXIT();
2459                       return;
2460                   }
2461 kumpf 1.102 #else
2462 kumpf 1.109       delete poA;
2463 kumpf 1.102       _enqueueResponse(request, response);
2464                   PEG_METHOD_EXIT();
2465                   return;
2466             #endif
2467 karl  1.97     }
2468 karl  1.86  
2469 karl  1.97     if(ps > 0)
2470                {
2471                    //************* Limit to one response if we have problems with more.
2472             #ifdef LIMIT_ENUM_TO_ONE_LEVEL
2473                    ps = 1;
2474 kumpf 1.109 #endif
2475 karl  1.97         // Simply takes the top level request and ignores the others.
2476                    //*******************/
2477                    poA->setTotalIssued(ps);
2478             
2479                    for(Uint32 i = 0; i < ps; i++ )
2480                    {
2481                        poA->classes.append(subClassNameList[i]);
2482                        poA->serviceNames.append(serviceNames[i]);
2483                        poA->controlProviderNames.append(controlProviderNames[i]);
2484                        
2485                        Uint32 current =  poA->classes.size() - 1;
2486                        //request->print(cout, true);
2487             
2488                        CIMEnumerateInstanceNamesRequestMessage* requestCopy =
2489                 	     new CIMEnumerateInstanceNamesRequestMessage(*request);
2490             
2491                        requestCopy->className = poA->classes[current];
2492             
2493                        //request->print(cout, true);
2494                        //requestCopy->print(cout, true);
2495             
2496 karl  1.97      	   PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4, 
2497                            Formatter::format(
2498                            "EnumerateNames Req. class $0 to svc $1 for control provider $2 No $3 of $4",
2499                            poA->classes[current], poA->serviceNames[current],
2500                            ((poA->controlProviderNames[current] != String::EMPTY)  ?
2501                                 poA->controlProviderNames[current] : "None"),
2502                            i, ps));
2503                         
2504 kumpf 1.109     	   /*cout << "KSTEST send to provider, Class =  " << classes[current]
2505 karl  1.97                 << " servicename = " << poA->serviceNames[current]
2506                            << " control provider name = " 
2507                            << ((poA->controlProviderNames[current] != String::EMPTY)  ?
2508                                 poA->controlProviderNames[current] : "None")
2509                 	       << " count " << current << endl;
2510             
2511                        for(Uint32 j = 0; j <= i; j++ )
2512                        {
2513                            cout << "KSTEST View Class Arrays "
2514                                 << " Class = " <<   poA->classes[j]
2515                                 << " Service Name = " << poA->serviceNames[j]
2516                                 << " Control Provider = " << ((poA->controlProviderNames[j]
2517                                      != String::EMPTY)  ?
2518                                        poA->controlProviderNames[j] : "None") 
2519                 	            << " count " << j << endl;
2520 kumpf 1.109            }*/
2521 karl  1.97             
2522 kumpf 1.109     	  _forwardRequestForAggregation(poA->serviceNames[current],
2523 karl  1.97      	       poA->controlProviderNames[current], requestCopy, poA);
2524                    }
2525                    PEG_METHOD_EXIT();
2526                    return;
2527 mday  1.36     }
2528 karl  1.97     // No provider is registered and the repository isn't the default
2529 kumpf 1.102    if ((ps == 0) && !(_repository->isDefaultInstanceProvider()))
2530 karl  1.97     {         
2531                    PEG_TRACE_STRING(TRC_DISPATCHER, Tracer::LEVEL4, 
2532 kumpf 1.110                         "No provider for " + className + " and subclasses."); 
2533 karl  1.86  
2534                    CIMEnumerateInstanceNamesResponseMessage* response =
2535 kumpf 1.47           new CIMEnumerateInstanceNamesResponseMessage(
2536                         request->messageId,
2537 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2538 kumpf 1.47              request->queueIds.copyAndPop(),
2539 kumpf 1.92              Array<CIMObjectPath>());
2540 kumpf 1.47  
2541 sage  1.77        STAT_COPYDISPATCHER
2542             
2543 kumpf 1.109       delete poA;
2544 kumpf 1.47        _enqueueResponse(request, response);
2545 mday  1.36     }
2546 kumpf 1.59  
2547                PEG_METHOD_EXIT();
2548 mike  1.2   }
2549             
2550 mday  1.36  void CIMOperationRequestDispatcher::handleAssociatorsRequest(
2551                CIMAssociatorsRequestMessage* request)
2552 mike  1.2   {
2553 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
2554 kumpf 1.73        "CIMOperationRequestDispatcher::handleAssociatorsRequest");
2555 kumpf 1.59  
2556 kumpf 1.104    if (!_enableAssociationTraversal)
2557                {
2558                    CIMException cimException =
2559                        PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "Associators");
2560                    Array<CIMObject> cimObjects;
2561             
2562                    CIMAssociatorsResponseMessage* response =
2563                        new CIMAssociatorsResponseMessage(
2564                            request->messageId,
2565             	       cimException,
2566             	       request->queueIds.copyAndPop(),
2567             	       cimObjects);
2568             
2569                    STAT_COPYDISPATCHER
2570             
2571                    _enqueueResponse(request, response);
2572             
2573                    PEG_METHOD_EXIT();
2574 kumpf 1.113        return;
2575 kumpf 1.104    }
2576             
2577 mday  1.36     String className = request->objectName.getClassName();
2578 sage  1.75     String assocClassName = request->assocClass;
2579                String resultClassName = request->resultClass;
2580             
2581 kumpf 1.61     CIMResponseMessage * response;
2582 karl  1.81  
2583 mday  1.36     // check the class name for an "external provider"
2584 sage  1.75     Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
2585 chip  1.12  
2586 sage  1.75     if(providerNames.size() != 0)
2587 mday  1.36     {
2588 kumpf 1.61        CIMAssociatorsRequestMessage* requestCopy =
2589                       new CIMAssociatorsRequestMessage(*request);
2590 chip  1.12  
2591 kumpf 1.61        _forwardRequestToService(
2592 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
2593 chip  1.39  
2594 kumpf 1.61        PEG_METHOD_EXIT();
2595                   return;
2596 mday  1.36     }
2597 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
2598                {
2599 kumpf 1.72        CIMException cimException;
2600 sage  1.77  
2601                   STAT_PROVIDERSTART
2602             
2603 kumpf 1.103       Array<CIMObject> cimObjects;
2604 kumpf 1.47  
2605                   _repository->read_lock();
2606 chip  1.12  
2607 kumpf 1.47        try
2608                   {
2609                      cimObjects = _repository->associators(
2610 karl  1.97      	    request->nameSpace,
2611                 	    request->objectName,
2612                 	    request->assocClass,
2613                 	    request->resultClass,
2614                 	    request->role,
2615                 	    request->resultRole,
2616                 	    request->includeQualifiers,
2617                 	    request->includeClassOrigin,
2618                 	    request->propertyList.getPropertyNameArray());
2619 kumpf 1.47        }
2620                   catch(CIMException& exception)
2621                   {
2622 kumpf 1.72           cimException = exception;
2623 kumpf 1.47        }
2624                   catch(Exception& exception)
2625                   {
2626 kumpf 1.72           cimException =
2627                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
2628 kumpf 1.47        }
2629                   catch(...)
2630                   {
2631 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
2632 kumpf 1.47        }
2633             
2634                   _repository->read_unlock();
2635 chip  1.12  
2636 sage  1.77        STAT_PROVIDEREND
2637             
2638 kumpf 1.47        CIMAssociatorsResponseMessage* response =
2639                      new CIMAssociatorsResponseMessage(
2640             	    request->messageId,
2641 kumpf 1.72  	    cimException,
2642 kumpf 1.47  	    request->queueIds.copyAndPop(),
2643             	    cimObjects);
2644 mike  1.2   
2645 sage  1.77        STAT_COPYDISPATCHER_REP
2646             
2647 kumpf 1.47        _enqueueResponse(request, response);
2648 mday  1.36     }
2649 kumpf 1.47     else // No provider is registered and the repository isn't the default
2650 mday  1.36     {
2651 kumpf 1.47        CIMAssociatorsResponseMessage* response =
2652                      new CIMAssociatorsResponseMessage(
2653                         request->messageId,
2654 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2655 kumpf 1.47              request->queueIds.copyAndPop(),
2656 kumpf 1.103             Array<CIMObject>());
2657 kumpf 1.47  
2658 sage  1.77        STAT_COPYDISPATCHER
2659             
2660 kumpf 1.47        _enqueueResponse(request, response);
2661 mday  1.36     }
2662 kumpf 1.59  
2663                PEG_METHOD_EXIT();
2664 mike  1.2   }
2665             
2666 mday  1.36  void CIMOperationRequestDispatcher::handleAssociatorNamesRequest(
2667                CIMAssociatorNamesRequestMessage* request)
2668 mike  1.2   {
2669 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
2670 kumpf 1.73        "CIMOperationRequestDispatcher::handleAssociatorNamesRequest");
2671 kumpf 1.59  
2672 kumpf 1.104    if (!_enableAssociationTraversal)
2673                {
2674                    CIMException cimException =
2675                        PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "AssociatorNames");
2676                    Array<CIMObjectPath> cimObjects;
2677             
2678                    CIMAssociatorNamesResponseMessage* response =
2679                        new CIMAssociatorNamesResponseMessage(
2680                            request->messageId,
2681             	       cimException,
2682             	       request->queueIds.copyAndPop(),
2683             	       cimObjects);
2684             
2685                    STAT_COPYDISPATCHER
2686             
2687                    _enqueueResponse(request, response);
2688             
2689                    PEG_METHOD_EXIT();
2690 kumpf 1.113        return;
2691 kumpf 1.104    }
2692             
2693 mday  1.36     String className = request->objectName.getClassName();
2694 sage  1.75     String resultClassName = request->resultClass;
2695 kumpf 1.61     CIMResponseMessage * response;
2696 karl  1.81  
2697 mday  1.36     // check the class name for an "external provider"
2698 sage  1.75     Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
2699 mike  1.2   
2700 sage  1.75     if(providerNames.size() != 0)
2701 mday  1.36     {
2702 kumpf 1.61        CIMAssociatorNamesRequestMessage* requestCopy =
2703                       new CIMAssociatorNamesRequestMessage(*request);
2704 chip  1.53  
2705 kumpf 1.61        _forwardRequestToService(
2706 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
2707 chip  1.53  
2708 kumpf 1.61        PEG_METHOD_EXIT();
2709                   return;
2710 mday  1.36     }
2711 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
2712                {
2713 kumpf 1.72        CIMException cimException;
2714 sage  1.77  
2715                   STAT_PROVIDERSTART
2716             
2717 kumpf 1.92        Array<CIMObjectPath> objectNames;
2718 chip  1.12  
2719 kumpf 1.47        _repository->read_lock();
2720             
2721                   try
2722                   {
2723                      objectNames = _repository->associatorNames(
2724             	    request->nameSpace,
2725             	    request->objectName,
2726             	    request->assocClass,
2727             	    request->resultClass,
2728             	    request->role,
2729             	    request->resultRole);
2730                   }
2731                   catch(CIMException& exception)
2732                   {
2733 kumpf 1.72           cimException = exception;
2734 kumpf 1.47        }
2735                   catch(Exception& exception)
2736                   {
2737 kumpf 1.72           cimException =
2738                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
2739 kumpf 1.47        }
2740                   catch(...)
2741                   {
2742 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
2743 kumpf 1.47        }
2744             
2745                   _repository->read_unlock();
2746 kumpf 1.26  
2747 sage  1.77        STAT_PROVIDEREND
2748             
2749 kumpf 1.47        CIMAssociatorNamesResponseMessage* response =
2750                      new CIMAssociatorNamesResponseMessage(
2751             	    request->messageId,
2752 kumpf 1.72  	    cimException,
2753 kumpf 1.47  	    request->queueIds.copyAndPop(),
2754             	    objectNames);
2755 kumpf 1.25  
2756 sage  1.77        STAT_COPYDISPATCHER_REP
2757             
2758 kumpf 1.47        _enqueueResponse(request, response);
2759 mday  1.36     }
2760 kumpf 1.47     else // No provider is registered and the repository isn't the default
2761 mday  1.36     {
2762 kumpf 1.47        CIMAssociatorNamesResponseMessage* response =
2763                      new CIMAssociatorNamesResponseMessage(
2764                         request->messageId,
2765 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2766 kumpf 1.47              request->queueIds.copyAndPop(),
2767 kumpf 1.92              Array<CIMObjectPath>());
2768 kumpf 1.47  
2769 sage  1.77        STAT_COPYDISPATCHER
2770             
2771 kumpf 1.47        _enqueueResponse(request, response);
2772 mday  1.36     }
2773 kumpf 1.59  
2774                PEG_METHOD_EXIT();
2775 mday  1.36  }
2776 kumpf 1.25  
2777 mday  1.36  void CIMOperationRequestDispatcher::handleReferencesRequest(
2778                CIMReferencesRequestMessage* request)
2779             {
2780 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
2781 kumpf 1.73        "CIMOperationRequestDispatcher::handleReferencesRequest");
2782 kumpf 1.59  
2783 kumpf 1.104    if (!_enableAssociationTraversal)
2784                {
2785                    CIMException cimException =
2786                        PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "References");
2787                    Array<CIMObject> cimObjects;
2788             
2789                    CIMReferencesResponseMessage* response =
2790                        new CIMReferencesResponseMessage(
2791                            request->messageId,
2792             	       cimException,
2793             	       request->queueIds.copyAndPop(),
2794             	       cimObjects);
2795             
2796                    STAT_COPYDISPATCHER
2797             
2798                    _enqueueResponse(request, response);
2799             
2800                    PEG_METHOD_EXIT();
2801 kumpf 1.113        return;
2802 kumpf 1.104    }
2803             
2804 mday  1.36     String className = request->objectName.getClassName();
2805 kumpf 1.61     CIMResponseMessage * response;
2806 karl  1.81  
2807 mday  1.36     // check the class name for an "external provider"
2808 sage  1.75     Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
2809 mike  1.2   
2810 sage  1.75     if(providerNames.size() != 0)
2811 mday  1.36     {
2812 kumpf 1.61        CIMReferencesRequestMessage* requestCopy =
2813                       new CIMReferencesRequestMessage(*request);
2814 chip  1.53  
2815 kumpf 1.61        _forwardRequestToService(
2816 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
2817 chip  1.53  
2818 kumpf 1.61        PEG_METHOD_EXIT();
2819                   return;
2820 mday  1.36     }
2821 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
2822                {
2823 kumpf 1.72        CIMException cimException;
2824 sage  1.77  
2825                   STAT_PROVIDERSTART
2826             
2827 kumpf 1.103       Array<CIMObject> cimObjects;
2828 kumpf 1.47  
2829                   _repository->read_lock();
2830             
2831                   try
2832                   {
2833                      cimObjects = _repository->references(
2834             	    request->nameSpace,
2835             	    request->objectName,
2836             	    request->resultClass,
2837             	    request->role,
2838             	    request->includeQualifiers,
2839             	    request->includeClassOrigin,
2840             	    request->propertyList.getPropertyNameArray());
2841                   }
2842                   catch(CIMException& exception)
2843                   {
2844 kumpf 1.72           cimException = exception;
2845 kumpf 1.47        }
2846                   catch(Exception& exception)
2847                   {
2848 kumpf 1.72           cimException =
2849                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
2850 kumpf 1.47        }
2851                   catch(...)
2852                   {
2853 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
2854 kumpf 1.47        }
2855 chip  1.6   
2856 kumpf 1.47        _repository->read_unlock();
2857 mike  1.2   
2858 sage  1.77        STAT_PROVIDEREND
2859             
2860 kumpf 1.47        CIMReferencesResponseMessage* response =
2861                      new CIMReferencesResponseMessage(
2862             	    request->messageId,
2863 kumpf 1.72  	    cimException,
2864 kumpf 1.47  	    request->queueIds.copyAndPop(),
2865             	    cimObjects);
2866 mike  1.2   
2867 sage  1.77        STAT_COPYDISPATCHER_REP
2868             
2869 kumpf 1.47        _enqueueResponse(request, response);
2870 mday  1.36     }
2871 kumpf 1.47     else // No provider is registered and the repository isn't the default
2872 mday  1.36     {
2873 kumpf 1.47        CIMReferencesResponseMessage* response =
2874                      new CIMReferencesResponseMessage(
2875                         request->messageId,
2876 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2877 kumpf 1.47              request->queueIds.copyAndPop(),
2878 kumpf 1.103             Array<CIMObject>());
2879 kumpf 1.47  
2880 sage  1.77        STAT_COPYDISPATCHER
2881             
2882 kumpf 1.47        _enqueueResponse(request, response);
2883 mday  1.36     }
2884 kumpf 1.59  
2885                PEG_METHOD_EXIT();
2886 mike  1.2   }
2887             
2888 mday  1.36  void CIMOperationRequestDispatcher::handleReferenceNamesRequest(
2889                CIMReferenceNamesRequestMessage* request)
2890 mike  1.2   {
2891 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
2892 kumpf 1.73        "CIMOperationRequestDispatcher::handleReferenceNamesRequest");
2893 kumpf 1.104 
2894                if (!_enableAssociationTraversal)
2895                {
2896                    CIMException cimException =
2897                        PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "ReferenceNames");
2898                    Array<CIMObjectPath> cimObjects;
2899             
2900                    CIMReferenceNamesResponseMessage* response =
2901                        new CIMReferenceNamesResponseMessage(
2902                            request->messageId,
2903             	       cimException,
2904             	       request->queueIds.copyAndPop(),
2905             	       cimObjects);
2906             
2907                    STAT_COPYDISPATCHER
2908             
2909                    _enqueueResponse(request, response);
2910             
2911                    PEG_METHOD_EXIT();
2912 kumpf 1.113        return;
2913 kumpf 1.104    }
2914 kumpf 1.59  
2915 mday  1.36     String className = request->objectName.getClassName();
2916 kumpf 1.61     CIMResponseMessage * response;
2917 karl  1.81  
2918 mday  1.36     // check the class name for an "external provider"
2919 sage  1.75     Array<String> providerNames = _lookupAssociationProvider(request->nameSpace, className);
2920 mday  1.36  
2921 sage  1.75     if(providerNames.size() != 0)
2922 mday  1.36     {
2923 kumpf 1.61        CIMReferenceNamesRequestMessage* requestCopy =
2924                       new CIMReferenceNamesRequestMessage(*request);
2925 chip  1.53  
2926 kumpf 1.61        _forwardRequestToService(
2927 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
2928 chip  1.53  
2929 kumpf 1.61        PEG_METHOD_EXIT();
2930                   return;
2931 mday  1.36     }
2932 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
2933                {
2934 kumpf 1.72        CIMException cimException;
2935 sage  1.77  
2936                   STAT_PROVIDERSTART
2937             
2938 kumpf 1.92        Array<CIMObjectPath> objectNames;
2939 kumpf 1.47  
2940                   _repository->read_lock();
2941             
2942                   try
2943                   {
2944                      objectNames = _repository->referenceNames(
2945             	    request->nameSpace,
2946             	    request->objectName,
2947             	    request->resultClass,
2948             	    request->role);
2949                   }
2950                   catch(CIMException& exception)
2951                   {
2952 kumpf 1.72           cimException = exception;
2953 kumpf 1.47        }
2954                   catch(Exception& exception)
2955                   {
2956 kumpf 1.72           cimException =
2957                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
2958 kumpf 1.47        }
2959                   catch(...)
2960                   {
2961 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
2962 kumpf 1.47        }
2963 mike  1.2   
2964 kumpf 1.47        _repository->read_unlock();
2965 mike  1.2   
2966 sage  1.77        STAT_PROVIDEREND
2967             
2968 kumpf 1.47        CIMReferenceNamesResponseMessage* response =
2969                      new CIMReferenceNamesResponseMessage(
2970             	    request->messageId,
2971 kumpf 1.72  	    cimException,
2972 kumpf 1.47  	    request->queueIds.copyAndPop(),
2973             	    objectNames);
2974 mike  1.2   
2975 sage  1.77        STAT_COPYDISPATCHER_REP
2976             
2977 kumpf 1.47        _enqueueResponse(request, response);
2978 mday  1.36     }
2979 kumpf 1.47     else // No provider is registered and the repository isn't the default
2980 mday  1.36     {
2981 kumpf 1.47        CIMReferenceNamesResponseMessage* response =
2982                      new CIMReferenceNamesResponseMessage(
2983                         request->messageId,
2984 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
2985 kumpf 1.47              request->queueIds.copyAndPop(),
2986 kumpf 1.92              Array<CIMObjectPath>());
2987 kumpf 1.47  
2988 sage  1.77        STAT_COPYDISPATCHER
2989             
2990 kumpf 1.47        _enqueueResponse(request, response);
2991 mday  1.36     }
2992 kumpf 1.59     PEG_METHOD_EXIT();
2993 mike  1.2   }
2994             
2995 mday  1.36  void CIMOperationRequestDispatcher::handleGetPropertyRequest(
2996                CIMGetPropertyRequestMessage* request)
2997 mike  1.2   {
2998 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
2999 kumpf 1.73        "CIMOperationRequestDispatcher::handleGetPropertyRequest");
3000 kumpf 1.59  
3001 mday  1.36     String className = request->instanceName.getClassName();
3002 kumpf 1.61     CIMResponseMessage * response;
3003 karl  1.81  
3004 mday  1.36     // check the class name for an "external provider"
3005 kumpf 1.43     String providerName = _lookupInstanceProvider(request->nameSpace, className);
3006 mike  1.2   
3007 mday  1.36     if(providerName.size() != 0)
3008                {
3009 kumpf 1.61        CIMGetPropertyRequestMessage* requestCopy =
3010                       new CIMGetPropertyRequestMessage(*request);
3011 chip  1.53  
3012 kumpf 1.61        _forwardRequestToService(
3013 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
3014 mday  1.36  
3015 kumpf 1.61        PEG_METHOD_EXIT();
3016                   return;
3017 mday  1.36     }
3018 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
3019                {
3020 kumpf 1.72        CIMException cimException;
3021 sage  1.77  
3022                   STAT_PROVIDERSTART
3023 karl  1.81  
3024 kumpf 1.47        CIMValue value;
3025             
3026                   _repository->read_lock();
3027 karl  1.81  
3028 kumpf 1.47        try
3029                   {
3030                      value = _repository->getProperty(
3031             	    request->nameSpace,
3032             	    request->instanceName,
3033             	    request->propertyName);
3034                   }
3035                   catch(CIMException& exception)
3036                   {
3037 kumpf 1.72           cimException = exception;
3038 kumpf 1.47        }
3039                   catch(Exception& exception)
3040                   {
3041 kumpf 1.72           cimException =
3042                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3043 kumpf 1.47        }
3044                   catch(...)
3045                   {
3046 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3047 kumpf 1.47        }
3048 mike  1.2   
3049 kumpf 1.47        _repository->read_unlock();
3050 sage  1.77  
3051                   STAT_PROVIDEREND
3052 karl  1.81  
3053 kumpf 1.47        CIMGetPropertyResponseMessage* response =
3054                      new CIMGetPropertyResponseMessage(
3055             	    request->messageId,
3056 kumpf 1.72  	    cimException,
3057 kumpf 1.47  	    request->queueIds.copyAndPop(),
3058             	    value);
3059             
3060 sage  1.77        STAT_COPYDISPATCHER_REP
3061             
3062 kumpf 1.47        _enqueueResponse(request, response);
3063 mday  1.36     }
3064 kumpf 1.47     else // No provider is registered and the repository isn't the default
3065 mday  1.36     {
3066 kumpf 1.47        CIMGetPropertyResponseMessage* response =
3067                      new CIMGetPropertyResponseMessage(
3068                         request->messageId,
3069 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
3070 kumpf 1.47              request->queueIds.copyAndPop(),
3071                         CIMValue());
3072             
3073 sage  1.77        STAT_COPYDISPATCHER
3074             
3075 kumpf 1.47        _enqueueResponse(request, response);
3076 mday  1.36     }
3077 kumpf 1.59     PEG_METHOD_EXIT();
3078 mike  1.2   }
3079             
3080 mday  1.36  void CIMOperationRequestDispatcher::handleSetPropertyRequest(
3081                CIMSetPropertyRequestMessage* request)
3082 mike  1.2   {
3083 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3084 kumpf 1.73        "CIMOperationRequestDispatcher::handleSetPropertyRequest");
3085 kumpf 1.59  
3086 kumpf 1.47     {
3087 kumpf 1.72        CIMException cimException;
3088 kumpf 1.47        try
3089                   {
3090                      _fixSetPropertyValueType(request);
3091                   }
3092                   catch (CIMException& exception)
3093                   {
3094 kumpf 1.72           cimException = exception;
3095 kumpf 1.47        }
3096                   catch(Exception& exception)
3097                   {
3098 kumpf 1.72           cimException =
3099                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3100 kumpf 1.47        }
3101                   catch(...)
3102                   {
3103 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3104 kumpf 1.47        }
3105             
3106 kumpf 1.72        if (cimException.getCode() != CIM_ERR_SUCCESS)
3107 kumpf 1.47        {
3108                      CIMSetPropertyResponseMessage* response =
3109                         new CIMSetPropertyResponseMessage(
3110                            request->messageId,
3111 kumpf 1.72                 cimException,
3112 kumpf 1.47                 request->queueIds.copyAndPop());
3113             
3114 sage  1.77           STAT_COPYDISPATCHER
3115             
3116 kumpf 1.47           _enqueueResponse(request, response);
3117 kumpf 1.59  
3118                      PEG_METHOD_EXIT();
3119                      return;
3120 kumpf 1.47        }
3121                }
3122 mday  1.36  
3123                String className = request->instanceName.getClassName();
3124 kumpf 1.61     CIMResponseMessage * response;
3125 karl  1.81  
3126 mday  1.36     // check the class name for an "external provider"
3127 kumpf 1.43     String providerName = _lookupInstanceProvider(request->nameSpace, className);
3128 mike  1.2   
3129 mday  1.36     if(providerName.size() != 0)
3130                {
3131 kumpf 1.61        CIMSetPropertyRequestMessage* requestCopy =
3132                       new CIMSetPropertyRequestMessage(*request);
3133 chip  1.39  
3134 kumpf 1.61        _forwardRequestToService(
3135 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
3136 chip  1.39  
3137 kumpf 1.61        PEG_METHOD_EXIT();
3138                   return;
3139 mday  1.36     }
3140 kumpf 1.47     else if (_repository->isDefaultInstanceProvider())
3141                {
3142 kumpf 1.72        CIMException cimException;
3143 kumpf 1.47  
3144 sage  1.77        STAT_PROVIDERSTART
3145             
3146 kumpf 1.47        _repository->write_lock();
3147             
3148                   try
3149                   {
3150                      _repository->setProperty(
3151             	    request->nameSpace,
3152             	    request->instanceName,
3153             	    request->propertyName,
3154             	    request->newValue);
3155                   }
3156                   catch(CIMException& exception)
3157                   {
3158 kumpf 1.72           cimException = exception;
3159 kumpf 1.47        }
3160                   catch(Exception& exception)
3161                   {
3162 kumpf 1.72           cimException =
3163                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3164 kumpf 1.47        }
3165                   catch(...)
3166                   {
3167 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3168 kumpf 1.47        }
3169             
3170                   _repository->write_unlock();
3171 mike  1.2   
3172 sage  1.77        STAT_PROVIDEREND
3173             
3174 kumpf 1.47        CIMSetPropertyResponseMessage* response =
3175                      new CIMSetPropertyResponseMessage(
3176             	    request->messageId,
3177 kumpf 1.72  	    cimException,
3178 kumpf 1.47  	    request->queueIds.copyAndPop());
3179 mike  1.2   
3180 sage  1.77        STAT_COPYDISPATCHER_REP
3181             
3182 kumpf 1.47        _enqueueResponse(request, response);
3183 mday  1.36     }
3184 kumpf 1.47     else // No provider is registered and the repository isn't the default
3185 mday  1.36     {
3186 kumpf 1.47        CIMSetPropertyResponseMessage* response =
3187                      new CIMSetPropertyResponseMessage(
3188                         request->messageId,
3189 kumpf 1.72              PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, String::EMPTY),
3190 kumpf 1.47              request->queueIds.copyAndPop());
3191             
3192 sage  1.77        STAT_COPYDISPATCHER
3193             
3194 kumpf 1.47        _enqueueResponse(request, response);
3195 mday  1.36     }
3196 kumpf 1.59  
3197                PEG_METHOD_EXIT();
3198 mike  1.2   }
3199             
3200 mday  1.36  void CIMOperationRequestDispatcher::handleGetQualifierRequest(
3201                CIMGetQualifierRequestMessage* request)
3202 mike  1.2   {
3203 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3204 kumpf 1.73        "CIMOperationRequestDispatcher::handleGetQualifierRequest");
3205 kumpf 1.59  
3206 sage  1.77     STAT_PROVIDERSTART
3207             
3208 kumpf 1.72     CIMException cimException;
3209 mday  1.36     CIMQualifierDecl cimQualifierDecl;
3210 kumpf 1.30  
3211 mday  1.36     _repository->read_lock();
3212 karl  1.81  
3213 mday  1.36     try
3214                {
3215                   cimQualifierDecl = _repository->getQualifier(
3216             	 request->nameSpace,
3217             	 request->qualifierName);
3218                }
3219                catch(CIMException& exception)
3220                {
3221 kumpf 1.72        cimException = exception;
3222 mday  1.36     }
3223                catch(Exception& exception)
3224                {
3225 kumpf 1.72        cimException =
3226                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3227 mday  1.36     }
3228                catch(...)
3229                {
3230 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3231 mday  1.36     }
3232 mike  1.2   
3233 mday  1.36     _repository->read_unlock();
3234 mike  1.2   
3235 sage  1.77     STAT_PROVIDEREND
3236             
3237 mday  1.36     CIMGetQualifierResponseMessage* response =
3238                   new CIMGetQualifierResponseMessage(
3239             	 request->messageId,
3240 kumpf 1.72  	 cimException,
3241 mday  1.36  	 request->queueIds.copyAndPop(),
3242             	 cimQualifierDecl);
3243 mike  1.2   
3244 sage  1.77     STAT_COPYDISPATCHER_REP
3245             
3246 mday  1.36     _enqueueResponse(request, response);
3247 kumpf 1.59  
3248                PEG_METHOD_EXIT();
3249 mike  1.2   }
3250             
3251             void CIMOperationRequestDispatcher::handleSetQualifierRequest(
3252 mday  1.36     CIMSetQualifierRequestMessage* request)
3253 mike  1.2   {
3254 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3255 kumpf 1.73        "CIMOperationRequestDispatcher::handleSetQualifierRequest");
3256 kumpf 1.59  
3257 sage  1.77     STAT_PROVIDERSTART
3258             
3259 kumpf 1.72     CIMException cimException;
3260 mike  1.2   
3261 mday  1.36     _repository->write_lock();
3262 karl  1.81  
3263 mday  1.36     try
3264                {
3265                   _repository->setQualifier(
3266             	 request->nameSpace,
3267             	 request->qualifierDeclaration);
3268                }
3269                catch(CIMException& exception)
3270                {
3271 kumpf 1.72        cimException = exception;
3272 mday  1.36     }
3273                catch(Exception& exception)
3274                {
3275 kumpf 1.72        cimException =
3276                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3277 mday  1.36     }
3278                catch(...)
3279                {
3280 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3281 mday  1.36     }
3282             
3283                _repository->write_unlock();
3284             
3285 sage  1.77     STAT_PROVIDEREND
3286             
3287 mday  1.36     CIMSetQualifierResponseMessage* response =
3288                   new CIMSetQualifierResponseMessage(
3289             	 request->messageId,
3290 kumpf 1.72  	 cimException,
3291 mday  1.36  	 request->queueIds.copyAndPop());
3292 mike  1.2   
3293 sage  1.77     STAT_COPYDISPATCHER_REP
3294             
3295 mday  1.36     _enqueueResponse(request, response);
3296 kumpf 1.59  
3297                PEG_METHOD_EXIT();
3298 mike  1.2   }
3299             
3300             void CIMOperationRequestDispatcher::handleDeleteQualifierRequest(
3301 mday  1.36     CIMDeleteQualifierRequestMessage* request)
3302 mike  1.2   {
3303 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3304 kumpf 1.73        "CIMOperationRequestDispatcher::handleDeleteQualifierRequest");
3305 kumpf 1.59  
3306 sage  1.77     STAT_PROVIDERSTART
3307             
3308 kumpf 1.72     CIMException cimException;
3309 mday  1.36  
3310                _repository->write_lock();
3311             
3312                try
3313                {
3314                   _repository->deleteQualifier(
3315             	 request->nameSpace,
3316             	 request->qualifierName);
3317                }
3318             
3319                catch(CIMException& exception)
3320                {
3321 kumpf 1.72        cimException = exception;
3322 mday  1.36     }
3323                catch(Exception& exception)
3324                {
3325 kumpf 1.72        cimException =
3326                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3327 mday  1.36     }
3328                catch(...)
3329                {
3330 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3331 mday  1.36     }
3332 mike  1.2   
3333 mday  1.36     _repository->write_unlock();
3334 mike  1.2   
3335 sage  1.77     STAT_PROVIDEREND
3336             
3337 mday  1.36     CIMDeleteQualifierResponseMessage* response =
3338                   new CIMDeleteQualifierResponseMessage(
3339             	 request->messageId,
3340 kumpf 1.72  	 cimException,
3341 mday  1.36  	 request->queueIds.copyAndPop());
3342 mike  1.2   
3343 sage  1.77     STAT_COPYDISPATCHER_REP
3344             
3345 mday  1.36     _enqueueResponse(request, response);
3346 kumpf 1.59  
3347                PEG_METHOD_EXIT();
3348 mike  1.2   }
3349             
3350             void CIMOperationRequestDispatcher::handleEnumerateQualifiersRequest(
3351 mday  1.36     CIMEnumerateQualifiersRequestMessage* request)
3352 mike  1.2   {
3353 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3354 kumpf 1.73        "CIMOperationRequestDispatcher::handleEnumerateQualifiersRequest");
3355 kumpf 1.59  
3356 kumpf 1.72     CIMException cimException;
3357 sage  1.77  
3358                STAT_PROVIDERSTART
3359             
3360 mday  1.36     Array<CIMQualifierDecl> qualifierDeclarations;
3361             
3362                _repository->read_lock();
3363             
3364                try
3365                {
3366                   qualifierDeclarations = _repository->enumerateQualifiers(
3367             	 request->nameSpace);
3368                }
3369             
3370                catch(CIMException& exception)
3371                {
3372 kumpf 1.72        cimException = exception;
3373 mday  1.36     }
3374                catch(Exception& exception)
3375                {
3376 kumpf 1.72        cimException =
3377                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3378 mday  1.36     }
3379                catch(...)
3380                {
3381 kumpf 1.72        cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3382 mday  1.36     }
3383             
3384                _repository->read_unlock();
3385             
3386 sage  1.77     STAT_PROVIDEREND
3387             
3388 mday  1.36     CIMEnumerateQualifiersResponseMessage* response =
3389                   new CIMEnumerateQualifiersResponseMessage(
3390             	 request->messageId,
3391 kumpf 1.72  	 cimException,
3392 mday  1.36  	 request->queueIds.copyAndPop(),
3393             	 qualifierDeclarations);
3394 kumpf 1.68  
3395                _enqueueResponse(request, response);
3396             
3397 sage  1.77     STAT_COPYDISPATCHER_REP
3398             
3399 kumpf 1.68     PEG_METHOD_EXIT();
3400             }
3401             
3402             void CIMOperationRequestDispatcher::handleExecQueryRequest(
3403                CIMExecQueryRequestMessage* request)
3404             {
3405                PEG_METHOD_ENTER(TRC_DISPATCHER,
3406 kumpf 1.73        "CIMOperationRequestDispatcher::handleExecQueryRequest");
3407 kumpf 1.68  
3408 kumpf 1.72     CIMException cimException =
3409                    PEGASUS_CIM_EXCEPTION(CIM_ERR_NOT_SUPPORTED, "ExecQuery");
3410 kumpf 1.103    Array<CIMObject> cimObjects;
3411 kumpf 1.68  
3412                CIMExecQueryResponseMessage* response =
3413                   new CIMExecQueryResponseMessage(
3414             	 request->messageId,
3415 kumpf 1.72  	 cimException,
3416 kumpf 1.68  	 request->queueIds.copyAndPop(),
3417 kumpf 1.69  	 cimObjects);
3418 mike  1.2   
3419 sage  1.77     STAT_COPYDISPATCHER
3420             
3421 mday  1.36     _enqueueResponse(request, response);
3422 kumpf 1.59  
3423                PEG_METHOD_EXIT();
3424 mike  1.2   }
3425             
3426             void CIMOperationRequestDispatcher::handleInvokeMethodRequest(
3427 mday  1.36     CIMInvokeMethodRequestMessage* request)
3428 mike  1.2   {
3429 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3430 kumpf 1.73        "CIMOperationRequestDispatcher::handleInvokeMethodRequest");
3431 kumpf 1.59  
3432 kumpf 1.61     CIMResponseMessage * response;
3433             
3434 kumpf 1.47     {
3435 kumpf 1.72        CIMException cimException;
3436 kumpf 1.47        try
3437                   {
3438                      _fixInvokeMethodParameterTypes(request);
3439                   }
3440                   catch (CIMException& exception)
3441                   {
3442 kumpf 1.72           cimException = exception;
3443 kumpf 1.47        }
3444                   catch(Exception& exception)
3445                   {
3446 kumpf 1.72           cimException =
3447                         PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3448 kumpf 1.47        }
3449                   catch(...)
3450                   {
3451 kumpf 1.72           cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3452 kumpf 1.47        }
3453             
3454 kumpf 1.72        if (cimException.getCode() != CIM_ERR_SUCCESS)
3455 kumpf 1.47        {
3456 kumpf 1.61           response =
3457 kumpf 1.47              new CIMInvokeMethodResponseMessage(
3458                            request->messageId,
3459 kumpf 1.72                 cimException,
3460 kumpf 1.47                 request->queueIds.copyAndPop(),
3461                            CIMValue(),
3462                            Array<CIMParamValue>(),
3463                            request->methodName);
3464             
3465 sage  1.77           STAT_COPYDISPATCHER
3466             
3467 kumpf 1.47           _enqueueResponse(request, response);
3468 kumpf 1.59  
3469                      PEG_METHOD_EXIT();
3470                      return;
3471 kumpf 1.47        }
3472                }
3473             
3474 kumpf 1.30  
3475 mday  1.36     String className = request->instanceName.getClassName();
3476 kumpf 1.65  
3477 kumpf 1.113    CIMException checkClassException;
3478                _checkExistenceOfClass(request->nameSpace, className, checkClassException);
3479                if (checkClassException.getCode() != CIM_ERR_SUCCESS)
3480                {
3481                   CIMInvokeMethodResponseMessage* response =
3482                      new CIMInvokeMethodResponseMessage(
3483                         request->messageId,
3484                         checkClassException,
3485                         request->queueIds.copyAndPop(),
3486                         CIMValue(),
3487                         Array<CIMParamValue>(),
3488                         request->methodName);
3489             
3490                   _enqueueResponse(request, response);
3491                   PEG_METHOD_EXIT();
3492                   return;
3493                }
3494             
3495 kumpf 1.65     String serviceName = String::EMPTY;
3496                String controlProviderName = String::EMPTY;
3497             
3498                // Check for class provided by an internal provider
3499                if (_lookupInternalProvider(request->nameSpace, className, serviceName,
3500                        controlProviderName))
3501                {
3502                   CIMInvokeMethodRequestMessage* requestCopy =
3503                      new CIMInvokeMethodRequestMessage(*request);
3504             
3505 karl  1.84        _forwardRequest(className, serviceName, controlProviderName,
3506 karl  1.96            requestCopy);
3507 kumpf 1.65  
3508                   PEG_METHOD_EXIT();
3509                   return;
3510                }
3511             
3512 mday  1.36     // check the class name for an "external provider"
3513 chip  1.46     String providerName = _lookupMethodProvider(request->nameSpace,
3514 kumpf 1.43  			 className, request->methodName);
3515 mike  1.2   
3516 mday  1.36     if(providerName.size() != 0)
3517                {
3518 kumpf 1.61        CIMInvokeMethodRequestMessage* requestCopy =
3519                       new CIMInvokeMethodRequestMessage(*request);
3520 chip  1.53  
3521 kumpf 1.61        _forwardRequestToService(
3522 kumpf 1.74            PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP, requestCopy, response);
3523 chip  1.39  
3524 kumpf 1.61        PEG_METHOD_EXIT();
3525                   return;
3526 mday  1.36     }
3527 karl  1.81  
3528 kumpf 1.72     CIMException cimException =
3529                    PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, "Provider not available");
3530 mday  1.36     CIMValue retValue(1);
3531                Array<CIMParamValue> outParameters;
3532             
3533 kumpf 1.61     response =
3534 mday  1.36        new CIMInvokeMethodResponseMessage(
3535             	 request->messageId,
3536 kumpf 1.72  	 cimException,
3537 mday  1.36  	 request->queueIds.copyAndPop(),
3538             	 retValue,
3539             	 outParameters,
3540             	 request->methodName);
3541 sage  1.77  
3542                STAT_COPYDISPATCHER
3543 chip  1.12  
3544 mday  1.36     _enqueueResponse(request, response);
3545 kumpf 1.59  
3546                PEG_METHOD_EXIT();
3547 kumpf 1.16  }
3548 kumpf 1.30  
3549             /**
3550 mday  1.36     Convert the specified CIMValue to the specified type, and return it in
3551                a new CIMValue.
3552 kumpf 1.30  */
3553             CIMValue CIMOperationRequestDispatcher::_convertValueType(
3554 mday  1.36     const CIMValue& value,
3555                CIMType type)
3556 kumpf 1.30  {
3557 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3558 kumpf 1.73        "CIMOperationRequestDispatcher::_convertValueType");
3559 kumpf 1.59  
3560 mday  1.36     CIMValue newValue;
3561 kumpf 1.30  
3562 mday  1.36     if (value.isArray())
3563                {
3564                   Array<String> stringArray;
3565                   Array<char*> charPtrArray;
3566                   Array<const char*> constCharPtrArray;
3567             
3568                   //
3569                   // Convert the value to Array<const char*> to send to conversion method
3570                   //
3571                   // ATTN-RK-P3-20020221: Deal with TypeMismatch exception
3572                   // (Shouldn't really ever get that exception)
3573                   value.get(stringArray);
3574             
3575                   for (Uint32 k=0; k<stringArray.size(); k++)
3576                   {
3577             	 // Need to build an Array<const char*> to send to the conversion
3578             	 // routine, but also need to keep track of them pointers as char*
3579             	 // because Windows won't let me delete a const char*.
3580             	 char* charPtr = stringArray[k].allocateCString();
3581             	 charPtrArray.append(charPtr);
3582             	 constCharPtrArray.append(charPtr);
3583 mday  1.36        }
3584             
3585                   //
3586                   // Convert the value to the specified type
3587                   //
3588                   try
3589                   {
3590             	 newValue = XmlReader::stringArrayToValue(0, constCharPtrArray, type);
3591                   }
3592                   catch (XmlSemanticError e)
3593                   {
3594 kumpf 1.59           PEG_METHOD_EXIT();
3595 mday  1.36  	 throw PEGASUS_CIM_EXCEPTION(
3596             	    CIM_ERR_INVALID_PARAMETER,
3597 kumpf 1.91  	    String("Malformed ") + type.toString() + " value");
3598 mday  1.36        }
3599             
3600                   for (Uint32 k=0; k<charPtrArray.size(); k++)
3601                   {
3602             	 delete charPtrArray[k];
3603                   }
3604                }
3605                else
3606                {
3607                   String stringValue;
3608 kumpf 1.30  
3609 mday  1.36        // ATTN-RK-P3-20020221: Deal with TypeMismatch exception
3610                   // (Shouldn't really ever get that exception)
3611                   value.get(stringValue);
3612             
3613                   try
3614                   {
3615             	 newValue = XmlReader::stringToValue(0, _CString(stringValue), type);
3616                   }
3617                   catch (XmlSemanticError e)
3618                   {
3619 kumpf 1.59           PEG_METHOD_EXIT();
3620 mday  1.36  	 throw PEGASUS_CIM_EXCEPTION(
3621             	    CIM_ERR_INVALID_PARAMETER,
3622 kumpf 1.91  	    String("Malformed ") + type.toString() + " value");
3623 mday  1.36        }
3624                }
3625 kumpf 1.30  
3626 kumpf 1.59     PEG_METHOD_EXIT();
3627 mday  1.36     return newValue;
3628 kumpf 1.30  }
3629             
3630             /**
3631 mday  1.36     Find the CIMParamValues in the InvokeMethod request whose types were
3632                not specified in the XML encoding, and convert them to the types
3633                specified in the method schema.
3634 kumpf 1.47  */
3635 kumpf 1.30  void CIMOperationRequestDispatcher::_fixInvokeMethodParameterTypes(
3636 mday  1.36     CIMInvokeMethodRequestMessage* request)
3637 kumpf 1.30  {
3638 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3639 kumpf 1.73        "CIMOperationRequestDispatcher::_fixInvokeMethodParameterTypes");
3640 kumpf 1.59  
3641 mday  1.36     Boolean gotMethodDefinition = false;
3642                CIMMethod method;
3643 kumpf 1.30  
3644                 //
3645                 // Cycle through the input parameters, converting the untyped ones.
3646                 //
3647                 Array<CIMParamValue> inParameters = request->inParameters;
3648                 Uint32 numInParamValues = inParameters.size();
3649                 for (Uint32 i=0; i<numInParamValues; i++)
3650                 {
3651 kumpf 1.33          if (!inParameters[i].isTyped())
3652 kumpf 1.30          {
3653                         //
3654                         // Retrieve the method definition, if we haven't already done so
3655                         // (only look up the method if we have an untyped parameter value)
3656                         //
3657                         if (!gotMethodDefinition)
3658                         {
3659                             //
3660                             // Get the class definition for this method
3661                             //
3662                             CIMClass cimClass;
3663                             _repository->read_lock();
3664 kumpf 1.47                  try
3665                             {
3666                                 cimClass = _repository->getClass(
3667                                     request->nameSpace,
3668                                     request->instanceName.getClassName(),
3669                                     false, //localOnly,
3670                                     false, //includeQualifiers,
3671                                     false, //includeClassOrigin,
3672                                     CIMPropertyList());
3673                             }
3674                             catch (CIMException& exception)
3675                             {
3676                                 _repository->read_unlock();
3677 kumpf 1.59                      PEG_METHOD_EXIT();
3678 kumpf 1.47                      throw exception;
3679                             }
3680                             catch (Exception& exception)
3681                             {
3682                                 _repository->read_unlock();
3683 kumpf 1.59                      PEG_METHOD_EXIT();
3684 kumpf 1.47                      throw exception;
3685                             }
3686                             catch (...)
3687                             {
3688                                 _repository->read_unlock();
3689 kumpf 1.59                      PEG_METHOD_EXIT();
3690 kumpf 1.47                      throw CIMException(CIM_ERR_FAILED);
3691                             }
3692 kumpf 1.30                  _repository->read_unlock();
3693             
3694                             //
3695                             // Get the method definition from the class
3696                             //
3697                             Uint32 methodPos = cimClass.findMethod(request->methodName);
3698                             if (methodPos == PEG_NOT_FOUND)
3699                             {
3700 kumpf 1.34                      throw CIMException(CIM_ERR_METHOD_NOT_FOUND);
3701 kumpf 1.30                  }
3702                             method = cimClass.getMethod(methodPos);
3703             
3704                             gotMethodDefinition = true;
3705                         }
3706             
3707                         //
3708                         // Find the parameter definition for this input parameter
3709                         //
3710 kumpf 1.33              String paramName = inParameters[i].getParameterName();
3711 kumpf 1.30              Uint32 numParams = method.getParameterCount();
3712                         for (Uint32 j=0; j<numParams; j++)
3713                         {
3714                             CIMParameter param = method.getParameter(j);
3715                             if (paramName == param.getName())
3716                             {
3717                                 //
3718                                 // Retype the input parameter value according to the
3719                                 // type defined in the class/method schema
3720                                 //
3721                                 CIMType paramType = param.getType();
3722                                 CIMValue newValue;
3723             
3724                                 if (inParameters[i].getValue().isNull())
3725                                 {
3726                                     newValue.setNullValue(param.getType(), param.isArray());
3727                                 }
3728                                 else if (inParameters[i].getValue().isArray() !=
3729                                              param.isArray())
3730                                 {
3731                                     // ATTN-RK-P1-20020222: Who catches this?  They aren't.
3732 kumpf 1.59                          PEG_METHOD_EXIT();
3733 kumpf 1.34                          throw CIMException(CIM_ERR_TYPE_MISMATCH);
3734 kumpf 1.30                      }
3735                                 else
3736                                 {
3737                                     newValue = _convertValueType(inParameters[i].getValue(),
3738                                         paramType);
3739                                 }
3740             
3741 kumpf 1.35                      inParameters[i].setValue(newValue);
3742                                 inParameters[i].setIsTyped(true);
3743 kumpf 1.30                      break;
3744                             }
3745                         }
3746                     }
3747                 }
3748 kumpf 1.59  
3749                 PEG_METHOD_EXIT();
3750 kumpf 1.30  }
3751             
3752             /**
3753 mday  1.36     Convert the CIMValue given in a SetProperty request to the correct
3754                type according to the schema, because it is not possible to specify
3755                the property type in the XML encoding.
3756 kumpf 1.30  */
3757             void CIMOperationRequestDispatcher::_fixSetPropertyValueType(
3758 mday  1.36     CIMSetPropertyRequestMessage* request)
3759 kumpf 1.30  {
3760 kumpf 1.59     PEG_METHOD_ENTER(TRC_DISPATCHER,
3761 kumpf 1.73        "CIMOperationRequestDispatcher::_fixSetPropertyValueType");
3762 kumpf 1.59  
3763 mday  1.36     CIMValue inValue = request->newValue;
3764 kumpf 1.30  
3765 mday  1.36     //
3766                // Only do the conversion if the type is not already set
3767                //
3768                if ((inValue.getType() != CIMType::STRING) &&
3769                    (inValue.getType() != CIMType::NONE))
3770                {
3771 kumpf 1.59        PEG_METHOD_EXIT();
3772 mday  1.36        return;
3773                }
3774 kumpf 1.30  
3775 mday  1.36     //
3776                // Get the class definition for this property
3777                //
3778                CIMClass cimClass;
3779                _repository->read_lock();
3780 kumpf 1.47     try
3781                {
3782                   cimClass = _repository->getClass(
3783                      request->nameSpace,
3784                      request->instanceName.getClassName(),
3785                      false, //localOnly,
3786                      false, //includeQualifiers,
3787                      false, //includeClassOrigin,
3788                      CIMPropertyList());
3789                }
3790                catch (CIMException& exception)
3791                {
3792                   _repository->read_unlock();
3793 kumpf 1.59        PEG_METHOD_EXIT();
3794 kumpf 1.47        throw exception;
3795                }
3796                catch (Exception& exception)
3797                {
3798                   _repository->read_unlock();
3799 kumpf 1.59        PEG_METHOD_EXIT();
3800 kumpf 1.47        throw exception;
3801                }
3802                catch (...)
3803                {
3804                   _repository->read_unlock();
3805 kumpf 1.59        PEG_METHOD_EXIT();
3806 kumpf 1.47        throw CIMException(CIM_ERR_FAILED);
3807                }
3808 mday  1.36     _repository->read_unlock();
3809             
3810                //
3811                // Get the property definition from the class
3812                //
3813                Uint32 propertyPos = cimClass.findProperty(request->propertyName);
3814                if (propertyPos == PEG_NOT_FOUND)
3815                {
3816 kumpf 1.59        PEG_METHOD_EXIT();
3817 mday  1.36        throw CIMException(CIM_ERR_NO_SUCH_PROPERTY);
3818                }
3819                CIMProperty property = cimClass.getProperty(propertyPos);
3820 kumpf 1.30  
3821 mday  1.36     //
3822                // Retype the input property value according to the
3823                // type defined in the schema
3824                //
3825                CIMValue newValue;
3826 kumpf 1.30  
3827 mday  1.36     if (inValue.isNull())
3828                {
3829                   newValue.setNullValue(property.getType(), property.isArray());
3830                }
3831                else if (inValue.isArray() != property.isArray())
3832                {
3833                   // ATTN-RK-P1-20020222: Who catches this?  They aren't.
3834 kumpf 1.59        PEG_METHOD_EXIT();
3835 mday  1.36        throw CIMException(CIM_ERR_TYPE_MISMATCH);
3836                }
3837                else
3838                {
3839                   newValue = _convertValueType(inValue, property.getType());
3840                }
3841 kumpf 1.30  
3842 mday  1.36     //
3843                // Put the retyped value back into the message
3844                //
3845                request->newValue = newValue;
3846 kumpf 1.59  
3847                PEG_METHOD_EXIT();
3848 kumpf 1.113 }
3849             
3850             void CIMOperationRequestDispatcher::_checkExistenceOfClass(
3851                const String& nameSpace,
3852                const String& className,
3853                CIMException& cimException)
3854             {
3855                if (String::equalNoCase(className,"__Namespace"))
3856                {
3857                   return;
3858                }
3859             
3860                CIMClass cimClass;
3861             
3862                _repository->read_lock();
3863             
3864                try
3865                {
3866                   cimClass = _repository->getClass(
3867                      nameSpace,
3868                      className,
3869 kumpf 1.113          true,
3870                      false,
3871                      false,
3872                      CIMPropertyList());
3873                }
3874                catch(CIMException& exception)
3875                {
3876                   cimException = exception;
3877                }
3878                catch(Exception& exception)
3879                {
3880                   cimException =
3881                      PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, exception.getMessage());
3882                }
3883                catch(...)
3884                {
3885                   cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED, String::EMPTY);
3886                }
3887             
3888                _repository->read_unlock();
3889 kumpf 1.30  }
3890 mike  1.2   
3891             PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2