version 1.11, 2005/02/05 23:00:30
|
version 1.20, 2007/06/05 10:04:11
|
|
|
//%2005//////////////////////////////////////////////////////////////////////// |
//%2006//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development | // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. | // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
|
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. | // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; | // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
// EMC Corporation; VERITAS Software Corporation; The Open Group. | // 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 |
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// Author: Chip Vincent (cvincent@us.ibm.com) |
|
// |
|
// Modified By: |
|
// Nag Boranna, Hewlett-Packard Company(nagaraja_boranna@hp.com) |
|
// Yi Zhou, Hewlett-Packard Company(yi_zhou@hp.com) |
|
// Mike Day, IBM (mdday@us.ibm.com) |
|
// Adrian Schuur, IBM (schuur@de.ibm.com) |
|
// Josephine Eskaline Joyce (jojustin@in.ibm.com) for PEP#101 |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#include "ProviderModule.h" | #include "ProviderModule.h" |
| |
#include <Pegasus/Common/FileSystem.h> | #include <Pegasus/Common/FileSystem.h> |
#include <Pegasus/Common/MessageLoader.h> //l10n |
#include <Pegasus/Common/MessageLoader.h> |
|
|
#ifdef PEGASUS_OS_OS400 |
|
#include "CreateProviderOS400SystemState.h" |
|
#endif |
|
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
ProviderModule::ProviderModule(const String & fileName, const String & interfaceName) |
ProviderModule::ProviderModule(const String& fileName) |
: _fileName(fileName), |
: _library(fileName) |
_ref_count(0), |
|
_library(0), |
|
_interfaceName(interfaceName) |
|
{ |
|
_interfaceFileName=String::EMPTY; |
|
if(_interfaceName.size()>0) |
|
{ |
|
#ifdef PEGASUS_OS_TYPE_WINDOWS |
|
_interfaceFileName=_interfaceName+String("Adapter.dll"); |
|
#elif defined(PEGASUS_OS_HPUX) |
|
_interfaceFileName = |
|
String("lib")+interfaceName+String("Adapter.sl"); |
|
#elif defined(PEGASUS_OS_OS400) |
|
_interfaceFileName=interfaceName+String("Adapter"); |
|
#elif defined(PEGASUS_OS_DARWIN) |
|
_interfaceFileName= String("lib")+interfaceName+String("Adapter.dylib"); |
|
#else |
|
_interfaceFileName= String("lib")+interfaceName+String("Adapter.so"); |
|
#endif |
|
|
|
_interfaceFileName = FileSystem::getAbsoluteFileName( |
|
ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir")), _interfaceFileName); |
|
|
|
} |
|
} |
|
|
|
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 = String("lib") + _interfaceName + String(".sl"); |
|
#elif defined(PEGASUS_OS_OS400) |
|
_interfaceFileName = _interfaceName; |
|
#elif defined(PEGASUS_OS_DARWIN) |
|
_interfaceFileName = String("lib") + _interfaceName + String(".dylib"); |
|
#else |
|
_interfaceFileName = String("lib") + _interfaceName + String(".so"); |
|
#endif |
|
|
|
_interfaceFileName = FileSystem::getAbsoluteFileName( |
|
ConfigManager::getHomedPath(ConfigManager::getInstance()->getCurrentValue("providerDir")), _interfaceFileName); |
|
|
|
} |
|
} |
|
|
|
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) |
|
{ | { |
} | } |
| |
ProviderModule::~ProviderModule(void) |
ProviderModule::~ProviderModule() |
{ | { |
} | } |
| |
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.load()) |
{ |
|
_library = System::loadDynamicLibrary((const char *)_fileName.getCString()); |
|
} |
|
|
|
if(_library == 0) |
|
{ | { |
|
throw Exception(MessageLoaderParms( |
// ATTN: does unload() need to be called? |
"ProviderManager.ProviderModule.CANNOT_LOAD_LIBRARY", |
//l10n |
|
//String errorString = "Cannot load library, error: " + System::dynamicLoadError(); |
|
//throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString); |
|
throw Exception(MessageLoaderParms("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 libray 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) |
{ | { |
//l10n |
_library.unload(); |
//String errorString = "entry point not found."; |
throw Exception(MessageLoaderParms( |
//throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString); |
"ProviderManager.ProviderModule.ENTRY_POINT_NOT_FOUND", |
|
|
throw Exception(MessageLoaderParms("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 |
CIMProvider* 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 |
_library.unload(); |
//String errorString = "provider is not a CIMProvider."; |
throw Exception(MessageLoaderParms( |
//throw Exception("ProviderLoadFailure (" + _fileName + ":" + providerName + "):" + errorString); |
"ProviderManager.ProviderModule.PROVIDER_IS_NOT_A", |
throw Exception(MessageLoaderParms("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)); |
} | } |
_ref_count++; |
|
return(provider); |
|
} |
|
|
|
void ProviderModule::unloadModule(void) |
|
{ |
|
if (_ref_count.DecAndTestIfZero()) |
|
{ |
|
if(_library != 0) |
|
{ |
|
System::unloadDynamicLibrary(_library); |
|
_library = 0; |
|
} |
|
} |
|
} |
|
| |
Boolean ProviderModule::operator == (const void *key) const |
return provider; |
{ |
|
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 |
void ProviderModule::unloadModule() |
{ | { |
if(String::equalNoCase(_fileName, pm._fileName)) |
_library.unload(); |
return(true); |
|
return(false); |
|
} | } |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |