started docu
[libt2n] / src / client.cpp
index 9c6e05b..8c40bc1 100644 (file)
@@ -25,16 +25,59 @@ namespace libt2n
 {
 
 client_connection::client_connection()
-    : 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
+*/
+void client_connection::add_callback(callback_event_type event, const boost::function<void ()>& func)
+{
+    callbacks[event].push_back(func);
+}
+
+/**
+    @example callback use boost::bind to bind to member functions and parameters like this:
+        int 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));
+*/
+
+
+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 && level >= log_level)
+    if (logstream && log_level >= level)
         return logstream;
+    else
+        return NULL;
 }
 
 /// activate logging to the given stream. everything above the given level is logged.