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.
 
   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.
 
  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
 
  18  *    Author : Maxim Mamontov <faust@stargazer.dp.ua>
 
  35     enum CHANGE_POLICY { ALLOW = 0, TO_CHEAP, TO_EXPENSIVE, DENY };
 
  37     enum PERIOD { DAY = 0, MONTH };
 
  39     enum TRAFF_TYPE { TRAFF_UP = 0, TRAFF_DOWN, TRAFF_UP_DOWN, TRAFF_MAX };
 
  41     static std::string ChangePolicyToString(CHANGE_POLICY changePolicy);
 
  42     static CHANGE_POLICY StringToChangePolicy(const std::string& value);
 
  44     static std::string PeriodToString(PERIOD period);
 
  45     static PERIOD StringToPeriod(const std::string& value);
 
  47     static std::string TraffTypeToString(TRAFF_TYPE type);
 
  48     static TRAFF_TYPE StringToTraffType(const std::string& value);
 
  49     static TRAFF_TYPE IntToTraffType(int value);
 
  52     virtual double  GetPriceWithTraffType(uint64_t up,
 
  56     virtual double  GetFreeMb() const = 0;
 
  57     virtual double  GetPassiveCost() const = 0;
 
  58     virtual double  GetFee() const = 0;
 
  59     virtual double  GetFree() const = 0;
 
  60     virtual PERIOD  GetPeriod() const = 0;
 
  61     virtual CHANGE_POLICY GetChangePolicy() const = 0;
 
  62     virtual time_t  GetChangePolicyTimeout() const = 0;
 
  64     virtual const   std::string & GetName() const = 0;
 
  65     virtual void    SetName(const std::string & name) = 0;
 
  67     virtual int     GetTraffType() const = 0;
 
  68     virtual int64_t GetTraffByType(uint64_t up, uint64_t down) const = 0;
 
  69     virtual int     GetThreshold(int dir) const = 0;
 
  70     virtual const TARIFF_DATA & GetTariffData() const = 0;
 
  71     virtual std::string TariffChangeIsAllowed(const TARIFF & to) const = 0;
 
  75 std::string TARIFF::ChangePolicyToString(TARIFF::CHANGE_POLICY changePolicy)
 
  79     case ALLOW: return "allow";
 
  80     case TO_CHEAP: return "to_cheap";
 
  81     case TO_EXPENSIVE: return "to_expensive";
 
  82     case DENY: return "deny";
 
  84 return "allow"; // Classic behaviour.
 
  88 TARIFF::CHANGE_POLICY TARIFF::StringToChangePolicy(const std::string& value)
 
  90 if (strcasecmp(value.c_str(), "to_cheap") == 0)
 
  92 if (strcasecmp(value.c_str(), "to_expensive") == 0)
 
  94 if (strcasecmp(value.c_str(), "deny") == 0)
 
  96 return ALLOW; // Classic behaviour.
 
 100 std::string TARIFF::PeriodToString(TARIFF::PERIOD period)
 
 104     case DAY: return "day";
 
 105     case MONTH: return "month";
 
 107 return "month"; // Classic behaviour.
 
 111 TARIFF::PERIOD TARIFF::StringToPeriod(const std::string& value)
 
 113 if (strcasecmp(value.c_str(), "day") == 0)
 
 115 return MONTH; // Classic behaviour.
 
 119 std::string TARIFF::TraffTypeToString(TARIFF::TRAFF_TYPE type)
 
 123     case TRAFF_UP: return "up";
 
 124     case TRAFF_DOWN: return "down";
 
 125     case TRAFF_UP_DOWN: return "up+down";
 
 126     case TRAFF_MAX: return "max";
 
 132 TARIFF::TRAFF_TYPE TARIFF::StringToTraffType(const std::string& value)
 
 134 if (strcasecmp(value.c_str(), "up") == 0)
 
 136 if (strcasecmp(value.c_str(), "down") == 0)
 
 138 if (strcasecmp(value.c_str(), "up+down") == 0)
 
 139     return TRAFF_UP_DOWN;
 
 140 if (strcasecmp(value.c_str(), "max") == 0)
 
 142 return TRAFF_UP_DOWN;
 
 146 std::istream & operator>>(std::istream & stream, TARIFF::TRAFF_TYPE & traffType)
 
 150     traffType = static_cast<TARIFF::TRAFF_TYPE>(val);
 
 155 TARIFF::TRAFF_TYPE TARIFF::IntToTraffType(int value)
 
 157     if (value < 0 || value > TRAFF_MAX)
 
 158         return TRAFF_UP_DOWN;
 
 159     return static_cast<TRAFF_TYPE>(value);