00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #include "OW_config.h"
00036 #include "OW_SharedLibraryException.hpp"
00037 #include "OW_ProviderIFCLoader.hpp"
00038 #include "OW_Format.hpp"
00039 #include "OW_SignalScope.hpp"
00040 #include "OW_ConfigOpts.hpp"
00041 #include "OW_FileSystem.hpp"
00042 #include "OW_SafeLibCreate.hpp"
00043 #include "OW_Exception.hpp"
00044
00045 namespace OW_NAMESPACE
00046 {
00047
00048 namespace
00049 {
00050 const String COMPONENT_NAME("ow.owcimomd.ProviderIFCLoader");
00051
00052 OW_DECLARE_EXCEPTION(ProviderIFCLoader);
00053 OW_DEFINE_EXCEPTION(ProviderIFCLoader);
00054
00055 }
00057 ProviderIFCBaseIFCRef
00058 ProviderIFCLoaderBase::createProviderIFCFromLib(const String& libname) const
00059 {
00060 LoggerRef lgr(m_env->getLogger(COMPONENT_NAME));
00061 OW_LOG_DEBUG(lgr, Format("ProviderIFCBaseIFCLoaderBase::createProviderIFCFromLib loading library %1", libname));
00062 SharedLibraryRef sl = m_sll->loadSharedLibrary(libname,
00063 lgr);
00064 ProviderIFCBaseIFC* ptr = 0;
00065 if ( sl )
00066 {
00067 ptr = SafeLibCreate<ProviderIFCBaseIFC>::create(sl, "createProviderIFC", lgr);
00068 }
00069 else
00070 {
00071 OW_THROW(ProviderIFCLoaderException, Format("ProviderIFCBaseIFCLoaderBase::createProviderIFCFromLib FAILED loading library %1", libname).c_str());
00072 }
00073 ProviderIFCBaseIFCRef retval(sl, ptr);
00074 return retval;
00075 }
00076
00078 void
00079 ProviderIFCLoader::loadIFCs(Array<ProviderIFCBaseIFCRef>& ifcs) const
00080 {
00081 ServiceEnvironmentIFCRef env = getEnvironment();
00082 LoggerRef lgr(env->getLogger(COMPONENT_NAME));
00083 int ifcCount = 0;
00084
00085 StringArray libdirs = env->getMultiConfigItem(ConfigOpts::PROVIDER_IFC_LIBS_opt, String(OW_DEFAULT_PROVIDER_IFC_LIBS).tokenize(), OW_PATHNAME_SEPARATOR);
00086 for (size_t i = 0; i < libdirs.size(); ++i)
00087 {
00088 const String libdir(libdirs[i]);
00089 OW_LOG_DEBUG(lgr, Format("ProviderIFCBaseIFCLoaderBase::loadIFC getting provider interfaces from: %1", libdir));
00090 StringArray libs;
00091 FileSystem::getDirectoryContents(libdir, libs);
00092 if (libs.size() == 0)
00093 {
00094 OW_THROW(ProviderIFCLoaderException, "ProviderIFCBaseIFCLoaderBase::loadIFCs did not find any provider interfaces");
00095 return;
00096 }
00097 for (StringArray::size_type i = 0; i < libs.size(); ++i)
00098 {
00099 if (!libs[i].endsWith(OW_SHAREDLIB_EXTENSION))
00100 {
00101 continue;
00102 }
00103 #ifdef OW_DARWIN
00104 if (libs[i].indexOf(OW_VERSION) != String::npos)
00105 {
00106 continue;
00107 }
00108 #endif // OW_DARWIN
00109 ProviderIFCBaseIFCRef rval;
00110 ProviderIFCBaseIFCRef pmr;
00111 rval = createProviderIFCFromLib(libdir + OW_FILENAME_SEPARATOR + libs[i]);
00112 if (rval)
00113 {
00114 ifcCount++;
00115 ifcs.push_back(rval);
00116 }
00117 else
00118 {
00119 OW_LOG_ERROR(lgr, Format("Unable to load ProviderIFC library %1", libs[i]));
00120 }
00121 }
00122 }
00123 OW_LOG_DEBUG(lgr, Format("Number of provider interfaces loaded: %1",
00124 ifcCount));
00125 }
00127
00128 ProviderIFCLoaderRef
00129 ProviderIFCLoader::createProviderIFCLoader(ServiceEnvironmentIFCRef env)
00130 {
00131 return ProviderIFCLoaderRef(new ProviderIFCLoader(
00132 SharedLibraryLoader::createSharedLibraryLoader(), env));
00133 }
00135 ProviderIFCLoaderBase::~ProviderIFCLoaderBase()
00136 {
00137 }
00139 ProviderIFCLoader::~ProviderIFCLoader()
00140 {
00141 }
00142
00143 }
00144