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
|