version 1.16, 2006/01/30 16:18:08
|
version 1.17, 2006/08/08 18:03:04
|
|
|
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
ProviderModule::ProviderModule(const String& fileName) | ProviderModule::ProviderModule(const String& fileName) |
: _fileName(fileName), |
: _refCount(0), |
_refCount(0), |
_library(fileName) |
_library(0) |
|
{ | { |
} | } |
| |
ProviderModule::~ProviderModule() | ProviderModule::~ProviderModule() |
{ | { |
if (_library != 0) |
|
{ |
|
System::unloadDynamicLibrary(_library); |
|
_library = 0; |
|
_refCount = 0; |
|
} |
|
} | } |
| |
CIMProvider* ProviderModule::load(const String& providerName) | CIMProvider* ProviderModule::load(const String& providerName) |
{ | { |
CIMProvider* provider = 0; |
|
|
|
// dynamically load the provider library | // dynamically load the provider library |
if (_library == 0) |
if (!_library.isLoaded()) |
{ | { |
_library = |
if (!_library.load()) |
System::loadDynamicLibrary((const char *)_fileName.getCString()); |
|
|
|
if (_library == 0) |
|
{ | { |
// ATTN: does unload() need to be called? |
|
throw Exception(MessageLoaderParms( | throw Exception(MessageLoaderParms( |
"ProviderManager.ProviderModule.CANNOT_LOAD_LIBRARY", | "ProviderManager.ProviderModule.CANNOT_LOAD_LIBRARY", |
"ProviderLoadFailure ($0:$1):Cannot load library, error: $2", | "ProviderLoadFailure ($0:$1):Cannot load library, error: $2", |
_fileName, |
_library.getFileName(), |
providerName, | providerName, |
System::dynamicLoadError())); |
_library.getLoadErrorMessage())); |
} | } |
} | } |
| |
// find library entry point | // find library entry point |
CIMProvider * (*createProvider)(const String &) = 0; |
CIMProvider * (*createProvider)(const String &) = |
|
(CIMProvider* (*)(const String&)) |
createProvider = (CIMProvider* (*)(const String&))System::loadDynamicSymbol( |
_library.getSymbol("PegasusCreateProvider"); |
_library, "PegasusCreateProvider"); |
|
| |
if (createProvider == 0) | if (createProvider == 0) |
{ | { |
throw Exception(MessageLoaderParms( | throw Exception(MessageLoaderParms( |
"ProviderManager.ProviderModule.ENTRY_POINT_NOT_FOUND", | "ProviderManager.ProviderModule.ENTRY_POINT_NOT_FOUND", |
"ProviderLoadFailure ($0:$1):entry point not found.", | "ProviderLoadFailure ($0:$1):entry point not found.", |
_fileName, |
_library.getFileName(), |
providerName)); | providerName)); |
} | } |
| |
// invoke the provider entry point | // invoke the provider entry point |
#ifndef PEGASUS_OS_OS400 | #ifndef PEGASUS_OS_OS400 |
provider = createProvider(providerName); |
CIMProvider* provider = createProvider(providerName); |
#else | #else |
// On OS/400, need to call a layer of code that does platform-specific | // On OS/400, need to call a layer of code that does platform-specific |
// checks before calling the provider | // checks before calling the provider |
provider = OS400_CreateProvider( |
CIMProvider* provider = OS400_CreateProvider( |
providerName.getCString(), createProvider, _fileName); | providerName.getCString(), createProvider, _fileName); |
#endif | #endif |
| |
|
|
throw Exception(MessageLoaderParms( | throw Exception(MessageLoaderParms( |
"ProviderManager.ProviderModule.PROVIDER_IS_NOT_A", | "ProviderManager.ProviderModule.PROVIDER_IS_NOT_A", |
"ProviderLoadFailure ($0:$1):provider is not a CIMProvider.", | "ProviderLoadFailure ($0:$1):provider is not a CIMProvider.", |
_fileName, |
_library.getFileName(), |
providerName)); | providerName)); |
} | } |
|
|
_refCount++; | _refCount++; |
|
|
return(provider); | return(provider); |
} | } |
| |
|
|
{ | { |
if (_refCount.decAndTestIfZero()) | if (_refCount.decAndTestIfZero()) |
{ | { |
if (_library != 0) |
if (_library.isLoaded()) |
{ | { |
System::unloadDynamicLibrary(_library); |
_library.unload(); |
_library = 0; |
|
} | } |
} | } |
} | } |