]> git.stg.codes - stg.git/commitdiff
Add subscription for add/del tariffs
authorMaxim Mamontov <faust.madf@gmail.com>
Thu, 1 Sep 2011 13:27:24 +0000 (16:27 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Thu, 1 Sep 2011 13:27:24 +0000 (16:27 +0300)
include/stg/tariffs.h
projects/stargazer/tariffs_impl.cpp
projects/stargazer/tariffs_impl.h

index b492833b3de660204c7511d84e8a9089b4ea4fac..515e76088f1322fce2b153c56967c5ea8c7ae19d 100644 (file)
 #include <string>
 #include <list>
 
+#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<TARIFF_DATA> * notifier) = 0;
+    virtual void DelNotifierAdd(NOTIFIER_BASE<TARIFF_DATA> * notifier) = 0;
+
+    virtual void AddNotifierDel(NOTIFIER_BASE<TARIFF_DATA> * notifier) = 0;
+    virtual void DelNotifierDel(NOTIFIER_BASE<TARIFF_DATA> * notifier) = 0;
 
-    virtual void           GetTariffsData(std::list<TARIFF_DATA> * tdl) = 0;
+    virtual void GetTariffsData(std::list<TARIFF_DATA> * tdl) = 0;
 
-    virtual size_t         Count() const = 0;
+    virtual size_t Count() const = 0;
 
     virtual const std::string & GetStrError() const = 0;
 };
index a912c3387e8eb14f141b48d8cabb49e1fa7b8039..ea3632cb376cf437b4f2d932cdc903fccb3069a1 100644 (file)
@@ -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<TARIFF_IMPL>::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<TARIFF_IMPL>::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<NOTIFIER_BASE<TARIFF_DATA> *>::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<TARIFF_IMPL>::iterator ti;
-ti = find(tariffs.begin(), tariffs.end(), TARIFF_IMPL(name));
+    list<TARIFF_IMPL>::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<NOTIFIER_BASE<TARIFF_DATA> *>::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<TARIFF_DATA> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onAddNotifiers.insert(n);
+}
+//-----------------------------------------------------------------------------
+void TARIFFS_IMPL::DelNotifierAdd(NOTIFIER_BASE<TARIFF_DATA> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onAddNotifiers.erase(n);
+}
+//-----------------------------------------------------------------------------
+void TARIFFS_IMPL::AddNotifierDel(NOTIFIER_BASE<TARIFF_DATA> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onDelNotifiers.insert(n);
+}
+//-----------------------------------------------------------------------------
+void TARIFFS_IMPL::DelNotifierDel(NOTIFIER_BASE<TARIFF_DATA> * n)
+{
+STG_LOCKER lock(&mutex, __FILE__, __LINE__);
+onDelNotifiers.erase(n);
+}
+//-----------------------------------------------------------------------------
index cef5fed71cc8fdbe04860d08afc515f0fa7d2142..b50c2f10491c4dd05d8268180db702cbcad60c63 100644 (file)
@@ -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
  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
  */
 
-/*
- $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 <string>
 #include <list>
+#include <set>
 
 #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<TARIFF_DATA> * notifier);
+    void DelNotifierAdd(NOTIFIER_BASE<TARIFF_DATA> * notifier);
+
+    void AddNotifierDel(NOTIFIER_BASE<TARIFF_DATA> * notifier);
+    void DelNotifierDel(NOTIFIER_BASE<TARIFF_DATA> * notifier);
+
     void    GetTariffsData(std::list<TARIFF_DATA> * 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<NOTIFIER_BASE<TARIFF_DATA>*> onAddNotifiers;
+    std::set<NOTIFIER_BASE<TARIFF_DATA>*> onDelNotifiers;
 };
 
 #endif