X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/ae21e8d6ad32d0bf3517127aef5cd8129b7507aa..908dee0db9288bb455e9f1b68dd81ab50897a677:/stglibs/srvconf.lib/parsers/property.h diff --git a/stglibs/srvconf.lib/parsers/property.h b/stglibs/srvconf.lib/parsers/property.h index 3469b987..df033c99 100644 --- a/stglibs/srvconf.lib/parsers/property.h +++ b/stglibs/srvconf.lib/parsers/property.h @@ -33,30 +33,48 @@ class BASE_PROPERTY_PARSER { public: virtual ~BASE_PROPERTY_PARSER() {} - virtual bool Parse(const char ** attr) = 0; + virtual bool Parse(const char ** attr, const std::string & attrName, const std::string & fromEncoding) = 0; }; template class PROPERTY_PARSER : public BASE_PROPERTY_PARSER { public: - typedef bool (* FUNC)(const char **, T &); + typedef bool (* FUNC)(const char **, T &, const std::string &); PROPERTY_PARSER(T & v, FUNC f) : value(v), func(f) {} - virtual bool Parse(const char ** attr) { return func(attr, value); } + PROPERTY_PARSER(T & v, FUNC f, const std::string & e) : value(v), func(f), encoding(e) {} + virtual bool Parse(const char ** attr, const std::string & attrName, const std::string & /*fromEncoding*/) { return func(attr, value, attrName); } private: T & value; FUNC func; + std::string encoding; }; +template <> +inline +bool PROPERTY_PARSER::Parse(const char ** attr, const std::string & attrName, const std::string & fromEncoding) +{ +if (!encoding.empty() && !fromEncoding.empty()) + { + std::string tmp; + if (!func(attr, value, attrName)) + return false; + value = IconvString(tmp, fromEncoding, encoding); + return true; + } +else + return func(attr, value, attrName); +} + typedef std::map PROPERTY_PARSERS; -bool CheckValue(const char ** attr); +bool CheckValue(const char ** attr, const std::string & attrName); template inline -bool GetValue(const char ** attr, T & value) +bool GetValue(const char ** attr, T & value, const std::string & attrName) { -if (CheckValue(attr)) +if (CheckValue(attr, attrName)) if (str2x(attr[1], value) < 0) return false; return true; @@ -64,9 +82,9 @@ return true; template <> inline -bool GetValue(const char ** attr, std::string & value) +bool GetValue(const char ** attr, std::string & value, const std::string & attrName) { -if (!CheckValue(attr)) +if (!CheckValue(attr, attrName)) return false; value = attr[1]; return true; @@ -74,29 +92,33 @@ return true; template <> inline -bool GetValue(const char ** attr, double & value) +bool GetValue(const char ** attr, double & value, const std::string & attrName) { -if (CheckValue(attr)) +if (CheckValue(attr, attrName)) if (strtodouble2(attr[1], value)) return false; return true; } -bool GetEncodedValue(const char ** attr, std::string & value); +bool GetEncodedValue(const char ** attr, std::string & value, const std::string & attrName); -bool GetIPValue(const char ** attr, uint32_t& value); +bool GetIPValue(const char ** attr, uint32_t& value, const std::string & attrName); template -void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER::FUNC & func = GetValue); +inline +void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER::FUNC & func = GetValue) +{ + parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER(value, func))); +} template inline -void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const typename PROPERTY_PARSER::FUNC & func) +void AddParser(PROPERTY_PARSERS & parsers, const std::string & name, T & value, const std::string & toEncoding, const typename PROPERTY_PARSER::FUNC & func = GetValue) { - parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER(value, func))); + parsers.insert(std::make_pair(ToLower(name), new PROPERTY_PARSER(value, func, toEncoding))); } -bool TryParse(PROPERTY_PARSERS & parsers, const std::string & name, const char ** attr); +bool TryParse(PROPERTY_PARSERS & parsers, const std::string & name, const char ** attr, const std::string & fromEncoding, const std::string & attrName = "value"); } // namespace STG