summaryrefslogtreecommitdiff
path: root/src/components/connection_handler/src/connection_handler_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/connection_handler/src/connection_handler_impl.cc')
-rw-r--r--src/components/connection_handler/src/connection_handler_impl.cc167
1 files changed, 70 insertions, 97 deletions
diff --git a/src/components/connection_handler/src/connection_handler_impl.cc b/src/components/connection_handler/src/connection_handler_impl.cc
index 89910df6e7..261a8d232c 100644
--- a/src/components/connection_handler/src/connection_handler_impl.cc
+++ b/src/components/connection_handler/src/connection_handler_impl.cc
@@ -38,18 +38,11 @@
#include "connection_handler/connection_handler_impl.h"
#include "transport_manager/info.h"
-#include "config_profile/profile.h"
#ifdef ENABLE_SECURITY
#include "security_manager/security_manager.h"
#endif // ENABLE_SECURITY
-namespace {
-uint32_t HeartBeatTimeout() {
- return profile::Profile::instance()->heart_beat_timeout();
-}
-} // namespace
-
/**
* \namespace connection_handler
* \brief SmartDeviceLink ConnectionHandler namespace.
@@ -67,12 +60,15 @@ transport_manager::ConnectionUID ConnectionUIDFromHandle(
return transport_manager::ConnectionUID(handle);
}
-ConnectionHandlerImpl::ConnectionHandlerImpl()
- : connection_handler_observer_(NULL),
- transport_manager_(NULL),
- protocol_handler_(NULL),
- connection_handler_observer_lock_(true),
- connection_list_deleter_(&connection_list_) {
+ConnectionHandlerImpl::ConnectionHandlerImpl(
+ const ConnectionHandlerSettings& settings,
+ transport_manager::TransportManager& tm)
+ : settings_(settings)
+ , connection_handler_observer_(NULL)
+ , transport_manager_(tm)
+ , protocol_handler_(NULL)
+ , connection_handler_observer_lock_(true)
+ , connection_list_deleter_(&connection_list_) {
}
ConnectionHandlerImpl::~ConnectionHandlerImpl() {
@@ -99,17 +95,6 @@ void ConnectionHandlerImpl::set_connection_handler_observer(
connection_handler_observer_ = observer;
}
-void ConnectionHandlerImpl::set_transport_manager(
- transport_manager::TransportManager *transport_mngr) {
- LOG4CXX_DEBUG(logger_, "ConnectionHandlerImpl::set_transport_manager() "
- << transport_mngr);
- if (!transport_mngr) {
- LOG4CXX_ERROR(logger_, "Null pointer to TransportManager.");
- return;
- }
- transport_manager_ = transport_mngr;
-}
-
void ConnectionHandlerImpl::set_protocol_handler(
protocol_handler::ProtocolHandler *protocol_handler) {
LOG4CXX_DEBUG(logger_, "ConnectionHandlerImpl::set_protocol_handler()"
@@ -194,7 +179,7 @@ void ConnectionHandlerImpl::OnScanDevicesFailed(
void ConnectionHandlerImpl::OnConnectionEstablished(
const transport_manager::DeviceInfo &device_info,
- const transport_manager::ConnectionUID &connection_id) {
+ const transport_manager::ConnectionUID connection_id) {
LOG4CXX_AUTO_TRACE(logger_);
DeviceMap::iterator it = device_list_.find(device_info.device_handle());
@@ -208,7 +193,7 @@ void ConnectionHandlerImpl::OnConnectionEstablished(
ConnectionList::value_type(
connection_id,
new Connection(connection_id, device_info.device_handle(), this,
- HeartBeatTimeout())));
+ get_settings().heart_beat_timeout())));
}
void ConnectionHandlerImpl::OnConnectionFailed(
@@ -262,39 +247,28 @@ void ConnectionHandlerImpl::RemoveConnection(
}
#ifdef ENABLE_SECURITY
-namespace {
-bool AllowProtection(const protocol_handler::ServiceType &service_type,
- const bool is_protected) {
- if (is_protected) {
- // Check deliver-specific services (which shall not be protected)
- const std::list<int> force_unprotected_list =
- profile::Profile::instance()->ReadIntContainer(
- "Security Manager", "ForceUnprotectedService", NULL);
- if (std::find(force_unprotected_list.begin(), force_unprotected_list.end(), service_type) !=
- force_unprotected_list.end()) {
- LOG4CXX_ERROR(logger_, "Service " << static_cast<int>(service_type)
- << " is forbidden to be protected");
- return false;
- }
- } else {
- // Check deliver-specific services (which shall be protected)
- const std::list<int> force_protected_list =
- profile::Profile::instance()->ReadIntContainer(
- "Security Manager", "ForceProtectedService", NULL);
- if (std::find(force_protected_list.begin(), force_protected_list.end(), service_type) !=
- force_protected_list.end()) {
- LOG4CXX_ERROR(logger_, "Service " << static_cast<int>(service_type)
- << " shall be protected");
- return false;
- }
+bool AllowProtection(const ConnectionHandlerSettings& settings,
+ const protocol_handler::ServiceType& service_type,
+ const bool is_protected) {
+ const std::vector<int>& force_unprotected_list =
+ is_protected ? settings.force_unprotected_service()
+ : settings.force_protected_service();
+
+ if (std::find(force_unprotected_list.begin(), force_unprotected_list.end(), service_type) !=
+ force_unprotected_list.end()) {
+ LOG4CXX_ERROR(logger_,
+ "Service " << static_cast<int>(service_type)
+ << " shall be protected");
+ return false;
}
+ LOG4CXX_DEBUG(logger_,
+ "Service " << static_cast<int>(service_type) << " allowed");
return true;
}
-} // namespace
#endif // ENABLE_SECURITY
uint32_t ConnectionHandlerImpl::OnSessionStartedCallback(
- const transport_manager::ConnectionUID &connection_handle,
+ const transport_manager::ConnectionUID connection_handle,
const uint8_t session_id, const protocol_handler::ServiceType &service_type,
const bool is_protected, uint32_t* hash_id) {
LOG4CXX_AUTO_TRACE(logger_);
@@ -303,7 +277,7 @@ uint32_t ConnectionHandlerImpl::OnSessionStartedCallback(
*hash_id = protocol_handler::HASH_ID_WRONG;
}
#ifdef ENABLE_SECURITY
- if (!AllowProtection(service_type, is_protected)) {
+ if (!AllowProtection(get_settings(), service_type, is_protected)) {
return 0;
}
#endif // ENABLE_SECURITY
@@ -389,7 +363,8 @@ void ConnectionHandlerImpl::OnMalformedMessageCallback(
}
uint32_t ConnectionHandlerImpl::OnSessionEndedCallback(
- const uint32_t &connection_handle, const uint8_t session_id,
+ const transport_manager::ConnectionUID connection_handle,
+ const uint8_t session_id,
const uint32_t &hashCode,
const protocol_handler::ServiceType &service_type) {
LOG4CXX_AUTO_TRACE(logger_);
@@ -442,7 +417,8 @@ uint32_t ConnectionHandlerImpl::OnSessionEndedCallback(
}
uint32_t ConnectionHandlerImpl::KeyFromPair(
- transport_manager::ConnectionUID connection_handle, uint8_t session_id) {
+ transport_manager::ConnectionUID connection_handle,
+ uint8_t session_id) const {
const uint32_t key = connection_handle | (session_id << 16);
LOG4CXX_DEBUG(logger_, "Key for ConnectionHandle:"
<< static_cast<uint32_t>(connection_handle)
@@ -456,8 +432,8 @@ uint32_t ConnectionHandlerImpl::KeyFromPair(
}
void ConnectionHandlerImpl::PairFromKey(uint32_t key,
- uint32_t *connection_handle,
- uint8_t *session_id) {
+ transport_manager::ConnectionUID *connection_handle,
+ uint8_t *session_id) const {
*connection_handle = key & 0xFF00FFFF;
*session_id = key >> 16;
LOG4CXX_DEBUG(logger_, "ConnectionHandle:"
@@ -468,7 +444,7 @@ void ConnectionHandlerImpl::PairFromKey(uint32_t key,
int32_t ConnectionHandlerImpl::GetDataOnSessionKey(
uint32_t key, uint32_t* app_id, std::list<int32_t>* sessions_list,
- uint32_t* device_id) {
+ uint32_t* device_id) const {
LOG4CXX_AUTO_TRACE(logger_);
const int32_t error_result = -1;
@@ -476,7 +452,7 @@ int32_t ConnectionHandlerImpl::GetDataOnSessionKey(
uint8_t session_id = 0;
PairFromKey(key, &conn_handle, &session_id);
- ConnectionList::iterator it = connection_list_.find(conn_handle);
+ ConnectionList::const_iterator it = connection_list_.find(conn_handle);
if (connection_list_.end() == it) {
LOG4CXX_ERROR(logger_, "Connection not found for key: " << key);
return error_result;
@@ -512,6 +488,20 @@ int32_t ConnectionHandlerImpl::GetDataOnSessionKey(
return 0;
}
+const ConnectionHandlerSettings& ConnectionHandlerImpl::get_settings() const
+{
+ return settings_;
+}
+
+const protocol_handler::SessionObserver&
+ConnectionHandlerImpl::get_session_observer() {
+ return *this;
+}
+
+DevicesDiscoveryStarter& ConnectionHandlerImpl::get_device_discovery_starter() {
+ return *this;
+}
+
struct CompareMAC {
explicit CompareMAC(const std::string &mac) : mac_(mac) {}
bool operator() (const DeviceMap::value_type &device) {
@@ -539,11 +529,11 @@ int32_t ConnectionHandlerImpl::GetDataOnDeviceID(
DeviceHandle device_handle,
std::string *device_name,
std::list<uint32_t> *applications_list, std::string *mac_address,
- std::string* connection_type ) {
+ std::string* connection_type ) const {
LOG4CXX_AUTO_TRACE(logger_);
int32_t result = -1;
- DeviceMap::iterator it = device_list_.find(device_handle);
+ DeviceMap::const_iterator it = device_list_.find(device_handle);
if (device_list_.end() == it) {
LOG4CXX_ERROR(logger_, "Device not found!");
return result;
@@ -558,13 +548,13 @@ int32_t ConnectionHandlerImpl::GetDataOnDeviceID(
if (applications_list) {
applications_list->clear();
sync_primitives::AutoReadLock connection_list_lock(connection_list_lock_);
- for (ConnectionList::iterator itr = connection_list_.begin();
+ for (ConnectionList::const_iterator itr = connection_list_.begin();
itr != connection_list_.end(); ++itr) {
if (device_handle == (*itr).second->connection_device_handle()) {
const SessionMap &session_map = (itr->second)->session_map();
for (SessionMap::const_iterator session_it = session_map.begin();
session_map.end() != session_it; ++session_it) {
- const transport_manager::ConnectionUID &connection_handle = itr->first;
+ const transport_manager::ConnectionUID connection_handle = itr->first;
const uint32_t session_id = session_it->first;
const uint32_t application_id = KeyFromPair(connection_handle, session_id);
applications_list->push_back(application_id);
@@ -654,11 +644,7 @@ ConnectionHandlerImpl::GetHandshakeContext(uint32_t key) const {
void ConnectionHandlerImpl::StartDevicesDiscovery() {
LOG4CXX_AUTO_TRACE(logger_);
- if (NULL == transport_manager_) {
- LOG4CXX_ERROR(logger_, "Null pointer to TransportManager.");
- return;
- }
- transport_manager_->SearchDevices();
+ transport_manager_.SearchDevices();
sync_primitives::AutoLock lock(connection_handler_observer_lock_);
if (connection_handler_observer_) {
connection_handler_observer_->OnDeviceListUpdated(device_list_);
@@ -672,17 +658,13 @@ void ConnectionHandlerImpl::ConnectToDevice(
if (device_list_.end() != it_in) {
LOG4CXX_INFO(logger_,
"Connecting to device with handle " << device_handle);
- if (transport_manager_) {
- if (transport_manager::E_SUCCESS
- != transport_manager_->ConnectDevice(device_handle)) {
- LOG4CXX_WARN(logger_, "Can't connect to device");
- }
+ if (transport_manager::E_SUCCESS
+ != transport_manager_.ConnectDevice(device_handle)) {
+ LOG4CXX_WARN(logger_, "Can't connect to device");
} else {
- LOG4CXX_ERROR(logger_, "Null pointer to TransportManager.");
+ LOG4CXX_ERROR(
+ logger_, "Application Manager wanted to connect to non-existing device");
}
- } else {
- LOG4CXX_ERROR(
- logger_, "Application Manager wanted to connect to non-existing device");
}
}
@@ -695,12 +677,7 @@ void ConnectionHandlerImpl::ConnectToAllDevices() {
void ConnectionHandlerImpl::StartTransportManager() {
LOG4CXX_AUTO_TRACE(logger_);
- if (NULL == transport_manager_) {
- LOG4CXX_ERROR(logger_, "Null pointer to TransportManager.");
- return;
- }
-
- transport_manager_->Visibility(true);
+ transport_manager_.Visibility(true);
}
void ConnectionHandlerImpl::CloseRevokedConnection(uint32_t connection_key) {
@@ -716,13 +693,9 @@ void ConnectionHandlerImpl::CloseRevokedConnection(uint32_t connection_key) {
void ConnectionHandlerImpl::CloseConnection(
ConnectionHandle connection_handle) {
LOG4CXX_AUTO_TRACE(logger_);
- if (!transport_manager_) {
- LOG4CXX_ERROR(logger_, "Null pointer to TransportManager.");
- return;
- }
transport_manager::ConnectionUID connection_uid =
ConnectionUIDFromHandle(connection_handle);
- transport_manager_->DisconnectForce(connection_uid);
+ transport_manager_.DisconnectForce(connection_uid);
sync_primitives::AutoWriteLock connection_list_lock(connection_list_lock_);
@@ -910,7 +883,7 @@ void ConnectionHandlerImpl::KeepConnectionAlive(uint32_t connection_key,
}
void ConnectionHandlerImpl::OnConnectionEnded(
- const transport_manager::ConnectionUID &connection_id) {
+ const transport_manager::ConnectionUID connection_id) {
LOG4CXX_INFO(logger_, "Delete Connection: " << static_cast<int32_t>(connection_id)
<< " from the list.");
connection_list_lock_.AcquireForWriting();
@@ -955,11 +928,12 @@ void ConnectionHandlerImpl::BindProtocolVersionWithSession(
}
bool ConnectionHandlerImpl::IsHeartBeatSupported(
- transport_manager::ConnectionUID connection_handle,uint8_t session_id) {
+ transport_manager::ConnectionUID connection_handle,
+ uint8_t session_id) const {
LOG4CXX_AUTO_TRACE(logger_);
sync_primitives::AutoReadLock lock(connection_list_lock_);
uint32_t connection = static_cast<uint32_t>(connection_handle);
- ConnectionList::iterator it = connection_list_.find(connection);
+ ConnectionList::const_iterator it = connection_list_.find(connection);
if (connection_list_.end() == it) {
LOG4CXX_WARN(logger_, "Connection not found !");
return false;
@@ -968,10 +942,10 @@ bool ConnectionHandlerImpl::IsHeartBeatSupported(
}
bool ConnectionHandlerImpl::ProtocolVersionUsed(uint32_t connection_id,
- uint8_t session_id, uint8_t& protocol_version) {
+ uint8_t session_id, uint8_t& protocol_version) const {
LOG4CXX_AUTO_TRACE(logger_);
sync_primitives::AutoReadLock lock(connection_list_lock_);
- ConnectionList::iterator it = connection_list_.find(connection_id);
+ ConnectionList::const_iterator it = connection_list_.find(connection_id);
if (connection_list_.end() != it) {
return it->second->ProtocolVersion(session_id, protocol_version);
}
@@ -988,9 +962,8 @@ const DeviceMap& ConnectionHandlerImpl::getDeviceList() {
return device_list_;
}
-void ConnectionHandlerImpl::addDeviceConnection(
- const transport_manager::DeviceInfo &device_info,
- const transport_manager::ConnectionUID &connection_id) {
+void ConnectionHandlerImpl::addDeviceConnection(const transport_manager::DeviceInfo &device_info,
+ const transport_manager::ConnectionUID connection_id) {
// Add Device
OnDeviceAdded(device_info);
// Add connection