1 chip 1.1 //%////////////-*-c++-*-///////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2000 - 2003 BMC Software, Hewlett-Packard Company, IBM,
4 // The Open Group, Tivoli Systems
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to
8 // deal in the Software without restriction, including without limitation the
9 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 // sell copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
12 //
13 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
14 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
15 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
16 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
17 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
18 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 //
22 chip 1.1 //==============================================================================
23 //
24 // Author: Chip Vincent (cvincent@us.ibm.com)
25 //
26 // Modified By:
27 // Nag Boranna, Hewlett-Packard Company(nagaraja_boranna@hp.com)
28 // Yi Zhou, Hewlett-Packard Company(yi_zhou@hp.com)
29 // Mike Day, IBM (mdday@us.ibm.com)
30 // Adrian Schuur, IBM (schuur@de.ibm.com)
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
34 #include "ProviderModule.h"
35
36 #include <Pegasus/Common/Destroyer.h>
37 #include <Pegasus/Common/FileSystem.h>
38 #include <Pegasus/Common/MessageLoader.h> //l10n
|
40 chip 1.1
41 PEGASUS_NAMESPACE_BEGIN
42
43
44 // added support to re-activate ProviderAdapter ( A Schuur )
45
46 /*
47 ProviderModule::ProviderModule(const String & fileName)
48 : _fileName(fileName),
49 _ref_count(0),
50 _library(0)
51 {
52 _interfaceFileName=String::EMPTY;
53 _library = System::loadDynamicLibrary((const char *)_fileName.getCString());
54 }
55 */
56
57 ProviderModule::ProviderModule(const String & fileName, const String & interfaceName)
58 : _fileName(fileName),
59 _interfaceName(interfaceName),
60 _ref_count(0),
61 chip 1.1 _library(0)
62 {
63 _interfaceFileName=String::EMPTY;
64 if(_interfaceName.size()>0)
65 {
66 #ifdef PEGASUS_OS_TYPE_WINDOWS
67 _interfaceFileName=_interfaceName+String("Adapter.dll");
68 #elif defined(PEGASUS_OS_HPUX)
69 _interfaceFileName=ConfigManager::getHomedPath(
70 ConfigManager::getInstance()->getCurrentValue("providerDir"))+
71 String("/lib")+interfaceName+String("Adapter.sl");
72 #elif defined(PEGASUS_OS_OS400)
73 _interfaceFileName=interfaceName+String("Adapter");
74 #else
75 _interfaceFileName=ConfigManager::getHomedPath(
76 ConfigManager::getInstance()->getCurrentValue("providerDir"))+
77 String("/lib")+interfaceName+String("Adapter.so");
78 #endif
79 }
80 }
81
82 chip 1.1 /*
83 ProviderModule::ProviderModule(const String & fileName,
84 const String & providerName)
85 : _fileName(fileName),
86 _library(0),
87 _providerName(providerName),
88 _provider(0)
89 {
90 }
91 */
92
93 ProviderModule::ProviderModule(const String & fileName,
94 const String & providerName,
95 const String & interfaceName,
96 const Uint32 & refCount)
97 : _fileName(fileName),
98 _library(0),
99 _providerName(providerName),
100 _interfaceName(interfaceName),
101 _provider(0),
102 _refCount(refCount)
103 chip 1.1
104 {
105 // currently without interface registration
106 _interfaceFileName = String::EMPTY;
107
108 if(_interfaceName.size() > 0)
109 if(!( String::equalNoCase(_interfaceName, "C++Standard") ||
110 String::equalNoCase(_interfaceName, "C++Default") ||
111 String::equalNoCase(_interfaceName, "PG_DefaultC++") ))
112 {
113 #ifdef PEGASUS_OS_TYPE_WINDOWS
114 _interfaceFileName = _interfaceName + String(".dll");
115 #elif defined(PEGASUS_OS_HPUX)
116 _interfaceFileName = ConfigManager::getHomedPath(
117 ConfigManager::getInstance()->getCurrentValue("providerDir"));
118 _interfaceFileName.append(
119 String("/lib") + _interfaceName + String(".sl"));
120 #elif defined(PEGASUS_OS_OS400)
121 _interfaceFileName = _interfaceName;
122 #else
123 _interfaceFileName = ConfigManager::getHomedPath(
124 chip 1.1 ConfigManager::getInstance()->getCurrentValue("providerDir"));
125 _interfaceFileName.append(
126 String("/lib") + _interfaceName + String(".so"));
127 #endif
128 }
129 }
130
131 ProviderModule::ProviderModule(const ProviderModule & pm)
132 : _fileName(pm._fileName),
133 _library(pm._library),
134 _providerName(pm._providerName),
135 _interfaceName(pm._interfaceName),
136 _interfaceFileName(pm._interfaceFileName),
137 _provider(pm._provider),
138 _refCount(pm._refCount)
139 {
140 }
141
142 ProviderModule::~ProviderModule(void)
143 {
144
145 chip 1.1 }
146
147 CIMProvider *ProviderModule::load(const String & providerName)
148 {
149 // get the interface adapter library first
150 CIMProvider *provider = 0;
151
152 /*
153 if (_interfaceFileName.size()>0) {
154 _adapter=ProviderAdapterManager::get_pamgr()->addAdapter(
155 _interfaceName,_interfaceFileName,_fileName,providerName);
156 provider=dynamic_cast<CIMProvider*>(_adapter);
157 if (provider==NULL) {
158 //l10n
159 //throw Exception("ProviderLoadFailure ("+providerName+
160 //"Provider is not a BaseProvider");
161 String s0 = "ProviderLoadFailure";
162 String s2 = "Provider";
163 String s3 = "BaseProvider";
164 throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.IS_NOT_A"
165 "$0 ($1$2 is not a $3)",
166 chip 1.1 s0,
167 providerName,
168 s2,
169 s3));
170 }
171 _ref_count++;
172 return provider;
173 }
174 */
175
176 // dynamically load the provider library
177 if(_library == 0)
178 {
179 _library = System::loadDynamicLibrary((const char *)_fileName.getCString());
180 }
181
182 if(_library == 0)
183 {
184
185 // ATTN: does unload() need to be called?
186 //l10n
187 chip 1.1 //String errorString = "Cannot load library, error: " + System::dynamicLoadError();
188 //throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString);
189 String s0 = "ProviderLoadFailure";
190 throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.CANNOT_LOAD_LIBRARY",
191 "$0 ($1:$2):Cannot load library, error: $3",
192 s0,
193 _fileName,
194 providerName,
195 System::dynamicLoadError()));
196 }
197
198 // find libray entry point
199 CIMProvider * (*createProvider)(const String &) = 0;
200
201 createProvider = (CIMProvider * (*)(const String &))System::loadDynamicSymbol(
202 _library, "PegasusCreateProvider");
203
204 if(createProvider == 0)
205 {
206 //l10n
207 //String errorString = "entry point not found.";
208 chip 1.1 //throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString);
209 String s0 = "ProviderLoadFailure";
210 throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.ENTRY_POINT_NOT_FOUND",
211 "$0 ($1:$2):entry point not found.",
212 s0,
213 _fileName,
214 providerName));
215 }
216
217 // invoke the provider entry point
218 provider = createProvider(providerName);
219
220 // test for the appropriate interface
221 if(dynamic_cast<CIMProvider *>(provider) == 0)
222 {
223 //l10n
224 //String errorString = "provider is not a CIMProvider.";
225 //throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString);
226 String s0 = "ProviderLoadFailure";
227 String s3 = "CIMProvider";
228 throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.PROVIDER_IS_NOT_A",
229 chip 1.1 "$0 ($1:$2):provider is not a $3.",
230 s0,
231 _fileName,
232 providerName,
233 s3));
234 }
235
236 _ref_count++;
237
238 return(provider);
239 }
240
241 void ProviderModule::unloadModule(void)
242 {
243 _ref_count--;
244
245 if(_ref_count.value() > 0)
246 return;
247
248 _ref_count = 0;
249
250 chip 1.1 if(_library != 0)
251 {
252 System::unloadDynamicLibrary(_library);
253 _library = 0;
254 }
255 }
256
257 Boolean ProviderModule::operator == (const void *key) const
258 {
259 String *prov = reinterpret_cast<String *>(const_cast<void *>(key));
260
261 if(String::equalNoCase(_fileName, *prov))
262 return(true);
263
264 return(false);
265 }
266
267 Boolean ProviderModule::operator == (const ProviderModule &pm) const
268 {
269 if(String::equalNoCase(_fileName, pm._fileName))
270 return(true);
271 chip 1.1
272 return(false);
273 }
274
275 PEGASUS_NAMESPACE_END
|