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