diff --git a/src/main/native/cpp/ConnectionNotifier.h b/src/main/native/cpp/ConnectionNotifier.h index 86457a7c00..de941492ff 100644 --- a/src/main/native/cpp/ConnectionNotifier.h +++ b/src/main/native/cpp/ConnectionNotifier.h @@ -57,9 +57,9 @@ class ConnectionNotifier void Start(); - unsigned int Add( - std::function callback); - unsigned int AddPolled(unsigned int poller_uid); + unsigned int Add(std::function + callback) override; + unsigned int AddPolled(unsigned int poller_uid) override; void NotifyConnection(bool connected, const ConnectionInfo& conn_info, unsigned int only_listener = UINT_MAX) override; diff --git a/src/main/native/cpp/Dispatcher.cpp b/src/main/native/cpp/Dispatcher.cpp index a170311927..ef10653c03 100644 --- a/src/main/native/cpp/Dispatcher.cpp +++ b/src/main/native/cpp/Dispatcher.cpp @@ -239,6 +239,35 @@ bool DispatcherBase::IsConnected() const { return false; } +unsigned int DispatcherBase::AddListener( + std::function callback, + bool immediate_notify) const { + std::lock_guard lock(m_user_mutex); + unsigned int uid = m_notifier.Add(callback); + // perform immediate notifications + if (immediate_notify) { + for (auto& conn : m_connections) { + if (conn->state() != NetworkConnection::kActive) continue; + m_notifier.NotifyConnection(true, conn->info(), uid); + } + } + return uid; +} + +unsigned int DispatcherBase::AddPolledListener(unsigned int poller_uid, + bool immediate_notify) const { + std::lock_guard lock(m_user_mutex); + unsigned int uid = m_notifier.AddPolled(poller_uid); + // perform immediate notifications + if (immediate_notify) { + for (auto& conn : m_connections) { + if (conn->state() != NetworkConnection::kActive) continue; + m_notifier.NotifyConnection(true, conn->info(), uid); + } + } + return uid; +} + void DispatcherBase::SetConnector(Connector connector) { std::lock_guard lock(m_user_mutex); m_client_connector = std::move(connector); diff --git a/src/main/native/cpp/Dispatcher.h b/src/main/native/cpp/Dispatcher.h index 5f7299ee68..b8a48a8287 100644 --- a/src/main/native/cpp/Dispatcher.h +++ b/src/main/native/cpp/Dispatcher.h @@ -56,6 +56,12 @@ class DispatcherBase : public IDispatcher { std::vector GetConnections() const; bool IsConnected() const; + unsigned int AddListener( + std::function callback, + bool immediate_notify) const; + unsigned int AddPolledListener(unsigned int poller_uid, + bool immediate_notify) const; + void SetConnector(Connector connector); void SetConnectorOverride(Connector connector); void ClearConnectorOverride(); diff --git a/src/main/native/cpp/IConnectionNotifier.h b/src/main/native/cpp/IConnectionNotifier.h index d5f9705344..c4c96367a8 100644 --- a/src/main/native/cpp/IConnectionNotifier.h +++ b/src/main/native/cpp/IConnectionNotifier.h @@ -20,6 +20,9 @@ class IConnectionNotifier { IConnectionNotifier(const IConnectionNotifier&) = delete; IConnectionNotifier& operator=(const IConnectionNotifier&) = delete; virtual ~IConnectionNotifier() = default; + virtual unsigned int Add( + std::function callback) = 0; + virtual unsigned int AddPolled(unsigned int poller_uid) = 0; virtual void NotifyConnection(bool connected, const ConnectionInfo& conn_info, unsigned int only_listener = UINT_MAX) = 0; }; diff --git a/src/main/native/cpp/ntcore_cpp.cpp b/src/main/native/cpp/ntcore_cpp.cpp index f654103171..9d0dbe0d56 100644 --- a/src/main/native/cpp/ntcore_cpp.cpp +++ b/src/main/native/cpp/ntcore_cpp.cpp @@ -388,11 +388,7 @@ NT_ConnectionListener AddConnectionListener( auto ii = InstanceImpl::Get(i); if (!ii) return 0; - unsigned int uid = ii->connection_notifier.Add(callback); - if (immediate_notify) { - for (auto& conn : ii->dispatcher.GetConnections()) - ii->connection_notifier.NotifyConnection(true, conn, uid); - } + unsigned int uid = ii->dispatcher.AddListener(callback, immediate_notify); return Handle(i, uid, Handle::kConnectionListener); } @@ -422,12 +418,7 @@ NT_ConnectionListener AddPolledConnectionListener( auto ii = InstanceImpl::Get(i); if (id < 0 || !ii) return 0; - unsigned int uid = ii->connection_notifier.AddPolled(id); - // perform immediate notifications - if (immediate_notify) { - for (auto& conn : ii->dispatcher.GetConnections()) - ii->connection_notifier.NotifyConnection(true, conn, uid); - } + unsigned int uid = ii->dispatcher.AddPolledListener(id, immediate_notify); return Handle(i, uid, Handle::kConnectionListener); } diff --git a/src/test/native/cpp/MockConnectionNotifier.h b/src/test/native/cpp/MockConnectionNotifier.h index 4a5667a077..7db4a765a8 100644 --- a/src/test/native/cpp/MockConnectionNotifier.h +++ b/src/test/native/cpp/MockConnectionNotifier.h @@ -16,6 +16,11 @@ namespace nt { class MockConnectionNotifier : public IConnectionNotifier { public: + MOCK_METHOD1( + Add, + unsigned int( + std::function callback)); + MOCK_METHOD1(AddPolled, unsigned int(unsigned int poller_uid)); MOCK_METHOD3(NotifyConnection, void(bool connected, const ConnectionInfo& conn_info, unsigned int only_listener));