X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/6c05b2e63b58b19df2f35707fa12f238a18458e7..d1ddf1df6b8987cc1be7dc96608e22998c3e9cb6:/stglibs/srvconf.lib/parsers/get_tariff.cpp?ds=inline diff --git a/stglibs/srvconf.lib/parsers/get_tariff.cpp b/stglibs/srvconf.lib/parsers/get_tariff.cpp index 993f8b50..4844fd6c 100644 --- a/stglibs/srvconf.lib/parsers/get_tariff.cpp +++ b/stglibs/srvconf.lib/parsers/get_tariff.cpp @@ -24,7 +24,6 @@ #include "stg/common.h" -#include #include #include @@ -40,7 +39,7 @@ class AOS_PARSER : public BASE_PROPERTY_PARSER public: typedef bool (* FUNC)(const char **, A &, T A::value_type:: *); AOS_PARSER(A & a, T A::value_type:: * fld, FUNC f) : array(a), field(fld), func(f) {} - virtual bool Parse(const char ** attr) { return func(attr, array, field); } + virtual bool Parse(const char ** attr, const std::string & /*attrName*/, const std::string & /*fromEncoding*/) { return func(attr, array, field); } private: A & array; T A::value_type:: * field; @@ -54,13 +53,14 @@ void AddAOSParser(PROPERTY_PARSERS & parsers, const std::string & name, A & arra parsers.insert(std::make_pair(ToLower(name), new AOS_PARSER(array, field, func))); } -bool GetTimeSpan(const char ** attr, DIRPRICE_DATA & value) +bool GetTimeSpan(const char ** attr, DIRPRICE_DATA & value, const std::string & attrName) { -int hb = 0; -int mb = 0; -int he = 0; -int me = 0; -if (CheckValue(attr)) +if (CheckValue(attr, attrName)) + { + int hb = 0; + int mb = 0; + int he = 0; + int me = 0; if (ParseTariffTimeStr(attr[1], hb, mb, he, me) == 0) { value.hDay = hb; @@ -69,23 +69,48 @@ if (CheckValue(attr)) value.mNight = me; return true; } + } return false; } template -bool GetTraffType(const char ** attr, T & value) +bool GetTraffType(const char ** attr, T & value, const std::string & attrName) +{ +if (!CheckValue(attr, attrName)) + return false; +value = TARIFF::StringToTraffType(attr[1]); +return true; +} + +template +bool GetPeriod(const char ** attr, T & value, const std::string & attrName) { -if (!CheckValue(attr)) +if (!CheckValue(attr, attrName)) return false; std::string type(attr[1]); -if (type == "up") - value = TRAFF_UP; -else if (type == "down") - value = TRAFF_DOWN; -else if (type == "up+down") - value = TRAFF_UP_DOWN; -else if (type == "max") - value = TRAFF_MAX; +if (type == "day") + value = TARIFF::DAY; +else if (type == "month") + value = TARIFF::MONTH; +else + return false; +return true; +} + +template +bool GetChangePolicy(const char ** attr, T & value, const std::string & attrName) +{ +if (!CheckValue(attr, attrName)) + return false; +std::string type(attr[1]); +if (type == "allow") + value = TARIFF::ALLOW; +else if (type == "to_cheap") + value = TARIFF::TO_CHEAP; +else if (type == "to_expensive") + value = TARIFF::TO_EXPENSIVE; +else if (type == "deny") + value = TARIFF::DENY; else return false; return true; @@ -94,7 +119,7 @@ return true; template bool GetSlashedValue(const char ** attr, A & array, T A::value_type:: * field) { -if (!CheckValue(attr)) +if (!CheckValue(attr, "value")) return false; const char * start = attr[1]; size_t item = 0; @@ -113,9 +138,10 @@ return true; } // namespace anonymous -GET_TARIFF::PARSER::PARSER(CALLBACK f, void * d) +GET_TARIFF::PARSER::PARSER(CALLBACK f, void * d, const std::string & e) : callback(f), data(d), + encoding(e), depth(0), parsingAnswer(false) { @@ -123,6 +149,8 @@ GET_TARIFF::PARSER::PARSER(CALLBACK f, void * d) AddParser(propertyParsers, "passiveCost", info.tariffConf.passiveCost); AddParser(propertyParsers, "free", info.tariffConf.free); AddParser(propertyParsers, "traffType", info.tariffConf.traffType, GetTraffType); + AddParser(propertyParsers, "period", info.tariffConf.period, GetPeriod); + AddParser(propertyParsers, "changePolicy", info.tariffConf.changePolicy, GetChangePolicy); for (size_t i = 0; i < DIR_NUM; ++i) AddParser(propertyParsers, "time" + unsigned2str(i), info.dirPrice[i], GetTimeSpan); AddAOSParser(propertyParsers, "priceDayA", info.dirPrice, &DIRPRICE_DATA::priceDayA, GetSlashedValue); @@ -131,6 +159,7 @@ GET_TARIFF::PARSER::PARSER(CALLBACK f, void * d) AddAOSParser(propertyParsers, "priceNightB", info.dirPrice, &DIRPRICE_DATA::priceNightB, GetSlashedValue); AddAOSParser(propertyParsers, "singlePrice", info.dirPrice, &DIRPRICE_DATA::singlePrice, GetSlashedValue); AddAOSParser(propertyParsers, "noDiscount", info.dirPrice, &DIRPRICE_DATA::noDiscount, GetSlashedValue); + AddAOSParser(propertyParsers, "threshold", info.dirPrice, &DIRPRICE_DATA::threshold, GetSlashedValue); } //----------------------------------------------------------------------------- GET_TARIFF::PARSER::~PARSER() @@ -178,7 +207,11 @@ if (strcasecmp(el, "tariff") == 0) error = "Tariff not found."; } else + { parsingAnswer = true; + if (strcasecmp(attr[0], "name") == 0) + info.tariffConf.name = attr[1]; + } } else parsingAnswer = true; @@ -187,6 +220,6 @@ if (strcasecmp(el, "tariff") == 0) //----------------------------------------------------------------------------- void GET_TARIFF::PARSER::ParseTariffParams(const char * el, const char ** attr) { -if (!TryParse(propertyParsers, ToLower(el), attr)) - error = "Invalid parameter."; +if (!TryParse(propertyParsers, ToLower(el), attr, encoding)) + error = std::string("Invalid parameter '") + el + "'."; }