]> git.stg.codes - stg.git/blobdiff - projects/stargazer/plugins/other/ping/ping.h
More std::jthread stuff.
[stg.git] / projects / stargazer / plugins / other / ping / ping.h
index aecbfb1559a4902284331b32993faa013b7263b8..b52a5e1cd180825e655ad0b3c1e08e1ad0d10247 100644 (file)
- /*
- $Revision: 1.16 $
- $Date: 2009/06/23 11:32:28 $
- $Author: faust $
- */
+#pragma once
 
-#ifndef PING_H
-#define PING_H
-
-#include <pthread.h>
-
-#include <string>
-#include <list>
-
-#include "stg/os_int.h"
 #include "stg/plugin.h"
 #include "stg/module_settings.h"
-#include "stg/notifer.h"
+#include "stg/subscriptions.h"
 #include "stg/user_ips.h"
 #include "stg/pinger.h"
 #include "stg/users.h"
+#include "stg/logger.h"
 
-extern "C" PLUGIN * GetPlugin();
-
-class PING;
-class USER;
-class SETTINGS;
-//-----------------------------------------------------------------------------*/
-class CHG_CURRIP_NOTIFIER_PING: public PROPERTY_NOTIFIER_BASE<uint32_t> {
-public:
-    CHG_CURRIP_NOTIFIER_PING(const PING & p, USER_PTR u) : user(u), ping(p) {}
-    void Notify(const uint32_t & oldIP, const uint32_t & newIP);
-    USER_PTR GetUser() const { return user; }
-
-private:
-    USER_PTR user;
-    const PING & ping;
-};
-//-----------------------------------------------------------------------------
-class CHG_IPS_NOTIFIER_PING: public PROPERTY_NOTIFIER_BASE<USER_IPS> {
-public:
-    CHG_IPS_NOTIFIER_PING(const PING & p, USER_PTR u) : user(u), ping(p) {}
-    void Notify(const USER_IPS & oldIPS, const USER_IPS & newIPS);
-    USER_PTR GetUser() const { return user; }
-
-private:
-    USER_PTR user;
-    const PING & ping;
-};
-//-----------------------------------------------------------------------------
-class ADD_USER_NONIFIER_PING: public NOTIFIER_BASE<USER_PTR> {
-public:
-    ADD_USER_NONIFIER_PING(PING & p) : ping(p) {}
-    virtual ~ADD_USER_NONIFIER_PING() {}
-    void Notify(const USER_PTR & user);
-
-private:
-    PING & ping;
-};
-//-----------------------------------------------------------------------------
-class DEL_USER_NONIFIER_PING: public NOTIFIER_BASE<USER_PTR> {
-public:
-    DEL_USER_NONIFIER_PING(PING & p) : ping(p) {}
-    virtual ~DEL_USER_NONIFIER_PING() {}
-    void Notify(const USER_PTR & user);
-
-private:
-    PING & ping;
-};
+#include <string>
+#include <vector>
+#include <tuple>
+#include <list>
+#include <mutex>
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wshadow"
+#include <jthread.hpp>
+#pragma GCC diagnostic pop
+#include <cstdint>
+
+namespace STG
+{
+struct USER;
+struct SETTINGS;
+
+using UserPtr = User*;
 //-----------------------------------------------------------------------------
-class PING_SETTINGS {
-public:
-    PING_SETTINGS();
-    virtual ~PING_SETTINGS() {}
-    const std::string & GetStrError() const { return errorStr; }
-    int ParseSettings(const MODULE_SETTINGS & s);
-    int GetPingDelay() const { return pingDelay; }
-private:
-    int pingDelay;
-    mutable std::string errorStr;
+class PING_SETTINGS
+{
+    public:
+        PING_SETTINGS() : pingDelay(0) {}
+        const std::string & GetStrError() const { return errorStr; }
+        int ParseSettings(const ModuleSettings & s);
+        int GetPingDelay() const { return pingDelay; }
+    private:
+        int pingDelay;
+        std::string errorStr;
 };
 //-----------------------------------------------------------------------------
-class PING : public PLUGIN {
-friend class CHG_CURRIP_NOTIFIER_PING;
-friend class CHG_IPS_NOTIFIER_PING;
-public:
-    PING();
-    virtual ~PING();
-
-    void SetUsers(USERS * u);
-    void SetTariffs(TARIFFS *) {}
-    void SetAdmins(ADMINS *) {}
-    void SetTraffcounter(TRAFFCOUNTER *) {}
-    void SetStore(STORE *) {}
-    void SetStgSettings(const SETTINGS *) {}
-    void SetSettings(const MODULE_SETTINGS & s);
-    int ParseSettings();
-
-    int Start();
-    int Stop();
-    int Reload() { return 0; }
-    bool IsRunning();
-
-    const std::string & GetStrError() const;
-    const std::string GetVersion() const;
-    uint16_t GetStartPosition() const;
-    uint16_t GetStopPosition() const;
-
-    void AddUser(USER_PTR u);
-    void DelUser(USER_PTR u);
-
-private:
-    void GetUsers();
-    void SetUserNotifiers(USER_PTR u);
-    void UnSetUserNotifiers(USER_PTR u);
-    static void * Run(void * d);
-
-    mutable std::string errorStr;
-    PING_SETTINGS pingSettings;
-    MODULE_SETTINGS settings;
-    USERS * users;
-    std::list<USER_PTR> usersList;
-
-    /*
-    ÍÙ ÄÏÌÖÎÙ ÐÅÒÅÐÒÏ×ÅÒÉÔØ ×ÏÚÍÏÖÎÏÓÔØ ÐÉÎÇÏ×ÁÎÉÑ ÀÚÅÒÁ ÐÒÉ ÉÚÍÅÎÅÎÉÉ
-    ÓÌÅÄÕÀÝÉÈ ÅÇÏ ÐÁÒÁÍÅÔÒÏ×:
-    - currIP
-    - ips
-    */
-    pthread_t thread;
-    pthread_mutex_t mutex;
-    bool nonstop;
-    bool isRunning;
-    mutable STG_PINGER pinger;
-
-    std::list<CHG_CURRIP_NOTIFIER_PING> ChgCurrIPNotifierList;
-    std::list<CHG_IPS_NOTIFIER_PING> ChgIPNotifierList;
-
-    ADD_USER_NONIFIER_PING onAddUserNotifier;
-    DEL_USER_NONIFIER_PING onDelUserNotifier;
+class PING : public Plugin
+{
+    public:
+        PING();
+
+        void SetUsers(Users * u) override { users = u; }
+        void SetSettings(const ModuleSettings & s) override { settings = s; }
+        int ParseSettings() override;
+
+        int Start() override;
+        int Stop() override;
+        int Reload(const ModuleSettings & /*ms*/) override { return 0; }
+        bool IsRunning() override;
+
+        const std::string & GetStrError() const override { return errorStr; }
+        std::string GetVersion() const override { return "Pinger v.1.01"; }
+        uint16_t GetStartPosition() const override { return 10; }
+        uint16_t GetStopPosition() const override { return 10; }
+
+        void AddUser(UserPtr u);
+        void DelUser(UserPtr u);
+
+    private:
+        explicit PING(const PING & rvalue);
+        PING & operator=(const PING & rvalue);
+
+        void GetUsers();
+        void SetUserNotifiers(UserPtr u);
+        void UnSetUserNotifiers(UserPtr u);
+        void Run(std::stop_token token);
+
+        std::string errorStr;
+        PING_SETTINGS pingSettings;
+        ModuleSettings settings;
+        Users * users;
+        std::list<UserPtr> usersList;
+
+        std::jthread m_thread;
+        std::mutex m_mutex;
+        bool isRunning;
+        STG_PINGER m_pinger;
+
+        void updateCurrIP(uint32_t oldVal, uint32_t newVal);
+        void updateIPs(const UserIPs& oldVal, const UserIPs& newVal);
+
+        ScopedConnection m_onAddUserConn;
+        ScopedConnection m_onDelUserConn;
+
+        using ConnHolder = std::tuple<int, ScopedConnection, ScopedConnection>;
+        std::vector<ConnHolder> m_conns;
+
+        PluginLogger logger;
 };
-//-----------------------------------------------------------------------------
 
-#endif
+}