]> git.stg.codes - stg.git/blob - include/stg/tariff.h
1b6413b302f3c56417d32683d530850dcc6eb5f9
[stg.git] / include / stg / tariff.h
1 /*
2  *    This program is free software; you can redistribute it and/or modify
3  *    it under the terms of the GNU General Public License as published by
4  *    the Free Software Foundation; either version 2 of the License, or
5  *    (at your option) any later version.
6  *
7  *    This program is distributed in the hope that it will be useful,
8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  *    GNU General Public License for more details.
11  *
12  *    You should have received a copy of the GNU General Public License
13  *    along with this program; if not, write to the Free Software
14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15  */
16
17 /*
18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
19  */
20
21 #ifndef TARIFF_H
22 #define TARIFF_H
23
24 #include "os_int.h"
25
26 #include <string>
27 #include <cstring>
28 #include <ctime>
29 #include <istream>
30
31 struct TARIFF_DATA;
32
33 class TARIFF {
34 public:
35     enum PERIOD { DAY = 0, MONTH };
36
37     enum TRAFF_TYPE { TRAFF_UP = 0, TRAFF_DOWN, TRAFF_UP_DOWN, TRAFF_MAX };
38
39     static std::string PeriodToString(PERIOD period);
40     static PERIOD StringToPeriod(const std::string& value);
41
42     static std::string TraffTypeToString(TRAFF_TYPE type);
43     static TRAFF_TYPE StringToTraffType(const std::string& value);
44
45     virtual ~TARIFF() {}
46     virtual double  GetPriceWithTraffType(uint64_t up,
47                                           uint64_t down,
48                                           int dir,
49                                           time_t t) const = 0;
50     virtual double  GetFreeMb() const = 0;
51     virtual double  GetPassiveCost() const = 0;
52     virtual double  GetFee() const = 0;
53     virtual double  GetFree() const = 0;
54     virtual PERIOD  GetPeriod() const = 0;
55
56     virtual const   std::string & GetName() const = 0;
57     virtual void    SetName(const std::string & name) = 0;
58
59     virtual int     GetTraffType() const = 0;
60     virtual int64_t GetTraffByType(uint64_t up, uint64_t down) const = 0;
61     virtual int     GetThreshold(int dir) const = 0;
62     virtual const TARIFF_DATA & GetTariffData() const = 0;
63 };
64
65 inline
66 std::string TARIFF::PeriodToString(TARIFF::PERIOD period)
67 {
68 switch (period)
69     {
70     case DAY: return "day";
71     case MONTH: return "month";
72     }
73 return "month"; // Classic behaviour.
74 }
75
76 inline
77 TARIFF::PERIOD TARIFF::StringToPeriod(const std::string& value)
78 {
79 if (strcasecmp(value.c_str(), "day") == 0)
80     return DAY;
81 return MONTH; // Classic behaviour.
82 }
83
84 inline
85 std::string TARIFF::TraffTypeToString(TARIFF::TRAFF_TYPE type)
86 {
87 switch (type)
88     {
89     case TRAFF_UP: return "up";
90     case TRAFF_DOWN: return "down";
91     case TRAFF_UP_DOWN: return "up+down";
92     case TRAFF_MAX: return "max";
93     }
94 return "up+down";
95 }
96
97 inline
98 TARIFF::TRAFF_TYPE TARIFF::StringToTraffType(const std::string& value)
99 {
100 if (strcasecmp(value.c_str(), "up") == 0)
101     return TRAFF_UP;
102 if (strcasecmp(value.c_str(), "down") == 0)
103     return TRAFF_DOWN;
104 if (strcasecmp(value.c_str(), "up+down") == 0)
105     return TRAFF_UP_DOWN;
106 if (strcasecmp(value.c_str(), "max") == 0)
107     return TRAFF_MAX;
108 return TRAFF_UP_DOWN;
109 }
110
111 inline
112 std::istream & operator>>(std::istream & stream, TARIFF::TRAFF_TYPE & traffType)
113 {
114     unsigned val;
115     stream >> val;
116     traffType = static_cast<TARIFF::TRAFF_TYPE>(val);
117     return stream;
118 }
119
120 #endif