diff options
Diffstat (limited to 'src/components/transport_manager/include/transport_manager/transport_manager_impl.h')
-rw-r--r-- | src/components/transport_manager/include/transport_manager/transport_manager_impl.h | 156 |
1 files changed, 96 insertions, 60 deletions
diff --git a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h index 4c38716f3f..289df3535d 100644 --- a/src/components/transport_manager/include/transport_manager/transport_manager_impl.h +++ b/src/components/transport_manager/include/transport_manager/transport_manager_impl.h @@ -36,28 +36,46 @@ #include <queue> #include <map> #include <list> +#include <vector> +#include <utility> #include <algorithm> -#include "utils/timer_thread.h" +#include "utils/timer.h" +#include "utils/timer_task_impl.h" +#include "utils/rwlock.h" #include "transport_manager/transport_manager.h" #include "transport_manager/transport_manager_listener.h" #include "transport_manager/transport_adapter/transport_adapter_listener_impl.h" #include "protocol/common.h" -#ifdef TIME_TESTER -#include "transport_manager/time_metric_observer.h" -#endif // TIME_TESTER +#ifdef TELEMETRY_MONITOR +#include "transport_manager/telemetry_observer.h" +#include "telemetry_monitor/telemetry_observable.h" +#endif // TELEMETRY_MONITOR #include "utils/threads/message_loop_thread.h" #include "transport_manager/transport_adapter/transport_adapter_event.h" +#include "transport_manager/transport_manager_settings.h" namespace transport_manager { +typedef threads::MessageLoopThread<std::queue<protocol_handler::RawMessagePtr> > + RawMessageLoopThread; +typedef threads::MessageLoopThread<std::queue<TransportAdapterEvent> > + TransportAdapterEventLoopThread; +typedef utils::SharedPtr<timer::Timer> TimerSPtr; + /** * @brief Implementation of transport manager.s */ -class TransportManagerImpl : public TransportManager, - public threads::MessageLoopThread<std::queue<protocol_handler::RawMessagePtr> >::Handler, - public threads::MessageLoopThread<std::queue<TransportAdapterEvent> >::Handler { +class TransportManagerImpl + : public TransportManager, + public RawMessageLoopThread::Handler, + public TransportAdapterEventLoopThread::Handler +#ifdef TELEMETRY_MONITOR + , + public telemetry_monitor::TelemetryObservable<TMTelemetryObserver> +#endif // TELEMETRY_MONITOR + { public: struct Connection { ConnectionUID id; @@ -69,24 +87,29 @@ class TransportManagerImpl : public TransportManager, /** * @brief Structure that contains internal connection parameters */ - struct ConnectionInternal: public Connection { + struct ConnectionInternal : public Connection { TransportManagerImpl* transport_manager; TransportAdapter* transport_adapter; - typedef timer::TimerThread<ConnectionInternal> TimerInternal; - typedef utils::SharedPtr<TimerInternal> TimerInternalSharedPointer; - TimerInternalSharedPointer timer; - bool shutDown; + TimerSPtr timer; + bool shutdown_; DeviceHandle device_handle_; int messages_count; ConnectionInternal(TransportManagerImpl* transport_manager, TransportAdapter* transport_adapter, - const ConnectionUID& id, const DeviceUID& dev_id, + const ConnectionUID id, + const DeviceUID& dev_id, const ApplicationHandle& app_id, - const DeviceHandle& device_handle); + const DeviceHandle device_handle); + void DisconnectFailedRoutine(); }; + public: + /** + * @brief Constructor. + **/ + explicit TransportManagerImpl(const TransportManagerSettings& settings); /** * @brief Destructor. @@ -98,20 +121,20 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. */ - virtual int Init(); + int Init(resumption::LastState& last_state) OVERRIDE; /** * Reinitializes transport manager * @return Error code */ - virtual int Reinit(); + virtual int Reinit() OVERRIDE; /** * @brief Start scanning for new devices. * * @return Code error. **/ - virtual int SearchDevices(); + int SearchDevices() OVERRIDE; /** * @brief Connect to all applications discovered on device. @@ -120,7 +143,7 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int ConnectDevice(const DeviceHandle& device_id); + int ConnectDevice(const DeviceHandle device_id) OVERRIDE; /** * @brief Disconnect from all applications connected on device. @@ -129,7 +152,7 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int DisconnectDevice(const DeviceHandle& device_id); + int DisconnectDevice(const DeviceHandle device_id) OVERRIDE; /** * @brief Disconnect from applications connected on device by connection @@ -139,14 +162,14 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int Disconnect(const ConnectionUID& connection_id); + int Disconnect(const ConnectionUID connection_id) OVERRIDE; /** * @brief Disconnect and clear all unreceived data. * * @param connection Connection unique identifier. */ - virtual int DisconnectForce(const ConnectionUID& connection_id); + int DisconnectForce(const ConnectionUID connection_id) OVERRIDE; /** * @brief Post new message in queue for massages destined to device. * @@ -154,7 +177,8 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int SendMessageToDevice(const protocol_handler::RawMessagePtr message); + int SendMessageToDevice( + const protocol_handler::RawMessagePtr message) OVERRIDE; /** * @brief Post event in the event queue. @@ -163,7 +187,7 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int ReceiveEventFromDevice(const TransportAdapterEvent& event); + int ReceiveEventFromDevice(const TransportAdapterEvent& event) OVERRIDE; /** * @brief Post listener to the container of transport manager listeners. @@ -172,9 +196,9 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int AddEventListener(TransportManagerListener* listener); + int AddEventListener(TransportManagerListener* listener) OVERRIDE; - virtual int Stop(); + int Stop() OVERRIDE; /** * @brief Add device adapter to the container of device adapters. @@ -183,8 +207,8 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int AddTransportAdapter( - transport_adapter::TransportAdapter* transport_adapter); + int AddTransportAdapter( + transport_adapter::TransportAdapter* transport_adapter) OVERRIDE; /** * @brief Remove device from the container that hold devices. @@ -193,7 +217,7 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. **/ - virtual int RemoveDevice(const DeviceHandle& device); + int RemoveDevice(const DeviceHandle device) OVERRIDE; /** * @brief Turns on or off visibility of SDL to mobile devices @@ -202,7 +226,7 @@ class TransportManagerImpl : public TransportManager, * * @return Code error. */ - virtual int Visibility(const bool& on_off) const; + int Visibility(const bool& on_off) const OVERRIDE; /** * @brief Updates total device list with info from specific transport adapter. @@ -210,28 +234,29 @@ class TransportManagerImpl : public TransportManager, */ void UpdateDeviceList(TransportAdapter* ta); -#ifdef TIME_TESTER +#ifdef TELEMETRY_MONITOR /** * @brief Setup observer for time metric. * * @param observer - pointer to observer */ - void SetTimeMetricObserver(TMMetricObserver* observer); -#endif // TIME_TESTER - + void SetTelemetryObserver(TMTelemetryObserver* observer); +#endif // TELEMETRY_MONITOR /** * @brief Constructor. **/ TransportManagerImpl(); - protected: + const TransportManagerSettings& get_settings() const; + protected: template <class Proc, class... Args> void RaiseEvent(Proc proc, Args... args) { for (TransportManagerListenerList::iterator it = transport_manager_listener_.begin(); - it != transport_manager_listener_.end(); ++it) { + it != transport_manager_listener_.end(); + ++it) { ((*it)->*proc)(args...); } } @@ -264,9 +289,9 @@ class TransportManagerImpl : public TransportManager, */ bool is_initialized_; -#ifdef TIME_TESTER - TMMetricObserver* metric_observer_; -#endif // TIME_TESTER +#ifdef TELEMETRY_MONITOR + TMTelemetryObserver* metric_observer_; +#endif // TELEMETRY_MONITOR private: /** @@ -282,19 +307,24 @@ class TransportManagerImpl : public TransportManager, } DeviceHandle UidToHandle(const DeviceUID& dev_uid, bool& is_new) { - ConversionTable::iterator it = std::find( - conversion_table_.begin(), conversion_table_.end(), dev_uid); - if (it != conversion_table_.end()) { - is_new = false; - return std::distance(conversion_table_.begin(), it) + - 1; // handle begin since 1 (one) + { + sync_primitives::AutoReadLock lock(conversion_table_lock); + ConversionTable::iterator it = std::find( + conversion_table_.begin(), conversion_table_.end(), dev_uid); + if (it != conversion_table_.end()) { + is_new = false; + return std::distance(conversion_table_.begin(), it) + + 1; // handle begin since 1 (one) + } } is_new = true; + sync_primitives::AutoWriteLock lock(conversion_table_lock); conversion_table_.push_back(dev_uid); return conversion_table_.size(); // handle begin since 1 (one) } - DeviceUID HandleToUid(DeviceHandle handle) { + DeviceUID HandleToUid(const DeviceHandle handle) { + sync_primitives::AutoReadLock lock(conversion_table_lock); if (handle == 0 || handle > conversion_table_.size()) { return DeviceUID(); } @@ -302,6 +332,7 @@ class TransportManagerImpl : public TransportManager, } ConversionTable conversion_table_; + sync_primitives::RWLock conversion_table_lock; }; /** @@ -312,22 +343,27 @@ class TransportManagerImpl : public TransportManager, explicit TransportManagerImpl(const TransportManagerImpl&); int connection_id_counter_; + sync_primitives::RWLock connections_lock_; std::vector<ConnectionInternal> connections_; - std::map<DeviceUID, TransportAdapter*> device_to_adapter_map_; + sync_primitives::RWLock device_to_adapter_map_lock_; + typedef std::map<DeviceUID, TransportAdapter*> DeviceToAdapterMap; + DeviceToAdapterMap device_to_adapter_map_; std::vector<TransportAdapter*> transport_adapters_; /** For keep listeners which were add TMImpl */ std::map<TransportAdapter*, TransportAdapterListenerImpl*> transport_adapter_listeners_; - threads::MessageLoopThread<std::queue<protocol_handler::RawMessagePtr> > message_queue_; - threads::MessageLoopThread<std::queue<TransportAdapterEvent> > event_queue_; - + RawMessageLoopThread message_queue_; + TransportAdapterEventLoopThread event_queue_; + const TransportManagerSettings& settings_; typedef std::vector<std::pair<const TransportAdapter*, DeviceInfo> > - DeviceInfoList; + DeviceInfoList; + sync_primitives::RWLock device_list_lock_; DeviceInfoList device_list_; void AddConnection(const ConnectionInternal& c); - void RemoveConnection(uint32_t id); - ConnectionInternal* GetConnection(const ConnectionUID& id); + void RemoveConnection(const uint32_t id, + transport_adapter::TransportAdapter* transport_adapter); + ConnectionInternal* GetConnection(const ConnectionUID id); ConnectionInternal* GetConnection(const DeviceUID& device, const ApplicationHandle& application); @@ -335,12 +371,15 @@ class TransportManagerImpl : public TransportManager, ConnectionUID id, std::map<ConnectionUID, std::pair<unsigned int, unsigned char*> >& container, - unsigned char* data, unsigned int data_size); - bool GetFrameSize(unsigned char* data, unsigned int data_size, + unsigned char* data, + unsigned int data_size); + bool GetFrameSize(unsigned char* data, + unsigned int data_size, unsigned int& frame_size); bool GetFrame(std::map<ConnectionUID, std::pair<unsigned int, unsigned char*> >& container, - ConnectionUID id, unsigned int frame_size, + ConnectionUID id, + unsigned int frame_size, unsigned char** frame); void OnDeviceListUpdated(TransportAdapter* ta); @@ -348,9 +387,6 @@ class TransportManagerImpl : public TransportManager, void TerminateAllAdapters(); int InitAllAdapters(); static Connection convert(const ConnectionInternal& p); -}; -// class ; - +}; // class TransportManagerImpl } // namespace transport_manager - -#endif +#endif // SRC_COMPONENTS_TRANSPORT_MANAGER_INCLUDE_TRANSPORT_MANAGER_TRANSPORT_MANAGER_IMPL_H_ |