From: Maxim Mamontov Date: Fri, 18 Oct 2013 21:06:31 +0000 (+0300) Subject: Improved CHG_USER. X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/94e901e9f7b263786e227baa3c019fffc85c6b7d?ds=inline Improved CHG_USER. --- diff --git a/include/stg/user_conf.h b/include/stg/user_conf.h index dcc19afa..5d65fcee 100644 --- a/include/stg/user_conf.h +++ b/include/stg/user_conf.h @@ -77,7 +77,7 @@ struct USER_CONF_RES group(), credit(), nextTariff(), - userdata(USERDATA_NUM, RESETABLE()), + userdata(USERDATA_NUM), creditExpire(), ips() { @@ -100,10 +100,7 @@ struct USER_CONF_RES group = uc.group; credit = uc.credit; nextTariff = uc.nextTariff; - for (int i = 0; i < USERDATA_NUM; i++) - { - userdata[i] = uc.userdata[i]; - } + for (size_t i = 0; i < USERDATA_NUM; i++) userdata[i] = uc.userdata[i]; creditExpire = uc.creditExpire; ips = uc.ips; return *this; diff --git a/include/stg/user_stat.h b/include/stg/user_stat.h index 4c06155d..ff020dc7 100644 --- a/include/stg/user_stat.h +++ b/include/stg/user_stat.h @@ -29,6 +29,8 @@ #include #include +#include +#include #include "os_int.h" #include "resetable.h" @@ -140,6 +142,8 @@ struct USER_STAT //----------------------------------------------------------------------------- typedef std::map TRAFF_STAT; //----------------------------------------------------------------------------- +typedef std::pair CASH_INFO; +//----------------------------------------------------------------------------- struct USER_STAT_RES { USER_STAT_RES() @@ -186,6 +190,8 @@ struct USER_STAT_RES } RESETABLE cash; + RESETABLE cashAdd; + RESETABLE cashSet; RESETABLE freeMb; RESETABLE lastCashAdd; RESETABLE lastCashAddTime; diff --git a/include/stg/user_traff.h b/include/stg/user_traff.h index 4d5efe62..48843a49 100644 --- a/include/stg/user_traff.h +++ b/include/stg/user_traff.h @@ -73,6 +73,7 @@ return o; class DIR_TRAFF_RES { public: + typedef RESETABLE value_type; typedef RESETABLE ValueType; typedef std::vector ContainerType; typedef ContainerType::size_type IndexType; @@ -86,6 +87,7 @@ public: } const ValueType & operator[](IndexType idx) const { return traff[idx]; } ValueType & operator[](IndexType idx) { return traff[idx]; } + IndexType size() const { return traff.size(); } DIR_TRAFF GetData() const { DIR_TRAFF res; diff --git a/projects/sgconf/common_sg.cpp b/projects/sgconf/common_sg.cpp index b899fc06..e407a716 100644 --- a/projects/sgconf/common_sg.cpp +++ b/projects/sgconf/common_sg.cpp @@ -437,12 +437,14 @@ bool ProcessSetUser(const std::string & server, int port, const std::string & login, const std::string & password, - const std::string & str) + const std::string & user, + const USER_CONF_RES & conf, + const USER_STAT_RES & stat) { SERVCONF sc(server, port, login, password); ResultData data; -int res = sc.ChgUser(str.c_str(), ResultCallback, &data); +int res = sc.ChgUser(user, conf, stat, ResultCallback, &data); if (res == st_ok && data.result) { diff --git a/projects/sgconf/common_sg.h b/projects/sgconf/common_sg.h index 59e27a37..323a8cf8 100644 --- a/projects/sgconf/common_sg.h +++ b/projects/sgconf/common_sg.h @@ -34,6 +34,9 @@ #include +struct USER_CONF_RES; +struct USER_STAT_RES; + void UsageConf(); void UsageInfo(); @@ -63,7 +66,9 @@ bool ProcessSetUser(const std::string & server, int port, const std::string & admLogin, const std::string & admPasswd, - const std::string & str); + const std::string & user, + const USER_CONF_RES & conf, + const USER_STAT_RES & stat); bool ProcessSendMessage(const std::string & server, uint16_t port, const std::string & login, const std::string & password, diff --git a/projects/sgconf/main.cpp b/projects/sgconf/main.cpp index 8fc66b5c..2e7a13d0 100644 --- a/projects/sgconf/main.cpp +++ b/projects/sgconf/main.cpp @@ -24,10 +24,13 @@ $Date: 2010/03/25 14:37:43 $ */ -#include -#include -#include -#include +#include "request.h" +#include "common_sg.h" +#include "sg_error_codes.h" + +#include "stg/user_conf.h" +#include "stg/user_stat.h" +#include "stg/common.h" #include #include @@ -37,16 +40,19 @@ #include #include -#include "stg/common.h" -#include "request.h" -#include "common_sg.h" -#include "sg_error_codes.h" +#include +#include +#include +#include namespace { template -struct ARRAY_TYPE; +struct ARRAY_TYPE +{ +typedef typename T::value_type type; +}; template struct ARRAY_TYPE @@ -150,35 +156,28 @@ struct option long_options_set[] = { {0, 0, 0, 0}}; //----------------------------------------------------------------------------- -double ParseCash(const char * c, string * message) +CASH_INFO ParseCash(const char * str) { //-c 123.45:log message -double cash; -char * msg; -char * str; -str = new char[strlen(c) + 1]; - -strncpy(str, c, strlen(c)); -str[strlen(c)] = 0; - -msg = strchr(str, ':'); - -if (msg) +std::string cashString; +std::string message; +const char * pos = strchr(str, ':'); +if (pos != NULL) { - *message = msg + 1; - str[msg - str] = 0; + cashString.append(str, pos); + message.append(pos + 1); } else - *message = ""; + cashString = str; -if (strtodouble2(str, cash) != 0) +double cash = 0; +if (strtodouble2(cashString, cash) != 0) { - printf("Incorrect cash value %s\n", c); + printf("Incorrect cash value %s\n", str); exit(PARAMETER_PARSING_ERR_CODE); } -delete[] str; -return cash; +return CASH_INFO(cash, message); } //----------------------------------------------------------------------------- double ParseCredit(const char * c) @@ -228,63 +227,24 @@ if (!(dp[1] == 0 && (dp[0] == '1' || dp[0] == '0'))) return dp[0] - '0'; } //----------------------------------------------------------------------------- -string ParseTariff(const char * t, int &chgType) +void ParseTariff(const char * str, RESETABLE & tariffName, RESETABLE & nextTariff) { -int l = strlen(t); -char * s; -s = new char[l]; -char * s1, * s2; -string ss; - -strcpy(s, t); - -s1 = strtok(s, ":"); - -if (strlen(s1) >= TARIFF_NAME_LEN) +const char * pos = strchr(str, ':'); +if (pos != NULL) { - printf("Tariff name too big %s\n", s1); - exit(PARAMETER_PARSING_ERR_CODE); - } - -//*tariff = s; - -if (CheckLogin(s1)) - { - printf("Incorrect tariff value %s\n", t); - exit(PARAMETER_PARSING_ERR_CODE); - } - -s2 = strtok(NULL, ":"); - -chgType = -1; - -if (s2 == NULL) - { - chgType = TARIFF_NOW; - ss = s; - delete[] s; - return ss; - } - - -if (strcmp(s2, "now") == 0) - chgType = TARIFF_NOW; - -if (strcmp(s2, "delayed") == 0) - chgType = TARIFF_DEL; - -if (strcmp(s2, "recalc") == 0) - chgType = TARIFF_REC; - -if (chgType < 0) - { - printf("Incorrect tariff value %s\n", t); - exit(PARAMETER_PARSING_ERR_CODE); + std::string tariff(str, pos); + if (strcmp(pos + 1, "now") == 0) + tariffName = tariff; + else if (strcmp(pos + 1, "delayed") == 0) + nextTariff = tariff; + else + { + printf("Incorrect tariff value '%s'. Should be '', ':now' or ':delayed'.\n", str); + exit(PARAMETER_PARSING_ERR_CODE); + } } - -ss = s; -delete[] s; -return ss; +else + tariffName = str; } //----------------------------------------------------------------------------- time_t ParseCreditExpire(const char * str) @@ -900,6 +860,8 @@ const char * short_options_set = "s:p:a:w:u:c:r:t:m:o:d:i:e:v:nlN:A:D:L:P:G:I:S: int missedOptionArg = false; +USER_CONF_RES conf; +USER_STAT_RES stat; while (1) { int option_index = -1; @@ -929,7 +891,7 @@ while (1) break; case 'o': //change user password - req.usrPasswd = ParsePassword(optarg); + conf.password = ParsePassword(optarg); break; case 'u': //user @@ -937,31 +899,31 @@ while (1) break; case 'c': //add cash - req.cash = ParseCash(optarg, &req.message); + stat.cashAdd = ParseCash(optarg); break; case 'v': //set cash - req.setCash = ParseCash(optarg, &req.message); + stat.cashSet = ParseCash(optarg); break; case 'r': //credit - req.credit = ParseCredit(optarg); + conf.credit = ParseCredit(optarg); break; case 'E': //credit expire - req.creditExpire = ParseCreditExpire(optarg); + conf.creditExpire = ParseCreditExpire(optarg); break; case 'd': //down - req.down = ParseDownPassive(optarg); + conf.disabled = ParseDownPassive(optarg); break; case 'i': //passive - req.passive = ParseDownPassive(optarg); + conf.passive = ParseDownPassive(optarg); break; case 't': //tariff - req.tariff = ParseTariff(optarg, req.chgTariff); + ParseTariff(optarg, conf.tariffName, conf.nextTariff); break; case 'm': //message @@ -971,7 +933,7 @@ while (1) break; case 'e': //Prepaid Traffic - req.prepaidTraff = ParsePrepaidTraffic(optarg); + stat.freeMb = ParsePrepaidTraffic(optarg); break; case 'n': //Create User @@ -984,69 +946,63 @@ while (1) case 'N': //Note ParseAnyString(optarg, &str, "koi8-ru"); - req.note = str; + conf.note = str; break; case 'A': //nAme ParseAnyString(optarg, &str, "koi8-ru"); - req.name = str; + conf.realName = str; break; case 'D': //aDdress ParseAnyString(optarg, &str, "koi8-ru"); - req.address = str; + conf.address = str; break; case 'L': //emaiL ParseAnyString(optarg, &str, "koi8-ru"); - req.email = str; - //printf("EMAIL=%s\n", optarg); + conf.email = str; break; case 'P': //phone ParseAnyString(optarg, &str); - req.phone = str; + conf.phone = str; break; case 'G': //Group ParseAnyString(optarg, &str, "koi8-ru"); - req.group = str; + conf.group = str; break; case 'I': //IP-address of user ParseAnyString(optarg, &str); - req.ips = str; + conf.ips = StrToIPS(str); break; case 'S': - req.disableDetailStat = ParseDownPassive(optarg); + conf.disabledDetailStat = ParseDownPassive(optarg); break; case 'O': - req.alwaysOnline = ParseDownPassive(optarg); + conf.alwaysOnline = ParseDownPassive(optarg); break; case 500: //U - SetArrayItem(req.sessionUpload, optarg, ParseTraff(argv[optind++])); - //req.sessionUpload[optarg] = ParseTraff(argv[optind++]); + SetArrayItem(stat.sessionUp, optarg, ParseTraff(argv[optind++])); break; case 501: - SetArrayItem(req.sessionDownload, optarg, ParseTraff(argv[optind++])); - //req.sessionDownload[optarg] = ParseTraff(argv[optind++]); + SetArrayItem(stat.sessionDown, optarg, ParseTraff(argv[optind++])); break; case 502: - SetArrayItem(req.monthUpload, optarg, ParseTraff(argv[optind++])); - //req.monthUpload[optarg] = ParseTraff(argv[optind++]); + SetArrayItem(stat.monthUp, optarg, ParseTraff(argv[optind++])); break; case 503: - SetArrayItem(req.monthDownload, optarg, ParseTraff(argv[optind++])); - //req.monthDownload[optarg] = ParseTraff(argv[optind++]); + SetArrayItem(stat.monthDown, optarg, ParseTraff(argv[optind++])); break; case 700: //UserData ParseAnyString(argv[optind++], &str); - SetArrayItem(req.userData, optarg, str); - //req.userData[optarg] = str; + SetArrayItem(conf.userdata, optarg, str); break; case '?': @@ -1082,11 +1038,10 @@ const int rLen = 20000; char rstr[rLen]; memset(rstr, 0, rLen); -CreateRequestSet(&req, rstr); if (isMessage) return ProcessSendMessage(req.server.data(), req.port.data(), req.admLogin.data(), req.admPasswd.data(), req.login.data(), req.usrMsg.data()); -return ProcessSetUser(req.server.data(), req.port.data(), req.admLogin.data(), req.admPasswd.data(), rstr); +return ProcessSetUser(req.server.data(), req.port.data(), req.admLogin.data(), req.admPasswd.data(), req.login.data(), conf, stat); } //----------------------------------------------------------------------------- int main(int argc, char **argv) diff --git a/stglibs/common.lib/include/stg/common.h b/stglibs/common.lib/include/stg/common.h index 524a3431..c4c7e1b7 100644 --- a/stglibs/common.lib/include/stg/common.h +++ b/stglibs/common.lib/include/stg/common.h @@ -56,9 +56,8 @@ const char * IntToKMG(int64_t a, int statType = ST_F); const char * LogDate(time_t t); int ParesTimeStat(const char * str); int IsTimeStat(struct tm * t, int statTime); -/*bool IsDigit(char c); -bool IsAlpha(char c);*/ -int strtodouble2(const char * s, double &a); +int strtodouble2(const char * str, double & value); +inline int strtodouble2(const std::string & str, double & value) { return strtodouble2(str.c_str(), value); } int printfd(const char * __file__, const char * fmt, ...); void Encode12(char * dst, const char * src, size_t srcLen); void Decode21(char * dst, const char * src); @@ -76,7 +75,6 @@ void WinToKOI(const std::string & s1, std::string * s2); int DaysInMonth(unsigned year, unsigned mon); int DaysInCurrentMonth(); int Min8(int a); -//char * inet_ntostr(unsigned long); std::string inet_ntostring(uint32_t); uint32_t inet_strington(const std::string & value); int strprintf(std::string * str, const char * fmt, ...); diff --git a/stglibs/srvconf.lib/include/stg/servconf.h b/stglibs/srvconf.lib/include/stg/servconf.h index 63987fd8..9c9acb7a 100644 --- a/stglibs/srvconf.lib/include/stg/servconf.h +++ b/stglibs/srvconf.lib/include/stg/servconf.h @@ -34,6 +34,9 @@ #include +struct USER_CONF_RES; +struct USER_STAT_RES; + namespace STG { @@ -49,12 +52,17 @@ public: int GetAdmins(GET_ADMINS::CALLBACK f, void * data); int GetAdmin(const std::string & login, GET_ADMIN::CALLBACK f, void * data); int ChgAdmin(const ADMIN_CONF_RES & conf, SIMPLE::CALLBACK f, void * data); - int AddAdmin(const std::string & login, const ADMIN_CONF & conf, SIMPLE::CALLBACK f, void * data); + int AddAdmin(const std::string & login, + const ADMIN_CONF_RES & conf, + SIMPLE::CALLBACK f, void * data); int DelAdmin(const std::string & login, SIMPLE::CALLBACK f, void * data); int GetUsers(GET_USERS::CALLBACK f, void * data); int GetUser(const std::string & login, GET_USER::CALLBACK f, void * data); - int ChgUser(const std::string & request, SIMPLE::CALLBACK f, void * data); + int ChgUser(const std::string & login, + const USER_CONF_RES & conf, + const USER_STAT_RES & stat, + SIMPLE::CALLBACK f, void * data); int DelUser(const std::string & login, SIMPLE::CALLBACK f, void * data); int AddUser(const std::string & login, SIMPLE::CALLBACK f, void * data); int AuthBy(const std::string & login, AUTH_BY::CALLBACK f, void * data); diff --git a/stglibs/srvconf.lib/parsers/chg_admin.cpp b/stglibs/srvconf.lib/parsers/chg_admin.cpp index 445ea280..a4265efa 100644 --- a/stglibs/srvconf.lib/parsers/chg_admin.cpp +++ b/stglibs/srvconf.lib/parsers/chg_admin.cpp @@ -35,6 +35,6 @@ if (!conf.login.empty()) if (!conf.password.empty()) params += " password=\"" + conf.password.data() + "\""; if (!conf.priv.empty()) - params += " priv=\"" + x2str(conf.priv.data().ToInt()) + "\""; + params += " priv=\"" + unsigned2str(conf.priv.data().ToInt()) + "\""; return params; } diff --git a/stglibs/srvconf.lib/parsers/chg_user.cpp b/stglibs/srvconf.lib/parsers/chg_user.cpp index a656c287..a9fddf15 100644 --- a/stglibs/srvconf.lib/parsers/chg_user.cpp +++ b/stglibs/srvconf.lib/parsers/chg_user.cpp @@ -21,10 +21,34 @@ #include "chg_user.h" +#include "stg/user_conf.h" +#include "stg/user_stat.h" + +#include + #include using namespace STG; +namespace +{ + +template +void appendResetable(std::ostream & stream, const std::string & name, const T & value) +{ +if (!value.empty()) + stream << "<" << name << " value=\"" << value.data() << "\"/>"; +} + +template +void appendResetable(std::ostream & stream, const std::string & name, size_t suffix, const T & value) +{ +if (!value.empty()) + stream << "<" << name << suffix << " value=\"" << value.data() << "\"/>"; +} + +} // namespace anonymous + CHG_USER::PARSER::PARSER(SIMPLE::CALLBACK f, void * d) : callback(f), data(d), @@ -61,3 +85,63 @@ if (attr && attr[0] && attr[1]) else callback(false, "Invalid response.", data); } + +std::string CHG_USER::Serialize(const USER_CONF_RES & conf, const USER_STAT_RES & stat) +{ +std::ostringstream stream; + +// Conf + +appendResetable(stream, "credit", conf.credit); +appendResetable(stream, "creditExpire", conf.creditExpire); +appendResetable(stream, "password", conf.password); +appendResetable(stream, "down", conf.disabled); // TODO: down -> disabled +appendResetable(stream, "passive", conf.passive); +appendResetable(stream, "disableDetailStat", conf.disabledDetailStat); // TODO: disable -> disabled +appendResetable(stream, "aonline", conf.alwaysOnline); // TODO: aonline -> alwaysOnline +appendResetable(stream, "ip", conf.ips); // TODO: ip -> ips + +if (!conf.nextTariff.empty()) + stream << ""; +else if (!conf.tariffName.empty()) + stream << ""; + +appendResetable(stream, "note", conf.note); +appendResetable(stream, "name", conf.realName); // TODO: name -> realName +appendResetable(stream, "address", conf.address); +appendResetable(stream, "email", conf.email); +appendResetable(stream, "phone", conf.phone); +appendResetable(stream, "group", conf.group); + +for (size_t i = 0; i < conf.userdata.size(); ++i) + appendResetable(stream, "userdata", i, conf.userdata[i]); + +// Stat + +if (!stat.cashAdd.empty()) + stream << ""; +else if (!stat.cashSet.empty()) + stream << ""; + +appendResetable(stream, "freeMb", stat.freeMb); + +std::ostringstream traff; +for (size_t i = 0; i < stat.sessionUp.size(); ++i) + if (!stat.sessionUp[i].empty()) + traff << " SU" << i << "=\"" << stat.sessionUp[i].data() << "\""; +for (size_t i = 0; i < stat.sessionDown.size(); ++i) + if (!stat.sessionDown[i].empty()) + traff << " SD" << i << "=\"" << stat.sessionDown[i].data() << "\""; +for (size_t i = 0; i < stat.monthUp.size(); ++i) + if (!stat.monthUp[i].empty()) + traff << " MU" << i << "=\"" << stat.monthUp[i].data() << "\""; +for (size_t i = 0; i < stat.monthDown.size(); ++i) + if (!stat.monthDown[i].empty()) + traff << " MD" << i << "=\"" << stat.monthDown[i].data() << "\""; + +std::string traffData = traff.str(); +if (!traffData.empty()) + stream << ""; + +return stream.str(); +} diff --git a/stglibs/srvconf.lib/parsers/chg_user.h b/stglibs/srvconf.lib/parsers/chg_user.h index 6bc76fde..9f8e6b03 100644 --- a/stglibs/srvconf.lib/parsers/chg_user.h +++ b/stglibs/srvconf.lib/parsers/chg_user.h @@ -26,6 +26,9 @@ #include "stg/servconf_types.h" +struct USER_CONF_RES; +struct USER_STAT_RES; + namespace STG { namespace CHG_USER @@ -46,6 +49,8 @@ private: void ParseAnswer(const char * el, const char ** attr); }; +std::string Serialize(const USER_CONF_RES & conf, const USER_STAT_RES & stat); + } // namespace CHG_USER } // namespace STG diff --git a/stglibs/srvconf.lib/parsers/get_admin.cpp b/stglibs/srvconf.lib/parsers/get_admin.cpp index a728e7d1..41217dfb 100644 --- a/stglibs/srvconf.lib/parsers/get_admin.cpp +++ b/stglibs/srvconf.lib/parsers/get_admin.cpp @@ -90,6 +90,7 @@ if (depth == 0 && parsingAnswer) void GET_ADMIN::PARSER::ParseAdmin(const char * el, const char ** attr) { if (strcasecmp(el, "admin") == 0) + { if (attr && attr[0] && attr[1]) { if (strcasecmp(attr[1], "error") == 0) @@ -104,6 +105,7 @@ if (strcasecmp(el, "admin") == 0) } else parsingAnswer = true; + } } //----------------------------------------------------------------------------- void GET_ADMIN::PARSER::ParseAdminParams(const char * el, const char ** attr) diff --git a/stglibs/srvconf.lib/parsers/get_user.cpp b/stglibs/srvconf.lib/parsers/get_user.cpp index e1f06e8b..54cfc0f9 100644 --- a/stglibs/srvconf.lib/parsers/get_user.cpp +++ b/stglibs/srvconf.lib/parsers/get_user.cpp @@ -41,10 +41,10 @@ if (!attr) std::map props; for (size_t i = 0; i < DIR_NUM; ++i) { - props.insert(std::pair("su" + x2str(i), &value.su[i])); - props.insert(std::pair("sd" + x2str(i), &value.sd[i])); - props.insert(std::pair("mu" + x2str(i), &value.mu[i])); - props.insert(std::pair("md" + x2str(i), &value.md[i])); + props.insert(std::pair("su" + unsigned2str(i), &value.su[i])); + props.insert(std::pair("sd" + unsigned2str(i), &value.sd[i])); + props.insert(std::pair("mu" + unsigned2str(i), &value.mu[i])); + props.insert(std::pair("md" + unsigned2str(i), &value.md[i])); } size_t pos = 0; while (attr[pos]) @@ -90,7 +90,7 @@ GET_USER::PARSER::PARSER(CALLBACK f, void * d) AddParser(propertyParsers, "traff", info.stat); for (size_t i = 0; i < USERDATA_NUM; ++i) - AddParser(propertyParsers, "userData" + x2str(i), info.userData[i], GetEncodedValue); + AddParser(propertyParsers, "userData" + unsigned2str(i), info.userData[i], GetEncodedValue); } //----------------------------------------------------------------------------- GET_USER::PARSER::~PARSER() @@ -127,6 +127,7 @@ if (depth == 0 && parsingAnswer) void GET_USER::PARSER::ParseUser(const char * el, const char ** attr) { if (strcasecmp(el, "user") == 0) + { if (attr && attr[0] && attr[1]) { if (strcasecmp(attr[1], "error") == 0) @@ -141,6 +142,7 @@ if (strcasecmp(el, "user") == 0) } else parsingAnswer = true; + } } //----------------------------------------------------------------------------- void GET_USER::PARSER::ParseUserParams(const char * el, const char ** attr) diff --git a/stglibs/srvconf.lib/parsers/server_info.cpp b/stglibs/srvconf.lib/parsers/server_info.cpp index da6b85e0..fbefb2d4 100644 --- a/stglibs/srvconf.lib/parsers/server_info.cpp +++ b/stglibs/srvconf.lib/parsers/server_info.cpp @@ -52,19 +52,23 @@ SERVER_INFO::PARSER::PARSER(CALLBACK f, void * d) 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); + AddParser(propertyParsers, "dir_name_" + unsigned2str(i), info.dirName[i], GetEncodedValue); } //----------------------------------------------------------------------------- int SERVER_INFO::PARSER::ParseStart(const char *el, const char **attr) { depth++; if (depth == 1) + { if (strcasecmp(el, "ServerInfo") == 0) parsingAnswer = true; + } else + { if (depth == 2 && parsingAnswer) if (!TryParse(propertyParsers, ToLower(el), attr)) error = "Invalid parameter."; + } return 0; } //----------------------------------------------------------------------------- diff --git a/stglibs/srvconf.lib/servconf.cpp b/stglibs/srvconf.lib/servconf.cpp index 950669f2..7aea7e19 100644 --- a/stglibs/srvconf.lib/servconf.cpp +++ b/stglibs/srvconf.lib/servconf.cpp @@ -129,7 +129,9 @@ int SERVCONF::ChgAdmin(const ADMIN_CONF_RES & conf, SIMPLE::CALLBACK f, void * d return pImpl->Exec("ChgAdmin", "", f, data); } -int SERVCONF::AddAdmin(const std::string & login, const ADMIN_CONF & conf, SIMPLE::CALLBACK f, void * data) +int SERVCONF::AddAdmin(const std::string & login, + const ADMIN_CONF_RES & conf, + SIMPLE::CALLBACK f, void * data) { int res = pImpl->Exec("AddAdmin", "", f, data); if (res != st_ok) @@ -154,9 +156,12 @@ int SERVCONF::GetUser(const std::string & login, GET_USER::CALLBACK f, void * da return pImpl->Exec("", f, data); } -int SERVCONF::ChgUser(const std::string & request, SIMPLE::CALLBACK f, void * data) +int SERVCONF::ChgUser(const std::string & login, + const USER_CONF_RES & conf, + const USER_STAT_RES & stat, + SIMPLE::CALLBACK f, void * data) { -return pImpl->Exec(request, f, data); +return pImpl->Exec("" + CHG_USER::Serialize(conf, stat) + "", f, data); } int SERVCONF::DelUser(const std::string & login, SIMPLE::CALLBACK f, void * data)