(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 schuur   1.25 CIMRepository* ProviderManagerService::_repository=NULL;
 80 kumpf    1.39 Uint32 ProviderManagerService::_indicationServiceQueueId = PEG_NOT_FOUND;
 81 schuur   1.19 
 82 chip     1.1  ProviderManagerService::ProviderManagerService(void)
 83                   : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
 84               {
 85 schuur   1.19     providerManagerService=this;
 86 chip     1.1  }
 87               
 88 schuur   1.25 ProviderManagerService::ProviderManagerService(
 89                       ProviderRegistrationManager * providerRegistrationManager,
 90                       CIMRepository * repository)
 91 chip     1.1      : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
 92               {
 93 schuur   1.19     providerManagerService=this;
 94 schuur   1.25     _repository=repository;
 95 dj.gorey 1.31 
 96 kumpf    1.38     _providerRegistrationManager = providerRegistrationManager;
 97 kumpf    1.39     _providerManagerRouter =
 98                       new BasicProviderManagerRouter(indicationCallback);
 99 chip     1.1  }
100               
101               ProviderManagerService::~ProviderManagerService(void)
102               {
103 kumpf    1.39     delete _providerManagerRouter;
104 schuur   1.19     providerManagerService=NULL;
105 chip     1.1  }
106               
107               Boolean ProviderManagerService::messageOK(const Message * message)
108               {
109                   PEGASUS_ASSERT(message != 0);
110               
111 chip     1.3      if(_isSupportedRequestType(message))
112 chip     1.1      {
113 chip     1.3          return(MessageQueueService::messageOK(message));
114 chip     1.1      }
115               
116 chip     1.3      return(false);
117 chip     1.1  }
118               
119               void ProviderManagerService::handleEnqueue(void)
120               {
121                   Message * message = dequeue();
122               
123                   handleEnqueue(message);
124               }
125               
126               void ProviderManagerService::handleEnqueue(Message * message)
127               {
128                   PEGASUS_ASSERT(message != 0);
129               
130                   AsyncLegacyOperationStart * asyncRequest;
131               
132                   if(message->_async != NULL)
133                   {
134                       asyncRequest = static_cast<AsyncLegacyOperationStart *>(message->_async);
135                   }
136                   else
137                   {
138 chip     1.1          asyncRequest = new AsyncLegacyOperationStart(
139                           get_next_xid(),
140                           0,
141                           this->getQueueId(),
142                           message,
143                           this->getQueueId());
144                   }
145               
146                   _handle_async_request(asyncRequest);
147               }
148               
149               void ProviderManagerService::_handle_async_request(AsyncRequest * request)
150               {
151                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
152                       "ProviderManagerService::_handle_async_request");
153               
154                   PEGASUS_ASSERT((request != 0) && (request->op != 0));
155               
156                   if(request->getType() == async_messages::ASYNC_LEGACY_OP_START)
157                   {
158                       request->op->processing();
159 chip     1.1  
160                       _incomingQueue.enqueue(request->op);
161               
162 schuur   1.32          while (!_thread_pool->allocate_and_awaken(
163                                    (void *)this, ProviderManagerService::handleCimOperation))
164                        {
165                            pegasus_yield();
166                        }
167 chip     1.1      }
168                   else
169                   {
170                       // pass all other operations to the default handler
171                       MessageQueueService::_handle_async_request(request);
172                   }
173               
174                   PEG_METHOD_EXIT();
175               
176                   return;
177               }
178               
179 kumpf    1.39 PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL
180               ProviderManagerService::handleCimOperation(void * arg) throw()
181 chip     1.1  {
182 kumpf    1.39     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
183                       "ProviderManagerService::handleCimOperation");
184 chip     1.1  
185 chip     1.8      if(arg == 0)
186                   {
187                       // thread started with invalid argument.
188                       return(PEGASUS_THREAD_RETURN(1));
189                   }
190               
191 chip     1.1      // get the service from argument
192 kumpf    1.39     ProviderManagerService * service =
193                       reinterpret_cast<ProviderManagerService *>(arg);
194 chip     1.1  
195                   if(service->_incomingQueue.size() == 0)
196                   {
197                       PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
198 kumpf    1.39             "ProviderManagerService::handleCimOperation() called with no "
199                               "op node in queue");
200 chip     1.1  
201                       PEG_METHOD_EXIT();
202               
203                       // thread started with no message in queue.
204                       return(PEGASUS_THREAD_RETURN(1));
205                   }
206               
207                   AsyncOpNode * op = service->_incomingQueue.dequeue();
208               
209 chip     1.8      if((op == 0) || (op->_request.count() == 0))
210 chip     1.1      {
211 kumpf    1.39         // ATTN: This may dereference a null pointer!
212 chip     1.1          MessageQueue * queue = MessageQueue::lookup(op->_source_queue);
213               
214                       PEGASUS_ASSERT(queue != 0);
215               
216                       PEG_METHOD_EXIT();
217               
218                       // no request in op node
219                       return(PEGASUS_THREAD_RETURN(1));
220                   }
221               
222                   AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0));
223               
224 kumpf    1.39     if ((request == 0) ||
225                       (request->getType() != async_messages::ASYNC_LEGACY_OP_START))
226 chip     1.1      {
227                       // reply with NAK
228                       PEG_METHOD_EXIT();
229                       return(PEGASUS_THREAD_RETURN(0));
230                   }
231               
232 chip     1.8      try
233 chip     1.1      {
234 kumpf    1.39         Message* legacy =
235                           static_cast<AsyncLegacyOperationStart *>(request)->get_action();
236 chip     1.1  
237 chip     1.8          if(_isSupportedRequestType(legacy))
238 chip     1.1          {
239 a.arora  1.37             AutoPtr<Message> xmessage(legacy);
240 chip     1.1  
241 chip     1.8              // Set the client's requested language into this service thread.
242                           // This will allow functions in this service to return messages
243                           // in the correct language.
244 kumpf    1.39             CIMMessage* msg = dynamic_cast<CIMMessage *>(legacy);
245 chip     1.8  
246 kumpf    1.39             if (msg != 0)
247 chip     1.8              {
248 kumpf    1.39                 AcceptLanguages* langs =
249                                   new AcceptLanguages(msg->acceptLanguages);
250 chip     1.8                  Thread::setLanguages(langs);
251                           }
252                           else
253                           {
254                               Thread::clearLanguages();
255                           }
256 chip     1.1  
257                           service->handleCimRequest(op, legacy);
258 chip     1.3          }
259 chip     1.8      }
260                   catch(...)
261                   {
262                       // ATTN: log error
263 chip     1.1      }
264               
265                   PEG_METHOD_EXIT();
266               
267                   return(PEGASUS_THREAD_RETURN(0));
268               }
269               
270 kumpf    1.39 void ProviderManagerService::handleCimRequest(
271                   AsyncOpNode * op,
272                   Message * message)
273 chip     1.1  {
274 kumpf    1.39     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
275                       "ProviderManagerService::handleCimRequest");
276 chip     1.1  
277 kumpf    1.38     CIMRequestMessage * request = dynamic_cast<CIMRequestMessage *>(message);
278                   PEGASUS_ASSERT(request != 0);
279 chip     1.1  
280                   // get request from op node
281                   AsyncRequest * async = static_cast<AsyncRequest *>(op->_request.next(0));
282 kumpf    1.38     PEGASUS_ASSERT(async != 0);
283               
284                   Message * response = 0;
285 chip     1.1  
286 kumpf    1.38     if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) ||
287 kumpf    1.40         (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) ||
288               	(request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE))
289 kumpf    1.38     {
290 se.gupta 1.41         // Handle CIMOperationRequestMessage and CIMExportIndicationRequestMessage
291               		// The provider ID container is already added to operationcontext in CIMOperationRequestDispacther
292               		// for all instance, method , association and indication providers under PEP135 , so no need to add it again .
293               		// So add it only for ExportIndicationRequestMessage
294               
295               		if (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE)
296               		{
297               		    ProviderIdContainer pidc = _getProviderIdContainer(request);
298                           request->operationContext.insert(pidc);
299               		}
300 kumpf    1.38 
301 kumpf    1.39         response = _providerManagerRouter->processMessage(request);
302 schuur   1.19     }
303 kumpf    1.38     else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE)
304                   {
305                       // Handle CIMEnableModuleRequestMessage
306                       CIMEnableModuleRequestMessage * emReq =
307                           dynamic_cast<CIMEnableModuleRequestMessage*>(request);
308               
309                       CIMInstance providerModule = emReq->providerModule;
310 dj.gorey 1.31 
311 kumpf    1.38         try
312                       {
313 kumpf    1.39             // Forward the request to the ProviderManager
314                           response = _providerManagerRouter->processMessage(request);
315 kumpf    1.38 
316                           // If successful, update provider module status to OK
317                           // ATTN: Use CIMEnableModuleResponseMessage operationalStatus?
318                           CIMEnableModuleResponseMessage * emResp =
319                               dynamic_cast<CIMEnableModuleResponseMessage*>(response);
320                           if (emResp->cimException.getCode() == CIM_ERR_SUCCESS)
321                           {
322                               _updateProviderModuleStatus(
323                                   providerModule, _MODULE_STOPPED, _MODULE_OK);
324                           }
325                       }
326                       catch (Exception& e)
327                       {
328                           // Get the OperationalStatus property from the provider module
329                           Array<Uint16> operationalStatus;
330                           CIMValue itValue = emReq->providerModule.getProperty(
331                               emReq->providerModule.findProperty("OperationalStatus"))
332                                   .getValue();
333                           itValue.get(operationalStatus);
334               
335                           if (response != 0)
336 kumpf    1.38             {
337                               delete response;
338                           }
339               
340                           response = new CIMEnableModuleResponseMessage(
341                               request->messageId,
342                               CIMException(CIM_ERR_FAILED, e.getMessage()),
343                               request->queueIds.copyAndPop(),
344                               operationalStatus);
345                       }
346                   }
347                   else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE)
348                   {
349                       // Handle CIMDisableModuleRequestMessage
350                       CIMDisableModuleRequestMessage * dmReq =
351                           dynamic_cast<CIMDisableModuleRequestMessage*>(request);
352               
353                       CIMInstance providerModule = dmReq->providerModule;
354                       Boolean updateModuleStatus = !dmReq->disableProviderOnly;
355               
356                       try
357 kumpf    1.38         {
358                           // Change module status from OK to STOPPING
359                           if (updateModuleStatus)
360                           {
361                               _updateProviderModuleStatus(
362                                   providerModule, _MODULE_OK, _MODULE_STOPPING);
363                           }
364               
365 kumpf    1.39             // Forward the request to the ProviderManager
366                           response = _providerManagerRouter->processMessage(request);
367 kumpf    1.38 
368                           // Update provider module status based on success or failure
369                           if (updateModuleStatus)
370                           {
371                               CIMDisableModuleResponseMessage * dmResp =
372                                   dynamic_cast<CIMDisableModuleResponseMessage*>(response);
373                               if (dmResp->cimException.getCode() != CIM_ERR_SUCCESS)
374                               {
375                                   // Disable operation failed.  Module not stopped.
376                                   _updateProviderModuleStatus(
377                                       providerModule, _MODULE_STOPPING, _MODULE_OK);
378                               }
379                               else
380                               {
381                                   // Disable may or may not have been successful,
382                                   // depending on whether there are outstanding requests.
383                                   // Use last operationalStatus entry.
384                                   _updateProviderModuleStatus(
385                                       providerModule, _MODULE_STOPPING,
386                                       dmResp->operationalStatus[
387                                           dmResp->operationalStatus.size()-1]);
388 kumpf    1.38                 }
389                           }
390                       }
391                       catch (Exception& e)
392                       {
393                           // Get the OperationalStatus property from the provider module
394                           Array<Uint16> operationalStatus;
395                           CIMValue itValue = dmReq->providerModule.getProperty(
396                               dmReq->providerModule.findProperty("OperationalStatus"))
397                                   .getValue();
398                           itValue.get(operationalStatus);
399               
400                           if (response != 0)
401                           {
402                               delete response;
403                           }
404               
405                           response = new CIMDisableModuleResponseMessage(
406                               request->messageId,
407                               CIMException(CIM_ERR_FAILED, e.getMessage()),
408                               request->queueIds.copyAndPop(),
409 kumpf    1.38                 operationalStatus);
410                       }
411                   }
412                   else
413                   {
414 kumpf    1.39         response = _providerManagerRouter->processMessage(request);
415 schuur   1.23     }
416 chip     1.13 
417 schuur   1.19     AsyncLegacyOperationResult * async_result =
418                       new AsyncLegacyOperationResult(
419                       async->getKey(),
420                       async->getRouting(),
421                       op,
422                       response);
423 chip     1.13 
424 schuur   1.19     _complete_op_node(op, ASYNC_OPSTATE_COMPLETE, 0, 0);
425 chip     1.13 
426 schuur   1.19     PEG_METHOD_EXIT();
427               }
428 chip     1.13 
429 chip     1.1  void ProviderManagerService::unload_idle_providers(void)
430               {
431 kumpf    1.39     _providerManagerRouter->unload_idle_providers();
432 kumpf    1.38 }
433               
434               ProviderIdContainer ProviderManagerService::_getProviderIdContainer(
435                   const CIMRequestMessage* message)
436               {
437                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
438                       "ProviderManagerService::_getProviderIdContainer");
439               
440                   CIMInstance providerModule;
441                   CIMInstance provider;
442               
443                   switch (message->getType())
444                   {
445                   case CIM_GET_CLASS_REQUEST_MESSAGE:
446                   case CIM_DELETE_CLASS_REQUEST_MESSAGE:
447                   case CIM_CREATE_CLASS_REQUEST_MESSAGE:
448                   case CIM_MODIFY_CLASS_REQUEST_MESSAGE:
449                   case CIM_ENUMERATE_CLASSES_REQUEST_MESSAGE:
450                   case CIM_ENUMERATE_CLASS_NAMES_REQUEST_MESSAGE:
451                   case CIM_GET_QUALIFIER_REQUEST_MESSAGE:
452                   case CIM_SET_QUALIFIER_REQUEST_MESSAGE:
453 kumpf    1.38     case CIM_DELETE_QUALIFIER_REQUEST_MESSAGE:
454                   case CIM_ENUMERATE_QUALIFIERS_REQUEST_MESSAGE:
455                       // The ProviderManagerService does not support class operations
456                       PEGASUS_ASSERT(0);
457                       break;
458               
459                   case CIM_GET_INSTANCE_REQUEST_MESSAGE:
460                   case CIM_DELETE_INSTANCE_REQUEST_MESSAGE:
461                   case CIM_CREATE_INSTANCE_REQUEST_MESSAGE:
462                   case CIM_MODIFY_INSTANCE_REQUEST_MESSAGE:
463                   case CIM_ENUMERATE_INSTANCES_REQUEST_MESSAGE:
464                   case CIM_ENUMERATE_INSTANCE_NAMES_REQUEST_MESSAGE:
465                   case CIM_GET_PROPERTY_REQUEST_MESSAGE:
466                   case CIM_SET_PROPERTY_REQUEST_MESSAGE:
467                   {
468                       // Look up instance provider
469                       const CIMOperationRequestMessage* request =
470                           dynamic_cast<const CIMOperationRequestMessage*>(message);
471                       _providerRegistrationManager->lookupInstanceProvider(
472                           request->nameSpace, request->className, provider, providerModule);
473                       break;
474 kumpf    1.38     }
475               
476                   case CIM_EXEC_QUERY_REQUEST_MESSAGE:
477                   {
478                       // Look up instance query provider
479                       const CIMOperationRequestMessage* request =
480                           dynamic_cast<const CIMOperationRequestMessage*>(message);
481                       Boolean hasNoQuery;
482                       _providerRegistrationManager->lookupInstanceProvider(
483                           request->nameSpace, request->className, provider, providerModule,
484                           0, &hasNoQuery);
485                       // We shouldn't have gotten this far if this isn't a query provider
486                       PEGASUS_ASSERT(!hasNoQuery);
487                       break;
488                   }
489               
490                   case CIM_ASSOCIATORS_REQUEST_MESSAGE:
491                   {
492                       // Look up association provider
493                       const CIMAssociatorsRequestMessage* request =
494                           dynamic_cast<const CIMAssociatorsRequestMessage*>(message);
495 kumpf    1.38         Array<CIMInstance> providerModules;
496                       Array<CIMInstance> providers;
497                       _providerRegistrationManager->lookupAssociationProvider(
498 kumpf    1.39             request->nameSpace, request->assocClass,
499                           providers, providerModules);
500 kumpf    1.38         providerModule = providerModules[0];
501                       provider = providers[0];
502                       break;
503                   }
504               
505                   case CIM_ASSOCIATOR_NAMES_REQUEST_MESSAGE:
506                   {
507                       // Look up association provider
508                       const CIMAssociatorNamesRequestMessage* request =
509                           dynamic_cast<const CIMAssociatorNamesRequestMessage*>(message);
510                       Array<CIMInstance> providerModules;
511                       Array<CIMInstance> providers;
512                       _providerRegistrationManager->lookupAssociationProvider(
513 kumpf    1.39             request->nameSpace, request->assocClass,
514                           providers, providerModules);
515 kumpf    1.38         providerModule = providerModules[0];
516                       provider = providers[0];
517                       break;
518                   }
519               
520                   case CIM_REFERENCES_REQUEST_MESSAGE:
521                   {
522                       // Look up association provider
523                       const CIMReferencesRequestMessage* request =
524                           dynamic_cast<const CIMReferencesRequestMessage*>(message);
525                       Array<CIMInstance> providerModules;
526                       Array<CIMInstance> providers;
527                       _providerRegistrationManager->lookupAssociationProvider(
528 kumpf    1.39             request->nameSpace, request->resultClass,
529                           providers, providerModules);
530 kumpf    1.38         providerModule = providerModules[0];
531                       provider = providers[0];
532                       break;
533                   }
534               
535                   case CIM_REFERENCE_NAMES_REQUEST_MESSAGE:
536                   {
537                       // Look up association provider
538                       const CIMReferenceNamesRequestMessage* request =
539                           dynamic_cast<const CIMReferenceNamesRequestMessage*>(message);
540                       Array<CIMInstance> providerModules;
541                       Array<CIMInstance> providers;
542                       _providerRegistrationManager->lookupAssociationProvider(
543 kumpf    1.39             request->nameSpace, request->resultClass,
544                           providers, providerModules);
545 kumpf    1.38         providerModule = providerModules[0];
546                       provider = providers[0];
547                       break;
548                   }
549               
550                   case CIM_INVOKE_METHOD_REQUEST_MESSAGE:
551                   {
552                       // Look up method provider
553                       const CIMInvokeMethodRequestMessage* request =
554                           dynamic_cast<const CIMInvokeMethodRequestMessage*>(message);
555                       _providerRegistrationManager->lookupMethodProvider(
556                           request->nameSpace, request->className, request->methodName,
557                           provider, providerModule);
558                       break;
559                   }
560               
561                   case CIM_EXPORT_INDICATION_REQUEST_MESSAGE:
562                   {
563                       const CIMExportIndicationRequestMessage* request =
564                           dynamic_cast<const CIMExportIndicationRequestMessage*>(message);
565                       _providerRegistrationManager->lookupIndicationConsumer(
566 kumpf    1.38             request->destinationPath, provider, providerModule);
567                       break;
568                   }
569               
570                   case CIM_ENABLE_INDICATIONS_REQUEST_MESSAGE:
571                   case CIM_DISABLE_INDICATIONS_REQUEST_MESSAGE:
572                   case CIM_CREATE_SUBSCRIPTION_REQUEST_MESSAGE:
573                   case CIM_MODIFY_SUBSCRIPTION_REQUEST_MESSAGE:
574                   case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE:
575                   {
576                       // Provider information is already in the message
577                       const CIMIndicationRequestMessage* request =
578                           dynamic_cast<const CIMIndicationRequestMessage*>(message);
579                       providerModule = request->providerModule;
580                       provider = request->provider;
581                       break;
582                   }
583               
584                   case CIM_ENABLE_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
585                   case CIM_MODIFY_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
586                   case CIM_DISABLE_INDICATION_SUBSCRIPTION_REQUEST_MESSAGE:
587 kumpf    1.38     case CIM_PROCESS_INDICATION_REQUEST_MESSAGE:
588                   case CIM_HANDLE_INDICATION_REQUEST_MESSAGE:
589                   case CIM_NOTIFY_PROVIDER_REGISTRATION_REQUEST_MESSAGE:
590                   case CIM_NOTIFY_PROVIDER_TERMINATION_REQUEST_MESSAGE:
591                       // These messages are not handled by the ProviderManagerService
592                       PEGASUS_ASSERT(0);
593                       break;
594               
595                   case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
596                   case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
597                   case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
598                       // These messages are handled specially by the ProviderManagerService
599                       PEGASUS_ASSERT(0);
600                       break;
601 kumpf    1.40 
602                   case CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE:
603                   {
604                       // Provider information is already in the message
605                       const CIMInitializeProviderRequestMessage* request =
606                           dynamic_cast<const CIMInitializeProviderRequestMessage*>(message);
607                       providerModule = request->providerModule;
608                       provider = request->provider;
609                       break;
610                   }
611               
612 kumpf    1.38     }
613               
614                   PEGASUS_ASSERT(!providerModule.isUninitialized());
615                   PEGASUS_ASSERT(!provider.isUninitialized());
616               
617                   PEG_METHOD_EXIT();
618                   return ProviderIdContainer(providerModule, provider);
619               }
620               
621               // Updates the providerModule instance and the ProviderRegistrationManager
622               void ProviderManagerService::_updateProviderModuleStatus(
623                   CIMInstance& providerModule,
624                   Uint16 fromStatus,
625                   Uint16 toStatus)
626               {
627                   PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
628                       "ProviderManagerService::_updateProviderModuleStatus");
629               
630                   Array<Uint16> operationalStatus;
631                   String providerModuleName;
632               
633 kumpf    1.38     Uint32 pos = providerModule.findProperty(CIMName("Name"));
634                   PEGASUS_ASSERT(pos != PEG_NOT_FOUND);
635                   providerModule.getProperty(pos).getValue().get(providerModuleName);
636               
637                   //
638                   // get operational status
639                   //
640                   pos = providerModule.findProperty(CIMName("OperationalStatus"));
641                   PEGASUS_ASSERT(pos != PEG_NOT_FOUND);
642                   CIMProperty operationalStatusProperty = providerModule.getProperty(pos);
643                   CIMValue operationalStatusValue = operationalStatusProperty.getValue();
644               
645                   if (!operationalStatusValue.isNull())
646                   {
647                       operationalStatusValue.get(operationalStatus);
648                   }
649               
650                   //
651                   // update module status
652                   //
653                   for (Uint32 i = operationalStatus.size(); i > 0; i--)
654 kumpf    1.38     {
655                       if (operationalStatus[i-1] == fromStatus)
656                       {
657                           operationalStatus.remove(i-1);
658                       }
659                   }
660               
661                   operationalStatus.append(toStatus);
662               
663                   if (_providerRegistrationManager->setProviderModuleStatus(
664                           providerModuleName, operationalStatus) == false)
665                   {
666                       throw PEGASUS_CIM_EXCEPTION_L(
667                           CIM_ERR_FAILED,
668                           MessageLoaderParms(
669                               "ProviderManager.ProviderManagerService."
670                                   "SET_MODULE_STATUS_FAILED",
671                               "set module status failed."));
672                   }
673               
674                   operationalStatusProperty.setValue(CIMValue(operationalStatus));
675 kumpf    1.38 
676                   PEG_METHOD_EXIT();
677 kumpf    1.39 }
678               
679               void ProviderManagerService::indicationCallback(
680                   CIMProcessIndicationRequestMessage* request)
681               {
682                   if (_indicationServiceQueueId == PEG_NOT_FOUND)
683                   {
684                       Array<Uint32> serviceIds;
685               
686                       providerManagerService->find_services(
687                           PEGASUS_QUEUENAME_INDICATIONSERVICE, 0, 0, &serviceIds);
688                       PEGASUS_ASSERT(serviceIds.size() != 0);
689               
690                       _indicationServiceQueueId = serviceIds[0];
691                   }
692               
693                   request->queueIds = QueueIdStack(
694                       _indicationServiceQueueId, providerManagerService->getQueueId());
695               
696                   AsyncLegacyOperationStart * asyncRequest =
697                       new AsyncLegacyOperationStart(
698 kumpf    1.39         providerManagerService->get_next_xid(),
699                       0,
700                       _indicationServiceQueueId,
701                       request,
702                       _indicationServiceQueueId);
703               
704                   providerManagerService->SendForget(asyncRequest);
705 chip     1.1  }
706               
707 a.arora  1.37 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2