8 #include <boost/thread/mutex.hpp>
18 ///sends Package off to next Filter, returns altered Package
19 virtual Package & process(Package & package) const {
22 virtual void configure(){};
24 /// get function - right val in assignment
25 std::string name() const {
29 /// set function - left val in assignment
30 std::string & name() {
34 /// set function - can be chained
35 Filter & name(const std::string & name){
45 class FilterException : public std::runtime_error {
47 FilterException(const std::string message)
48 : std::runtime_error("FilterException: " + message){
53 class RouterException : public std::runtime_error {
55 RouterException(const std::string message)
56 : std::runtime_error("RouterException: " + message){};
65 /// determines next Filter to use from current Filter and Package
66 virtual const Filter *move(const Filter *filter,
67 const Package *package) const {
71 /// re-read configuration of routing tables
72 virtual void configure(){};
74 /// add routing rule expressed as Filter to Router
75 virtual Router & rule(const Filter &filter){
79 /// disabled because class is singleton
80 Router(const Router &);
82 /// disabled because class is singleton
83 Router& operator=(const Router &);
87 class RouterChain : public Router {
90 virtual ~RouterChain(){};
91 virtual const Filter *move(const Filter *filter,
92 const Package *package) const {
93 std::list<const Filter *>::const_iterator it;
94 it = m_filter_list.begin();
97 for (; it != m_filter_list.end(); it++)
104 if (it == m_filter_list.end())
106 //throw RouterException("no routing rules known");
111 virtual void configure(){};
112 RouterChain & rule(const Filter &filter){
113 m_filter_list.push_back(&filter);
117 std::list<const Filter *> m_filter_list;
119 /// disabled because class is singleton
120 RouterChain(const RouterChain &);
122 /// disabled because class is singleton
123 RouterChain& operator=(const RouterChain &);
127 class PackageException : public std::runtime_error {
129 PackageException(const std::string message)
130 : std::runtime_error("PackageException: " + message){
138 Package(unsigned long int id = 0, bool close = 0)
139 : m_session_id(id), m_session_close(close),
140 m_filter(0), m_router(0), m_data(0) {}
142 /// send Package to it's next Filter defined in Router
144 m_filter = m_router->move(m_filter, this);
146 return m_filter->process(*this);
152 /// get function - right val in assignment
153 unsigned int session_id() const {
157 /// get function - right val in assignment
158 unsigned int session_close() const {
159 return m_session_close;
163 /// get function - right val in assignment
164 unsigned int data() const {
168 /// set function - left val in assignment
169 unsigned int & data() {
173 /// set function - can be chained
174 Package & data(const unsigned int & data){
180 //Router router() const {
184 //Router & router() {
188 /// set function - can be chained
189 Package & router(const Router &router){
197 unsigned long int m_session_id;
198 bool m_session_close;
199 const Filter *m_filter;
200 const Router *m_router;
208 Session() : m_id(0){};
209 /// returns next id, global state of id protected by boost::mutex
210 long unsigned int id() {
211 boost::mutex::scoped_lock scoped_lock(m_mutex);
216 /// disabled because class is singleton
217 Session(const Session &);
219 /// disabled because class is singleton
220 Session& operator=(const Session &);
222 boost::mutex m_mutex;
223 unsigned long int m_id;
235 * indent-tabs-mode: nil
237 * vim: shiftwidth=4 tabstop=8 expandtab