18 #ifndef SHEVEK_SERVER_HH 19 #define SHEVEK_SERVER_HH 28 sighandler_t ignore_broken_pipes = ::signal (SIGPIPE, SIG_IGN);
95 template <
typename client,
typename serverdata>
99 {
return sigc::mem_fun (who, &client::read); }
113 Glib::RefPtr <shevek::fd>
in;
115 Glib::RefPtr <shevek::fd>
out;
120 ::get_connection_cb_from_friend
121 (dynamic_cast <client *> (
this) ) );
129 Glib::RefPtr <server <client, serverdata> >
get_server () {
return m_server; }
133 friend class server <client, serverdata>;
134 Glib::RefPtr <server <client, serverdata> > m_server;
138 std::list <Glib::RefPtr <client> > m_connections;
139 Glib::RefPtr <socket> m_listener;
142 void l_read (std::string
const &line, Glib::RefPtr <client> conn);
143 void l_connect (Glib::RefPtr <fd>
in, Glib::RefPtr <fd>
out,
146 void l_delayed_disconnect (
typename std::list <Glib::RefPtr <client> >::iterator conn);
147 void l_error (
typename std::list <Glib::RefPtr <client> >::iterator conn);
150 static Glib::RefPtr <server>
create ();
154 void open (std::string
const &port,
bool use_stdio =
true);
156 serverdata &
data () {
return m_data; }
158 serverdata
const &
data ()
const {
return m_data;}
160 iterator
begin () {
return m_connections.begin (); }
162 iterator
end () {
return m_connections.end (); }
173 template <
typename client,
typename serverdata>
178 m_listener->disconnect ();
179 m_listener = Glib::RefPtr <socket> ();
181 while (!m_connections.empty () )
182 m_connections.front ()->disconnect ();
185 template <
typename client,
typename serverdata>
187 Glib::RefPtr <client> conn)
192 template <
typename client,
typename serverdata>
195 Glib::RefPtr <telnet> s = Glib::RefPtr <telnet>::cast_dynamic ( (*conn)->in);
198 m_connections.erase (conn);
201 template <
typename client,
typename serverdata>
204 Glib::RefPtr <telnet> s = Glib::RefPtr <telnet>::cast_dynamic ( (*conn)->in);
212 (*conn)->in->unread ();
213 m_connections.erase (conn);
217 template <
typename client,
typename serverdata>
219 Glib::RefPtr <fd>
out,
222 m_connections.push_back (client::create () );
223 m_connections.back ()->in =
in;
224 m_connections.back ()->out =
out;
225 m_connections.back ()->m_server = refptr_this <server <client, serverdata> > ();
226 m_connections.back ()->m_self = --m_connections.end ();
228 --m_connections.end () ) );
230 --m_connections.end () ) );
231 m_connections.back ()->continue_reading ();
233 --m_connections.end () ) );
234 m_connections.back ()->pickup (is_stdio);
237 template <
typename client,
typename serverdata>
241 m_listener->accept (newfd);
242 l_connect (newfd, newfd,
false);
245 template <
typename client,
typename serverdata>
250 template <
typename client,
typename serverdata>
256 template <
typename client,
typename serverdata>
261 m_listener->disconnect ();
iterator end()
Loop over all current connections.
Definition: server.hh:162
Base class for classes which want reference counting through Glib::RefPtr.
Definition: refbase.hh:27
Glib::RefPtr< shevek::fd > in
The input socket. The client can stop reading from this connection by calling in->unread ()...
Definition: server.hh:113
void shutdown()
Stop running this server, closing all current connections.
Definition: server.hh:174
static Glib::RefPtr< server > create()
Create a new server object.
Definition: server.hh:251
sigc::slot1< void, std::string const & > read_lines_t
Function pointer to call when a complete line has arrived.
Definition: fd.hh:38
void disconnect()
This can be called by the client object to close this connection.
Definition: server.hh:131
static Glib::RefPtr< fd > create(int value=-1, Glib::RefPtr< Glib::MainContext > main=Glib::MainContext::get_default())
Create a new fd.
void continue_reading()
This is called after in->unread (), to resume accepting data from this connection.
Definition: server.hh:117
Glib::RefPtr< shevek::fd > out
The output socket. This is used to send data to the connection.
Definition: server.hh:115
std::list< Glib::RefPtr< client > >::const_iterator const_iterator
Iterator for looping over all current connections.
Definition: server.hh:105
const_iterator begin() const
Loop over all current connections.
Definition: server.hh:164
Base of the client class which is implemented by the calling program.
Definition: server.hh:110
connection()
The client class can construct this object with its create function.
Definition: server.hh:127
~server()
The destructor shuts down the server.
Definition: server.hh:170
const_iterator end() const
Loop over all current connections.
Definition: server.hh:166
static Glib::RefPtr< socket > create(Glib::RefPtr< Glib::MainContext > main=Glib::MainContext::get_default())
Create a new socket.
Glib::RefPtr< server< client, serverdata > > get_server()
Access to the server object which hosts this client.
Definition: server.hh:129
~connection()
Destructor.
Definition: server.hh:124
static Glib::RefPtr< telnet > create(Glib::RefPtr< Glib::MainContext > main=Glib::MainContext::get_default())
Create a new telnet socket.
Set up a network server using shevek::telnet.
Definition: server.hh:96
iterator begin()
Loop over all current connections.
Definition: server.hh:160
std::list< Glib::RefPtr< client > >::iterator iterator
Iterator for looping over all current connections.
Definition: server.hh:102
void open(std::string const &port, bool use_stdio=true)
Open a port and start running.
Definition: server.hh:257
serverdata & data()
Get the corresponding serverdata structure.
Definition: server.hh:156
serverdata const & data() const
Get the corresponding serverdata structure.
Definition: server.hh:158