35 typedef std::map<std::string, CreateFilterCallback>
CallbackMap;
36 typedef std::map<std::string, CreateFilterCallback>::iterator
46 mp::FactoryFilter::NotFound::NotFound(
const std::string message)
47 :
std::runtime_error(message)
51 mp::FactoryFilter::Rep::Rep()
55 mp::FactoryFilter::Rep::~Rep()
70 CreateFilterCallback cfc)
72 return m_p->m_fcm.insert(Rep::CallbackMap::value_type(fi, cfc)).second;
78 return m_p->m_fcm.erase(fi) == 1;
83 Rep::CallbackMap::const_iterator it = m_p->m_fcm.find(fi);
85 if (it == m_p->m_fcm.end())
94 Rep::CallbackMap::const_iterator it = m_p->m_fcm.find(fi);
96 if (it == m_p->m_fcm.end()){
97 std::string msg =
"filter type '" + fi +
"' not found";
101 return (it->second());
105 const std::string &path)
108 if (m_p->m_fcm.find(fi) != m_p->m_fcm.end())
112 std::string full_name =
"metaproxy_1_filter_" + fi;
114 void *dl_handle = dlopen(0, RTLD_GLOBAL|RTLD_NOW);
115 void *dlsym_ptr = dlsym(dl_handle, full_name.c_str());
119 std::string full_path = path +
"/metaproxy_filter_" + fi +
".so";
120 dl_handle = dlopen(full_path.c_str(), RTLD_GLOBAL|RTLD_NOW);
123 const char *dl = dlerror();
124 std::cout <<
"dlopen " << full_path <<
" failed. dlerror=" << dl <<
128 dlsym_ptr = dlsym(dl_handle, full_name.c_str());
132 std::cout <<
"dlsym " << full_name <<
" failed\n";
135 struct metaproxy_1_filter_struct *s = (
struct metaproxy_1_filter_struct *) dlsym_ptr;
136 return add_creator(fi, s->creator);