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 chip 1.1 //
35 //%/////////////////////////////////////////////////////////////////////////////
36
37 #include "ProviderManagerService.h"
38
39 #include <Pegasus/Common/Config.h>
40 #include <Pegasus/Common/Constants.h>
41 #include <Pegasus/Common/CIMMessage.h>
42 #include <Pegasus/Common/Tracer.h>
43 #include <Pegasus/Common/Logger.h>
44 #include <Pegasus/Common/Destroyer.h>
|
45 schuur 1.22 #include <Pegasus/ProviderManager/OperationResponseHandler.h>
|
46 chip 1.1
|
47 chip 1.6 #include <Pegasus/Config/ConfigManager.h>
48
|
49 chip 1.17 #include <Pegasus/ProviderManager2/ProviderManagerModule.h>
50 #include <Pegasus/ProviderManager2/ProviderManager.h>
51
|
52 chip 1.1 PEGASUS_NAMESPACE_BEGIN
53
|
54 chip 1.13 // BEGIN TEMP SECTION
|
55 chip 1.11 class ProviderManagerContainer
|
56 chip 1.5 {
|
57 chip 1.11 public:
|
58 chip 1.17 ProviderManagerContainer(void) : _manager(0)
59 {
60 }
61
62 ProviderManagerContainer(const ProviderManagerContainer & container) : _manager(0)
63 {
64 *this = container;
65 }
66
67 ProviderManagerContainer(const String & physicalName, const String & logicalName, const String & interfaceName) : _manager(0)
|
68 chip 1.11 {
69 #if defined(PEGASUS_OS_TYPE_WINDOWS)
70 _physicalName = physicalName + String(".dll");
71 #elif defined(PEGASUS_OS_HPUX) && defined(PEGASUS_PLATFORM_HPUX_PARISC_ACC)
72 _physicalName = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir"));
|
73 kv.le 1.16 _physicalName.append(String("/lib") + physicalName + String(".sl"));
|
74 chip 1.11 #elif defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_HPUX_PARISC_ACC)
75 _physicalName = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir"));
|
76 kv.le 1.16 _physicalName.append(String("/lib") + physicalName + String(".so"));
|
77 chip 1.11 #elif defined(PEGASUS_OS_OS400)
78 _physicalName = physicalName;
79 #else
80 _physicalName = ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir"));
|
81 kv.le 1.16 _physicalName.append(String("/lib") + physicalName + String(".so"));
|
82 chip 1.11 #endif
|
83 chip 1.3
|
84 chip 1.11 _logicalName = logicalName;
85
86 _interfaceName = interfaceName;
|
87 chip 1.13
88 _module = ProviderManagerModule(_physicalName);
89
90 _module.load();
91
92 _manager = _module.getProviderManager(_logicalName);
|
93 chip 1.17
94 PEGASUS_ASSERT(_manager != 0);
|
95 chip 1.11 }
96
|
97 chip 1.13 ~ProviderManagerContainer(void)
98 {
99 _module.unload();
100 }
101
|
102 chip 1.17 ProviderManagerContainer & operator=(const ProviderManagerContainer & container)
103 {
104 if(this == &container)
105 {
106 return(*this);
107 }
108
109 _logicalName = container._logicalName;
110 _physicalName = container._physicalName;
111 _interfaceName = container._interfaceName;
112
113 _module = container._module;
114 _manager = container._manager;
115
116 return(*this);
117 }
118
|
119 schuur 1.19 ProviderManager *getProviderManager(void)
|
120 chip 1.13 {
|
121 schuur 1.19 return _manager;
|
122 chip 1.13 }
123
|
124 chip 1.17 const String & getPhysicalName(void) const
|
125 chip 1.3 {
|
126 chip 1.11 return(_physicalName);
|
127 chip 1.3 }
128
|
129 chip 1.17 const String & getLogicalName(void) const
|
130 chip 1.11 {
131 return(_logicalName);
132 }
|
133 chip 1.3
|
134 chip 1.17 const String & getInterfaceName(void) const
|
135 chip 1.11 {
136 return(_interfaceName);
|
137 chip 1.3 }
138
|
139 chip 1.11 private:
140 String _physicalName;
141 String _logicalName;
142 String _interfaceName;
|
143 chip 1.3
|
144 chip 1.13 ProviderManagerModule _module;
145 ProviderManager * _manager;
146
|
147 chip 1.11 };
|
148 chip 1.13
|
149 schuur 1.19 static Array<ProviderManagerContainer*> _providerManagers;
|
150 chip 1.11 // END TEMP SECTION
151
152 inline Boolean _isSupportedRequestType(const Message * message)
153 {
154 // ATTN: needs implementation
155
156 // for now, assume all requests are valid
157
158 return(true);
|
159 chip 1.3 }
160
161 inline Boolean _isSupportedResponseType(const Message * message)
162 {
|
163 chip 1.11 // ATTN: needs implementation
164
165 // for now, assume all responses are invalid
|
166 chip 1.3
|
167 chip 1.11 return(false);
|
168 chip 1.3 }
169
|
170 schuur 1.19 ProviderManagerService* ProviderManagerService::providerManagerService=NULL;
171
|
172 chip 1.1 ProviderManagerService::ProviderManagerService(void)
173 : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
174 {
|
175 schuur 1.19 providerManagerService=this;
|
176 chip 1.1 }
177
178 ProviderManagerService::ProviderManagerService(ProviderRegistrationManager * providerRegistrationManager)
179 : MessageQueueService(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP)
180 {
|
181 schuur 1.19 providerManagerService=this;
|
182 chip 1.10 SetProviderRegistrationManager(providerRegistrationManager);
183
|
184 chip 1.11 // ATTN: this section is a temporary solution to populate the list of enabled
185 // provider managers for a given distribution. it includes another temporary
186 // solution for converting a generic file name into a file name useable by
187 // each platform.
188
189 // BEGIN TEMP SECTION
190 //#if defined(PEGASUS_OS_OS400)
|
191 chip 1.13 //_providerManagers.append(ProviderManagerContainer("QSYS/??????????", "INTERNAL", "INTERNAL"));
|
192 chip 1.11 //#else
|
193 chip 1.13 //_providerManager.append(ProviderManagerContainer("InternalProviderManager", "DEFAULT", "INTERNAL"));
|
194 chip 1.11 //#endif
|
195 chip 1.2
|
196 chip 1.11 #if defined(ENABLE_DEFAULT_PROVIDER_MANAGER)
197 #if defined(PEGASUS_OS_OS400)
|
198 schuur 1.19 _providerManagers.append(
199 new ProviderManagerContainer("QSYS/QYCMDFTPVM", "DEFAULT", "C++Default"));
|
200 chip 1.11 #else
|
201 schuur 1.19 _providerManagers.append(
202 new ProviderManagerContainer("DefaultProviderManager", "DEFAULT", "C++Default"));
|
203 chip 1.11 #endif
204 #endif
|
205 chip 1.2
|
206 chip 1.11 #if defined(ENABLE_CMPI_PROVIDER_MANAGER)
207 #if defined(PEGASUS_OS_OS400)
|
208 schuur 1.19 _providerManagers.append(
209 new ProviderManagerContainer("QSYS/QYCMCMPIPM", "CMPI", "CMPI"));
|
210 chip 1.11 #else
|
211 schuur 1.19 _providerManagers.append(
212 new ProviderManagerContainer("CMPIProviderManager", "CMPI", "CMPI"));
|
213 chip 1.11 #endif
214 #endif
215 // END TEMP SECTION
|
216 chip 1.1 }
217
218 ProviderManagerService::~ProviderManagerService(void)
219 {
|
220 schuur 1.19 providerManagerService=NULL;
|
221 chip 1.1 }
222
223 Boolean ProviderManagerService::messageOK(const Message * message)
224 {
225 PEGASUS_ASSERT(message != 0);
226
|
227 chip 1.3 if(_isSupportedRequestType(message))
|
228 chip 1.1 {
|
229 chip 1.3 return(MessageQueueService::messageOK(message));
|
230 chip 1.1 }
231
|
232 chip 1.3 return(false);
|
233 chip 1.1 }
234
235 void ProviderManagerService::handleEnqueue(void)
236 {
237 Message * message = dequeue();
238
239 handleEnqueue(message);
240 }
241
242 void ProviderManagerService::handleEnqueue(Message * message)
243 {
244 PEGASUS_ASSERT(message != 0);
245
246 AsyncLegacyOperationStart * asyncRequest;
247
248 if(message->_async != NULL)
249 {
250 asyncRequest = static_cast<AsyncLegacyOperationStart *>(message->_async);
251 }
252 else
253 {
254 chip 1.1 asyncRequest = new AsyncLegacyOperationStart(
255 get_next_xid(),
256 0,
257 this->getQueueId(),
258 message,
259 this->getQueueId());
260 }
261
262 _handle_async_request(asyncRequest);
263 }
264
265 void ProviderManagerService::_handle_async_request(AsyncRequest * request)
266 {
267 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
268 "ProviderManagerService::_handle_async_request");
269
270 PEGASUS_ASSERT((request != 0) && (request->op != 0));
271
272 if(request->getType() == async_messages::ASYNC_LEGACY_OP_START)
273 {
274 request->op->processing();
275 chip 1.1
276 _incomingQueue.enqueue(request->op);
277
278 _thread_pool->allocate_and_awaken((void *)this, ProviderManagerService::handleCimOperation);
279 }
280 else
281 {
282 // pass all other operations to the default handler
283 MessageQueueService::_handle_async_request(request);
284 }
285
286 PEG_METHOD_EXIT();
287
288 return;
289 }
290
291
292 PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL ProviderManagerService::handleCimOperation(void * arg) throw()
293 {
294 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimOperation");
295
|
296 chip 1.8 if(arg == 0)
297 {
298 // thread started with invalid argument.
299 return(PEGASUS_THREAD_RETURN(1));
300 }
301
|
302 chip 1.1 // get the service from argument
303 ProviderManagerService * service = reinterpret_cast<ProviderManagerService *>(arg);
304
305 if(service->_incomingQueue.size() == 0)
306 {
307 PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
308 "ProviderManagerService::handleCimOperation() called with no op node in queue" );
309
310 PEG_METHOD_EXIT();
311
312 // thread started with no message in queue.
313 return(PEGASUS_THREAD_RETURN(1));
314 }
315
316 AsyncOpNode * op = service->_incomingQueue.dequeue();
317
|
318 chip 1.8 if((op == 0) || (op->_request.count() == 0))
|
319 chip 1.1 {
320 MessageQueue * queue = MessageQueue::lookup(op->_source_queue);
321
322 PEGASUS_ASSERT(queue != 0);
323
324 PEG_METHOD_EXIT();
325
326 // no request in op node
327 return(PEGASUS_THREAD_RETURN(1));
328 }
329
330 AsyncRequest * request = static_cast<AsyncRequest *>(op->_request.next(0));
331
|
332 chip 1.8 if((request == 0) || (request->getType() != async_messages::ASYNC_LEGACY_OP_START))
|
333 chip 1.1 {
334 // reply with NAK
335
336 PEG_METHOD_EXIT();
337
338 return(PEGASUS_THREAD_RETURN(0));
339 }
340
|
341 chip 1.8 try
|
342 chip 1.1 {
|
343 chip 1.8 Message * legacy = static_cast<AsyncLegacyOperationStart *>(request)->get_action();
|
344 chip 1.1
|
345 chip 1.8 if(_isSupportedRequestType(legacy))
|
346 chip 1.1 {
|
347 chip 1.8 Destroyer<Message> xmessage(legacy);
|
348 chip 1.1
|
349 chip 1.8 // Set the client's requested language into this service thread.
350 // This will allow functions in this service to return messages
351 // in the correct language.
352 CIMMessage * msg = dynamic_cast<CIMMessage *>(legacy);
353
354 if(msg != 0)
355 {
356 AcceptLanguages * langs = new AcceptLanguages(msg->acceptLanguages);
357
358 Thread::setLanguages(langs);
359 }
360 else
361 {
362 Thread::clearLanguages();
363 }
|
364 chip 1.1
365 service->handleCimRequest(op, legacy);
|
366 chip 1.3 }
|
367 chip 1.8 }
368 catch(...)
369 {
370 // ATTN: log error
|
371 chip 1.1 }
372
373 PEG_METHOD_EXIT();
374
375 return(PEGASUS_THREAD_RETURN(0));
376 }
377
|
378 chip 1.8 void ProviderManagerService::handleCimRequest(AsyncOpNode * op, const Message * message)
|
379 chip 1.1 {
380 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManagerService::handleCimRequest");
381
382 // ATTN: ensure message is a request???
383 CIMMessage * request = dynamic_cast<CIMMessage *>(const_cast<Message *>(message));
384
385 // get request from op node
386 AsyncRequest * async = static_cast<AsyncRequest *>(op->_request.next(0));
387
388 PEGASUS_ASSERT((request != 0) && (async != 0));
389
390 Message * response = 0;
|
391 schuur 1.22 String ifc;
|
392 schuur 1.23
|
393 schuur 1.19 // get the responsible provider Manager
|
394 schuur 1.22 ProviderManager * pm = locateProviderManager(message,ifc);
|
395 schuur 1.24.6.1 if (pm) {
|
396 chip 1.21 response = pm->processMessage(request);
|
397 schuur 1.19 }
|
398 schuur 1.24.6.1
399 else for (Uint32 i = 0, n = _providerManagers.size(); i < n; i++) {
400 ProviderManagerContainer *pmc=_providerManagers[i];
401 switch (message->getType()) {
402 case CIM_ENABLE_MODULE_REQUEST_MESSAGE: {
403 CIMEnableModuleRequestMessage * request =
404 dynamic_cast<CIMEnableModuleRequestMessage*>(const_cast<Message*>(message));
405 if (request->providerModule.getProperty(request->providerModule.findProperty
406 ("InterfaceType")).getValue().toString()==pmc->getInterfaceName())
407 response=pmc->getProviderManager()->processMessage(request);
408 }
409 break;
410 case CIM_DISABLE_MODULE_REQUEST_MESSAGE: {
411 CIMDisableModuleRequestMessage * request =
412 dynamic_cast<CIMDisableModuleRequestMessage*>(const_cast<Message*>(message));
413 if (request->providerModule.getProperty(request->providerModule.findProperty
414 ("InterfaceType")).getValue().toString()==pmc->getInterfaceName())
415 response=pmc->getProviderManager()->processMessage(request);
416 }
417 break;
418 case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE: {
419 schuur 1.24.6.1 Message *resp=pmc->getProviderManager()->processMessage(request);
420 if (resp) response=resp; }
421 break;
422 default:
|
423 schuur 1.23 CIMRequestMessage * req =
424 dynamic_cast<CIMRequestMessage *>(const_cast<Message *>(message));
425 CIMResponseMessage *resp=new CIMResponseMessage(0,req->messageId,CIMException(),
|
426 schuur 1.22 req->queueIds.copyAndPop());
|
427 schuur 1.23 response=resp;
428 resp->synch_response(req);
429 OperationResponseHandler handler(req, resp);
|
430 schuur 1.24.6.1 handler.setStatus(CIM_ERR_FAILED, "Unknown messagetype.");
|
431 schuur 1.23 }
432 }
|
433 chip 1.13
|
434 schuur 1.19 // preserve message key
435 response->setKey(request->getKey());
|
436 chip 1.13
|
437 schuur 1.19 // set HTTP method in response from request
438 response->setHttpMethod(request->getHttpMethod());
|
439 chip 1.13
|
440 schuur 1.19 AsyncLegacyOperationResult * async_result =
441 new AsyncLegacyOperationResult(
442 async->getKey(),
443 async->getRouting(),
444 op,
445 response);
|
446 chip 1.13
|
447 schuur 1.19 _complete_op_node(op, ASYNC_OPSTATE_COMPLETE, 0, 0);
|
448 chip 1.13
|
449 schuur 1.19 PEG_METHOD_EXIT();
450 }
|
451 chip 1.13
|
452 schuur 1.23 ProviderManager* ProviderManagerService::locateProviderManager(const Message *message,
|
453 schuur 1.22 String & it)
|
454 schuur 1.19 {
|
455 kumpf 1.24 CIMNamespaceName nameSpace;
456 CIMName className;
|
457 chip 1.13
|
458 schuur 1.22 const CIMOperationRequestMessage * p =
459 dynamic_cast<const CIMOperationRequestMessage *>(message);
|
460 chip 1.13
|
461 schuur 1.22 if (p) {
462 nameSpace=p->nameSpace;
463 if (p->providerType==ProviderType::ASSOCIATION)
464 className=((CIMAssociatorsRequestMessage*)p)->assocClass;
465 else className=p->className;
|
466 schuur 1.23
|
467 schuur 1.22 ProviderName name(
468 CIMObjectPath(String::EMPTY, nameSpace, className).toString(),
469 String::EMPTY,
470 String::EMPTY,
471 String::EMPTY,
472 p->providerType);
473 // find provider manager
|
474 schuur 1.24.6.1 name = ProviderRegistrar().findProvider(name,false);
|
475 schuur 1.22 it=name.getInterfaceName();
476 }
477
478 else {
479 const CIMIndicationRequestMessage * p =
480 dynamic_cast<const CIMIndicationRequestMessage *>(message);
481 if (p) {
482 CIMIndicationRequestMessage *m=(CIMIndicationRequestMessage*)message;
483 it=m->providerModule.getProperty (m->providerModule.findProperty
484 ("InterfaceType")).getValue ().toString ();
|
485 schuur 1.19 }
|
486 schuur 1.24.6.1
487 else switch (message->getType()) {
488 case CIM_DISABLE_MODULE_REQUEST_MESSAGE:
489 case CIM_ENABLE_MODULE_REQUEST_MESSAGE:
490 case CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE:
491 return NULL;
492 default:
493 it="C++Default";
|
494 schuur 1.19 }
|
495 chip 1.13 }
496
|
497 chip 1.11 // find provider manager for provider interface
|
498 chip 1.14 for(Uint32 i = 0, n = _providerManagers.size(); i < n; i++)
499 {
|
500 schuur 1.22 if (String::equalNoCase(it,_providerManagers[i]->getInterfaceName())) {
|
501 schuur 1.19 ProviderManagerContainer *pmc=_providerManagers[i];
502 return pmc->getProviderManager();
|
503 chip 1.14 }
|
504 chip 1.1 }
|
505 schuur 1.22 ProviderManagerContainer *pmc=_providerManagers[0];
506 return pmc->getProviderManager();
|
507 chip 1.1 }
508
509 void ProviderManagerService::unload_idle_providers(void)
510 {
511 }
512
513 PEGASUS_NAMESPACE_END
|
514 chip 1.9
|