X-Git-Url: http://developer.intra2net.com/git/?p=libt2n;a=blobdiff_plain;f=src%2Fconnection.cpp;h=b4cf198abc9fe514af6bb06c831b1c934b47a8a9;hp=d339f9f21b85ea38db0cf05358bbd9486b130d05;hb=a64066eb0e456c92c4c06959616443e531d4b39d;hpb=0ea6d528901a0eeb0fce1c2a71ae69c277798142 diff --git a/src/connection.cpp b/src/connection.cpp index d339f9f..b4cf198 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -28,6 +28,23 @@ namespace libt2n { +connection::~connection() +{ + // we want the connection_closed callbacks to be called before + close(); + + do_callbacks(connection_deleted); +} + +void connection::close() +{ + if (!is_closed()) + { + closed=true; + do_callbacks(connection_closed); + } +} + connection::packet_size_indicator connection::bytes_available() { // no size information -> no packet @@ -97,4 +114,45 @@ void connection::write(const std::string& data) real_write(send_data); } +/** @brief 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: + 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 connection::add_callback(callback_event_type event, const boost::function& func) +{ + if (event == new_connection) + throw std::logic_error("new_connection callback not allowed for server_connections"); + + callbacks[event].push_back(func); +} + +/** @brief an event has occured, execute the callbacks that are registered for this event + + @param event event type that has occured +*/ +void connection::do_callbacks(callback_event_type event) +{ + std::list >::iterator i,ie=callbacks[event].end(); + for (i=callbacks[event].begin(); i != ie; i++) + (*i)(); +} + +/** @brief get the callbacks in place for one event + + @param event event the callbacks should be registered for + @return std::list of functors (boost::function) with the callbacks + + @note if you want to get the callbacks for all events, loop from 0 to __events_end +*/ +std::list > connection::get_callback_list(callback_event_type event) +{ + return callbacks[event]; +} + + }