design.h split up into filter.hpp package.hpp router.hpp session.hpp
[metaproxy-moved-to-github.git] / src / router.hpp
1
2 #ifndef ROUTER_HPP
3 #define ROUTER_HPP
4
5 #include <stdexcept>
6 #include <list>
7
8 namespace yp2 {
9
10     class Package;
11     
12     class Filter; 
13     class RouterException : public std::runtime_error {
14     public:
15         RouterException(const std::string message)
16             : std::runtime_error("RouterException: " + message){};
17     };
18   
19     
20     class Router {
21     public:
22         Router(){};
23         virtual ~Router(){};
24
25         /// determines next Filter to use from current Filter and Package
26         virtual const Filter *move(const Filter *filter,
27                                    const Package *package) const {
28             return 0;
29         };
30
31         /// re-read configuration of routing tables
32         virtual void configure(){};
33
34         /// add routing rule expressed as Filter to Router
35         virtual Router & rule(const Filter &filter){
36             return *this;
37         }
38     private:
39         /// disabled because class is singleton
40         Router(const Router &);
41
42         /// disabled because class is singleton
43         Router& operator=(const Router &);
44     };
45   
46     
47     class RouterChain : public Router {
48     public:
49         RouterChain(){};
50         virtual ~RouterChain(){};
51         virtual const Filter *move(const Filter *filter,
52                                    const Package *package) const {
53             std::list<const Filter *>::const_iterator it;
54             it = m_filter_list.begin();
55             if (filter)
56                 {
57                     for (; it != m_filter_list.end(); it++)
58                         if (*it == filter)
59                             {
60                                 it++;
61                                 break;
62                             }
63                 }
64             if (it == m_filter_list.end())
65                 {
66                     //throw RouterException("no routing rules known");
67                     return 0;
68                 }
69             return *it;
70         };
71         virtual void configure(){};
72         RouterChain & rule(const Filter &filter){
73             m_filter_list.push_back(&filter);
74             return *this;
75         }
76     protected:
77         std::list<const Filter *> m_filter_list;
78     private:
79         /// disabled because class is singleton
80         RouterChain(const RouterChain &);
81
82         /// disabled because class is singleton
83         RouterChain& operator=(const RouterChain &);
84     };
85   
86
87   
88 }
89
90 #endif
91 /*
92  * Local variables:
93  * c-basic-offset: 4
94  * indent-tabs-mode: nil
95  * End:
96  * vim: shiftwidth=4 tabstop=8 expandtab
97  */