X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/e19d853bbf16b7ba8c58c71c1da488b9034e0fb3..e87b76d3a75c2833d2a646b38210584dc1a93624:/stglibs/srvconf.lib/parser_server_info.cpp diff --git a/stglibs/srvconf.lib/parser_server_info.cpp b/stglibs/srvconf.lib/parser_server_info.cpp index 8726c743..645f6099 100644 --- a/stglibs/srvconf.lib/parser_server_info.cpp +++ b/stglibs/srvconf.lib/parser_server_info.cpp @@ -24,6 +24,7 @@ #include "stg/common.h" #include // sprintf +#include #include @@ -34,99 +35,48 @@ const size_t UNAME_LEN = 256; const size_t SERV_VER_LEN = 64; const size_t DIRNAME_LEN = 16; -bool checkValue(const char ** attr) -{ -return attr && attr[0] && attr[1] && strcasecmp(attr[0], "value") == 0; -} - -int getIntValue(const char ** attr) -{ -int value = -1; -if (checkValue(attr)) - if (str2x(attr[1], value) < 0) - return -1; -return value; -} - -std::string getStringValue(const char ** attr) -{ -if (checkValue(attr)) - return attr[1]; -return ""; -} - } PARSER_SERVER_INFO::PARSER_SERVER_INFO() : callback(NULL), data(NULL), - depth(0) + depth(0), + parsingAnswer(false) { + AddParser(propertyParsers, "uname", info.uname); + AddParser(propertyParsers, "version", info.version); + AddParser(propertyParsers, "tariff", info.tariffType); + AddParser(propertyParsers, "dir_num", info.dirNum); + AddParser(propertyParsers, "users_num", info.usersNum); + AddParser(propertyParsers, "tariff_num", info.tariffNum); + + for (size_t i = 0; i < DIR_NUM; i++) + AddParser(propertyParsers, "dir_name_" + x2str(i), info.dirName[i], GetEncodedValue); } //----------------------------------------------------------------------------- int PARSER_SERVER_INFO::ParseStart(const char *el, const char **attr) { depth++; if (depth == 1) - { - if (strcasecmp(el, "ServerInfo") != 0) - { - //printf("%s\n", el); - } - } + if (strcasecmp(el, "ServerInfo") == 0) + parsingAnswer = true; else - { - if (depth == 2) - { - if (strcasecmp(el, "uname") == 0) - { - info.uname = getStringValue(attr); - return 0; - } - if (strcasecmp(el, "version") == 0) - { - info.version = getStringValue(attr); - return 0; - } - if (strcasecmp(el, "tariff") == 0) - { - info.tariffType = getIntValue(attr); - return 0; - } - if (strcasecmp(el, "dir_num") == 0) - { - info.dirNum = getIntValue(attr); - return 0; - } - if (strcasecmp(el, "users_num") == 0) - { - info.usersNum = getIntValue(attr); - return 0; - } - if (strcasecmp(el, "tariff_num") == 0) - { - info.tariffNum = getIntValue(attr); - return 0; - } - - for (int j = 0; j < DIR_NUM; j++) - { - char str[16]; - sprintf(str, "dir_name_%d", j); - if (strcasecmp(el, str) == 0) - ParseDirName(attr, j); - } - - } - } + if (depth == 2 && parsingAnswer) + if (!TryParse(propertyParsers, ToLower(el), attr)) + error = "Invalid parameter."; return 0; } //----------------------------------------------------------------------------- void PARSER_SERVER_INFO::ParseEnd(const char * /*el*/) { depth--; -if (depth == 0 && callback) - callback(info, data); +if (depth == 0 && parsingAnswer) + { + if (callback) + callback(error.empty(), error, info, data); + error.clear(); + parsingAnswer = false; + } } //----------------------------------------------------------------------------- void PARSER_SERVER_INFO::SetCallback(CALLBACK f, void * d) @@ -134,13 +84,3 @@ void PARSER_SERVER_INFO::SetCallback(CALLBACK f, void * d) callback = f; data = d; } -//----------------------------------------------------------------------------- -void PARSER_SERVER_INFO::ParseDirName(const char **attr, int d) -{ -if (checkValue(attr)) - { - char str[2 * DIRNAME_LEN + 1]; - Decode21(str, attr[1]); - info.dirName[d] = str; - } -}