From 7c744ef82350aa401c61aa6f0424866a16c2ed1a Mon Sep 17 00:00:00 2001 From: Maxim Mamontov Date: Thu, 1 Sep 2011 16:27:24 +0300 Subject: [PATCH] Add subscription for add/del tariffs --- include/stg/tariffs.h | 20 ++++-- projects/stargazer/tariffs_impl.cpp | 99 +++++++++++++++++++++-------- projects/stargazer/tariffs_impl.h | 21 +++--- 3 files changed, 98 insertions(+), 42 deletions(-) diff --git a/include/stg/tariffs.h b/include/stg/tariffs.h index b492833b..515e7608 100644 --- a/include/stg/tariffs.h +++ b/include/stg/tariffs.h @@ -24,22 +24,30 @@ #include #include +#include "notifer.h" + class ADMIN; class TARIFF; struct TARIFF_DATA; class TARIFFS { public: - virtual int ReadTariffs () = 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 TARIFF_DATA & td, const ADMIN * admin) = 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 TARIFF_DATA & td, const ADMIN * admin) = 0; + + virtual void AddNotifierAdd(NOTIFIER_BASE * notifier) = 0; + virtual void DelNotifierAdd(NOTIFIER_BASE * notifier) = 0; + + virtual void AddNotifierDel(NOTIFIER_BASE * notifier) = 0; + virtual void DelNotifierDel(NOTIFIER_BASE * notifier) = 0; - virtual void GetTariffsData(std::list * tdl) = 0; + virtual void GetTariffsData(std::list * tdl) = 0; - virtual size_t Count() const = 0; + virtual size_t Count() const = 0; virtual const std::string & GetStrError() const = 0; }; diff --git a/projects/stargazer/tariffs_impl.cpp b/projects/stargazer/tariffs_impl.cpp index a912c338..ea3632cb 100644 --- a/projects/stargazer/tariffs_impl.cpp +++ b/projects/stargazer/tariffs_impl.cpp @@ -47,7 +47,9 @@ TARIFFS_IMPL::TARIFFS_IMPL(STORE * st) store(st), WriteServLog(GetStgLogger()), strError(), - noTariff(NO_TARIFF_NAME) + noTariff(NO_TARIFF_NAME), + onAddNotifiers(), + onDelNotifiers() { pthread_mutex_init(&mutex, NULL); ReadTariffs(); @@ -160,27 +162,40 @@ if (!priv->tariffChg) 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, __FILE__, __LINE__); + + 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()); @@ -200,19 +215,21 @@ if (!priv->tariffChg) return -1; } -STG_LOCKER lock(&mutex, __FILE__, __LINE__); + { + STG_LOCKER lock(&mutex, __FILE__, __LINE__); -list::iterator ti; -ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name)); + 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,6 +238,14 @@ 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()); @@ -239,3 +264,27 @@ for (; it != tariffs.end(); ++it) } } //----------------------------------------------------------------------------- +void TARIFFS_IMPL::AddNotifierAdd(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex, __FILE__, __LINE__); +onAddNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +void TARIFFS_IMPL::DelNotifierAdd(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex, __FILE__, __LINE__); +onAddNotifiers.erase(n); +} +//----------------------------------------------------------------------------- +void TARIFFS_IMPL::AddNotifierDel(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex, __FILE__, __LINE__); +onDelNotifiers.insert(n); +} +//----------------------------------------------------------------------------- +void TARIFFS_IMPL::DelNotifierDel(NOTIFIER_BASE * n) +{ +STG_LOCKER lock(&mutex, __FILE__, __LINE__); +onDelNotifiers.erase(n); +} +//----------------------------------------------------------------------------- diff --git a/projects/stargazer/tariffs_impl.h b/projects/stargazer/tariffs_impl.h index cef5fed7..b50c2f10 100644 --- a/projects/stargazer/tariffs_impl.h +++ b/projects/stargazer/tariffs_impl.h @@ -1,8 +1,3 @@ - /* - $Revision: 1.7 $ - $Date: 2010/10/07 18:43:21 $ - */ - /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,12 +22,6 @@ * Author : Boris Mikhailenko */ -/* - $Revision: 1.7 $ - $Date: 2010/10/07 18:43:21 $ - $Author: faust $ - */ - #ifndef TARIFFS_IMPL_H #define TARIFFS_IMPL_H @@ -40,6 +29,7 @@ #include #include +#include #include "stg/tariff.h" #include "stg/tariffs.h" @@ -65,6 +55,12 @@ public: int Add(const std::string & name, const ADMIN * admin); int Chg(const TARIFF_DATA & td, const ADMIN * admin); + void AddNotifierAdd(NOTIFIER_BASE * notifier); + void DelNotifierAdd(NOTIFIER_BASE * notifier); + + void AddNotifierDel(NOTIFIER_BASE * notifier); + void DelNotifierDel(NOTIFIER_BASE * notifier); + void GetTariffsData(std::list * tdl); const std::string & GetStrError() const { return strError; } @@ -75,6 +71,9 @@ private: mutable pthread_mutex_t mutex; std::string strError; TARIFF_IMPL noTariff; + + std::set*> onAddNotifiers; + std::set*> onDelNotifiers; }; #endif -- 2.43.2