From: Maxim Mamontov <faust.madf@gmail.com> Date: Fri, 20 Jun 2014 22:11:48 +0000 (+0300) Subject: Optimized sending answers in sgconfig. X-Git-Tag: 2.409~298 X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/d230cb2411b6d2d6603a930f165bbd3138831eeb Optimized sending answers in sgconfig. Conflicts: projects/stargazer/plugins/configuration/sgconfig/parser.cpp projects/stargazer/plugins/configuration/sgconfig/parser.h projects/stargazer/plugins/configuration/sgconfig/parser_auth_by.cpp projects/stargazer/plugins/configuration/sgconfig/parser_user_info.cpp projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp --- diff --git a/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp b/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp index 232c57d8..7ece6549 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/configproto.cpp @@ -49,7 +49,6 @@ CONFIGPROTO * cp = static_cast<CONFIGPROTO *>(data); if (cp->currParser) { - cp->currParser->SetAnswerList(&cp->answerList); cp->currParser->SetCurrAdmin(*cp->currAdmin); cp->currParser->ParseStart(data, el, attr); } @@ -57,7 +56,6 @@ else { for (size_t i = 0; i < cp->dataParser.size(); i++) { - cp->dataParser[i]->SetAnswerList(&cp->answerList); cp->dataParser[i]->SetCurrAdmin(*cp->currAdmin); cp->dataParser[i]->Reset(); if (cp->dataParser[i]->ParseStart(data, el, attr) == 0) diff --git a/projects/stargazer/plugins/configuration/sgconfig/configproto.h b/projects/stargazer/plugins/configuration/sgconfig/configproto.h index 7f6929fe..4b93d675 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/configproto.h +++ b/projects/stargazer/plugins/configuration/sgconfig/configproto.h @@ -84,13 +84,12 @@ private: int RecvLoginS(int sock); int SendLoginSAnswer(int sock, int err); int RecvData(int sock); - int SendDataAnswer(int sock); - void SendError(const char * text); + int SendDataAnswer(int sock, const std::string & answer); + int SendError(int sock, const std::string & text); void WriteLogAccessFailed(uint32_t ip); int ParseCommand(); - std::list<std::string> answerList; std::list<std::string> requestList; uint32_t adminIP; std::string adminLogin; diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser.cpp index 5499c382..360d07c7 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser.cpp @@ -17,12 +17,142 @@ #include "parser.h" #define UNAME_LEN (256) + +namespace +{ + +std::string UserToXML(const USER & user, bool loginInStart, bool showPass, time_t lastTime = 0) +{ +std::string answer; + +if (loginInStart) + answer += "<User result=\"ok\">"; +else + answer += "<User result=\"ok\" login=\"" + user.GetLogin() + "\">"; + +answer += "<Login value=\"" + user.GetLogin() + "\"/>"; + +if (user.GetProperty().password.ModificationTime() > lastTime) + { + if (showPass) + answer += "<Password value=\"" + user.GetProperty().password.Get() + "\" />"; + else + answer += "<Password value=\"++++++\"/>"; + } + +if (user.GetProperty().cash.ModificationTime() > lastTime) + answer += "<Cash value=\"" + x2str(user.GetProperty().cash.Get()) + "\"/>"; +if (user.GetProperty().freeMb.ModificationTime() > lastTime) + answer += "<FreeMb value=\"" + x2str(user.GetProperty().freeMb.Get()) + "\"/>"; +if (user.GetProperty().credit.ModificationTime() > lastTime) + answer += "<Credit value=\"" + x2str(user.GetProperty().credit.Get()) + "\"/>"; + +if (user.GetProperty().nextTariff.Get() != "") + { + if (user.GetProperty().tariffName.ModificationTime() > lastTime || + user.GetProperty().nextTariff.ModificationTime() > lastTime) + answer += "<Tariff value=\"" + user.GetProperty().tariffName.Get() + "/" + user.GetProperty().nextTariff.Get() + "\"/>"; + } +else + { + if (user.GetProperty().tariffName.ModificationTime() > lastTime) + answer += "<Tariff value=\"" + user.GetProperty().tariffName.Get() + "\"/>"; + } + +if (user.GetProperty().note.ModificationTime() > lastTime) + answer += "<Note value=\"" + Encode12str(user.GetProperty().note) + "\"/>"; +if (user.GetProperty().phone.ModificationTime() > lastTime) + answer += "<Phone value=\"" + Encode12str(user.GetProperty().phone) + "\"/>"; +if (user.GetProperty().address.ModificationTime() > lastTime) + answer += "<Address value=\"" + Encode12str(user.GetProperty().address) + "\"/>"; +if (user.GetProperty().email.ModificationTime() > lastTime) + answer += "<Email value=\"" + Encode12str(user.GetProperty().email) + "\"/>"; + +std::vector<const USER_PROPERTY_LOGGED<std::string> *> userdata; +userdata.push_back(user.GetProperty().userdata0.GetPointer()); +userdata.push_back(user.GetProperty().userdata1.GetPointer()); +userdata.push_back(user.GetProperty().userdata2.GetPointer()); +userdata.push_back(user.GetProperty().userdata3.GetPointer()); +userdata.push_back(user.GetProperty().userdata4.GetPointer()); +userdata.push_back(user.GetProperty().userdata5.GetPointer()); +userdata.push_back(user.GetProperty().userdata6.GetPointer()); +userdata.push_back(user.GetProperty().userdata7.GetPointer()); +userdata.push_back(user.GetProperty().userdata8.GetPointer()); +userdata.push_back(user.GetProperty().userdata9.GetPointer()); + +for (size_t i = 0; i < userdata.size(); i++) + if (userdata[i]->ModificationTime() > lastTime) + answer += "<UserData" + x2str(i) + " value=\"" + Encode12str(userdata[i]->Get()) + "\" />"; + +if (user.GetProperty().realName.ModificationTime() > lastTime) + answer += "<Name value=\"" + Encode12str(user.GetProperty().realName) + "\"/>"; +if (user.GetProperty().group.ModificationTime() > lastTime) + answer += "<Group value=\"" + Encode12str(user.GetProperty().group) + "\"/>"; +if (user.GetConnectedModificationTime() > lastTime) + answer += std::string("<Status value=\"") + (user.GetConnected() ? "1" : "0") + "\"/>"; +if (user.GetProperty().alwaysOnline.ModificationTime() > lastTime) + answer += std::string("<AOnline value=\"") + (user.GetProperty().alwaysOnline.Get() ? "1" : "0") + "\"/>"; +if (user.GetCurrIPModificationTime() > lastTime) + answer += "<CurrIP value=\"" + inet_ntostring(user.GetCurrIP()) + "\"/>"; +if (user.GetPingTime() > lastTime) + answer += "<PingTime value=\"" + x2str(user.GetPingTime()) + "\"/>"; +if (user.GetProperty().ips.ModificationTime() > lastTime) + answer += "<IP value=\"" + user.GetProperty().ips.Get().GetIpStr() + "\"/>"; + +answer += "<Traff"; +const DIR_TRAFF & upload(user.GetProperty().down.Get()); +const DIR_TRAFF & download(user.GetProperty().up.Get()); +if (user.GetProperty().up.ModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " MU" + x2str(j) + "=\"" + x2str(upload[j]) + "\""; +if (user.GetProperty().down.ModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " MD" + x2str(j) + "=\"" + x2str(download[j]) + "\""; +if (user.GetSessionUploadModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " SU" + x2str(j) + "=\"" + x2str(user.GetSessionUpload()[j]) + "\""; +if (user.GetSessionDownloadModificationTime() > lastTime) + for (size_t j = 0; j < DIR_NUM; j++) + answer += " SD" + x2str(j) + "=\"" + x2str(user.GetSessionDownload()[j]) + "\""; +answer += "/>"; + +if (user.GetProperty().disabled.ModificationTime() > lastTime) + answer += std::string("<Down value=\"") + (user.GetProperty().disabled.Get() ? "1" : "0") + "\"/>"; +if (user.GetProperty().disabledDetailStat.ModificationTime() > lastTime) + answer += std::string("<DisableDetailStat value=\"") + (user.GetProperty().disabledDetailStat.Get() ? "1" : "0") + "\"/>"; +if (user.GetProperty().passive.ModificationTime() > lastTime) + answer += std::string("<Passive value=\"") + (user.GetProperty().passive.Get() ? "1" : "0") + "\"/>"; +if (user.GetProperty().lastCashAdd.ModificationTime() > lastTime) + answer += "<LastCash value=\"" + x2str(user.GetProperty().lastCashAdd.Get()) + "\"/>"; +if (user.GetProperty().lastCashAddTime.ModificationTime() > lastTime) + answer += "<LastTimeCash value=\"" + x2str(user.GetProperty().lastCashAddTime.Get()) + "\"/>"; +if (user.GetProperty().lastActivityTime.ModificationTime() > lastTime) + answer += "<LastActivityTime value=\"" + x2str(user.GetProperty().lastActivityTime.Get()) + "\"/>"; +if (user.GetProperty().creditExpire.ModificationTime() > lastTime) + answer += "<CreditExpire value=\"" + x2str(user.GetProperty().creditExpire.Get()) + "\"/>"; + +if (lastTime == 0) + { + answer += "<AuthorizedBy>"; + std::vector<std::string> list(user.GetAuthorizers()); + for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it) + answer += "<Auth name=\"" + *it + "\"/>"; + answer += "</AuthorizedBy>"; + } + +answer += "</User>"; + +return answer; +} + +} // namespace anonymous + //----------------------------------------------------------------------------- // GET SERVER INFO //----------------------------------------------------------------------------- int PARSER_GET_SERVER_INFO::ParseStart(void *, const char *el, const char **) { -answerList->erase(answerList->begin(), answerList->end()); +answer.clear(); if (strcasecmp(el, "GetServerInfo") == 0) { return 0; @@ -42,7 +172,6 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_SERVER_INFO::CreateAnswer() { -char s[UNAME_LEN + 128]; char un[UNAME_LEN]; struct utsname utsn; @@ -57,40 +186,20 @@ strcat(un, utsn.machine); strcat(un, " "); strcat(un, utsn.nodename); -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); -answerList->push_back("<ServerInfo>"); +answer.clear(); +answer += "<ServerInfo>"; +answer += std::string("<version value=\"") + SERVER_VERSION + "\"/>"; +answer += "<tariff_num value=\"" + x2str(tariffs->Count()) + "\"/>"; +answer += "<tariff value=\"2\"/>"; +answer += "<user_num value=\"" + x2str(users->Count()) + "\"/>"; +answer += std::string("<uname value=\"") + un + "\"/>"; +answer += "<dir_num value=\"" + x2str(DIR_NUM) + "\"/>"; +answer += "<day_fee value=\"" + x2str(settings->GetDayFee()) + "\"/>"; -sprintf(s, "<version value=\"%s\"/>", SERVER_VERSION); -answerList->push_back(s); +for (size_t i = 0; i< DIR_NUM; i++) + answer += "<dir_name_" + x2str(i) + " value=\"" + Encode12str(settings->GetDirName(i)) + "\"/>"; -sprintf(s, "<tariff_num value=\"%llu\"/>", static_cast<unsigned long long>(tariffs->Count())); -answerList->push_back(s); - -sprintf(s, "<tariff value=\"%d\"/>", 2); -answerList->push_back(s); - -sprintf(s, "<users_num value=\"%llu\"/>", static_cast<unsigned long long>(users->Count())); -answerList->push_back(s); - -sprintf(s, "<uname value=\"%s\"/>", un); -answerList->push_back(s); - -sprintf(s, "<dir_num value=\"%d\"/>", DIR_NUM); -answerList->push_back(s); - -sprintf(s, "<day_fee value=\"%d\"/>", settings->GetDayFee()); -answerList->push_back(s); - -for (int i = 0; i< DIR_NUM; i++) - { - std::string dn2e; - Encode12str(dn2e, settings->GetDirName(i)); - sprintf(s, "<dir_name_%d value=\"%s\"/>", i, dn2e.c_str()); - answerList->push_back(s); - } - -answerList->push_back("</ServerInfo>"); +answer += "</ServerInfo>"; } //----------------------------------------------------------------------------- // GET USER @@ -124,177 +233,17 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_USER::CreateAnswer() { -std::string s; -std::string enc; - USER_PTR u; -answerList->erase(answerList->begin(), answerList->end()); +answer.clear(); if (users->FindByName(login, &u)) { - s = "<user result=\"error\"/>"; - answerList->push_back(s); + answer = "<User result=\"error\" reason=\"User not found.\"/>"; return; } -s = "<user result=\"ok\">"; -answerList->push_back(s); - -s = "<login value=\"" + u->GetLogin() + "\"/>"; -answerList->push_back(s); - -if (currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd) - s = "<password value=\"" + u->GetProperty().password.Get() + "\" />"; -else - s = "<password value=\"++++++\"/>"; -answerList->push_back(s); - -strprintf(&s, "<cash value=\"%f\" />", u->GetProperty().cash.Get()); -answerList->push_back(s); - -strprintf(&s, "<freemb value=\"%f\" />", u->GetProperty().freeMb.Get()); -answerList->push_back(s); - -strprintf(&s, "<credit value=\"%f\" />", u->GetProperty().credit.Get()); -answerList->push_back(s); - -if (u->GetProperty().nextTariff.Get() != "") - { - strprintf(&s, "<tariff value=\"%s/%s\" />", - u->GetProperty().tariffName.Get().c_str(), - u->GetProperty().nextTariff.Get().c_str()); - } -else - { - strprintf(&s, "<tariff value=\"%s\" />", - u->GetProperty().tariffName.Get().c_str()); - } - -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().note); -s = "<note value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().phone); -s = "<phone value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().address); -s = "<address value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().email); -s = "<email value=\"" + enc + "\" />"; -answerList->push_back(s); - - -std::vector<USER_PROPERTY_LOGGED<std::string> *> userdata; -userdata.push_back(u->GetProperty().userdata0.GetPointer()); -userdata.push_back(u->GetProperty().userdata1.GetPointer()); -userdata.push_back(u->GetProperty().userdata2.GetPointer()); -userdata.push_back(u->GetProperty().userdata3.GetPointer()); -userdata.push_back(u->GetProperty().userdata4.GetPointer()); -userdata.push_back(u->GetProperty().userdata5.GetPointer()); -userdata.push_back(u->GetProperty().userdata6.GetPointer()); -userdata.push_back(u->GetProperty().userdata7.GetPointer()); -userdata.push_back(u->GetProperty().userdata8.GetPointer()); -userdata.push_back(u->GetProperty().userdata9.GetPointer()); - -std::string tmpI; -for (unsigned i = 0; i < userdata.size(); i++) - { - Encode12str(enc, userdata[i]->Get()); - s = "<UserData" + x2str(i, tmpI) + " value=\"" + enc + "\" />"; - answerList->push_back(s); - } - -Encode12str(enc, u->GetProperty().realName); -s = "<name value=\"" + enc + "\" />"; -answerList->push_back(s); - -Encode12str(enc, u->GetProperty().group); -s = "<GROUP value=\"" + enc + "\" />"; -answerList->push_back(s); - -strprintf(&s, "<status value=\"%d\" />", u->GetConnected()); -answerList->push_back(s); - -strprintf(&s, "<aonline value=\"%d\" />", u->GetProperty().alwaysOnline.Get()); -answerList->push_back(s); - -strprintf(&s, "<currip value=\"%s\" />", inet_ntostring(u->GetCurrIP()).c_str()); -answerList->push_back(s); - -strprintf(&s, "<PingTime value=\"%lu\" />", u->GetPingTime()); -answerList->push_back(s); - -std::ostringstream sstr; -sstr << u->GetProperty().ips.Get(); -strprintf(&s, "<ip value=\"%s\" />", sstr.str().c_str()); -answerList->push_back(s); - -char * ss; -ss = new char[DIR_NUM*25*4 + 50]; -char st[50]; -sprintf(ss, "<traff"); -DIR_TRAFF upload; -DIR_TRAFF download; -download = u->GetProperty().down.Get(); -upload = u->GetProperty().up.Get(); - -for (int j = 0; j < DIR_NUM; j++) - { - std::string s; - x2str(upload[j], s); - sprintf(st, " MU%d=\"%s\"", j, s.c_str()); - strcat(ss, st); - - x2str(download[j], s); - sprintf(st, " MD%d=\"%s\"", j, s.c_str()); - strcat(ss, st); - - sprintf(st, " SU%d=\"0\"", j); - strcat(ss, st); - - sprintf(st, " SD%d=\"0\"", j); - strcat(ss, st); - } -strcat(ss, " />"); -answerList->push_back(ss); -delete[] ss; - -strprintf(&s, "<down value=\"%d\" />", u->GetProperty().disabled.Get()); -answerList->push_back(s); - -strprintf(&s, "<DisableDetailStat value=\"%d\" />", u->GetProperty().disabledDetailStat.Get()); -answerList->push_back(s); - -strprintf(&s, "<passive value=\"%d\" />", u->GetProperty().passive.Get()); -answerList->push_back(s); - -strprintf(&s, "<LastCash value=\"%f\" />", u->GetProperty().lastCashAdd.Get()); -answerList->push_back(s); - -strprintf(&s, "<LastTimeCash value=\"%ld\" />", u->GetProperty().lastCashAddTime.Get()); -answerList->push_back(s); - -strprintf(&s, "<LastActivityTime value=\"%ld\" />", u->GetProperty().lastActivityTime.Get()); -answerList->push_back(s); - -strprintf(&s, "<CreditExpire value=\"%ld\" />", u->GetProperty().creditExpire.Get()); -answerList->push_back(s); - -s = "<AuthorizedBy>"; -std::vector<std::string> list(u->GetAuthorizers()); -for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it) - s += "<Auth name=\"" + *it + "\">"; -s += "</AuthorizedBy>"; -answerList->push_back(s); - -strprintf(&s, "</user>"); -answerList->push_back(s); +answer = UserToXML(*u, false, currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd); } //----------------------------------------------------------------------------- // GET USERS @@ -347,20 +296,7 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_USERS::CreateAnswer() { -answerList->erase(answerList->begin(), answerList->end()); - -std::string s; -std::string userStart; -std::string traffStart; -std::string traffMiddle; -std::string traffFinish; -std::string middle; -std::string userFinish; - - -std::string enc; - -USER_PTR u; +answer.clear(); int h = users->OpenSearch(); if (!h) @@ -369,273 +305,20 @@ if (!h) users->CloseSearch(h); return; } -std::string updateTime; -x2str(time(NULL), updateTime); if (lastUpdateFound) - answerList->push_back("<Users LastUpdate=\"" + updateTime + "\">"); + answer += "<Users LastUpdate=\"" + x2str(time(NULL)) + "\">"; else - answerList->push_back("<Users>"); - -while (1) - { - if (users->SearchNext(h, &u)) - { - break; - } - userStart = "<user login=\"" + u->GetLogin() + "\">"; - middle = ""; + answer += "<Users>"; - if (u->GetProperty().password.ModificationTime() > lastUserUpdateTime) - { - if (currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd) - s = "<password value=\"" + u->GetProperty().password.Get() + "\" />"; - else - s = "<password value=\"++++++\"/>"; - middle += s; - } - - - if (u->GetProperty().cash.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<cash value=\"%f\" />", u->GetProperty().cash.Get()); - middle += s; - //printfd(__FILE__, "cash value=\"%f\"\n", u->GetProperty().cash.Get()); - } - - - if (u->GetProperty().freeMb.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<freemb value=\"%f\" />", u->GetProperty().freeMb.Get()); - middle += s; - } - - if (u->GetProperty().credit.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<credit value=\"%f\" />", u->GetProperty().credit.Get()); - middle += s; - } - - if (u->GetProperty().nextTariff.Get() != "") - { - if (u->GetProperty().tariffName.ModificationTime() > lastUserUpdateTime - || u->GetProperty().nextTariff.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<tariff value=\"%s/%s\" />", - u->GetProperty().tariffName.Get().c_str(), - u->GetProperty().nextTariff.Get().c_str()); - middle += s; - } - } - else - { - if (u->GetProperty().tariffName.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<tariff value=\"%s\" />", - u->GetProperty().tariffName.Get().c_str()); - middle += s; - } - } - - if (u->GetProperty().note.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().note); - strprintf(&s, "<note value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().phone.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().phone); - strprintf(&s, "<phone value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().address.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().address); - strprintf(&s, "<address value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().email.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().email); - strprintf(&s, "<email value=\"%s\" />", enc.c_str()); - middle += s; - } - - std::vector<USER_PROPERTY_LOGGED<std::string> *> userdata; - userdata.push_back(u->GetProperty().userdata0.GetPointer()); - userdata.push_back(u->GetProperty().userdata1.GetPointer()); - userdata.push_back(u->GetProperty().userdata2.GetPointer()); - userdata.push_back(u->GetProperty().userdata3.GetPointer()); - userdata.push_back(u->GetProperty().userdata4.GetPointer()); - userdata.push_back(u->GetProperty().userdata5.GetPointer()); - userdata.push_back(u->GetProperty().userdata6.GetPointer()); - userdata.push_back(u->GetProperty().userdata7.GetPointer()); - userdata.push_back(u->GetProperty().userdata8.GetPointer()); - userdata.push_back(u->GetProperty().userdata9.GetPointer()); - - std::string tmpI; - for (unsigned i = 0; i < userdata.size(); i++) - { - if (userdata[i]->ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, userdata[i]->Get()); - s = "<UserData" + x2str(i, tmpI) + " value=\"" + enc + "\" />"; - middle += s; - } - } - - if (u->GetProperty().realName.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().realName); - strprintf(&s, "<name value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().group.ModificationTime() > lastUserUpdateTime) - { - Encode12str(enc, u->GetProperty().group); - strprintf(&s, "<GROUP value=\"%s\" />", enc.c_str()); - middle += s; - } - - if (u->GetProperty().alwaysOnline.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<aonline value=\"%d\" />", u->GetProperty().alwaysOnline.Get()); - middle += s; - } - - if (u->GetCurrIPModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<currip value=\"%s\" />", inet_ntostring(u->GetCurrIP()).c_str()); - middle += s; - } - - - if (u->GetConnectedModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<status value=\"%d\" />", u->GetConnected()); - middle += s; - } - - if (u->GetPingTime() > lastUserUpdateTime) - { - strprintf(&s, "<PingTime value=\"%lu\" />", u->GetPingTime()); - middle += s; - } - - if (u->GetProperty().ips.ModificationTime() > lastUserUpdateTime) - { - std::ostringstream sstr; - sstr << u->GetProperty().ips.Get(); - strprintf(&s, "<ip value=\"%s\" />", sstr.str().c_str()); - middle += s; - } - - char st[50]; - traffStart = "<traff"; - DIR_TRAFF upload; - DIR_TRAFF download; - download = u->GetProperty().down.Get(); - upload = u->GetProperty().up.Get(); - traffMiddle = ""; - - if (u->GetProperty().up.ModificationTime() > lastUserUpdateTime) - { - for (int j = 0; j < DIR_NUM; j++) - { - std::string s; - x2str(upload[j], s); - sprintf(st, " MU%d=\"%s\" ", j, s.c_str()); - traffMiddle += st; - } - } - - if (u->GetProperty().down.ModificationTime() > lastUserUpdateTime) - { - for (int j = 0; j < DIR_NUM; j++) - { - x2str(download[j], s); - sprintf(st, " MD%d=\"%s\" ", j, s.c_str()); - traffMiddle += st; - } - } - - traffFinish = " />"; - if (traffMiddle.length() > 0) - { - middle += traffStart; - middle += traffMiddle; - middle += traffFinish; - } - - if (u->GetProperty().disabled.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<down value=\"%d\" />", u->GetProperty().disabled.Get()); - middle += s; - } - - if (u->GetProperty().disabledDetailStat.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<DisableDetailStat value=\"%d\" />", u->GetProperty().disabledDetailStat.Get()); - middle += s; - } - - //printfd(__FILE__, ">>>>> %s\n", s.c_str()); - - if (u->GetProperty().passive.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<passive value=\"%d\" />", u->GetProperty().passive.Get()); - middle += s; - } - - if (u->GetProperty().lastCashAdd.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<LastCash value=\"%f\" />", u->GetProperty().lastCashAdd.Get()); - middle += s; - } - - if (u->GetProperty().lastCashAddTime.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<LastTimeCash value=\"%ld\" />", u->GetProperty().lastCashAddTime.Get()); - middle += s; - } - - - if (u->GetProperty().lastActivityTime.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<LastActivityTime value=\"%ld\" />", u->GetProperty().lastActivityTime.Get()); - middle += s; - } - - if (u->GetProperty().creditExpire.ModificationTime() > lastUserUpdateTime) - { - strprintf(&s, "<CreditExpire value=\"%ld\" />", u->GetProperty().creditExpire.Get()); - middle += s; - } - - - userFinish = "</user>"; - - if (middle.length() > 0) - { - /*printfd(__FILE__, "login: %s\n", u->GetLogin().c_str()); - printfd(__FILE__, "middle: %s\n", middle.c_str());*/ +USER_PTR u; - answerList->push_back(userStart); - answerList->push_back(middle); - answerList->push_back(userFinish); - } - } +while (users->SearchNext(h, &u) == 0) + answer += UserToXML(*u, true, currAdmin->GetPriv()->userConf || currAdmin->GetPriv()->userPasswd, lastUserUpdateTime); users->CloseSearch(h); -//answerList->push_back("</Users>"); - -answerList->push_back("</Users>"); +answer += "</Users>"; } //----------------------------------------------------------------------------- // ADD USER @@ -686,17 +369,10 @@ depth = 0; //----------------------------------------------------------------------------- void PARSER_ADD_USER::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (CheckUserData() == 0) - { - answerList->push_back("<AddUser result=\"ok\"/>"); - } + answer = "<AddUser result=\"ok\"/>"; else - { - answerList->push_back("<AddUser result=\"error\" reason=\"Access denied\"/>"); - } + answer = "<AddUser result=\"error\" reason=\"Access denied\"/>"; } //----------------------------------------------------------------------------- int PARSER_ADD_USER::CheckUserData() @@ -978,22 +654,19 @@ return -1; //----------------------------------------------------------------------------- void PARSER_CHG_USER::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - switch (res) { case 0: - answerList->push_back("<SetUser result=\"ok\"/>"); + answer = "<SetUser result=\"ok\"/>"; break; case -1: - answerList->push_back("<SetUser result=\"error\"/>"); + answer = "<SetUser result=\"error\"/>"; break; case -2: - answerList->push_back("<SetUser result=\"error\"/>"); + answer = "<SetUser result=\"error\"/>"; break; default: - answerList->push_back("<SetUser result=\"error\"/>"); + answer = "<SetUser result=\"error\"/>"; break; } @@ -1340,22 +1013,18 @@ return 0; //----------------------------------------------------------------------------- void PARSER_SEND_MESSAGE::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); -//answerList->push_back("<SendMessageResult value=\"ok\"/>"); -// switch (result) { case res_ok: - answerList->push_back("<SendMessageResult value=\"ok\"/>"); + answer = "<SendMessageResult value=\"ok\"/>"; break; case res_params_error: printfd(__FILE__, "res_params_error\n"); - answerList->push_back("<SendMessageResult value=\"Parameters error\"/>"); + answer = "<SendMessageResult value=\"Parameters error.\"/>"; break; case res_unknown: printfd(__FILE__, "res_unknown\n"); - answerList->push_back("<SendMessageResult value=\"Unknown user\"/>"); + answer = "<SendMessageResult value=\"Unknown user.\"/>"; break; default: printfd(__FILE__, "res_default\n"); @@ -1404,9 +1073,9 @@ return -1; void PARSER_DEL_USER::CreateAnswer() { if (res) - answerList->push_back("<DelUser value=\"error\" reason=\"User not found\"/>"); + answer = "<DelUser value=\"error\" reason=\"User not found\"/>"; else - answerList->push_back("<DelUser value=\"ok\"/>"); + answer = "<DelUser value=\"ok\"/>"; } //----------------------------------------------------------------------------- /*void PARSERDELUSER::CreateAnswer(char * mes) @@ -1472,10 +1141,10 @@ return -1; //----------------------------------------------------------------------------- void PARSER_CHECK_USER::CreateAnswer() { -if (result) - answerList->push_back("<CheckUser value=\"Ok\"/>"); +if (error) + answer = std::string("<CheckUser value=\"Err\" reason=\"") + error + "\"/>"; else - answerList->push_back("<CheckUser value=\"Err\"/>"); + answer = "<CheckUser value=\"Ok\"/>"; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser.h b/projects/stargazer/plugins/configuration/sgconfig/parser.h index df3d7155..f854a759 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser.h +++ b/projects/stargazer/plugins/configuration/sgconfig/parser.h @@ -7,10 +7,6 @@ #ifndef PARSER_H #define PARSER_H -#include <list> -#include <string> -#include <vector> - #include "stg/resetable.h" #include "stg/const.h" #include "stg/store.h" @@ -19,6 +15,9 @@ #include "stg/users.h" #include "stg/message.h" +#include <string> +#include <vector> + class TARIFFS; class SETTINGS; @@ -33,14 +32,12 @@ public: store(NULL), settings(NULL), currAdmin(NULL), - depth(0), - answerList(NULL) + depth(0) {} virtual ~BASE_PARSER() {} virtual int ParseStart(void *data, const char *el, const char **attr) = 0; virtual int ParseEnd(void *data, const char *el) = 0; - virtual void CreateAnswer() = 0; - virtual void SetAnswerList(std::list<std::string> * ansList) { answerList = ansList; } + virtual void Reset() { answer.clear(); depth = 0; } virtual void SetUsers(USERS * u) { users = u; } virtual void SetAdmins(ADMINS * a) { admins = a; } @@ -48,9 +45,9 @@ public: virtual void SetStore(STORE * s) { store = s; } virtual void SetStgSettings(const SETTINGS * s) { settings = s; } - virtual void SetCurrAdmin(ADMIN & cua) { currAdmin = &cua; } - virtual std::string & GetStrError() { return strError; } - virtual void Reset() { answerList->clear(); depth = 0; } + void SetCurrAdmin(ADMIN & cua) { currAdmin = &cua; } + const std::string & GetStrError() const { return strError; } + const std::string & GetAnswer() const { return answer; } protected: BASE_PARSER(const BASE_PARSER & rvalue); @@ -64,7 +61,7 @@ protected: const SETTINGS * settings; ADMIN * currAdmin; int depth; - std::list<std::string> * answerList; + std::string answer; }; //----------------------------------------------------------------------------- class PARSER_GET_ADMINS: public BASE_PARSER { diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser_admin.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser_admin.cpp index d93b3448..7783888e 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser_admin.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser_admin.cpp @@ -30,24 +30,18 @@ void PARSER_GET_ADMINS::CreateAnswer() const PRIV * priv = currAdmin->GetPriv(); if (!priv->adminChg) { - //answerList->clear(); - answerList->erase(answerList->begin(), answerList->end()); - - answerList->push_back("<Error Result=\"Error. Access denied.\"/>"); + answer = "<Error Result=\"Error. Access denied.\"/>"; return; } -std::string s; -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); +answer.clear(); -answerList->push_back("<Admins>"); +answer += "<Admins>"; ADMIN_CONF ac; int h = admins->OpenSearch(); while (admins->SearchNext(h, &ac) == 0) { - //memcpy(&p, &ac.priv, sizeof(unsigned int)); unsigned int p = (ac.priv.userStat << 0) + (ac.priv.userConf << 2) + (ac.priv.userCash << 4) + @@ -55,11 +49,10 @@ while (admins->SearchNext(h, &ac) == 0) (ac.priv.userAddDel << 8) + (ac.priv.adminChg << 10) + (ac.priv.tariffChg << 12); - strprintf(&s, "<admin login=\"%s\" priv=\"%d\"/>", ac.login.c_str(), p); - answerList->push_back(s); + answer += "<admin login=\"" + ac.login + "\" priv=\"" + x2str(p) + "\"/>"; } admins->CloseSearch(h); -answerList->push_back("</Admins>"); +answer += "</Admins>"; } //----------------------------------------------------------------------------- @@ -89,19 +82,10 @@ return -1; //----------------------------------------------------------------------------- void PARSER_DEL_ADMIN::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (admins->Del(adminToDel, currAdmin) == 0) - { - answerList->push_back("<DelAdmin Result=\"Ok\"/>"); - } + answer = "<DelAdmin Result=\"Ok\"/>"; else - { - std::string s; - strprintf(&s, "<DelAdmin Result=\"Error. %s\"/>", admins->GetStrError().c_str()); - answerList->push_back(s); - } + answer = "<DelAdmin Result=\"Error. " + admins->GetStrError() + "\"/>"; } //----------------------------------------------------------------------------- // ADD ADMIN @@ -118,9 +102,6 @@ return -1; //----------------------------------------------------------------------------- int PARSER_ADD_ADMIN::ParseEnd(void *, const char *el) { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (strcasecmp(el, "AddAdmin") == 0) { CreateAnswer(); @@ -131,19 +112,10 @@ return -1; //----------------------------------------------------------------------------- void PARSER_ADD_ADMIN::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (admins->Add(adminToAdd, currAdmin) == 0) - { - answerList->push_back("<AddAdmin Result=\"Ok\"/>"); - } + answer = "<AddAdmin Result=\"Ok\"/>"; else - { - std::string s; - strprintf(&s, "<AddAdmin Result=\"Error. %s\"/>", admins->GetStrError().c_str()); - answerList->push_back(s); - } + answer = "<AddAdmin Result=\"Error. " + admins->GetStrError() + "\"/>"; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -195,16 +167,13 @@ return -1; //----------------------------------------------------------------------------- void PARSER_CHG_ADMIN::CreateAnswer() { -answerList->erase(answerList->begin(), answerList->end()); - - if (!login.empty()) { ADMIN * origAdmin = NULL; if (admins->Find(login.data(), &origAdmin)) { - answerList->push_back(std::string("<ChgAdmin Result = \"Admin '") + login.data() + "' is not found.\"/>"); + answer = "<ChgAdmin Result = \"Admin '" + login.data() + "' is not found.\"/>"; return; } @@ -218,7 +187,7 @@ if (!login.empty()) int p = 0; if (str2x(privAsString.data().c_str(), p) < 0) { - answerList->push_back("<ChgAdmin Result = \"Incorrect parameter Priv.\"/>"); + answer = "<ChgAdmin Result = \"Incorrect parameter Priv.\"/>"; return; } @@ -226,20 +195,10 @@ if (!login.empty()) } if (admins->Change(conf, currAdmin) != 0) - { - std::string s; - strprintf(&s, "<ChgAdmin Result = \"%s\"/>", admins->GetStrError().c_str()); - answerList->push_back(s); - } + answer = "<ChgAdmin Result = \"" + admins->GetStrError() + "\"/>"; else - { - answerList->push_back("<ChgAdmin Result = \"Ok\"/>"); - } + answer = "<ChgAdmin Result = \"Ok\"/>"; } else - { - answerList->push_back("<ChgAdmin Result = \"Incorrect parameter login.\"/>"); - } + answer = "<ChgAdmin Result = \"Incorrect parameter login.\"/>"; } -//-----------------------------------------------------------------------------*/ - diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser_auth_by.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser_auth_by.cpp index e1da75b6..1ac27d65 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser_auth_by.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser_auth_by.cpp @@ -28,19 +28,17 @@ return -1; void PARSER_AUTH_BY::CreateAnswer() { -answerList->erase(answerList->begin(), answerList->end()); - USER_PTR u; if (users->FindByName(login, &u)) { - answerList->push_back("<user result=\"error\"/>"); + answer = "<AuthorizedBy result=\"error\" reason=\"User not found.\"/>"; return; } -std::string s = "<AuthorizedBy>"; +answer.clear(); +answer += "<AuthorizedBy result=\"ok\">"; std::vector<std::string> list(u->GetAuthorizers()); for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it) - s += "<Auth name=\"" + *it + "\"/>"; -s += "</AuthorizedBy>"; -answerList->push_back(s); + answer += "<Auth name=\"" + *it + "\"/>"; +answer += "</AuthorizedBy>"; } diff --git a/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp b/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp index a4531703..88ab2670 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp @@ -29,127 +29,131 @@ return -1; //----------------------------------------------------------------------------- void PARSER_GET_TARIFFS::CreateAnswer() { -std::string s; -char vs[100]; -int hd, hn, md, mn; - -answerList->erase(answerList->begin(), answerList->end()); - -answerList->push_back("<Tariffs>"); +answer = "<Tariffs>"; std::list<TARIFF_DATA> dataList; tariffs->GetTariffsData(&dataList); std::list<TARIFF_DATA>::const_iterator it = dataList.begin(); for (; it != dataList.end(); ++it) { - s = "<tariff name=\"" + it->tariffConf.name + "\">"; - answerList->push_back(s); - - for (int j = 0; j < DIR_NUM; j++) - { - hd = it->dirPrice[j].hDay; - md = it->dirPrice[j].mDay; - - hn = it->dirPrice[j].hNight; - mn = it->dirPrice[j].mNight; + answer += "<tariff name=\"" + it->tariffConf.name + "\">"; - strprintf(&s, "<Time%d value=\"%d:%d-%d:%d\"/>", j, hd, md, hn, mn); - answerList->push_back(s); - } + for (size_t i = 0; i < DIR_NUM; i++) + answer += "<Time" + x2str(i) + " value=\"" + + x2str(it->dirPrice[i].hDay) + ":" + x2str(it->dirPrice[i].mDay) + "-" + + x2str(it->dirPrice[i].hNight) + ":" + x2str(it->dirPrice[i].mNight) + "\"/>"; - strprintf(&s, " <PriceDayA value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<PriceDayA value=\""; + bool first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%.5f%s", it->dirPrice[i].priceDayA * pt_mega, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += x2str(it->dirPrice[i].priceDayA * pt_mega); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <PriceDayB value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<PriceDayB value=\""; + first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%.5f%s", it->dirPrice[i].priceDayB * pt_mega, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += x2str(it->dirPrice[i].priceDayB * pt_mega); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <PriceNightA value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<PriceNightA value=\""; + first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%.5f%s", it->dirPrice[i].priceNightA * pt_mega, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += x2str(it->dirPrice[i].priceNightA * pt_mega); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <PriceNightB value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<PriceNightB value=\""; + first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%.5f%s", it->dirPrice[i].priceNightB * pt_mega, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += x2str(it->dirPrice[i].priceNightB * pt_mega); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <Threshold value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<Threshold value=\""; + first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%d%s", it->dirPrice[i].threshold, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += x2str(it->dirPrice[i].threshold); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <SinglePrice value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<SinglePrice value=\""; + first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%d%s", it->dirPrice[i].singlePrice, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += (it->dirPrice[i].singlePrice ? "1" : "0"); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <NoDiscount value=\""); - for (int i = 0; i < DIR_NUM; i++) + answer += "<NoDiscount value=\""; + first = true; + for (size_t i = 0; i < DIR_NUM; i++) { - snprintf(vs, 100, "%d%s", it->dirPrice[i].noDiscount, i+1 == DIR_NUM?"":"/"); - s += vs; + if (first) + first = false; + else + answer += "/"; + answer += (it->dirPrice[i].noDiscount ? "1" : "0"); } - s += "\"/>"; - answerList->push_back(s); + answer += "\"/>"; - strprintf(&s, " <Fee value=\"%.5f\"/>", it->tariffConf.fee); - answerList->push_back(s); + answer += "<Fee value=\"" + x2str(it->tariffConf.fee) + "\"/>"; - strprintf(&s, " <PassiveCost value=\"%.5f\"/>", it->tariffConf.passiveCost); - answerList->push_back(s); + answer += "<PassiveCost value=\"" + x2str(it->tariffConf.passiveCost) + "\"/>"; - strprintf(&s, " <Free value=\"%.5f\"/>", it->tariffConf.free); - answerList->push_back(s); + answer += "<Free value=\"" + x2str(it->tariffConf.free) + "\"/>"; switch (it->tariffConf.traffType) { case TRAFF_UP: - answerList->push_back("<TraffType value=\"up\"/>"); + answer += "<TraffType value=\"up\"/>"; break; case TRAFF_DOWN: - answerList->push_back("<TraffType value=\"down\"/>"); + answer += "<TraffType value=\"down\"/>"; break; case TRAFF_UP_DOWN: - answerList->push_back("<TraffType value=\"up+down\"/>"); + answer += "<TraffType value=\"up+down\"/>"; break; case TRAFF_MAX: - answerList->push_back("<TraffType value=\"max\"/>"); + answer += "<TraffType value=\"max\"/>"; break; } - answerList->push_back("<Period value=\"" + TARIFF::PeriodToString(it->tariffConf.period) + "\"/>"); + answer += "<Period value=\"" + TARIFF::PeriodToString(it->tariffConf.period) + "\"/>"; - answerList->push_back("</tariff>"); + answer += "</tariff>"; } -answerList->push_back("</Tariffs>"); +answer += "</Tariffs>"; } //----------------------------------------------------------------------------- // ADD TARIFF @@ -179,19 +183,10 @@ return -1; //----------------------------------------------------------------------------- void PARSER_ADD_TARIFF::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (tariffs->Add(tariffToAdd, currAdmin) == 0) - { - answerList->push_back("<AddTariff Result=\"Ok\"/>"); - } + answer = "<AddTariff Result=\"Ok\"/>"; else - { - std::string s; - strprintf(&s, "<AddTariff Result=\"Error. %s\"/>", tariffs->GetStrError().c_str()); - answerList->push_back(s); - } + answer = "<AddTariff Result=\"Error. " + tariffs->GetStrError() + "\"/>"; } //----------------------------------------------------------------------------- // DEL TARIFF @@ -219,27 +214,12 @@ return -1; //----------------------------------------------------------------------------- void PARSER_DEL_TARIFF::CreateAnswer() { -//answerList->clear(); -answerList->erase(answerList->begin(), answerList->end()); - if (users->TariffInUse(tariffToDel)) - { - std::string s; - strprintf(&s, "<DelTariff Result=\"Error. Tariff \'%s\' cannot be deleted. Tariff in use.\"/>", tariffToDel.c_str()); - answerList->push_back(s); - return; - } - -if (tariffs->Del(tariffToDel, currAdmin) == 0) - { - answerList->push_back("<DelTariff Result=\"Ok\"/>"); - } + answer = "<DelTariff Result=\"Error. Tariff \'" + tariffToDel + "\' cannot be deleted. Tariff in use.\"/>"; +else if (tariffs->Del(tariffToDel, currAdmin) == 0) + answer = "<DelTariff Result=\"Ok\"/>"; else - { - std::string s; - strprintf(&s, "<DelTariff Result=\"Error. %s\"/>", tariffs->GetStrError().c_str()); - answerList->push_back(s); - } + answer = "<DelTariff Result=\"Error. " + tariffs->GetStrError() + "\"/>"; } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -481,24 +461,20 @@ return -1; //----------------------------------------------------------------------------- void PARSER_CHG_TARIFF::CreateAnswer() { -answerList->erase(answerList->begin(), answerList->end()); - if (!td.tariffConf.name.data().empty()) { TARIFF_DATA tariffData = td.GetData(); if (tariffs->Chg(tariffData, currAdmin) == 0) { - answerList->push_back("<SetTariff Result=\"ok\"/>"); + answer = "<SetTariff Result=\"ok\"/>"; return; } else { - std::string s; - strprintf(&s, "<SetTariff Result=\"Change tariff error! %s\"/>", tariffs->GetStrError().c_str()); - answerList->push_back(s); + answer = "<SetTariff Result=\"Change tariff error! " + tariffs->GetStrError() + "\"/>"; return; } } -answerList->push_back("<SetTariff Result=\"Change tariff error!\"/>"); +answer = "<SetTariff Result=\"Change tariff error!\"/>"; } //----------------------------------------------------------------------------- diff --git a/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp b/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp index 9298e8a1..9488d71d 100644 --- a/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp +++ b/projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp @@ -28,7 +28,8 @@ #include "configproto.h" -#include "stg/admins.h" +#include "parser.h" + #include "stg/logger.h" #include "stg/common.h" #include "stg/blowfish.h" @@ -258,7 +259,7 @@ while (pos < stgHdrLen) if (!WaitPackets(sock)) { state = confHdr; - SendError("Bad request"); + SendError(sock, "Bad request"); return -1; } ssize_t ret = recv(sock, &buf[pos], static_cast<int>(stgHdrLen) - static_cast<int>(pos), 0); @@ -279,7 +280,7 @@ if (0 == strncmp(buf, STG_HEADER, strlen(STG_HEADER))) } else { - SendError("Bad request"); + SendError(sock, "Bad request"); } state = confHdr; @@ -488,69 +489,40 @@ while (1) { // End of data if (ParseCommand()) - { - SendError("Bad command"); - } - return SendDataAnswer(sock); + return SendError(sock, "Bad command"); + else + return SendDataAnswer(sock, currParser->GetAnswer()); } } //return 0; } //----------------------------------------------------------------------------- -int CONFIGPROTO::SendDataAnswer(int sock) +int CONFIGPROTO::SendDataAnswer(int sock, const std::string & answer) { -std::list<std::string>::iterator li; -li = answerList.begin(); +if (answer.empty()) + return 0; BLOWFISH_CTX ctx; - -char buff[8]; -char buffS[8]; -int n = 0; -int k = 0; - EnDecodeInit(adminPassword.c_str(), ADM_PASSWD_LEN, &ctx); -while (li != answerList.end()) +std::string::size_type pos = 0; +std::string::size_type length = answer.length(); +while (pos < length) { - while ((*li).c_str()[k]) - { - buff[n % 8] = (*li).c_str()[k]; - n++; - k++; - - if (n % 8 == 0) - { - EncodeString(buffS, buff, &ctx); - int ret = static_cast<int>(send(sock, buffS, 8, 0)); - if (ret < 0) - { - return -1; - } - } - } - k = 0;// new node - ++li; + char buffer[1024]; + std::string::size_type chunkLength = std::min(length - pos, sizeof(buffer)); + EncodeFullString(buffer, answer.c_str() + pos, chunkLength, ctx); + if (send(sock, buffer, chunkLength, 0) < 0) + return -1; + pos += chunkLength; } -if (answerList.empty()) { - return 0; -} - -buff[n % 8] = 0; -EncodeString(buffS, buff, &ctx); - -answerList.clear(); - -return static_cast<int>(send(sock, buffS, 8, 0)); +return 1; } //----------------------------------------------------------------------------- -void CONFIGPROTO::SendError(const char * text) +int CONFIGPROTO::SendError(int sock, const std::string & text) { -char s[255]; -answerList.clear(); -snprintf(s, 255, "<Error value=\"%s\"/>", text); -answerList.push_back(s); +return SendDataAnswer(sock, "<Error value=\"" + text + "\"/>"); } //----------------------------------------------------------------------------- void CONFIGPROTO::WriteLogAccessFailed(uint32_t ip)