namespace libt2n
{
+client_connection::client_connection()
+ : connection(), callbacks(__events_end)
+{
+ set_logging(NULL,none);
+}
+
+client_connection::~client_connection()
+{
+ // we want the connection_closed callbacks to be called before
+ close();
+
+ do_callbacks(connection_deleted);
+}
+
+void client_connection::close()
+{
+ if (!is_closed())
+ {
+ connection::close();
+ do_callbacks(connection_closed);
+ }
+}
+
+/// add a callback
+/**
+ @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:
+ @verbatim
+ // in this example 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));
+ @endverbatim
+*/
+void client_connection::add_callback(callback_event_type event, const boost::function<void ()>& func)
+{
+ callbacks[event].push_back(func);
+}
+
+
+
+void client_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)();
+}
+
+/// get pointer to logging stream, returns NULL if no logging needed
+std::ostream* client_connection::get_logstream(log_level_values level)
+{
+ if (logstream && log_level >= level)
+ return logstream;
+ else
+ return NULL;
+}
+
+/// activate logging to the given stream. everything above the given level is logged.
+void client_connection::set_logging(std::ostream *_logstream, log_level_values _log_level)
+{
+ log_level=_log_level;
+ logstream=_logstream;
+}
};