summaryrefslogtreecommitdiff
path: root/src/components/connection_handler/src/connection.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/connection_handler/src/connection.cc')
-rw-r--r--src/components/connection_handler/src/connection.cc47
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