/* This file is part of Metaproxy.
- Copyright (C) 2005-2011 Index Data
+ Copyright (C) 2005-2013 Index Data
Metaproxy is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
namespace metaproxy_1 {
class FactoryFilter::Rep {
typedef std::map<std::string, CreateFilterCallback> CallbackMap;
- typedef std::map<std::string, CreateFilterCallback>::iterator
+ typedef std::map<std::string, CreateFilterCallback>::iterator
CallbackMapIt;
public:
friend class FactoryFilter;
}
-bool mp::FactoryFilter::add_creator(std::string fi,
- CreateFilterCallback cfc)
+bool mp::FactoryFilter::add_creator(const std::string &fi,
+ CreateFilterCallback cfc)
{
return m_p->m_fcm.insert(Rep::CallbackMap::value_type(fi, cfc)).second;
}
bool mp::FactoryFilter::exist(std::string fi)
{
Rep::CallbackMap::const_iterator it = m_p->m_fcm.find(fi);
-
+
if (it == m_p->m_fcm.end())
{
return false;
mp::filter::Base* mp::FactoryFilter::create(std::string fi)
{
Rep::CallbackMap::const_iterator it = m_p->m_fcm.find(fi);
-
+
if (it == m_p->m_fcm.end()){
std::string msg = "filter type '" + fi + "' not found";
throw NotFound(msg);
return (it->second());
}
-bool mp::FactoryFilter::have_dl_support()
-{
-#if HAVE_DLFCN_H
- return true;
-#else
- return false;
-#endif
-}
-
bool mp::FactoryFilter::add_creator_dl(const std::string &fi,
const std::string &path)
{
{
return true;
}
+ std::string full_name = "metaproxy_1_filter_" + fi;
- std::string full_path = path + "/metaproxy_filter_" + fi + ".so";
- void *dl_handle = dlopen(full_path.c_str(), RTLD_GLOBAL|RTLD_NOW);
- if (!dl_handle)
+ void *dl_handle = dlopen(0, RTLD_GLOBAL|RTLD_NOW);
+ void *dlsym_ptr = dlsym(dl_handle, full_name.c_str());
+
+ if (!dlsym_ptr)
{
- const char *dl = dlerror();
- std::cout << "dlopen " << full_path << " failed. dlerror=" << dl <<
- std::endl;
- return false;
+ std::string full_path = path + "/metaproxy_filter_" + fi + ".so";
+ dl_handle = dlopen(full_path.c_str(), RTLD_GLOBAL|RTLD_NOW);
+ if (!dl_handle)
+ {
+ const char *dl = dlerror();
+ std::cout << "dlopen " << full_path << " failed. dlerror=" << dl <<
+ std::endl;
+ return false;
+ }
+ dlsym_ptr = dlsym(dl_handle, full_name.c_str());
}
-
- std::string full_name = "metaproxy_1_filter_" + fi;
-
- void *dlsym_ptr = dlsym(dl_handle, full_name.c_str());
if (!dlsym_ptr)
{
std::cout << "dlsym " << full_name << " failed\n";