diff options
Diffstat (limited to 'src/components/connection_handler/src/connection.cc')
-rw-r--r-- | src/components/connection_handler/src/connection.cc | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/src/components/connection_handler/src/connection.cc b/src/components/connection_handler/src/connection.cc index 0b248e5e5..de8c7edb0 100644 --- a/src/components/connection_handler/src/connection.cc +++ b/src/components/connection_handler/src/connection.cc @@ -37,6 +37,7 @@ #include "connection_handler/connection.h" #include "connection_handler/connection_handler.h" #include "protocol_handler/protocol_packet.h" +#include "config_profile/profile.h" #include "utils/logger.h" #include "utils/macro.h" @@ -45,7 +46,6 @@ #include "security_manager/security_manager.h" #endif // ENABLE_SECURITY -#include "utils/threads/thread_manager.h" /** * \namespace connection_handler @@ -79,23 +79,24 @@ Connection::Connection(ConnectionHandle connection_handle, int32_t heartbeat_timeout) : connection_handler_(connection_handler), connection_handle_(connection_handle), - connection_device_handle_(connection_device_handle) { - LOG4CXX_TRACE_ENTER(logger_); + connection_device_handle_(connection_device_handle), + session_map_lock_(true) { + LOG4CXX_AUTO_TRACE(logger_); DCHECK(connection_handler_); heartbeat_monitor_ = new HeartBeatMonitor(heartbeat_timeout, this); heart_beat_monitor_thread_ = threads::CreateThread("HeartBeatMonitor", - heartbeat_monitor_); + heartbeat_monitor_); heart_beat_monitor_thread_->start(); } Connection::~Connection() { - LOG4CXX_TRACE_ENTER(logger_); - heart_beat_monitor_thread_->stop(); + LOG4CXX_AUTO_TRACE(logger_); + heart_beat_monitor_thread_->join(); + delete heartbeat_monitor_; threads::DeleteThread(heart_beat_monitor_thread_); sync_primitives::AutoLock lock(session_map_lock_); session_map_.clear(); - LOG4CXX_TRACE_EXIT(logger_); } // Finds a key not presented in std::map<unsigned char, T> @@ -113,7 +114,7 @@ uint32_t findGap(const std::map<unsigned char, T> &map) { } // namespace uint32_t Connection::AddNewSession() { - LOG4CXX_TRACE_ENTER(logger_); + LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock lock(session_map_lock_); const uint32_t session_id = findGap(session_map_); if (session_id > 0) { @@ -236,7 +237,7 @@ int Connection::SetSSLContext(uint8_t session_id, security_manager::SSLContext *Connection::GetSSLContext( const uint8_t session_id, const protocol_handler::ServiceType &service_type) const { - LOG4CXX_TRACE(logger_, "Connection::GetSSLContext"); + LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock lock(session_map_lock_); SessionMap::const_iterator session_it = session_map_.find(session_id); if (session_it == session_map_.end()) { @@ -260,7 +261,7 @@ security_manager::SSLContext *Connection::GetSSLContext( void Connection::SetProtectionFlag( const uint8_t session_id, const protocol_handler::ServiceType &service_type) { - LOG4CXX_TRACE(logger_, "Connection::SetProtectionFlag"); + LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock lock(session_map_lock_); SessionMap::iterator session_it = session_map_.find(session_id); if (session_it == session_map_.end()) { @@ -312,7 +313,9 @@ void Connection::CloseSession(uint8_t session_id) { size = session_map_.size(); } - connection_handler_->CloseSession(connection_handle_, session_id); + connection_handler_->CloseSession(connection_handle_, + session_id, + connection_handler::kCommon); //Close connection if it is last session if (1 == size) { @@ -333,6 +336,7 @@ void Connection::UpdateProtocolVersionSession( } bool Connection::SupportHeartBeat(uint8_t session_id) { + LOG4CXX_AUTO_TRACE(logger_); sync_primitives::AutoLock lock(session_map_lock_); SessionMap::iterator session_it = session_map_.find(session_id); if (session_map_.end() == session_it) { @@ -340,7 +344,22 @@ bool Connection::SupportHeartBeat(uint8_t session_id) { return false; } Session &session = session_it->second; - return ::protocol_handler::PROTOCOL_VERSION_3 == session.protocol_version; + + return ((::protocol_handler::PROTOCOL_VERSION_3 == session.protocol_version || + ::protocol_handler::PROTOCOL_VERSION_4 == session.protocol_version) && + (profile::Profile::instance()->heart_beat_timeout())); +} + +bool Connection::ProtocolVersion(uint8_t session_id, uint8_t& protocol_version) { + LOG4CXX_AUTO_TRACE(logger_); + sync_primitives::AutoLock lock(session_map_lock_); + SessionMap::iterator session_it = session_map_.find(session_id); + if (session_map_.end() == session_it) { + LOG4CXX_WARN(logger_, "Session not found in this connection!"); + return false; + } + protocol_version = (session_it->second).protocol_version; + return true; } void Connection::StartHeartBeat(uint8_t session_id) { @@ -355,8 +374,8 @@ void Connection::KeepAlive(uint8_t session_id) { heartbeat_monitor_->KeepAlive(session_id); } -void Connection::SetHeartBeatTimeout(int32_t timeout) { - heartbeat_monitor_->set_heartbeat_timeout_seconds(timeout); +void Connection::SetHeartBeatTimeout(int32_t timeout, uint8_t session_id) { + heartbeat_monitor_->set_heartbeat_timeout_seconds(timeout, session_id); } } // namespace connection_handler |