]> git.stg.codes - stg.git/blob - include/stg/tariff.h
Merge remote-tracking branch 'github/master'
[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 #pragma once
22
23 #include <string>
24 //#include <istream>
25 #include <cstring>
26 #include <ctime>
27 #include <cstdint>
28
29 namespace STG
30 {
31
32 struct TariffData;
33
34 struct Tariff {
35     enum ChangePolicy { ALLOW = 0, TO_CHEAP, TO_EXPENSIVE, DENY };
36
37     enum Period { DAY = 0, MONTH };
38
39     enum TraffType { TRAFF_UP = 0, TRAFF_DOWN, TRAFF_UP_DOWN, TRAFF_MAX };
40
41     static std::string toString(ChangePolicy changePolicy);
42     static ChangePolicy parseChangePolicy(const std::string& value);
43
44     static std::string toString(Period period);
45     static Period parsePeriod(const std::string& value);
46
47     static std::string toString(TraffType type);
48     static TraffType parseTraffType(const std::string& value);
49     static TraffType fromInt(int value);
50
51     virtual ~Tariff() = default;
52
53     virtual double  GetPriceWithTraffType(uint64_t up,
54                                           uint64_t down,
55                                           int dir,
56                                           time_t t) const = 0;
57     virtual double  GetFreeMb() const = 0;
58     virtual double  GetPassiveCost() const = 0;
59     virtual double  GetFee() const = 0;
60     virtual double  GetFree() const = 0;
61     virtual Period  GetPeriod() const = 0;
62     virtual ChangePolicy GetChangePolicy() const = 0;
63     virtual time_t  GetChangePolicyTimeout() const = 0;
64
65     virtual const   std::string& GetName() const = 0;
66     virtual void    SetName(const std::string& name) = 0;
67
68     virtual int     GetTraffType() const = 0;
69     virtual int64_t GetTraffByType(uint64_t up, uint64_t down) const = 0;
70     virtual int     GetThreshold(int dir) const = 0;
71     virtual const TariffData& GetTariffData() const = 0;
72     virtual std::string TariffChangeIsAllowed(const Tariff& to, time_t currentTime) const = 0;
73 };
74
75 inline
76 std::string Tariff::toString(ChangePolicy changePolicy)
77 {
78     switch (changePolicy)
79     {
80         case ALLOW: return "allow";
81         case TO_CHEAP: return "to_cheap";
82         case TO_EXPENSIVE: return "to_expensive";
83         case DENY: return "deny";
84     }
85     return "allow"; // Classic behaviour.
86 }
87
88 inline
89 Tariff::ChangePolicy Tariff::parseChangePolicy(const std::string& value)
90 {
91     if (strcasecmp(value.c_str(), "to_cheap") == 0)
92         return TO_CHEAP;
93     if (strcasecmp(value.c_str(), "to_expensive") == 0)
94         return TO_EXPENSIVE;
95     if (strcasecmp(value.c_str(), "deny") == 0)
96         return DENY;
97     return ALLOW; // Classic behaviour.
98 }
99
100 inline
101 std::string Tariff::toString(Period period)
102 {
103     switch (period)
104     {
105         case DAY: return "day";
106         case MONTH: return "month";
107     }
108     return "month"; // Classic behaviour.
109 }
110
111 inline
112 Tariff::Period Tariff::parsePeriod(const std::string& value)
113 {
114     if (strcasecmp(value.c_str(), "day") == 0)
115         return DAY;
116     return MONTH; // Classic behaviour.
117 }
118
119 inline
120 std::string Tariff::toString(TraffType type)
121 {
122     switch (type)
123     {
124         case TRAFF_UP: return "up";
125         case TRAFF_DOWN: return "down";
126         case TRAFF_UP_DOWN: return "up+down";
127         case TRAFF_MAX: return "max";
128     }
129     return "up+down";
130 }
131
132 inline
133 Tariff::TraffType Tariff::parseTraffType(const std::string& value)
134 {
135     if (strcasecmp(value.c_str(), "up") == 0)
136         return TRAFF_UP;
137     if (strcasecmp(value.c_str(), "down") == 0)
138         return TRAFF_DOWN;
139     if (strcasecmp(value.c_str(), "up+down") == 0)
140         return TRAFF_UP_DOWN;
141     if (strcasecmp(value.c_str(), "max") == 0)
142         return TRAFF_MAX;
143     return TRAFF_UP_DOWN;
144 }
145
146 /*inline
147 std::istream& operator>>(std::istream& stream, Tariff::TraffType& traffType)
148 {
149     unsigned val;
150     stream >> val;
151     traffType = static_cast<Tariff::TraffType>(val);
152     return stream;
153 }*/
154
155 inline
156 Tariff::TraffType Tariff::fromInt(int value)
157 {
158     if (value < 0 || value > TRAFF_MAX)
159         return TRAFF_UP_DOWN;
160     return static_cast<TraffType>(value);
161 }
162
163 }