version 1.1, 2003/08/18 04:27:16
|
version 1.16, 2006/01/30 16:18:08
|
|
|
//%////////////-*-c++-*-/////////////////////////////////////////////////////////// |
//%2006//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000 - 2003 BMC Software, Hewlett-Packard Company, IBM, |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// The Open Group, Tivoli Systems |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
|
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation, The Open Group. |
|
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; Symantec Corporation; The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// Yi Zhou, Hewlett-Packard Company(yi_zhou@hp.com) | // Yi Zhou, Hewlett-Packard Company(yi_zhou@hp.com) |
// Mike Day, IBM (mdday@us.ibm.com) | // Mike Day, IBM (mdday@us.ibm.com) |
// Adrian Schuur, IBM (schuur@de.ibm.com) | // Adrian Schuur, IBM (schuur@de.ibm.com) |
|
// Josephine Eskaline Joyce (jojustin@in.ibm.com) for PEP#101 |
|
// Sean Keenan, Hewlett-Packard Company <sean.keenan@hp.com> |
|
// Roger Kumpf, Hewlett-Packard Company <roger_kumpf@hp.com> |
|
// Aruran, IBM (ashanmug@in.ibm.com) for Bug#4585 |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include "ProviderModule.h" | #include "ProviderModule.h" |
| |
#include <Pegasus/Common/Destroyer.h> |
|
#include <Pegasus/Common/FileSystem.h> | #include <Pegasus/Common/FileSystem.h> |
#include <Pegasus/Common/MessageLoader.h> //l10n |
#include <Pegasus/Common/MessageLoader.h> |
| |
PEGASUS_NAMESPACE_BEGIN |
#ifdef PEGASUS_OS_OS400 |
|
# include "CreateProviderOS400SystemState.h" |
|
#endif |
| |
| |
// added support to re-activate ProviderAdapter ( A Schuur ) |
PEGASUS_NAMESPACE_BEGIN |
| |
/* |
|
ProviderModule::ProviderModule(const String & fileName) | ProviderModule::ProviderModule(const String & fileName) |
: _fileName(fileName), | : _fileName(fileName), |
_ref_count(0), |
_refCount(0), |
_library(0) | _library(0) |
{ | { |
_interfaceFileName=String::EMPTY; |
|
_library = System::loadDynamicLibrary((const char *)_fileName.getCString()); |
|
} | } |
*/ |
|
| |
ProviderModule::ProviderModule(const String & fileName, const String & interfaceName) |
ProviderModule::~ProviderModule() |
: _fileName(fileName), |
|
_interfaceName(interfaceName), |
|
_ref_count(0), |
|
_library(0) |
|
{ |
|
_interfaceFileName=String::EMPTY; |
|
if(_interfaceName.size()>0) |
|
{ |
|
#ifdef PEGASUS_OS_TYPE_WINDOWS |
|
_interfaceFileName=_interfaceName+String("Adapter.dll"); |
|
#elif defined(PEGASUS_OS_HPUX) |
|
_interfaceFileName=ConfigManager::getHomedPath( |
|
ConfigManager::getInstance()->getCurrentValue("providerDir"))+ |
|
String("/lib")+interfaceName+String("Adapter.sl"); |
|
#elif defined(PEGASUS_OS_OS400) |
|
_interfaceFileName=interfaceName+String("Adapter"); |
|
#else |
|
_interfaceFileName=ConfigManager::getHomedPath( |
|
ConfigManager::getInstance()->getCurrentValue("providerDir"))+ |
|
String("/lib")+interfaceName+String("Adapter.so"); |
|
#endif |
|
} |
|
} |
|
|
|
/* |
|
ProviderModule::ProviderModule(const String & fileName, |
|
const String & providerName) |
|
: _fileName(fileName), |
|
_library(0), |
|
_providerName(providerName), |
|
_provider(0) |
|
{ | { |
} |
if (_library != 0) |
*/ |
|
|
|
ProviderModule::ProviderModule(const String & fileName, |
|
const String & providerName, |
|
const String & interfaceName, |
|
const Uint32 & refCount) |
|
: _fileName(fileName), |
|
_library(0), |
|
_providerName(providerName), |
|
_interfaceName(interfaceName), |
|
_provider(0), |
|
_refCount(refCount) |
|
|
|
{ |
|
// currently without interface registration |
|
_interfaceFileName = String::EMPTY; |
|
|
|
if(_interfaceName.size() > 0) |
|
if(!( String::equalNoCase(_interfaceName, "C++Standard") || |
|
String::equalNoCase(_interfaceName, "C++Default") || |
|
String::equalNoCase(_interfaceName, "PG_DefaultC++") )) |
|
{ |
|
#ifdef PEGASUS_OS_TYPE_WINDOWS |
|
_interfaceFileName = _interfaceName + String(".dll"); |
|
#elif defined(PEGASUS_OS_HPUX) |
|
_interfaceFileName = ConfigManager::getHomedPath( |
|
ConfigManager::getInstance()->getCurrentValue("providerDir")); |
|
_interfaceFileName.append( |
|
String("/lib") + _interfaceName + String(".sl")); |
|
#elif defined(PEGASUS_OS_OS400) |
|
_interfaceFileName = _interfaceName; |
|
#else |
|
_interfaceFileName = ConfigManager::getHomedPath( |
|
ConfigManager::getInstance()->getCurrentValue("providerDir")); |
|
_interfaceFileName.append( |
|
String("/lib") + _interfaceName + String(".so")); |
|
#endif |
|
} |
|
} |
|
|
|
ProviderModule::ProviderModule(const ProviderModule & pm) |
|
: _fileName(pm._fileName), |
|
_library(pm._library), |
|
_providerName(pm._providerName), |
|
_interfaceName(pm._interfaceName), |
|
_interfaceFileName(pm._interfaceFileName), |
|
_provider(pm._provider), |
|
_refCount(pm._refCount) |
|
{ | { |
|
System::unloadDynamicLibrary(_library); |
|
_library = 0; |
|
_refCount = 0; |
} | } |
|
|
ProviderModule::~ProviderModule(void) |
|
{ |
|
|
|
} | } |
| |
CIMProvider *ProviderModule::load(const String & providerName) | CIMProvider *ProviderModule::load(const String & providerName) |
{ | { |
// get the interface adapter library first |
|
CIMProvider *provider = 0; | CIMProvider *provider = 0; |
| |
/* |
|
if (_interfaceFileName.size()>0) { |
|
_adapter=ProviderAdapterManager::get_pamgr()->addAdapter( |
|
_interfaceName,_interfaceFileName,_fileName,providerName); |
|
provider=dynamic_cast<CIMProvider*>(_adapter); |
|
if (provider==NULL) { |
|
//l10n |
|
//throw Exception("ProviderLoadFailure ("+providerName+ |
|
//"Provider is not a BaseProvider"); |
|
String s0 = "ProviderLoadFailure"; |
|
String s2 = "Provider"; |
|
String s3 = "BaseProvider"; |
|
throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.IS_NOT_A" |
|
"$0 ($1$2 is not a $3)", |
|
s0, |
|
providerName, |
|
s2, |
|
s3)); |
|
} |
|
_ref_count++; |
|
return provider; |
|
} |
|
*/ |
|
|
|
// dynamically load the provider library | // dynamically load the provider library |
if(_library == 0) | if(_library == 0) |
{ | { |
_library = System::loadDynamicLibrary((const char *)_fileName.getCString()); |
_library = |
} |
System::loadDynamicLibrary((const char *)_fileName.getCString()); |
| |
if(_library == 0) | if(_library == 0) |
{ | { |
|
|
// ATTN: does unload() need to be called? | // ATTN: does unload() need to be called? |
//l10n |
throw Exception(MessageLoaderParms( |
//String errorString = "Cannot load library, error: " + System::dynamicLoadError(); |
"ProviderManager.ProviderModule.CANNOT_LOAD_LIBRARY", |
//throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString); |
"ProviderLoadFailure ($0:$1):Cannot load library, error: $2", |
String s0 = "ProviderLoadFailure"; |
|
throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.CANNOT_LOAD_LIBRARY", |
|
"$0 ($1:$2):Cannot load library, error: $3", |
|
s0, |
|
_fileName, | _fileName, |
providerName, | providerName, |
System::dynamicLoadError())); | System::dynamicLoadError())); |
} | } |
|
} |
| |
// find libray entry point |
// find library entry point |
CIMProvider * (*createProvider)(const String &) = 0; | CIMProvider * (*createProvider)(const String &) = 0; |
| |
createProvider = (CIMProvider * (*)(const String &))System::loadDynamicSymbol( | createProvider = (CIMProvider * (*)(const String &))System::loadDynamicSymbol( |
|
|
| |
if(createProvider == 0) | if(createProvider == 0) |
{ | { |
//l10n |
throw Exception(MessageLoaderParms( |
//String errorString = "entry point not found."; |
"ProviderManager.ProviderModule.ENTRY_POINT_NOT_FOUND", |
//throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString); |
"ProviderLoadFailure ($0:$1):entry point not found.", |
String s0 = "ProviderLoadFailure"; |
|
throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.ENTRY_POINT_NOT_FOUND", |
|
"$0 ($1:$2):entry point not found.", |
|
s0, |
|
_fileName, | _fileName, |
providerName)); | providerName)); |
} | } |
| |
// invoke the provider entry point | // invoke the provider entry point |
|
#ifndef PEGASUS_OS_OS400 |
provider = createProvider(providerName); | provider = createProvider(providerName); |
|
#else |
|
// On OS/400, need to call a layer of code that does platform-specific |
|
// checks before calling the provider |
|
provider = OS400_CreateProvider( |
|
providerName.getCString(), createProvider, _fileName); |
|
#endif |
| |
// test for the appropriate interface | // test for the appropriate interface |
if(dynamic_cast<CIMProvider *>(provider) == 0) | if(dynamic_cast<CIMProvider *>(provider) == 0) |
{ | { |
//l10n |
throw Exception(MessageLoaderParms( |
//String errorString = "provider is not a CIMProvider."; |
"ProviderManager.ProviderModule.PROVIDER_IS_NOT_A", |
//throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString); |
"ProviderLoadFailure ($0:$1):provider is not a CIMProvider.", |
String s0 = "ProviderLoadFailure"; |
|
String s3 = "CIMProvider"; |
|
throw Exception(MessageLoaderParms("ProviderManager.ProviderModule.PROVIDER_IS_NOT_A", |
|
"$0 ($1:$2):provider is not a $3.", |
|
s0, |
|
_fileName, | _fileName, |
providerName, |
providerName)); |
s3)); |
|
} | } |
|
_refCount++; |
_ref_count++; |
|
|
|
return(provider); | return(provider); |
} | } |
| |
void ProviderModule::unloadModule(void) |
void ProviderModule::unloadModule() |
|
{ |
|
if (_refCount.decAndTestIfZero()) |
{ | { |
_ref_count--; |
|
|
|
if(_ref_count.value() > 0) |
|
return; |
|
|
|
_ref_count = 0; |
|
|
|
if(_library != 0) | if(_library != 0) |
{ | { |
System::unloadDynamicLibrary(_library); | System::unloadDynamicLibrary(_library); |
_library = 0; | _library = 0; |
} | } |
} | } |
|
|
Boolean ProviderModule::operator == (const void *key) const |
|
{ |
|
String *prov = reinterpret_cast<String *>(const_cast<void *>(key)); |
|
|
|
if(String::equalNoCase(_fileName, *prov)) |
|
return(true); |
|
|
|
return(false); |
|
} |
|
|
|
Boolean ProviderModule::operator == (const ProviderModule &pm) const |
|
{ |
|
if(String::equalNoCase(_fileName, pm._fileName)) |
|
return(true); |
|
|
|
return(false); |
|
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |