#include <sstream>
#include <stdexcept>
+#include <time.h>
#include <boost/bind.hpp>
{
server_connection::server_connection(int _timeout)
- : connection(), callbacks(__events_end)
+ : connection_id(0)
+ , my_server(NULL)
+ , connection()
{
set_timeout(_timeout);
reset_timeout();
- connection_id=0;
- my_server=0;
}
+/**
+ * Destructor
+ */
server_connection::~server_connection()
{
- // we want the connection_closed callbacks to be called before
- close();
-
- do_callbacks(connection_deleted);
-}
-
-void server_connection::close()
-{
- if (!is_closed())
- {
- connection::close();
- do_callbacks(connection_closed);
- }
}
/// get pointer to logging stream, returns NULL if no logging needed
last_action_time=time(NULL);
}
-/** @brief add a callback
+/** @brief add a callback to one connection
@param event event the function will be called at
- @param func functor (see boost function) that will be called
-
- @note use boost::bind to bind to member functions and parameters like this:
- 17 is a fixed parameter that is always added to the call
- c.add_callback(connection_closed,bind(&my_class::func_to_call_back, boost::ref(*this), 17));
+ @param func functor (see boost::function) that will be called
*/
void server_connection::add_callback(callback_event_type event, const boost::function<void ()>& func)
{
if (event == new_connection)
throw std::logic_error("new_connection callback not allowed for server_connections");
- callbacks[event].push_back(func);
-}
-
-void server_connection::do_callbacks(callback_event_type event)
-{
- std::list<boost::function<void ()> >::iterator i,ie=callbacks[event].end();
- for (i=callbacks[event].begin(); i != ie; i++)
- (*i)();
+ connection::add_callback(event,func);
}
server::server()
std::map<unsigned int, server_connection*>::iterator ie=connections.end();
for(std::map<unsigned int, server_connection*>::iterator i=connections.begin(); i != ie; i++)
delete i->second;
+
+ connections.clear();
+}
+
+/**
+ * Close all open connections
+ */
+void server::close()
+{
+ std::map<unsigned int, server_connection*>::iterator ie=connections.end();
+ for(std::map<unsigned int, server_connection*>::iterator i=connections.begin(); i != ie; ++i)
+ i->second->close();
}
/** @brief add a callback
@param event event the function will be called at
- @param func functor (see boost function) that will be called
+ @param func functor (see boost::function) that will be called
@note use boost::bind to bind to member functions like this:
- s.add_callback(new_connection,bind(&my_class::func_to_call_back, boost::ref(*this), _1));
+ s.add_callback(new_connection,boost::bind(&my_class::func_to_call_back, boost::ref(*this), _1));
*/
void server::add_callback(callback_event_type event, const boost::function<void (unsigned int)>& func)
{
{
std::map<unsigned int, server_connection*>::iterator ie=connections.end();
for(std::map<unsigned int, server_connection*>::iterator i=connections.begin(); i != ie; i++)
- i->second->add_callback(event,bind(func, i->first));
+ i->second->add_callback(event,boost::bind(func, i->first));
}
}
+
+/** @brief an event occured, call all server-side callbacks
+
+ @param event event that occured
+ @param conn_id connection-id parameter that will be given to the callback-function
+*/
void server::do_callbacks(callback_event_type event, unsigned int conn_id)
{
std::list<boost::function<void (unsigned int)> >::iterator i,ie=callbacks[event].end();
(*i)(conn_id);
}
-int server::add_connection(server_connection* newconn)
+/// add a new connection to the server
+unsigned int server::add_connection(server_connection* newconn)
{
unsigned int cid=next_id++;
newconn->set_id(cid);
newconn->set_server(this);
connections[cid]=newconn;
- // add all callbacks
+ // add all callbacks except new_connection
for(int e=connection_closed; e != __events_end; e++)
{
std::list<boost::function<void (unsigned int)> >::iterator i,ie=callbacks[e].end();