diff options
Diffstat (limited to 'src/components/transport_manager/src')
3 files changed, 67 insertions, 31 deletions
diff --git a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc index 96c4c2c370..7d96c685f1 100644 --- a/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc +++ b/src/components/transport_manager/src/transport_adapter/threaded_socket_connection.cc @@ -62,7 +62,7 @@ ThreadedSocketConnection::ThreadedSocketConnection( , unexpected_disconnect_(false) , device_uid_(device_id) , app_handle_(app_handle) - , thread_(NULL) { + , thread_(nullptr) { const std::string thread_name = std::string("Socket ") + device_handle(); thread_ = threads::CreateThread(thread_name.c_str(), new SocketConnectionDelegate(this)); @@ -70,7 +70,7 @@ ThreadedSocketConnection::ThreadedSocketConnection( ThreadedSocketConnection::~ThreadedSocketConnection() { LOG4CXX_AUTO_TRACE(logger_); - DCHECK(NULL == thread_); + DCHECK(nullptr == thread_); if (-1 != read_fd_) { close(read_fd_); @@ -82,10 +82,12 @@ ThreadedSocketConnection::~ThreadedSocketConnection() { void ThreadedSocketConnection::StopAndJoinThread() { Disconnect(); - thread_->join(); - delete thread_->delegate(); - threads::DeleteThread(thread_); - thread_ = NULL; + if (thread_) { + thread_->join(); + delete thread_->delegate(); + threads::DeleteThread(thread_); + thread_ = nullptr; + } } void ThreadedSocketConnection::Abort() { @@ -167,16 +169,23 @@ TransportAdapter::Error ThreadedSocketConnection::Disconnect() { return Notify(); } +void ThreadedSocketConnection::Terminate() { + LOG4CXX_AUTO_TRACE(logger_); + StopAndJoinThread(); +} + void ThreadedSocketConnection::threadMain() { LOG4CXX_AUTO_TRACE(logger_); - ConnectError* connect_error = NULL; + ConnectError* connect_error = nullptr; if (!Establish(&connect_error)) { LOG4CXX_ERROR(logger_, "Connection Establish failed"); delete connect_error; Abort(); + } else { + LOG4CXX_DEBUG(logger_, "Connection established"); + controller_->ConnectDone(device_handle(), application_handle()); } - LOG4CXX_DEBUG(logger_, "Connection established"); - controller_->ConnectDone(device_handle(), application_handle()); + while (!terminate_flag_) { Transmit(); } diff --git a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc index c35520ff7b..78a9840401 100644 --- a/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc +++ b/src/components/transport_manager/src/transport_adapter/transport_adapter_impl.cc @@ -138,6 +138,12 @@ void TransportAdapterImpl::Terminate() { connections_lock_.AcquireForWriting(); std::swap(connections, connections_); connections_lock_.Release(); + for (const auto& connection : connections) { + auto& info = connection.second; + if (info.connection) { + info.connection->Terminate(); + } + } connections.clear(); LOG4CXX_DEBUG(logger_, "Connections deleted"); diff --git a/src/components/transport_manager/src/transport_manager_default.cc b/src/components/transport_manager/src/transport_manager_default.cc index 71fc41ada9..0d58e24b5c 100644 --- a/src/components/transport_manager/src/transport_manager_default.cc +++ b/src/components/transport_manager/src/transport_manager_default.cc @@ -55,9 +55,39 @@ namespace transport_manager { CREATE_LOGGERPTR_GLOBAL(logger_, "TransportManager") +TransportAdapterFactory::TransportAdapterFactory() { +#ifdef BLUETOOTH_SUPPORT + ta_bluetooth_creator_ = [](resumption::LastState& last_state, + const TransportManagerSettings& settings) { + return new transport_adapter::BluetoothTransportAdapter(last_state, + settings); + }; +#endif + ta_tcp_creator_ = [](const uint16_t port, + resumption::LastState& last_state, + const TransportManagerSettings& settings) { + return new transport_adapter::TcpTransportAdapter( + port, last_state, settings); + }; +#if defined(USB_SUPPORT) + ta_usb_creator_ = [](resumption::LastState& last_state, + const TransportManagerSettings& settings) { + return new transport_adapter::UsbAoaAdapter(last_state, settings); + }; +#endif +#if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) + ta_cloud_creator_ = [](resumption::LastState& last_state, + const TransportManagerSettings& settings) { + return new transport_adapter::CloudWebsocketTransportAdapter(last_state, + settings); + }; +#endif +} + TransportManagerDefault::TransportManagerDefault( - const TransportManagerSettings& settings) - : TransportManagerImpl(settings) {} + const TransportManagerSettings& settings, + const TransportAdapterFactory& ta_factory) + : TransportManagerImpl(settings), ta_factory_(ta_factory) {} int TransportManagerDefault::Init(resumption::LastState& last_state) { LOG4CXX_TRACE(logger_, "enter"); @@ -68,54 +98,45 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { return E_TM_IS_NOT_INITIALIZED; } -#ifdef BLUETOOTH_SUPPORT - transport_adapter::TransportAdapterImpl* ta_bluetooth = - new transport_adapter::BluetoothTransportAdapter(last_state, - get_settings()); + const auto& settings = get_settings(); + +#if defined(BLUETOOTH_SUPPORT) + auto ta_bluetooth = ta_factory_.ta_bluetooth_creator_(last_state, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_bluetooth->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_bluetooth); - ta_bluetooth = NULL; -#endif +#endif // BLUETOOTH_SUPPORT - const uint16_t port = get_settings().transport_manager_tcp_adapter_port(); - transport_adapter::TransportAdapterImpl* ta_tcp = - new transport_adapter::TcpTransportAdapter( - port, last_state, get_settings()); + auto ta_tcp = ta_factory_.ta_tcp_creator_( + settings.transport_manager_tcp_adapter_port(), last_state, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_tcp->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_tcp); - ta_tcp = NULL; #if defined(USB_SUPPORT) - transport_adapter::TransportAdapterImpl* ta_usb = - new transport_adapter::UsbAoaAdapter(last_state, get_settings()); + auto ta_usb = ta_factory_.ta_usb_creator_(last_state, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_usb->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_usb); - ta_usb = NULL; #endif // USB_SUPPORT #if defined(CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT) - transport_adapter::TransportAdapterImpl* ta_cloud = - new transport_adapter::CloudWebsocketTransportAdapter(last_state, - get_settings()); + auto ta_cloud = ta_factory_.ta_cloud_creator_(last_state, settings); #ifdef TELEMETRY_MONITOR if (metric_observer_) { ta_cloud->SetTelemetryObserver(metric_observer_); } #endif // TELEMETRY_MONITOR AddTransportAdapter(ta_cloud); - ta_cloud = NULL; #endif // CLOUD_APP_WEBSOCKET_TRANSPORT_SUPPORT #if defined BUILD_TESTS @@ -123,14 +144,14 @@ int TransportManagerDefault::Init(resumption::LastState& last_state) { transport_adapter::IAP2BluetoothEmulationTransportAdapter* iap2_bt_emu_adapter = new transport_adapter::IAP2BluetoothEmulationTransportAdapter( - iap2_bt_emu_port, last_state, get_settings()); + iap2_bt_emu_port, last_state, settings); AddTransportAdapter(iap2_bt_emu_adapter); const uint16_t iap2_usb_emu_port = 34567; transport_adapter::IAP2USBEmulationTransportAdapter* iap2_usb_emu_adapter = new transport_adapter::IAP2USBEmulationTransportAdapter( - iap2_usb_emu_port, last_state, get_settings()); + iap2_usb_emu_port, last_state, settings); AddTransportAdapter(iap2_usb_emu_adapter); #endif // BUILD_TEST |