]> git.stg.codes - stg.git/commitdiff
More subscriptions, less notifiers.
authorMaksym Mamontov <madf@madf.info>
Thu, 25 Aug 2022 13:16:56 +0000 (16:16 +0300)
committerMaksym Mamontov <madf@madf.info>
Thu, 25 Aug 2022 13:16:56 +0000 (16:16 +0300)
14 files changed:
include/stg/subscriptions.h
include/stg/tariffs.h
include/stg/users.h
projects/stargazer/plugins/authorization/ao/ao.cpp
projects/stargazer/plugins/authorization/inetaccess/inetaccess.cpp
projects/stargazer/plugins/other/ping/ping.cpp
projects/stargazer/plugins/other/rscript/rscript.cpp
projects/stargazer/plugins/other/smux/smux.cpp
projects/stargazer/plugins/other/smux/smux.h
projects/stargazer/tariffs_impl.cpp
projects/stargazer/tariffs_impl.h
projects/stargazer/traffcounter_impl.cpp
projects/stargazer/users_impl.h
tests/testtariffs.h

index 853cebe1a152705357e88827cce18f2f206255d3..a50cbba3a90364023b58850961bc062f25a5412f 100644 (file)
@@ -53,7 +53,7 @@ template <typename... Ts>
 class Subscriptions
 {
     public:
-        using Callback = std::function<void (Ts...)>;
+        using Callback = std::function<void (const Ts&...)>;
         using Callbacks = std::list<Callback>;
 
         Connection makeConn(typename Callbacks::iterator i) noexcept
@@ -71,7 +71,7 @@ class Subscriptions
         template <typename C, typename... T2s>
         Connection add(C& c, void (C::*m)(T2s...))
         {
-            return add([&c, m](Ts&&... values){ (c.*m)(std::forward<Ts>(values)...); });
+            return add([&c, m](const Ts&... values){ (c.*m)(values...); });
         }
 
         void remove(typename Callbacks::iterator i)
@@ -80,7 +80,7 @@ class Subscriptions
             m_callbacks.erase(i);
         }
 
-        void notify(Ts&&... values)
+        void notify(const Ts&... values)
         {
             std::lock_guard lock(m_mutex);
             for (auto& cb : m_callbacks)
index 66db5f315cb0425053c27251d31c891c52fc4020..c47b857fadd0363bd09b943fdb574a349c3202ac 100644 (file)
 
 #pragma once
 
+#include "subscriptions.h"
+
 #include <string>
 #include <vector>
 
-#include "notifer.h"
-
 namespace STG
 {
 
@@ -32,27 +32,32 @@ struct Admin;
 struct Tariff;
 struct TariffData;
 
-struct Tariffs {
-    virtual ~Tariffs() = default;
+class Tariffs
+{
+    public:
+        virtual ~Tariffs() = default;
 
-    virtual int ReadTariffs() = 0;
-    virtual const Tariff* FindByName(const std::string& name) const = 0;
-    virtual const Tariff* GetNoTariff() const = 0;
-    virtual int Del(const std::string& name, const Admin* admin) = 0;
-    virtual int Add(const std::string& name, const Admin* admin) = 0;
-    virtual int Chg(const TariffData& td, const Admin* admin) = 0;
+        virtual int ReadTariffs() = 0;
+        virtual const Tariff* FindByName(const std::string& name) const = 0;
+        virtual const Tariff* GetNoTariff() const = 0;
+        virtual int Del(const std::string& name, const Admin* admin) = 0;
+        virtual int Add(const std::string& name, const Admin* admin) = 0;
+        virtual int Chg(const TariffData& td, const Admin* admin) = 0;
 
-    virtual void AddNotifierAdd(NotifierBase<TariffData>* notifier) = 0;
-    virtual void DelNotifierAdd(NotifierBase<TariffData>* notifier) = 0;
+        template <typename F>
+        auto onAdd(F&& f) { return m_onAddCallbacks.add(std::forward<F>(f)); }
+        template <typename F>
+        auto onDel(F&& f) { return m_onDelCallbacks.add(std::forward<F>(f)); }
 
-    virtual void AddNotifierDel(NotifierBase<TariffData>* notifier) = 0;
-    virtual void DelNotifierDel(NotifierBase<TariffData>* notifier) = 0;
+        virtual void GetTariffsData(std::vector<TariffData>* tdl) const = 0;
 
-    virtual void GetTariffsData(std::vector<TariffData>* tdl) const = 0;
+        virtual size_t Count() const = 0;
 
-    virtual size_t Count() const = 0;
+        virtual const std::string& GetStrError() const = 0;
 
-    virtual const std::string& GetStrError() const = 0;
+    protected:
+        Subscriptions<TariffData> m_onAddCallbacks;
+        Subscriptions<TariffData> m_onDelCallbacks;
 };
 
 }
index a8d4eb60518331785718bbf9f1a59e49ac194088..1587f35050c4eb8fdcb5aa91203270193cc95cb9 100644 (file)
@@ -24,6 +24,8 @@
 
 #include <string>
 
+#include <cstdint>
+
 namespace STG
 {
 
@@ -46,9 +48,9 @@ class Users
         virtual bool TariffInUse(const std::string& tariffName) const = 0;
 
         template <typename F>
-        auto onUserAdd(F&& f) { return m_onAddCallbacks.add(std::forward<F>(f)); }
+        auto onAdd(F&& f) { return m_onAddCallbacks.add(std::forward<F>(f)); }
         template <typename F>
-        auto onUserDel(F&& f) { return m_onDelCallbacks.add(std::forward<F>(f)); }
+        auto onDel(F&& f) { return m_onDelCallbacks.add(std::forward<F>(f)); }
 
         virtual int  Add(const std::string& login, const Admin* admin) = 0;
         virtual void Del(const std::string& login, const Admin* admin) = 0;
index d0be8dd58bc98992003662d93ec7f4da59455ee6..355c7061663699b9894b98980406bd7377d6de50 100644 (file)
@@ -57,8 +57,8 @@ int AUTH_AO::Start()
 printfd(__FILE__, "AUTH_AO::Start()\n");
 GetUsers();
 
-m_onAddUserConn = users->onUserAdd([this](auto user){ AddUser(user); });
-m_onDelUserConn = users->onUserDel([this](auto user){ DelUser(user); });
+m_onAddUserConn = users->onAdd([this](auto user){ AddUser(user); });
+m_onDelUserConn = users->onDel([this](auto user){ DelUser(user); });
 
 std::for_each(userList.begin(), userList.end(), [this](auto user){ UpdateUserAuthorization(user); });
 
index 3c6a687cefdea5e23cc33ec4c638a987fcce95d3..c607b2ac714d9f859d13a46298e97517b83cafd7 100644 (file)
@@ -340,7 +340,7 @@ AUTH_IA::~AUTH_IA()
 //-----------------------------------------------------------------------------
 int AUTH_IA::Start()
 {
-m_onDelUserConn = users->onUserDel([this](auto user){ DelUser(user); });
+m_onDelUserConn = users->onDel([this](auto user){ DelUser(user); });
 
 if (PrepareNet())
     return -1;
index 65dd34547d2e5c551500973717484b172a27a1c9..71752de60719ef461981f9f060dc2d85ebc29a8f 100644 (file)
@@ -79,8 +79,8 @@ int PING::Start()
 {
 GetUsers();
 
-m_onAddUserConn = users->onUserAdd([this](auto user){ AddUser(user); });
-m_onDelUserConn = users->onUserDel([this](auto user){ DelUser(user); });
+m_onAddUserConn = users->onAdd([this](auto user){ AddUser(user); });
+m_onDelUserConn = users->onDel([this](auto user){ DelUser(user); });
 
 pinger.SetDelayTime(pingSettings.GetPingDelay());
 pinger.Start();
index d54c800e5e4ebdd7591e035d3c8ea9a74de4957d..f8dc9d99bed486b8f2cee38b45a4d96fdbbb3d21 100644 (file)
@@ -199,8 +199,8 @@ netRouters = rsSettings.GetSubnetsMap();
 
 InitEncrypt(rsSettings.GetPassword());
 
-m_onAddUserConn = users->onUserAdd([this](auto user){ AddUser(user); });
-m_onDelUserConn = users->onUserDel([this](auto user){ DelUser(user); });
+m_onAddUserConn = users->onAdd([this](auto user){ AddUser(user); });
+m_onDelUserConn = users->onDel([this](auto user){ DelUser(user); });
 
 if (GetUsers())
     return -1;
index 8d5079bdc331c169db7d436dd70547def1653414..07f9d20035d8800c7fcb65f1213e2958fad9d9c3 100644 (file)
@@ -100,7 +100,6 @@ SMUX::SMUX()
       lastReconnectTry(0),
       reconnectTimeout(1),
       sock(-1),
-      addDelTariffNotifier(*this),
       logger(STG::PluginLogger::get("smux"))
 {
 smuxHandlers[SMUX_PDUs_PR_close] = &SMUX::CloseHandler;
@@ -442,23 +441,24 @@ while (users->SearchNext(h, &u) == 0)
 
 users->CloseSearch(h);
 
-m_onAddUserConn = users->onUserAdd([this](auto user){
+m_onAddUserConn = users->onAdd([this](auto user){
     SetNotifier(user);
     UpdateTables();
 });
-m_onDelUserConn = users->onUserDel([this](auto user){
+m_onDelUserConn = users->onDel([this](auto user){
     UnsetNotifier(user);
     UpdateTables();
 });
 
-tariffs->AddNotifierAdd(&addDelTariffNotifier);
-tariffs->AddNotifierDel(&addDelTariffNotifier);
+auto updateTables = [this](const STG::TariffData&){ UpdateTables(); };
+m_onAddTariffConn = tariffs->onAdd(updateTables);
+m_onDelTariffConn = tariffs->onDel(updateTables);
 }
 
 void SMUX::ResetNotifiers()
 {
-tariffs->DelNotifierDel(&addDelTariffNotifier);
-tariffs->DelNotifierAdd(&addDelTariffNotifier);
+m_onAddTariffConn.disconnect();
+m_onDelTariffConn.disconnect();
 
 m_onAddUserConn.disconnect();
 m_onDelUserConn.disconnect();
index 1986d28be72ce746b02327e353c90ce88fdc8f1a..3e708e2b70342da1a45a70be6c2d3acd77dd3e48 100644 (file)
@@ -81,16 +81,6 @@ private:
     UserPtr userPtr;
 };
 //-----------------------------------------------------------------------------
-class ADD_DEL_TARIFF_NOTIFIER : public STG::NotifierBase<STG::TariffData> {
-public:
-    explicit ADD_DEL_TARIFF_NOTIFIER(SMUX & s)
-             : STG::NotifierBase<STG::TariffData>(), smux(s) {}
-    void notify(const STG::TariffData &) override;
-
-private:
-    SMUX & smux;
-};
-//-----------------------------------------------------------------------------
 class SMUX : public STG::Plugin {
 public:
     SMUX();
@@ -170,9 +160,10 @@ private:
 
     STG::ScopedConnection m_onAddUserConn;
     STG::ScopedConnection m_onDelUserConn;
+    STG::ScopedConnection m_onAddTariffConn;
+    STG::ScopedConnection m_onDelTariffConn;
 
     std::list<CHG_AFTER_NOTIFIER> notifiers;
-    ADD_DEL_TARIFF_NOTIFIER addDelTariffNotifier;
 
     STG::PluginLogger logger;
 };
@@ -183,9 +174,3 @@ void CHG_AFTER_NOTIFIER::notify(const std::string &, const std::string &)
 {
 smux.UpdateTables();
 }
-
-inline
-void ADD_DEL_TARIFF_NOTIFIER::notify(const STG::TariffData &)
-{
-smux.UpdateTables();
-}
index 492f403f7780764383be17750ce601e54bcb8f8d..116570d3253eb7e340a80125ace303059f149ca9 100644 (file)
@@ -175,12 +175,7 @@ TariffData td;
     tariffs.erase(ti);
     }
 
-auto ni = onDelNotifiers.begin();
-while (ni != onDelNotifiers.end())
-    {
-    (*ni)->notify(td);
-    ++ni;
-    }
+m_onDelCallbacks.notify(td);
 
 WriteServLog("%s Tariff \'%s\' deleted.",
              admin->logStr().c_str(),
@@ -223,13 +218,7 @@ if (store->AddTariff(name) < 0)
     return -1;
     }
 
-// Fire all "on add" notifiers
-auto ni = onAddNotifiers.begin();
-while (ni != onAddNotifiers.end())
-    {
-    (*ni)->notify(tariffs.back().GetTariffData());
-    ++ni;
-    }
+m_onAddCallbacks.notify(tariffs.back().GetTariffData());
 
 WriteServLog("%s Tariff \'%s\' added.",
                  admin->logStr().c_str(), name.c_str());
@@ -249,27 +238,3 @@ for (; it != tariffs.end(); ++it)
     }
 }
 //-----------------------------------------------------------------------------
-void TariffsImpl::AddNotifierAdd(NotifierBase<TariffData> * n)
-{
-std::lock_guard<std::mutex> lock(m_mutex);
-onAddNotifiers.insert(n);
-}
-//-----------------------------------------------------------------------------
-void TariffsImpl::DelNotifierAdd(NotifierBase<TariffData> * n)
-{
-std::lock_guard<std::mutex> lock(m_mutex);
-onAddNotifiers.erase(n);
-}
-//-----------------------------------------------------------------------------
-void TariffsImpl::AddNotifierDel(NotifierBase<TariffData> * n)
-{
-std::lock_guard<std::mutex> lock(m_mutex);
-onDelNotifiers.insert(n);
-}
-//-----------------------------------------------------------------------------
-void TariffsImpl::DelNotifierDel(NotifierBase<TariffData> * n)
-{
-std::lock_guard<std::mutex> lock(m_mutex);
-onDelNotifiers.erase(n);
-}
-//-----------------------------------------------------------------------------
index 4b554b4d9baa110a2a9d9cd53aaf97ec7d2eafb6..31d22b596a1186399aebae33119c683ea43be890 100644 (file)
@@ -55,12 +55,6 @@ class TariffsImpl : public Tariffs {
         int Add(const std::string & name, const Admin * admin) override;
         int Chg(const TariffData & td, const Admin * admin) override;
 
-        void AddNotifierAdd(NotifierBase<TariffData> * notifier) override;
-        void DelNotifierAdd(NotifierBase<TariffData> * notifier) override;
-
-        void AddNotifierDel(NotifierBase<TariffData> * notifier) override;
-        void DelNotifierDel(NotifierBase<TariffData> * notifier) override;
-
         void GetTariffsData(std::vector<TariffData> * tdl) const override;
 
         const std::string & GetStrError() const override { return strError; }
@@ -72,9 +66,6 @@ class TariffsImpl : public Tariffs {
         mutable std::mutex m_mutex;
         std::string        strError;
         TariffImpl         noTariff;
-
-        std::set<NotifierBase<TariffData>*> onAddNotifiers;
-        std::set<NotifierBase<TariffData>*> onDelNotifiers;
 };
 
 }
index aa156c9dcabb150e35ae184413363706af43352f..44f2e5580ff8ec431655326b9cc57815d753a84a 100644 (file)
@@ -78,10 +78,10 @@ for (int i = 0; i < DIR_NUM; i++)
 
 dirName[DIR_NUM] = "NULL";
 
-m_onAddUserConn = users->onUserImplAdd([this](auto user){
+m_onAddUserConn = users->onImplAdd([this](auto user){
     AsyncPoolST::enqueue([this, user](){ SetUserNotifiers(user); });
 });
-m_onDelUserConn = users->onUserImplDel([this](auto user){
+m_onDelUserConn = users->onImplDel([this](auto user){
     AsyncPoolST::enqueue([this, user](){ UnSetUserNotifiers(user); });
     AsyncPoolST::enqueue([this, user](){ DelUser(user->GetCurrIP()); });
 });
index b5a37063079c14d1af26cc545b5cdbbefe8faddc..7b6f900adc1209d345289084034a65dc8d0890c6 100644 (file)
@@ -83,9 +83,9 @@ class UsersImpl : public Users
         bool            TariffInUse(const std::string & tariffName) const override;
 
         template <typename F>
-        auto            onUserImplAdd(F&& f) { return m_onAddImplCallbacks.add(std::forward<F>(f)); }
+        auto            onImplAdd(F&& f) { return m_onAddImplCallbacks.add(std::forward<F>(f)); }
         template <typename F>
-        auto            onUserImplDel(F&& f) { return m_onDelImplCallbacks.add(std::forward<F>(f)); }
+        auto            onImplDel(F&& f) { return m_onDelImplCallbacks.add(std::forward<F>(f)); }
 
         int             Add(const std::string & login, const Admin * admin) override;
         void            Del(const std::string & login, const Admin * admin) override;
index 30f26a5d9f7e10f115963f390e68b7639e2e9e6e..ca8ab0cea301230ad6d3ca6ff406a278cffc3204 100644 (file)
@@ -16,12 +16,6 @@ class TestTariffs : public STG::Tariffs
         int            Add(const std::string& /*name*/, const STG::Admin* /*admin*/) override { return 0; }
         int            Chg(const STG::TariffData& /*td*/, const STG::Admin* /*admin*/) override { return 0; }
 
-        void AddNotifierAdd(STG::NotifierBase<STG::TariffData>*) override {}
-        void DelNotifierAdd(STG::NotifierBase<STG::TariffData>*) override {}
-
-        void AddNotifierDel(STG::NotifierBase<STG::TariffData>*) override {}
-        void DelNotifierDel(STG::NotifierBase<STG::TariffData>*) override {}
-
         void           GetTariffsData(std::vector<STG::TariffData>* /*tdl*/) const override {}
 
         size_t         Count() const override { return 0; }