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

  1 karl  1.15 //%2003////////////////////////////////////////////////////////////////////////
  2 chip  1.1  //
  3 karl  1.15 // Copyright (c) 2000, 2001, 2002  BMC Software, Hewlett-Packard Development
  4            // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.
  5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
  6            // IBM Corp.; EMC Corporation, The Open Group.
  7 chip  1.1  //
  8            // Permission is hereby granted, free of charge, to any person obtaining a copy
  9            // of this software and associated documentation files (the "Software"), to
 10            // deal in the Software without restriction, including without limitation the
 11            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 12            // sell copies of the Software, and to permit persons to whom the Software is
 13            // furnished to do so, subject to the following conditions:
 14 chip  1.17 //
 15 chip  1.1  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 16            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 17            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 18            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 19            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 20            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 21            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 22            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 23            //
 24            //==============================================================================
 25            //
 26            // Author: Chip Vincent (cvincent@us.ibm.com)
 27            //
 28            // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
 29            //                  (carolann_graves@hp.com)
 30            //              Mike Day, IBM (mdday@us.ibm.com)
 31            //              Karl Schopmeyer(k.schopmeyer@opengroup.org) - Fix associators.
 32 chip  1.9  //              Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)
 33 schuur 1.19 //              Adrian Schuur, IBM (schuur@de.ibm.com)
 34 a.arora 1.37 //              Amit K Arora (amita@in.ibm.com) for PEP-101
 35 kumpf   1.39 //              Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
 36 se.gupta 1.41 //              Seema Gupta (gseema@in.ibm.com for PEP135)
 37 chip     1.1  //
 38               //%/////////////////////////////////////////////////////////////////////////////
 39               
 40               #include "ProviderManagerService.h"
 41               
 42               #include <Pegasus/Common/Config.h>
 43               #include <Pegasus/Common/Constants.h>
 44               #include <Pegasus/Common/CIMMessage.h>
 45 kumpf    1.39 #include <Pegasus/Common/Thread.h>
 46 chip     1.1  #include <Pegasus/Common/Tracer.h>
 47               #include <Pegasus/Common/Logger.h>
 48 a.arora  1.37 #include <Pegasus/Common/AutoPtr.h>
 49 chip     1.1  
 50 chip     1.6  #include <Pegasus/Config/ConfigManager.h>
 51               
 52 kumpf    1.39 #include <Pegasus/ProviderManager2/BasicProviderManagerRouter.h>
 53 chip     1.17 
 54 chip     1.1  PEGASUS_NAMESPACE_BEGIN
 55               
 56 kumpf    1.38 static const Uint16 _MODULE_OK       = 2;
 57               static const Uint16 _MODULE_STOPPING = 9;
 58               static const Uint16 _MODULE_STOPPED  = 10;
 59               
 60 chip     1.11 inline Boolean _isSupportedRequestType(const Message * message)
 61               {
 62                   // ATTN: needs implementation
 63               
 64                   // for now, assume all requests are valid
 65               
 66                   return(true);
 67 chip     1.3  }
 68               
 69               inline Boolean _isSupportedResponseType(const Message * message)
 70               {
 71 chip     1.11     // ATTN: needs implementation
 72               
 73                   // for now, assume all responses are invalid
 74 chip     1.3  
 75 chip     1.11     return(false);
 76 chip     1.3  }
 77               
 78 schuur   1.19 ProviderManagerService* ProviderManagerService::providerManagerService=NULL;
 79 kumpf    1.39 Uint32 ProviderManagerService::_indicationServiceQueueId = PEG_NOT_FOUND;
 80 schuur   1.19 
 81 chip     1.1  ProviderManagerService::ProviderManagerService(void)
 82                   : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
 83               {
 84 schuur   1.19     providerManagerService=this;
 85 chip     1.1  }
 86               
 87 schuur   1.25 ProviderManagerService::ProviderManagerService(
 88                       ProviderRegistrationManager * providerRegistrationManager,
 89                       CIMRepository * repository)
 90 chip     1.1      : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
 91               {
 92 schuur   1.19     providerManagerService=this;
 93 schuur   1.25     _repository=repository;
 94 dj.gorey 1.31 
 95 kumpf    1.38     _providerRegistrationManager = providerRegistrationManager;
 96 kumpf    1.44 
 97                   _unloadIdleProvidersBusy = 0;
 98               
 99 kumpf    1.39     _providerManagerRouter =
100                       new BasicProviderManagerRouter(indicationCallback);
101 chip     1.1  }
102               
103               ProviderManagerService::~ProviderManagerService(void)
104               {
105 kumpf    1.39     delete _providerManagerRouter;
106 schuur   1.19     providerManagerService=NULL;
107 chip     1.1  }
108               
109               Boolean ProviderManagerService::messageOK(const Message * message)
110               {
111                   PEGASUS_ASSERT(message != 0);
112               
113 chip     1.3      if(_isSupportedRequestType(message))
114 chip     1.1      {
115 chip     1.3          return(MessageQueueService::messageOK(message));
116 chip     1.1      }
117               
118 chip     1.3      return(false);
119 chip     1.1  }
120               
121               void ProviderManagerService::handleEnqueue(void)
122               {
123                   Message * message = dequeue();
124               
125                   handleEnqueue(message);
126               }
127               
128               void ProviderManagerService::handleEnqueue(Message * message)
129               {
130                   PEGASUS_ASSERT(message != 0);
131               
132                   AsyncLegacyOperationStart * asyncRequest;
133               
134                   if(message->_async != NULL)
135                   {
136                       asyncRequest = static_cast<AsyncLegacyOperationStart *>(message->_async);
137                   }
138                   else
139                   {
140 chip     1.1          asyncRequest = new AsyncLegacyOperationStart(
141                           get_next_xid(),
142                           0,
143                           this->getQueueId(),
144                           message,
145                           this->getQueueId());
146                   }
147               
148                   _handle_async_request(asyncRequest);
149               }
150               
151               void ProviderManagerService::_handle_async_request(AsyncRequest * request)
152               {
153                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
154                       "ProviderManagerService::_handle_async_request");
155               
156                   PEGASUS_ASSERT((request != 0) && (request->op != 0));
157               
158                   if(request->getType() == async_messages::ASYNC_LEGACY_OP_START)
159                   {
160                       request->op->processing();
161 chip     1.1  
162                       _incomingQueue.enqueue(request->op);
163               
164 schuur   1.32          while (!_thread_pool->allocate_and_awaken(
165                                    (void *)this, ProviderManagerService::handleCimOperation))
166                        {
167                            pegasus_yield();
168                        }
169 chip     1.1      }
170                   else
171                   {
172                       // pass all other operations to the default handler
173                       MessageQueueService::_handle_async_request(request);
174                   }
175               
176                   PEG_METHOD_EXIT();
177               
178                   return;
179               }
180               
181 kumpf    1.39 PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL
182               ProviderManagerService::handleCimOperation(void * arg) throw()
183 chip     1.1  {
184 kumpf    1.39     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
185                       "ProviderManagerService::handleCimOperation");
186 chip     1.1  
187 chip     1.8      if(arg == 0)
188                   {
189                       // thread started with invalid argument.
190                       return(PEGASUS_THREAD_RETURN(1));
191                   }
192               
193 chip     1.1      // get the service from argument
194 kumpf    1.39     ProviderManagerService * service =
195                       reinterpret_cast<ProviderManagerService *>(arg);
196 chip     1.1  
197                   if(service->_incomingQueue.size() == 0)
198                   {
199                       PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
200 kumpf    1.39             "ProviderManagerService::handleCimOperation() called with no "
201                               "op node in queue");
202 chip     1.1  
203                       PEG_METHOD_EXIT();
204               
205                       // thread started with no message in queue.
206                       return(PEGASUS_THREAD_RETURN(1));
207                   }
208               
209                   AsyncOpNode * op = service->_incomingQueue.dequeue();
210               
211 chip     1.8      if((op == 0) || (op->_request.count() == 0))
212 chip     1.1      {
213 kumpf    1.39         // ATTN: This may dereference a null pointer!
214 chip     1.1          MessageQueue * queue = MessageQueue::lookup(op->_source_queue);
215               
216                       PEGASUS_ASSERT(queue != 0);
217               
218                       PEG_METHOD_EXIT();
219               
220                       // no request in op node
221                       return(PEGASUS_THREAD_RETURN(1));
222                   }
223               
224                   AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0));
225               
226 kumpf    1.39     if ((request == 0) ||
227                       (request->getType() != async_messages::ASYNC_LEGACY_OP_START))
228 chip     1.1      {
229                       // reply with NAK
230                       PEG_METHOD_EXIT();
231                       return(PEGASUS_THREAD_RETURN(0));
232                   }
233               
234 chip     1.8      try
235 chip     1.1      {
236 kumpf    1.39         Message* legacy =
237                           static_cast<AsyncLegacyOperationStart *>(request)->get_action();
238 chip     1.1  
239 chip     1.8          if(_isSupportedRequestType(legacy))
240 chip     1.1          {
241 a.arora  1.37             AutoPtr<Message> xmessage(legacy);
242 chip     1.1  
243 chip     1.8              // Set the client's requested language into this service thread.
244                           // This will allow functions in this service to return messages
245                           // in the correct language.
246 kumpf    1.39             CIMMessage* msg = dynamic_cast<CIMMessage *>(legacy);
247 chip     1.8  
248 kumpf    1.39             if (msg != 0)
249 chip     1.8              {
250 kumpf    1.39                 AcceptLanguages* langs =
251                                   new AcceptLanguages(msg->acceptLanguages);
252 chip     1.8                  Thread::setLanguages(langs);
253                           }
254                           else
255                           {
256                               Thread::clearLanguages();
257                           }
258 chip     1.1  
259                           service->handleCimRequest(op, legacy);
260 chip     1.3          }
261 chip     1.8      }
262                   catch(...)
263                   {
264                       // ATTN: log error
265 chip     1.1      }
266               
267                   PEG_METHOD_EXIT();
268               
269                   return(PEGASUS_THREAD_RETURN(0));
270               }
271               
272 kumpf    1.39 void ProviderManagerService::handleCimRequest(
273                   AsyncOpNode * op,
274                   Message * message)
275 chip     1.1  {
276 kumpf    1.39     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
277                       "ProviderManagerService::handleCimRequest");
278 chip     1.1  
279 kumpf    1.38     CIMRequestMessage * request = dynamic_cast<CIMRequestMessage *>(message);
280                   PEGASUS_ASSERT(request != 0);
281 chip     1.1  
282                   // get request from op node
283                   AsyncRequest * async = static_cast<AsyncRequest *>(op->_request.next(0));
284 kumpf    1.38     PEGASUS_ASSERT(async != 0);
285               
286                   Message * response = 0;
287 chip     1.1  
288 kumpf    1.38     if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) ||
289 kumpf    1.40         (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) ||
290               	(request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE))
291 kumpf    1.38     {
292 se.gupta 1.41         // Handle CIMOperationRequestMessage and CIMExportIndicationRequestMessage
293               		// The provider ID container is already added to operationcontext in CIMOperationRequestDispacther
294               		// for all instance, method , association and indication providers under PEP135 , so no need to add it again .
295               		// So add it only for ExportIndicationRequestMessage
296               
297               		if (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE)
298               		{
299               		    ProviderIdContainer pidc = _getProviderIdContainer(request);
300                           request->operationContext.insert(pidc);
301               		}
302 kumpf    1.38 
303 kumpf    1.39         response = _providerManagerRouter->processMessage(request);
304 schuur   1.19     }
305 kumpf    1.38     else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE)
306                   {
307                       // Handle CIMEnableModuleRequestMessage
308                       CIMEnableModuleRequestMessage * emReq =
309                           dynamic_cast<CIMEnableModuleRequestMessage*>(request);
310               
311                       CIMInstance providerModule = emReq->providerModule;
312 dj.gorey 1.31 
313 kumpf    1.38         try
314                       {
315 kumpf    1.39             // Forward the request to the ProviderManager
316                           response = _providerManagerRouter->processMessage(request);
317 kumpf    1.38 
318                           // If successful, update provider module status to OK
319                           // ATTN: Use CIMEnableModuleResponseMessage operationalStatus?
320                           CIMEnableModuleResponseMessage * emResp =
321                               dynamic_cast<CIMEnableModuleResponseMessage*>(response);
322                           if (emResp->cimException.getCode() == CIM_ERR_SUCCESS)
323                           {
324                               _updateProviderModuleStatus(
325                                   providerModule, _MODULE_STOPPED, _MODULE_OK);
326                           }
327                       }
328                       catch (Exception& e)
329                       {
330                           // Get the OperationalStatus property from the provider module
331                           Array<Uint16> operationalStatus;
332                           CIMValue itValue = emReq->providerModule.getProperty(
333                               emReq->providerModule.findProperty("OperationalStatus"))
334                                   .getValue();
335                           itValue.get(operationalStatus);
336               
337                           if (response != 0)
338 kumpf    1.38             {
339                               delete response;
340                           }
341               
342                           response = new CIMEnableModuleResponseMessage(
343                               request->messageId,
344                               CIMException(CIM_ERR_FAILED, e.getMessage()),
345                               request->queueIds.copyAndPop(),
346                               operationalStatus);
347                       }
348                   }
349                   else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE)
350                   {
351                       // Handle CIMDisableModuleRequestMessage
352                       CIMDisableModuleRequestMessage * dmReq =
353                           dynamic_cast<CIMDisableModuleRequestMessage*>(request);
354               
355                       CIMInstance providerModule = dmReq->providerModule;
356                       Boolean updateModuleStatus = !dmReq->disableProviderOnly;
357               
358                       try
359 kumpf    1.38         {
360                           // Change module status from OK to STOPPING
361                           if (updateModuleStatus)
362                           {
363                               _updateProviderModuleStatus(
364                                   providerModule, _MODULE_OK, _MODULE_STOPPING);
365                           }
366               
367 kumpf    1.39             // Forward the request to the ProviderManager
368                           response = _providerManagerRouter->processMessage(request);
369 kumpf    1.38 
370                           // Update provider module status based on success or failure
371                           if (updateModuleStatus)
372                           {
373                               CIMDisableModuleResponseMessage * dmResp =
374                                   dynamic_cast<CIMDisableModuleResponseMessage*>(response);
375                               if (dmResp->cimException.getCode() != CIM_ERR_SUCCESS)
376                               {
377                                   // Disable operation failed.  Module not stopped.
378                                   _updateProviderModuleStatus(
379                                       providerModule, _MODULE_STOPPING, _MODULE_OK);
380                               }
381                               else
382                               {
383                                   // Disable may or may not have been successful,
384                                   // depending on whether there are outstanding requests.
385                                   // Use last operationalStatus entry.
386                                   _updateProviderModuleStatus(
387                                       providerModule, _MODULE_STOPPING,
388                                       dmResp->operationalStatus[
389                                           dmResp->operationalStatus.size()-1]);
390 kumpf    1.38                 }
391                           }
392                       }
393                       catch (Exception& e)
394                       {
395                           // Get the OperationalStatus property from the provider module
396                           Array<Uint16> operationalStatus;
397                           CIMValue itValue = dmReq->providerModule.getProperty(
398                               dmReq->providerModule.findProperty("OperationalStatus"))
399                                   .getValue();
400                           itValue.get(operationalStatus);
401               
402                           if (response != 0)
403                           {
404                               delete response;
405                           }
406               
407                           response = new CIMDisableModuleResponseMessage(
408                               request->messageId,
409                               CIMException(CIM_ERR_FAILED, e.getMessage()),
410                               request->queueIds.copyAndPop(),
411 kumpf    1.38                 operationalStatus);
412                       }
413                   }
414                   else
415                   {
416 kumpf    1.39         response = _providerManagerRouter->processMessage(request);
417 schuur   1.23     }
418 chip     1.13 
419 schuur   1.19     AsyncLegacyOperationResult * async_result =
420                       new AsyncLegacyOperationResult(
421                       async->getKey(),
422                       async->getRouting(),
423                       op,
424                       response);
425 chip     1.13 
426 schuur   1.19     _complete_op_node(op, ASYNC_OPSTATE_COMPLETE, 0, 0);
427 chip     1.13 
428 schuur   1.19     PEG_METHOD_EXIT();
429               }
430 chip     1.13 
431 kumpf    1.44 void ProviderManagerService::unloadIdleProviders()
432               {
433                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
434                       "ProviderManagerService::unloadIdleProviders");
435               
436                   // Ensure that only one _unloadIdleProvidersHandler thread runs at a time
437                   _unloadIdleProvidersBusy++;
438                   if ((_unloadIdleProvidersBusy.value() == 1) &&
439                       (_thread_pool->allocate_and_awaken(
440                            (void*)this, ProviderManagerService::_unloadIdleProvidersHandler)))
441                   {
442                       // _unloadIdleProvidersBusy is decremented in
443                       // _unloadIdleProvidersHandler
444                   }
445                   else
446                   {
447                       // If we fail to allocate a thread, don't retry now.
448                       _unloadIdleProvidersBusy--;
449                   }
450               
451                   PEG_METHOD_EXIT();
452 kumpf    1.44 }
453               
454               PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL
455               ProviderManagerService::_unloadIdleProvidersHandler(void* arg) throw()
456 chip     1.1  {
457 kumpf    1.44     try
458                   {
459                       PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
460                           "ProviderManagerService::unloadIdleProvidersHandler");
461               
462                       ProviderManagerService* myself =
463                           reinterpret_cast<ProviderManagerService*>(arg);
464               
465                       try
466                       {
467                           myself->_providerManagerRouter->unloadIdleProviders();
468                       }
469                       catch (...)
470                       {
471                           // Ignore errors
472                           PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
473                               "Unexpected exception in _unloadIdleProvidersHandler");
474                       }
475               
476                       myself->_unloadIdleProvidersBusy--;
477                       PEG_METHOD_EXIT();
478 kumpf    1.44     }
479                   catch (...)
480                   {
481                       // Ignore errors
482                       PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
483                           "Unexpected exception in _unloadIdleProvidersHandler");
484                   }
485               
486                   return(PEGASUS_THREAD_RETURN(0));
487 kumpf    1.38 }
488               
489               ProviderIdContainer ProviderManagerService::_getProviderIdContainer(
490                   const CIMRequestMessage* message)
491               {
492                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
493                       "ProviderManagerService::_getProviderIdContainer");
494               
495                   CIMInstance providerModule;
496                   CIMInstance provider;
497               
498                   switch (message->getType())
499                   {
500                   case CIM_GET_CLASS_REQUEST_MESSAGE:
501                   case CIM_DELETE_CLASS_REQUEST_MESSAGE:
502                   case CIM_CREATE_CLASS_REQUEST_MESSAGE:
503                   case CIM_MODIFY_CLASS_REQUEST_MESSAGE:
504                   case CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE:
505                   case CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE:
506                   case CIM_GET_QUALIFIER_REQUEST_MESSAGE:
507                   case CIM_SET_QUALIFIER_REQUEST_MESSAGE:
508 kumpf    1.38     case CIM_DELETE_QUALIFIER_REQUEST_MESSAGE:
509                   case CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE:
510                       // The ProviderManagerService does not support class operations
511                       PEGASUS_ASSERT(0);
512                       break;
513               
514                   case CIM_GET_INSTANCE_REQUEST_MESSAGE:
515                   case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
516                   case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
517                   case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
518                   case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
519                   case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
520                   case CIM_GET_PROPERTY_REQUEST_MESSAGE:
521                   case CIM_SET_PROPERTY_REQUEST_MESSAGE:
522                   {
523                       // Look up instance provider
524                       const CIMOperationRequestMessage* request =
525                           dynamic_cast<const CIMOperationRequestMessage*>(message);
526                       _providerRegistrationManager->lookupInstanceProvider(
527                           request->nameSpace, request->className, provider, providerModule);
528                       break;
529 kumpf    1.38     }
530               
531                   case CIM_EXEC_QUERY_REQUEST_MESSAGE:
532                   {
533                       // Look up instance query provider
534                       const CIMOperationRequestMessage* request =
535                           dynamic_cast<const CIMOperationRequestMessage*>(message);
536                       Boolean hasNoQuery;
537                       _providerRegistrationManager->lookupInstanceProvider(
538                           request->nameSpace, request->className, provider, providerModule,
539                           0, &hasNoQuery);
540                       // We shouldn't have gotten this far if this isn't a query provider
541                       PEGASUS_ASSERT(!hasNoQuery);
542                       break;
543                   }
544               
545                   case CIM_ASSOCIATORS_REQUEST_MESSAGE:
546                   {
547                       // Look up association provider
548                       const CIMAssociatorsRequestMessage* request =
549                           dynamic_cast<const CIMAssociatorsRequestMessage*>(message);
550 kumpf    1.38         Array<CIMInstance> providerModules;
551                       Array<CIMInstance> providers;
552                       _providerRegistrationManager->lookupAssociationProvider(
553 kumpf    1.39             request->nameSpace, request->assocClass,
554                           providers, providerModules);
555 kumpf    1.38         providerModule = providerModules[0];
556                       provider = providers[0];
557                       break;
558                   }
559               
560                   case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
561                   {
562                       // Look up association provider
563                       const CIMAssociatorNamesRequestMessage* request =
564                           dynamic_cast<const CIMAssociatorNamesRequestMessage*>(message);
565                       Array<CIMInstance> providerModules;
566                       Array<CIMInstance> providers;
567                       _providerRegistrationManager->lookupAssociationProvider(
568 kumpf    1.39             request->nameSpace, request->assocClass,
569                           providers, providerModules);
570 kumpf    1.38         providerModule = providerModules[0];
571                       provider = providers[0];
572                       break;
573                   }
574               
575                   case CIM_REFERENCES_REQUEST_MESSAGE:
576                   {
577                       // Look up association provider
578                       const CIMReferencesRequestMessage* request =
579                           dynamic_cast<const CIMReferencesRequestMessage*>(message);
580                       Array<CIMInstance> providerModules;
581                       Array<CIMInstance> providers;
582                       _providerRegistrationManager->lookupAssociationProvider(
583 kumpf    1.39             request->nameSpace, request->resultClass,
584                           providers, providerModules);
585 kumpf    1.38         providerModule = providerModules[0];
586                       provider = providers[0];
587                       break;
588                   }
589               
590                   case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
591                   {
592                       // Look up association provider
593                       const CIMReferenceNamesRequestMessage* request =
594                           dynamic_cast<const CIMReferenceNamesRequestMessage*>(message);
595                       Array<CIMInstance> providerModules;
596                       Array<CIMInstance> providers;
597                       _providerRegistrationManager->lookupAssociationProvider(
598 kumpf    1.39             request->nameSpace, request->resultClass,
599                           providers, providerModules);
600 kumpf    1.38         providerModule = providerModules[0];
601                       provider = providers[0];
602                       break;
603                   }
604               
605                   case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
606                   {
607                       // Look up method provider
608                       const CIMInvokeMethodRequestMessage* request =
609                           dynamic_cast<const CIMInvokeMethodRequestMessage*>(message);
610                       _providerRegistrationManager->lookupMethodProvider(
611                           request->nameSpace, request->className, request->methodName,
612                           provider, providerModule);
613                       break;
614                   }
615               
616                   case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:
617                   {
618                       const CIMExportIndicationRequestMessage* request =
619                           dynamic_cast<const CIMExportIndicationRequestMessage*>(message);
620                       _providerRegistrationManager->lookupIndicationConsumer(
621 kumpf    1.38             request->destinationPath, provider, providerModule);
622                       break;
623                   }
624               
625                   case CIM_ENABLE_INDICATIONS_REQUEST_MESSAGE:
626                   case CIM_DISABLE_INDICATIONS_REQUEST_MESSAGE:
627                   case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:
628                   case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:
629                   case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:
630                   {
631                       // Provider information is already in the message
632                       const CIMIndicationRequestMessage* request =
633                           dynamic_cast<const CIMIndicationRequestMessage*>(message);
634                       providerModule = request->providerModule;
635                       provider = request->provider;
636                       break;
637                   }
638               
639                   case CIM_ENABLE_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
640                   case CIM_MODIFY_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
641                   case CIM_DISABLE_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
642 kumpf    1.38     case CIM_PROCESS_INDICATION_REQUEST_MESSAGE:
643                   case CIM_HANDLE_INDICATION_REQUEST_MESSAGE:
644                   case CIM_NOTIFY_PROVIDER_REGISTRATION_REQUEST_MESSAGE:
645                   case CIM_NOTIFY_PROVIDER_TERMINATION_REQUEST_MESSAGE:
646                       // These messages are not handled by the ProviderManagerService
647                       PEGASUS_ASSERT(0);
648                       break;
649               
650                   case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
651                   case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
652                   case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
653                       // These messages are handled specially by the ProviderManagerService
654                       PEGASUS_ASSERT(0);
655                       break;
656 kumpf    1.40 
657                   case CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE:
658                   {
659                       // Provider information is already in the message
660                       const CIMInitializeProviderRequestMessage* request =
661                           dynamic_cast<const CIMInitializeProviderRequestMessage*>(message);
662 kumpf    1.43 
663                       const ProviderIdContainer container =
664                           request->operationContext.get(ProviderIdContainer::NAME);
665                       providerModule = container.getModule(); 
666                       provider = container.getProvider(); 
667 kumpf    1.40         break;
668                   }
669               
670 kumpf    1.38     }
671               
672                   PEGASUS_ASSERT(!providerModule.isUninitialized());
673                   PEGASUS_ASSERT(!provider.isUninitialized());
674               
675                   PEG_METHOD_EXIT();
676                   return ProviderIdContainer(providerModule, provider);
677               }
678               
679               // Updates the providerModule instance and the ProviderRegistrationManager
680               void ProviderManagerService::_updateProviderModuleStatus(
681                   CIMInstance& providerModule,
682                   Uint16 fromStatus,
683                   Uint16 toStatus)
684               {
685                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
686                       "ProviderManagerService::_updateProviderModuleStatus");
687               
688                   Array<Uint16> operationalStatus;
689                   String providerModuleName;
690               
691 kumpf    1.38     Uint32 pos = providerModule.findProperty(CIMName("Name"));
692                   PEGASUS_ASSERT(pos != PEG_NOT_FOUND);
693                   providerModule.getProperty(pos).getValue().get(providerModuleName);
694               
695                   //
696                   // get operational status
697                   //
698                   pos = providerModule.findProperty(CIMName("OperationalStatus"));
699                   PEGASUS_ASSERT(pos != PEG_NOT_FOUND);
700                   CIMProperty operationalStatusProperty = providerModule.getProperty(pos);
701                   CIMValue operationalStatusValue = operationalStatusProperty.getValue();
702               
703                   if (!operationalStatusValue.isNull())
704                   {
705                       operationalStatusValue.get(operationalStatus);
706                   }
707               
708                   //
709                   // update module status
710                   //
711                   for (Uint32 i = operationalStatus.size(); i > 0; i--)
712 kumpf    1.38     {
713                       if (operationalStatus[i-1] == fromStatus)
714                       {
715                           operationalStatus.remove(i-1);
716                       }
717                   }
718               
719                   operationalStatus.append(toStatus);
720               
721                   if (_providerRegistrationManager->setProviderModuleStatus(
722                           providerModuleName, operationalStatus) == false)
723                   {
724                       throw PEGASUS_CIM_EXCEPTION_L(
725                           CIM_ERR_FAILED,
726                           MessageLoaderParms(
727                               "ProviderManager.ProviderManagerService."
728                                   "SET_MODULE_STATUS_FAILED",
729                               "set module status failed."));
730                   }
731               
732                   operationalStatusProperty.setValue(CIMValue(operationalStatus));
733 kumpf    1.38 
734                   PEG_METHOD_EXIT();
735 kumpf    1.39 }
736               
737               void ProviderManagerService::indicationCallback(
738                   CIMProcessIndicationRequestMessage* request)
739               {
740                   if (_indicationServiceQueueId == PEG_NOT_FOUND)
741                   {
742                       Array<Uint32> serviceIds;
743               
744                       providerManagerService->find_services(
745                           PEGASUS_QUEUENAME_INDICATIONSERVICE, 0, 0, &serviceIds);
746                       PEGASUS_ASSERT(serviceIds.size() != 0);
747               
748                       _indicationServiceQueueId = serviceIds[0];
749                   }
750               
751                   request->queueIds = QueueIdStack(
752                       _indicationServiceQueueId, providerManagerService->getQueueId());
753               
754                   AsyncLegacyOperationStart * asyncRequest =
755                       new AsyncLegacyOperationStart(
756 kumpf    1.39         providerManagerService->get_next_xid(),
757                       0,
758                       _indicationServiceQueueId,
759                       request,
760                       _indicationServiceQueueId);
761               
762                   providerManagerService->SendForget(asyncRequest);
763 chip     1.1  }
764               
765 a.arora  1.37 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2