(file) Return to ProviderModule.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / Default

  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
 39 kumpf 1.2 #include <Pegasus/Config/ConfigManager.h>
 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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2