X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/479b8853c2ab18c98926a9369a03888021e9b986..ee1709cd231588fe672d0bd2546ef69ee87ff88c:/projects/stargazer/plugins/other/smux/smux.cpp diff --git a/projects/stargazer/plugins/other/smux/smux.cpp b/projects/stargazer/plugins/other/smux/smux.cpp index e0ddfffc..8d5079bd 100644 --- a/projects/stargazer/plugins/other/smux/smux.cpp +++ b/projects/stargazer/plugins/other/smux/smux.cpp @@ -37,27 +37,24 @@ extern "C" STG::Plugin* GetPlugin() } SMUX_SETTINGS::SMUX_SETTINGS() - : errorStr(), - ip(0), - port(0), - password() + : ip(0), + port(0) {} int SMUX_SETTINGS::ParseSettings(const STG::ModuleSettings & s) { STG::ParamValue pv; -std::vector::const_iterator pvi; int p; pv.param = "Port"; -pvi = std::find(s.moduleParams.begin(), s.moduleParams.end(), pv); +auto pvi = std::find(s.moduleParams.begin(), s.moduleParams.end(), pv); if (pvi == s.moduleParams.end() || pvi->value.empty()) { errorStr = "Parameter \'Port\' not found."; printfd(__FILE__, "Parameter 'Port' not found\n"); return -1; } -if (ParseIntInRange(pvi->value[0], 2, 65535, &p)) +if (ParseIntInRange(pvi->value[0], 2, 65535, &p) != 0) { errorStr = "Cannot parse parameter \'Port\': " + errorStr; printfd(__FILE__, "Cannot parse parameter 'Port'\n"); @@ -92,19 +89,17 @@ return 0; } SMUX::SMUX() - : users(NULL), - tariffs(NULL), - admins(NULL), - services(NULL), - corporations(NULL), - traffcounter(NULL), + : users(nullptr), + tariffs(nullptr), + admins(nullptr), + services(nullptr), + corporations(nullptr), + traffcounter(nullptr), stopped(true), needReconnect(false), lastReconnectTry(0), reconnectTimeout(1), sock(-1), - addUserNotifier(*this), - delUserNotifier(*this), addDelTariffNotifier(*this), logger(STG::PluginLogger::get("smux")) { @@ -120,17 +115,11 @@ pdusHandlers[PDUs_PR_set_request] = &SMUX::SetRequestHandler; SMUX::~SMUX() { - { - Sensors::iterator it; - for (it = sensors.begin(); it != sensors.end(); ++it) - delete it->second; - } - { - Tables::iterator it; - for (it = tables.begin(); it != tables.end(); ++it) - delete it->second; - } -printfd(__FILE__, "SMUX::~SMUX()\n"); + for (auto& kv : sensors) + delete kv.second; + for (auto& kv : tables) + delete kv.second; + printfd(__FILE__, "SMUX::~SMUX()\n"); } int SMUX::ParseSettings() @@ -140,12 +129,12 @@ return smuxSettings.ParseSettings(settings); int SMUX::Start() { -assert(users != NULL && "users must not be NULL"); -assert(tariffs != NULL && "tariffs must not be NULL"); -assert(admins != NULL && "admins must not be NULL"); -assert(services != NULL && "services must not be NULL"); -assert(corporations != NULL && "corporations must not be NULL"); -assert(traffcounter != NULL && "traffcounter must not be NULL"); +assert(users != nullptr && "users must not be NULL"); +assert(tariffs != nullptr && "tariffs must not be NULL"); +assert(admins != nullptr && "admins must not be NULL"); +assert(services != nullptr && "services must not be NULL"); +assert(corporations != nullptr && "corporations must not be NULL"); +assert(traffcounter != nullptr && "traffcounter must not be NULL"); if (PrepareNet()) needReconnect = true; @@ -181,7 +170,7 @@ UpdateTables(); SetNotifiers(); #ifdef SMUX_DEBUG -Sensors::const_iterator it(sensors.begin()); +auto it = sensors.begin(); while (it != sensors.end()) { printfd(__FILE__, "%s = %s\n", @@ -192,7 +181,7 @@ while (it != sensors.end()) #endif if (!m_thread.joinable()) - m_thread = std::jthread([this](auto token){ Run(token); }); + m_thread = std::jthread([this](auto token){ Run(std::move(token)); }); return 0; } @@ -208,7 +197,7 @@ if (!stopped) for (int i = 0; i < 25 && !stopped; i++) { struct timespec ts = {0, 200000000}; - nanosleep(&ts, NULL); + nanosleep(&ts, nullptr); } } @@ -219,16 +208,10 @@ else ResetNotifiers(); - { - Tables::iterator it; - for (it = tables.begin(); it != tables.end(); ++it) - delete it->second; - } - { - Sensors::iterator it; - for (it = sensors.begin(); it != sensors.end(); ++it) - delete it->second; - } +for (auto& kv : sensors) + delete kv.second; +for (auto& kv : tables) + delete kv.second; tables.erase(tables.begin(), tables.end()); sensors.erase(sensors.begin(), sensors.end()); @@ -246,9 +229,9 @@ return 0; int SMUX::Reload(const STG::ModuleSettings & /*ms*/) { -if (Stop()) +if (Stop() != 0) return -1; -if (Start()) +if (Start() != 0) return -1; if (!needReconnect) { @@ -271,8 +254,8 @@ while (!token.stop_requested()) { if (WaitPackets(sock) && !needReconnect) { - SMUX_PDUs_t * pdus = RecvSMUXPDUs(sock); - if (pdus) + auto* pdus = RecvSMUXPDUs(sock); + if (pdus != nullptr) { DispatchPDUs(pdus); ASN_STRUCT_FREE(asn_DEF_SMUX_PDUs, pdus); @@ -307,7 +290,7 @@ addr.sin_family = AF_INET; addr.sin_port = htons(smuxSettings.GetPort()); addr.sin_addr.s_addr = smuxSettings.GetIP(); -if (connect(sock, reinterpret_cast(&addr), sizeof(addr))) +if (connect(sock, reinterpret_cast(&addr), sizeof(addr)) != 0) { errorStr = "Cannot connect."; logger("Cannot connect the socket: %s", strerror(errno)); @@ -320,7 +303,7 @@ return false; bool SMUX::Reconnect() { -if (needReconnect && difftime(time(NULL), lastReconnectTry) < reconnectTimeout) +if (needReconnect && difftime(time(nullptr), lastReconnectTry) < reconnectTimeout) return true; time(&lastReconnectTry); @@ -347,11 +330,9 @@ return true; bool SMUX::DispatchPDUs(const SMUX_PDUs_t * pdus) { -SMUXHandlers::iterator it(smuxHandlers.find(pdus->present)); +auto it = smuxHandlers.find(pdus->present); if (it != smuxHandlers.end()) - { return (this->*(it->second))(pdus); - } #ifdef SMUX_DEBUG else { @@ -379,7 +360,7 @@ bool SMUX::UpdateTables() { Sensors newSensors; bool done = true; -Tables::iterator it(tables.begin()); +auto it = tables.begin(); while (it != tables.end()) { try @@ -398,7 +379,7 @@ while (it != tables.end()) } if (!done) { - Sensors::iterator sit(newSensors.begin()); + auto sit = newSensors.begin(); while (sit != newSensors.end()) { delete sit->second; @@ -410,12 +391,11 @@ if (!done) it = tables.begin(); while (it != tables.end()) { - std::pair res; - res = std::equal_range(sensors.begin(), - sensors.end(), - std::pair(OID(it->first), NULL), - SPrefixLess); - Sensors::iterator sit(res.first); + auto res = std::equal_range(sensors.begin(), + sensors.end(), + std::pair(OID(it->first), nullptr), + SPrefixLess); + auto sit = res.first; while (sit != res.second) { delete sit->second; @@ -432,13 +412,13 @@ return true; void SMUX::SetNotifier(UserPtr userPtr) { -notifiers.push_back(CHG_AFTER_NOTIFIER(*this, userPtr)); +notifiers.emplace_back(*this, userPtr); userPtr->GetProperties().tariffName.AddAfterNotifier(¬ifiers.back()); } void SMUX::UnsetNotifier(UserPtr userPtr) { -std::list::iterator it = notifiers.begin(); +auto it = notifiers.begin(); while (it != notifiers.end()) { if (it->GetUserPtr() == userPtr) @@ -457,13 +437,19 @@ int h = users->OpenSearch(); assert(h && "USERS::OpenSearch is always correct"); UserPtr u; -while (!users->SearchNext(h, &u)) +while (users->SearchNext(h, &u) == 0) SetNotifier(u); users->CloseSearch(h); -users->AddNotifierUserAdd(&addUserNotifier); -users->AddNotifierUserDel(&delUserNotifier); +m_onAddUserConn = users->onUserAdd([this](auto user){ + SetNotifier(user); + UpdateTables(); +}); +m_onDelUserConn = users->onUserDel([this](auto user){ + UnsetNotifier(user); + UpdateTables(); +}); tariffs->AddNotifierAdd(&addDelTariffNotifier); tariffs->AddNotifierDel(&addDelTariffNotifier); @@ -474,10 +460,10 @@ void SMUX::ResetNotifiers() tariffs->DelNotifierDel(&addDelTariffNotifier); tariffs->DelNotifierAdd(&addDelTariffNotifier); -users->DelNotifierUserDel(&delUserNotifier); -users->DelNotifierUserAdd(&addUserNotifier); +m_onAddUserConn.disconnect(); +m_onDelUserConn.disconnect(); -std::list::iterator it(notifiers.begin()); +auto it = notifiers.begin(); while (it != notifiers.end()) { it->GetUserPtr()->GetProperties().tariffName.DelAfterNotifier(&(*it));