X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/4844bbe6135addc1ffdc33ed0576aebea0153e6d..73c393ae1ba7918ea8893787bbdda2d736cfa74f:/projects/stargazer/tariffs_impl.cpp diff --git a/projects/stargazer/tariffs_impl.cpp b/projects/stargazer/tariffs_impl.cpp index d2ea7c9a..d47ecf8f 100644 --- a/projects/stargazer/tariffs_impl.cpp +++ b/projects/stargazer/tariffs_impl.cpp @@ -38,16 +38,17 @@ #include "stg/admin.h" #include "tariffs_impl.h" -using namespace std; - //----------------------------------------------------------------------------- TARIFFS_IMPL::TARIFFS_IMPL(STORE * st) : TARIFFS(), tariffs(), store(st), WriteServLog(GetStgLogger()), + mutex(), strError(), - noTariff(NO_TARIFF_NAME) + noTariff(NO_TARIFF_NAME), + onAddNotifiers(), + onDelNotifiers() { pthread_mutex_init(&mutex, NULL); ReadTariffs(); @@ -60,18 +61,18 @@ pthread_mutex_destroy(&mutex); //----------------------------------------------------------------------------- int TARIFFS_IMPL::ReadTariffs() { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); -vector tariffsList; +std::vector tariffsList; if (store->GetTariffsList(&tariffsList)) { WriteServLog("Cannot get tariffs list."); WriteServLog("%s", store->GetStrError().c_str()); } -int tariffsNum = tariffsList.size(); +Tariffs::size_type tariffsNum = tariffsList.size(); -for (int i = 0; i < tariffsNum; i++) +for (Tariffs::size_type i = 0; i < tariffsNum; i++) { TARIFF_DATA td; if (store->RestoreTariff(&td, tariffsList[i])) @@ -86,19 +87,19 @@ for (int i = 0; i < tariffsNum; i++) return 0; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::GetTariffsNum() const +size_t TARIFFS_IMPL::Count() const { -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); return tariffs.size(); } //----------------------------------------------------------------------------- -const TARIFF * TARIFFS_IMPL::FindByName(const string & name) const +const TARIFF * TARIFFS_IMPL::FindByName(const std::string & name) const { if (name == NO_TARIFF_NAME) return &noTariff; -STG_LOCKER lock(&mutex, __FILE__, __LINE__); -list::const_iterator ti; +STG_LOCKER lock(&mutex); +std::list::const_iterator ti; ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); if (ti != tariffs.end()) @@ -113,16 +114,16 @@ const PRIV * priv = admin->GetPriv(); if (!priv->tariffChg) { - string s = admin->GetLogStr() + " Change tariff \'" + std::string s = admin->GetLogStr() + " Change tariff \'" + td.tariffConf.name + "\'. Access denied."; strError = "Access denied."; WriteServLog(s.c_str()); return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); -list::iterator ti; +std::list::iterator ti; ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(td.tariffConf.name)); if (ti == tariffs.end()) @@ -136,7 +137,7 @@ if (ti == tariffs.end()) if (store->SaveTariff(td, td.tariffConf.name)) { - string error = "Tariff " + td.tariffConf.name + " writing error. " + store->GetStrError(); + std::string error = "Tariff " + td.tariffConf.name + " writing error. " + store->GetStrError(); WriteServLog(error.c_str()); return -1; } @@ -147,72 +148,87 @@ WriteServLog("%s Tariff \'%s\' changed.", return 0; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::Del(const string & name, const ADMIN * admin) +int TARIFFS_IMPL::Del(const std::string & name, const ADMIN * admin) { const PRIV * priv = admin->GetPriv(); if (!priv->tariffChg) { - string s = admin->GetLogStr() + " Delete tariff \'" + std::string s = admin->GetLogStr() + " Delete tariff \'" + name + "\'. Access denied."; strError = "Access denied."; WriteServLog(s.c_str()); return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); - -list::iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); +TARIFF_DATA td; -if (ti == tariffs.end()) { - strError = "Tariff \'" + name + "\' cannot be deleted. Tariff does not exist."; - WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); - return -1; + STG_LOCKER lock(&mutex); + + std::list::iterator ti; + ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); + + if (ti == tariffs.end()) + { + strError = "Tariff \'" + name + "\' cannot be deleted. Tariff does not exist."; + WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); + return -1; + } + + if (store->DelTariff(name)) + { + WriteServLog("Cannot delete tariff %s.", name.c_str()); + WriteServLog("%s", store->GetStrError().c_str()); + return -1; + } + + td = ti->GetTariffData(); + + tariffs.erase(ti); } -if (store->DelTariff(name)) +std::set *>::iterator ni = onDelNotifiers.begin(); +while (ni != onDelNotifiers.end()) { - WriteServLog("Cannot delete tariff %s.", name.c_str()); - WriteServLog("%s", store->GetStrError().c_str()); - return -1; + (*ni)->Notify(td); + ++ni; } -tariffs.erase(ti); - WriteServLog("%s Tariff \'%s\' deleted.", admin->GetLogStr().c_str(), name.c_str()); return 0; } //----------------------------------------------------------------------------- -int TARIFFS_IMPL::Add(const string & name, const ADMIN * admin) +int TARIFFS_IMPL::Add(const std::string & name, const ADMIN * admin) { const PRIV * priv = admin->GetPriv(); if (!priv->tariffChg) { - string s = admin->GetLogStr() + " Add tariff \'" + std::string s = admin->GetLogStr() + " Add tariff \'" + name + "\'. Access denied."; strError = "Access denied."; WriteServLog(s.c_str()); return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); + { + STG_LOCKER lock(&mutex); -list::iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); + std::list::iterator ti; + ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); -if (ti != tariffs.end()) - { - strError = "Tariff \'" + name + "\' cannot be added. Tariff already exist."; - WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); - return -1; - } + if (ti != tariffs.end()) + { + strError = "Tariff \'" + name + "\' cannot be added. Tariff already exist."; + WriteServLog("%s %s", admin->GetLogStr().c_str(), strError.c_str()); + return -1; + } -tariffs.push_back(TARIFF_IMPL(name)); + tariffs.push_back(TARIFF_IMPL(name)); + } if (store->AddTariff(name) < 0) { @@ -221,21 +237,53 @@ if (store->AddTariff(name) < 0) return -1; } +// Fire all "on add" notifiers +std::set *>::iterator ni = onAddNotifiers.begin(); +while (ni != onAddNotifiers.end()) + { + (*ni)->Notify(tariffs.back().GetTariffData()); + ++ni; + } + WriteServLog("%s Tariff \'%s\' added.", admin->GetLogStr().c_str(), name.c_str()); return 0; } //----------------------------------------------------------------------------- -void TARIFFS_IMPL::GetTariffsData(std::list * tdl) +void TARIFFS_IMPL::GetTariffsData(std::list * tdl) const { assert(tdl != NULL && "Tariffs data list is not null"); -STG_LOCKER lock(&mutex, __FILE__, __LINE__); +STG_LOCKER lock(&mutex); -std::list::const_iterator it = tariffs.begin(); +Tariffs::const_iterator it = tariffs.begin(); for (; it != tariffs.end(); ++it) { tdl->push_back(it->GetTariffData()); } } //----------------------------------------------------------------------------- +void TARIFFS_IMPL::AddNotifierAdd(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex); +onAddNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +void TARIFFS_IMPL::DelNotifierAdd(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex); +onAddNotifiers.erase(n); +} +//----------------------------------------------------------------------------- +void TARIFFS_IMPL::AddNotifierDel(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex); +onDelNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +void TARIFFS_IMPL::DelNotifierDel(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex); +onDelNotifiers.erase(n); +} +//-----------------------------------------------------------------------------