1 karl 1.15 //%2005////////////////////////////////////////////////////////////////////////
|
2 kumpf 1.1 //
|
3 karl 1.14 // 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 kumpf 1.1 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.14 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.15 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 kumpf 1.1 //
12 // Permission is hereby granted, free of charge, to any person obtaining a copy
13 // of this software and associated documentation files (the "Software"), to
14 // deal in the Software without restriction, including without limitation the
15 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
16 // sell copies of the Software, and to permit persons to whom the Software is
17 // furnished to do so, subject to the following conditions:
|
18 karl 1.14 //
|
19 kumpf 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
20 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
21 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
22 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
23 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
25 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 //==============================================================================
29 //
30 // Author: Chip Vincent (cvincent@us.ibm.com)
31 // Roger Kumpf, Hewlett-Packard Company (roger_kumpf@hp.com)
32 //
|
33 se.gupta 1.9 // Modified By: Seema Gupta(gseema@in.ibm.com) for PEP135
|
34 gs.keenan 1.16 // Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)
|
35 carolann.graves 1.17 // Carol Ann Krug Graves, Hewlett-Packard Company
36 // (carolann_graves@hp.com)
|
37 joyce.j 1.23 // Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) for Bug#2619, #2685,#3354
|
38 kumpf 1.1 //
39 //%/////////////////////////////////////////////////////////////////////////////
40
41 #include "BasicProviderManagerRouter.h"
42
43 #include <Pegasus/Common/Config.h>
|
44 se.gupta 1.9 #include <Pegasus/Common/OperationContextInternal.h>
|
45 kumpf 1.1 #include <Pegasus/Common/CIMMessage.h>
46 #include <Pegasus/Common/Tracer.h>
|
47 kumpf 1.12 #include <Pegasus/Common/FileSystem.h>
48 #include <Pegasus/Config/ConfigManager.h>
|
49 kumpf 1.1 #include <Pegasus/ProviderManager2/OperationResponseHandler.h>
50 #include <Pegasus/ProviderManager2/ProviderManagerModule.h>
51 #include <Pegasus/ProviderManager2/ProviderManager.h>
52
53 // ProviderManager library names. Should these be defined elsewhere?
54 #if defined(PEGASUS_OS_OS400)
|
55 humberto 1.19 # define LIBRARY_NAME_DEFAULTPM "QSYS/QYCMPMDE00"
|
56 kumpf 1.1 # define LIBRARY_NAME_CMPIPM "QSYS/QYCMCMPIPM"
57 # define LIBRARY_NAME_JMPIPM "QSYS/QYCMJMPIPM"
58 #else
59 # define LIBRARY_NAME_DEFAULTPM "DefaultProviderManager"
60 # define LIBRARY_NAME_CMPIPM "CMPIProviderManager"
61 # define LIBRARY_NAME_JMPIPM "JMPIProviderManager"
62 #endif
63
64 PEGASUS_NAMESPACE_BEGIN
65
66 // BEGIN TEMP SECTION
67 class ProviderManagerContainer
68 {
69 public:
70 ProviderManagerContainer()
71 : _manager(0)
72 {
73 }
74
75 ProviderManagerContainer(const ProviderManagerContainer & container)
76 : _manager(0)
77 kumpf 1.1 {
78 *this = container;
79 }
80
81 ProviderManagerContainer(
82 const String& physicalName,
83 const String& logicalName,
84 const String& interfaceName,
|
85 carolann.graves 1.17 PEGASUS_INDICATION_CALLBACK indicationCallback,
86 Boolean subscriptionInitComplete)
|
87 kumpf 1.1 : _manager(0)
88 {
|
89 gs.keenan 1.16 #if defined (PEGASUS_OS_VMS)
90 _physicalName = FileSystem::buildLibraryFileName(physicalName);
|
91 humberto 1.19 #elif defined (PEGASUS_OS_OS400)
|
92 chuck 1.20 _physicalName = physicalName;
|
93 gs.keenan 1.16 #else
|
94 kumpf 1.12 _physicalName = ConfigManager::getHomedPath(PEGASUS_DEST_LIB_DIR) +
|
95 kumpf 1.13 String("/") + FileSystem::buildLibraryFileName(physicalName);
|
96 gs.keenan 1.16 #endif
|
97 kumpf 1.1
98 _logicalName = logicalName;
99 _interfaceName = interfaceName;
100
101 _module = ProviderManagerModule(_physicalName);
102 _module.load();
103
104 _manager = _module.getProviderManager(_logicalName);
105 PEGASUS_ASSERT(_manager != 0);
106
107 _manager->setIndicationCallback(indicationCallback);
|
108 carolann.graves 1.17
109 _manager->setSubscriptionInitComplete (subscriptionInitComplete);
|
110 kumpf 1.1 }
111
112 ~ProviderManagerContainer()
113 {
|
114 joyce.j 1.23 delete _manager;
|
115 kumpf 1.1 _module.unload();
116 }
117
118 ProviderManagerContainer& operator=(
119 const ProviderManagerContainer & container)
120 {
121 if (this == &container)
122 {
123 return *this;
124 }
125
126 _logicalName = container._logicalName;
127 _physicalName = container._physicalName;
128 _interfaceName = container._interfaceName;
129
130 _module = container._module;
131 _manager = container._manager;
132
133 return *this;
134 }
135
136 kumpf 1.1 ProviderManager* getProviderManager()
137 {
138 return _manager;
139 }
140
141 const String& getPhysicalName() const
142 {
143 return _physicalName;
144 }
145
146 const String& getLogicalName() const
147 {
148 return _logicalName;
149 }
150
151 const String& getInterfaceName() const
152 {
153 return _interfaceName;
154 }
155
156 private:
157 kumpf 1.1 String _physicalName;
158 String _logicalName;
159 String _interfaceName;
160
161 ProviderManagerModule _module;
162 ProviderManager* _manager;
163 };
164 // END TEMP SECTION
165
166
167 PEGASUS_INDICATION_CALLBACK BasicProviderManagerRouter::_indicationCallback = 0;
168
169 // Private, unimplemented constructor
170 BasicProviderManagerRouter::BasicProviderManagerRouter()
171 {
172 }
173
174 BasicProviderManagerRouter::BasicProviderManagerRouter(
175 PEGASUS_INDICATION_CALLBACK indicationCallback)
176 {
177 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
178 kumpf 1.1 "BasicProviderManagerRouter::BasicProviderManagerRouter");
179
180 _indicationCallback = indicationCallback;
|
181 carolann.graves 1.17 _subscriptionInitComplete = false;
|
182 kumpf 1.1
183 PEG_METHOD_EXIT();
184 }
185
186 BasicProviderManagerRouter::~BasicProviderManagerRouter()
187 {
188 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
189 "BasicProviderManagerRouter::~BasicProviderManagerRouter");
|
190 joyce.j 1.21 /* Clean up the provider managers */
191 for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
192 {
193 ProviderManagerContainer* pmc=_providerManagerTable[i];
194 delete pmc;
195 }
|
196 kumpf 1.1 PEG_METHOD_EXIT();
197 }
198
199 Message* BasicProviderManagerRouter::processMessage(Message * message)
200 {
201 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
202 "BasicProviderManagerRouter::processMessage");
203
204 CIMRequestMessage* request = dynamic_cast<CIMRequestMessage *>(message);
205 PEGASUS_ASSERT(request != 0);
206
207 Message* response = 0;
|
208 schuur 1.7 Boolean remoteNameSpaceRequest=false;
|
209 kumpf 1.1
210 //
211 // Retrieve the ProviderManager routing information
212 //
213
214 CIMInstance providerModule;
215
216 if ((dynamic_cast<CIMOperationRequestMessage*>(request) != 0) ||
|
217 kumpf 1.4 (request->getType() == CIM_EXPORT_INDICATION_REQUEST_MESSAGE) ||
218 (request->getType() == CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE))
|
219 kumpf 1.1 {
220 // Provider information is in OperationContext
221 ProviderIdContainer pidc = (ProviderIdContainer)
222 request->operationContext.get(ProviderIdContainer::NAME);
223 providerModule = pidc.getModule();
|
224 schuur 1.7 remoteNameSpaceRequest=pidc.isRemoteNameSpace();
|
225 kumpf 1.1 }
226 else if (dynamic_cast<CIMIndicationRequestMessage*>(request) != 0)
227 {
228 // Provider information is in CIMIndicationRequestMessage
229 CIMIndicationRequestMessage* indReq =
230 dynamic_cast<CIMIndicationRequestMessage*>(request);
|
231 se.gupta 1.9 ProviderIdContainer pidc = indReq->operationContext.get(ProviderIdContainer::NAME);
232 providerModule = pidc.getModule();
|
233 kumpf 1.1 }
234 else if (request->getType() == CIM_ENABLE_MODULE_REQUEST_MESSAGE)
235 {
236 // Provider information is in CIMEnableModuleRequestMessage
237 CIMEnableModuleRequestMessage* emReq =
238 dynamic_cast<CIMEnableModuleRequestMessage*>(request);
239 providerModule = emReq->providerModule;
240 }
241 else if (request->getType() == CIM_DISABLE_MODULE_REQUEST_MESSAGE)
242 {
243 // Provider information is in CIMDisableModuleRequestMessage
244 CIMDisableModuleRequestMessage* dmReq =
245 dynamic_cast<CIMDisableModuleRequestMessage*>(request);
246 providerModule = dmReq->providerModule;
247 }
|
248 kumpf 1.6 else if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||
|
249 carolann.graves 1.17 (request->getType() ==
250 CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE) ||
|
251 kumpf 1.6 (request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE))
|
252 kumpf 1.1 {
253 // This operation is not provider-specific
254 }
255 else
256 {
257 // Error: Unrecognized message type.
258 PEGASUS_ASSERT(0);
|
259 kumpf 1.6 CIMResponseMessage* resp = request->buildResponse();
|
260 schuur 1.7 resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
|
261 kumpf 1.6 "Unknown message type.");
|
262 kumpf 1.1 response = resp;
263 }
264
265 //
266 // Forward the request to the appropriate ProviderManager(s)
267 //
268
|
269 carolann.graves 1.17 if ((request->getType() == CIM_STOP_ALL_PROVIDERS_REQUEST_MESSAGE) ||
270 (request->getType() ==
271 CIM_SUBSCRIPTION_INIT_COMPLETE_REQUEST_MESSAGE))
|
272 kumpf 1.1 {
|
273 carolann.graves 1.17 _subscriptionInitComplete = true;
274
275 // Send CIMStopAllProvidersRequestMessage or
276 // CIMSubscriptionInitCompleteRequestMessage to all ProviderManagers
|
277 kumpf 1.5 ReadLock tableLock(_providerManagerTableLock);
|
278 kumpf 1.1 for (Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
279 {
280 ProviderManagerContainer* pmc=_providerManagerTable[i];
281 Message* resp = pmc->getProviderManager()->processMessage(request);
282 if (resp)
283 {
|
284 kumpf 1.3 delete resp;
|
285 kumpf 1.1 }
286 }
|
287 kumpf 1.3
|
288 schuur 1.7 response = request->buildResponse();
|
289 kumpf 1.6 }
290 else if(request->getType() == CIM_NOTIFY_CONFIG_CHANGE_REQUEST_MESSAGE)
291 {
|
292 schuur 1.7 // Do not need to forward this request to in-process provider
|
293 kumpf 1.6 // managers
|
294 schuur 1.7 response = request->buildResponse();
|
295 kumpf 1.1 }
296 else
297 {
298 // Retrieve the provider interface type
299 String interfaceType;
300 CIMValue itValue = providerModule.getProperty(
301 providerModule.findProperty("InterfaceType")).getValue();
302 itValue.get(interfaceType);
303
304 // Look up the appropriate ProviderManager by InterfaceType
305 ProviderManager* pm = _lookupProviderManager(interfaceType);
|
306 schuur 1.7 if (remoteNameSpaceRequest && !pm->supportsRemoteNameSpaces()) {
307 CIMResponseMessage* resp = request->buildResponse();
308 resp->cimException = PEGASUS_CIM_EXCEPTION(CIM_ERR_FAILED,
309 "Remote Namespace operations not supported for interface type "+interfaceType);
310 response = resp;
311 }
312 else response = pm->processMessage(request);
|
313 kumpf 1.1 }
314
315 // preserve message key
316 response->setKey(request->getKey());
317
318 // set HTTP method in response from request
319 response->setHttpMethod(request->getHttpMethod());
320
321 PEG_METHOD_EXIT();
322 return response;
323 }
324
325 // ATTN: May need to add interfaceVersion parameter to further constrain lookup
326 ProviderManager* BasicProviderManagerRouter::_lookupProviderManager(
327 const String& interfaceType)
328 {
329 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
330 "BasicProviderManagerRouter::_lookupProviderManager");
331
332 //
333 // Search for this InterfaceType in the table of loaded ProviderManagers
334 kumpf 1.1 //
335 {
336 ReadLock tableLock(_providerManagerTableLock);
337
338 // find provider manager for specified provider interface type
339 for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
340 {
341 if (interfaceType == _providerManagerTable[i]->getInterfaceName())
342 {
343 ProviderManagerContainer* pmc=_providerManagerTable[i];
344 PEG_METHOD_EXIT();
345 return pmc->getProviderManager();
346 }
347 }
348 }
349
350 //
351 // Load the ProviderManager for this InterfaceType and add it to the table
352 //
353 {
354 WriteLock tableLock(_providerManagerTableLock);
355 kumpf 1.1
356 // ATTN: this section is a temporary solution to populate the list of
357 // enabled provider managers for a given distribution. It includes
358 // another temporary solution for converting a generic file name into
359 // a file name useable by each platform.
360
|
361 se.gupta 1.10 #if defined(PEGASUS_ENABLE_DEFAULT_PROVIDER_MANAGER)
|
362 kumpf 1.1 if (interfaceType == "C++Default")
363 {
364 ProviderManagerContainer* pmc = new ProviderManagerContainer(
365 LIBRARY_NAME_DEFAULTPM, "DEFAULT", "C++Default",
|
366 carolann.graves 1.17 _indicationCallback, _subscriptionInitComplete);
|
367 kumpf 1.1 _providerManagerTable.append(pmc);
368 return pmc->getProviderManager();
369 }
370 #endif
371
|
372 se.gupta 1.11 #if defined(PEGASUS_ENABLE_CMPI_PROVIDER_MANAGER)
|
373 kumpf 1.1 if (interfaceType == "CMPI")
374 {
375 ProviderManagerContainer* pmc = new ProviderManagerContainer(
|
376 kumpf 1.18 LIBRARY_NAME_CMPIPM, "CMPI", "CMPI", _indicationCallback,
377 _subscriptionInitComplete);
|
378 kumpf 1.1 _providerManagerTable.append(pmc);
379 return pmc->getProviderManager();
380 }
381 #endif
382
|
383 se.gupta 1.11 #if defined(PEGASUS_ENABLE_JMPI_PROVIDER_MANAGER)
|
384 kumpf 1.1 if (interfaceType == "JMPI")
385 {
386 ProviderManagerContainer* pmc = new ProviderManagerContainer(
|
387 kumpf 1.18 LIBRARY_NAME_JMPIPM, "JMPI", "JMPI", _indicationCallback,
388 _subscriptionInitComplete);
|
389 kumpf 1.1 _providerManagerTable.append(pmc);
390 return pmc->getProviderManager();
391 }
392 #endif
393 // END TEMP SECTION
394 }
395
396 // Error: ProviderManager not found for the specified interface type
397 PEGASUS_ASSERT(0);
398 PEG_METHOD_EXIT();
399 return 0;
400 }
401
|
402 kumpf 1.5 Boolean BasicProviderManagerRouter::hasActiveProviders()
|
403 kumpf 1.1 {
404 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
|
405 kumpf 1.5 "BasicProviderManagerRouter::hasActiveProviders");
|
406 kumpf 1.1
|
407 kumpf 1.5 ReadLock tableLock(_providerManagerTableLock);
|
408 kumpf 1.1 for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
409 {
410 ProviderManagerContainer* pmc = _providerManagerTable[i];
|
411 kumpf 1.5 if (pmc->getProviderManager()->hasActiveProviders())
412 {
413 PEG_METHOD_EXIT();
414 return true;
415 }
416 }
417
418 PEG_METHOD_EXIT();
419 return false;
420 }
421
422 void BasicProviderManagerRouter::unloadIdleProviders()
423 {
424 PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
425 "BasicProviderManagerRouter::unloadIdleProviders");
426
427 //
428 // Save pointers to the ProviderManagerContainers so we don't hold the
429 // _providerManagerTableLock while unloading idle providers
430 //
431 Array<ProviderManagerContainer*> pmcs;
432 kumpf 1.5 {
433 ReadLock tableLock(_providerManagerTableLock);
434 for(Uint32 i = 0, n = _providerManagerTable.size(); i < n; i++)
435 {
436 pmcs.append(_providerManagerTable[i]);
437 }
438 }
439
440 //
441 // Unload idle providers in each of the active ProviderManagers
442 // _providerManagerTableLock while unloading idle providers
443 //
444 for (Uint32 i = 0; i < pmcs.size(); i++)
445 {
446 pmcs[i]->getProviderManager()->unloadIdleProviders();
|
447 kumpf 1.1 }
448
449 PEG_METHOD_EXIT();
450 }
451
452 PEGASUS_NAMESPACE_END
|