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
|