libt2n: (tomj) RPM/pkgconfig skeleton
[libt2n] / src / server.hxx
1 /***************************************************************************
2  *   Copyright (C) 2006 by Gerd v. Egidy                                   *
3  *   gve@intra2net.com                                                     *
4  *                                                                         *
5  *   This library is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU Lesser General Public License version   *
7  *   2.1 as published by the Free Software Foundation.                     *
8  *                                                                         *
9  *   This library is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU Lesser General Public License for more details.                   *
13  *                                                                         *
14  *   You should have received a copy of the GNU Lesser General Public      *
15  *   License along with this program; if not, write to the                 *
16  *   Free Software Foundation, Inc.,                                       *
17  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18  ***************************************************************************/
19 #ifndef __LIBT2N_SERVER
20 #define __LIBT2N_SERVER
21
22 #include <iostream>
23 #include <string>
24 #include <map>
25
26 namespace libt2n
27 {
28
29 class server;
30
31 /**
32     Basic connection class
33 */
34 class connection
35 {
36     private:
37         int timeout;
38         int last_action_time;
39         bool closed;
40         unsigned int connection_id;
41
42     protected:
43         connection(int _timeout)
44         {
45             set_timeout(_timeout);
46             reset_timeout();
47             closed=false;
48             connection_id=0;
49             my_server=0;
50         }
51
52         server *my_server;
53         std::string buffer;
54
55         typedef unsigned int packet_size_indicator;
56
57     public:
58         ~connection()
59             { this->close(); }
60
61         void check_timeout();
62         void reset_timeout();
63         void set_timeout(int _timeout)
64             { timeout=_timeout; }
65
66         bool is_closed()
67             { return closed; }
68
69         void set_server(server* _my_server)
70             { my_server=_my_server; }
71
72         void set_id(unsigned int _connection_id)
73             { connection_id=_connection_id; }
74         unsigned int get_id()
75             { return connection_id; }
76         std::string get_id_string();
77
78         virtual void close()
79             { closed=true; }
80
81         bool get_packet(std::string& data, unsigned int& conn_id);
82         virtual void write(const std::string& data)=0;
83 };
84
85 /**
86     Basic server class
87 */
88 class server
89 {
90     public:
91         enum log_level_values { none=0, error=1, debug=2 };
92
93     private:
94         int default_timeout;
95         log_level_values log_level;
96         std::ostream *logstream;
97
98         unsigned int next_id;
99
100     protected:
101         std::map<unsigned int, connection*> connections;
102
103         server()
104         {
105             set_default_timeout(30);
106             set_logging(NULL,none);
107             next_id=1;
108         }
109
110         int add_connection(connection* newconn);
111
112     public:
113         virtual ~server();
114
115         void set_default_timeout(int _default_timeout)
116             { default_timeout=_default_timeout; }
117         int get_default_timeout(void)
118             { return default_timeout; }
119
120         void set_logging(std::ostream *_logstream, log_level_values _log_level)
121         {
122             log_level=_log_level;
123             logstream=_logstream;
124         }
125
126         connection* get_connection(unsigned int conn_id);
127
128         virtual void fill_buffer(long long usec_timeout=-1)=0;
129         void check_timeout();
130
131         bool get_packet(std::string& data, unsigned int& conn_id);
132
133         virtual void fill_connection_buffers(void)=0;
134
135         void log(log_level_values level, const std::string& message)
136             { log(level,message.c_str()); }
137         void log(log_level_values level, const char* message);
138 };
139
140 }
141
142 #endif