metaproxy 1.22.1
factory_filter.cpp
Go to the documentation of this file.
1/* This file is part of Metaproxy.
2 Copyright (C) Index Data
3
4Metaproxy is free software; you can redistribute it and/or modify it under
5the terms of the GNU General Public License as published by the Free
6Software Foundation; either version 2, or (at your option) any later
7version.
8
9Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
10WARRANTY; without even the implied warranty of MERCHANTABILITY or
11FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#include "config.hpp"
20
21#include "factory_filter.hpp"
22
23#if HAVE_DLFCN_H
24#include <dlfcn.h>
25#endif
26#include <stdexcept>
27#include <iostream>
28#include <string>
29#include <map>
30
31namespace mp = metaproxy_1;
32
33namespace metaproxy_1 {
35 typedef std::map<std::string, CreateFilterCallback> CallbackMap;
36 typedef std::map<std::string, CreateFilterCallback>::iterator
38 public:
39 friend class FactoryFilter;
41 Rep();
42 ~Rep();
43 };
44}
45
46mp::FactoryFilter::NotFound::NotFound(const std::string message)
47 : std::runtime_error(message)
48{
49}
50
51mp::FactoryFilter::Rep::Rep()
52{
53}
54
55mp::FactoryFilter::Rep::~Rep()
56{
57}
58
59mp::FactoryFilter::FactoryFilter() : m_p(new mp::FactoryFilter::Rep)
60{
61
62}
63
64mp::FactoryFilter::~FactoryFilter()
65{
66
67}
68
69bool mp::FactoryFilter::add_creator(const std::string &fi,
70 CreateFilterCallback cfc)
71{
72 return m_p->m_fcm.insert(Rep::CallbackMap::value_type(fi, cfc)).second;
73}
74
75
76bool mp::FactoryFilter::drop_creator(std::string fi)
77{
78 return m_p->m_fcm.erase(fi) == 1;
79}
80
81bool mp::FactoryFilter::exist(std::string fi)
82{
83 Rep::CallbackMap::const_iterator it = m_p->m_fcm.find(fi);
84
85 if (it == m_p->m_fcm.end())
86 {
87 return false;
88 }
89 return true;
90}
91
92mp::filter::Base* mp::FactoryFilter::create(std::string fi)
93{
94 Rep::CallbackMap::const_iterator it = m_p->m_fcm.find(fi);
95
96 if (it == m_p->m_fcm.end()){
97 std::string msg = "filter type '" + fi + "' not found";
98 throw NotFound(msg);
99 }
100 // call create function
101 return (it->second());
102}
103
104bool mp::FactoryFilter::add_creator_dl(const std::string &fi,
105 const std::string &path)
106{
107#if HAVE_DLFCN_H
108 if (m_p->m_fcm.find(fi) != m_p->m_fcm.end())
109 {
110 return true;
111 }
112 std::string full_name = "metaproxy_1_filter_" + fi;
113
114 void *dl_handle = dlopen(0, RTLD_GLOBAL|RTLD_NOW);
115 void *dlsym_ptr = dlsym(dl_handle, full_name.c_str());
116
117 if (!dlsym_ptr)
118 {
119 std::string full_path = path + "/metaproxy_filter_" + fi + ".so";
120 dl_handle = dlopen(full_path.c_str(), RTLD_GLOBAL|RTLD_NOW);
121 if (!dl_handle)
122 {
123 const char *dl = dlerror();
124 std::cout << "dlopen " << full_path << " failed. dlerror=" << dl <<
125 std::endl;
126 return false;
127 }
128 dlsym_ptr = dlsym(dl_handle, full_name.c_str());
129 }
130 if (!dlsym_ptr)
131 {
132 std::cout << "dlsym " << full_name << " failed\n";
133 return false;
134 }
135 struct metaproxy_1_filter_struct *s = (struct metaproxy_1_filter_struct *) dlsym_ptr;
136 return add_creator(fi, s->creator);
137#else
138 return false;
139#endif
140}
141
142/*
143 * Local variables:
144 * c-basic-offset: 4
145 * c-file-style: "Stroustrup"
146 * indent-tabs-mode: nil
147 * End:
148 * vim: shiftwidth=4 tabstop=8 expandtab
149 */
150
std::map< std::string, CreateFilterCallback >::iterator CallbackMapIt
std::map< std::string, CreateFilterCallback > CallbackMap
boost::scoped_ptr< Rep > m_p