]> git.stg.codes - stg.git/commitdiff
Optimized sending answers in sgconfig.
authorMaxim Mamontov <faust.madf@gmail.com>
Fri, 20 Jun 2014 22:11:48 +0000 (01:11 +0300)
committerMaxim Mamontov <faust.madf@gmail.com>
Fri, 20 Jun 2014 22:11:48 +0000 (01:11 +0300)
projects/stargazer/plugins/configuration/sgconfig/configproto.cpp
projects/stargazer/plugins/configuration/sgconfig/configproto.h
projects/stargazer/plugins/configuration/sgconfig/parser.cpp
projects/stargazer/plugins/configuration/sgconfig/parser.h
projects/stargazer/plugins/configuration/sgconfig/parser_admin.cpp
projects/stargazer/plugins/configuration/sgconfig/parser_auth_by.cpp
projects/stargazer/plugins/configuration/sgconfig/parser_tariff.cpp
projects/stargazer/plugins/configuration/sgconfig/parser_user_info.cpp
projects/stargazer/plugins/configuration/sgconfig/rsconf.cpp

index 421349c7eb6871187f02fa962a6ffd8d8859c58f..7f46fab22d806406ee660769f5802cd3bd6c2ca8 100644 (file)
@@ -48,7 +48,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);
     }
@@ -56,7 +55,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)
index 2b76c4136604facc2d75a4b45c52d44018bdaa0c..623254ac1a0eee515d0e1e07a81efe4383a11253 100644 (file)
@@ -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;
index 2c2f2198379e949780452136ceaaa56c558cc0a2..017b78b096a2b940e61beadd7fa7792476ba7433 100644 (file)
 #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>");
-
-sprintf(s, "<version value=\"%s\"/>", SERVER_VERSION);
-answerList->push_back(s);
+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, "<tariff_num value=\"%llu\"/>", static_cast<unsigned long long>(tariffs->Count()));
-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 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,176 +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))
     {
-    answerList->push_back("<user result=\"error\" reason=\"User not found.\"/>");
+    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
@@ -346,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)
@@ -368,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 = "";
-
-    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;
-        }
+    answer += "<Users>";
 
+USER_PTR u;
 
-    userFinish = "</user>";
-
-    if (middle.length() > 0)
-        {
-        /*printfd(__FILE__, "login: %s\n", u->GetLogin().c_str());
-        printfd(__FILE__, "middle: %s\n", middle.c_str());*/
-
-        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
@@ -685,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()
@@ -977,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;
     }
 
@@ -1339,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");
@@ -1403,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\"/>";
 }
 //-----------------------------------------------------------------------------
 //  CHECK USER
@@ -1456,9 +1126,9 @@ return -1;
 void PARSER_CHECK_USER::CreateAnswer(const char * error)
 {
 if (error)
-    answerList->push_back(std::string("<CheckUser value=\"Err\" reason=\"") + error + "\"/>");
+    answer = std::string("<CheckUser value=\"Err\" reason=\"") + error + "\"/>";
 else
-    answerList->push_back("<CheckUser value=\"Ok\"/>");
+    answer = "<CheckUser value=\"Ok\"/>";
 }
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
index 7a71a2a8e03aebd095684c99f7d1f07f790238c5..b991a807b95fa87c1d5bfbc2129f16b1553c7698 100644 (file)
@@ -15,7 +15,6 @@
 #include "stg/users.h"
 #include "stg/message.h"
 
-#include <list>
 #include <string>
 #include <vector>
 
@@ -33,15 +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 Reset() { answerList->clear(); depth = 0; }
-
-    void SetAnswerList(std::list<std::string> * ansList) { answerList = ansList; }
+    virtual void Reset() { answer.clear(); depth = 0; }
 
     void SetUsers(USERS * u) { users = u; }
     void SetAdmins(ADMINS * a) { admins = a; }
@@ -50,7 +46,8 @@ public:
     void SetStgSettings(const SETTINGS * s) { settings = s; }
 
     void SetCurrAdmin(ADMIN & cua) { currAdmin = &cua; }
-    std::string & GetStrError() { return strError; }
+    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 {
index d93b3448f013efa4d8d6223afa39b6e02c182f95..7783888e37d24e632c4771bb2645a98ca00328c1 100644 (file)
@@ -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.\"/>";
 }
-//-----------------------------------------------------------------------------*/
-
index 54921571ae291e46ce2e0eb55d2228243af2b5ca..1ac27d6500c3208e91f8eb87f591e3f0043a5119 100644 (file)
@@ -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("<AuthorizedBy result=\"error\" reason=\"User not found.\"/>");
+    answer = "<AuthorizedBy result=\"error\" reason=\"User not found.\"/>";
     return;
     }
 
-std::string s = "<AuthorizedBy result=\"ok\">";
+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>";
 }
index a4531703c54de43765b319b3f6f22f1b015c1267..88ab267082e76aa83a0decf9c793f281fcf2d937 100644 (file)
@@ -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!\"/>";
 }
 //-----------------------------------------------------------------------------
index 72c3c6ece73ff36695c338822a6d16ca4105479b..0e06a4a7ac12d9d41159933344f65c4202c5813c 100644 (file)
@@ -49,22 +49,19 @@ return 0;
 
 void PARSER_USER_INFO::CreateAnswer()
 {
-answerList->clear();
-
 CONST_USER_PTR u;
 if (users->FindByName(login, &u))
     {
-    answerList->push_back("<UserInfo result=\"error\"/>");
+    answer = "<UserInfo result=\"error\"/>";
     return;
     }
 
-std::string s = "<UserInfo lastAuthTime=\"" + x2str(u->GetAuthorizedModificationTime()) + "\"" +
-                " lastDisconnectTime=\"" + x2str(u->GetConnectedModificationTime()) + "\"" +
-                " connected=\"" + (u->GetConnected() ? "true" : "false") + "\"" +
-                " lastDisconnectReason=\"" + u->GetLastDisconnectReason() + "\">";
+answer = "<UserInfo lastAuthTime=\"" + x2str(u->GetAuthorizedModificationTime()) + "\"" +
+         " lastDisconnectTime=\"" + x2str(u->GetConnectedModificationTime()) + "\"" +
+         " connected=\"" + (u->GetConnected() ? "true" : "false") + "\"" +
+         " lastDisconnectReason=\"" + u->GetLastDisconnectReason() + "\">";
 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 += "</UserInfo>";
-answerList->push_back(s);
+    answer += "<Auth name=\"" + *it + "\"/>";
+answer += "</UserInfo>";
 }
index 6eb2b4249f6329ec45ab6496dda624051c675826..e9f50e4802f65f4b62270024d7ddcbfefeabb45f 100644 (file)
@@ -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"
@@ -256,7 +257,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);
@@ -277,7 +278,7 @@ if (0 == strncmp(buf, STG_HEADER, strlen(STG_HEADER)))
     }
 else
     {
-    SendError("Bad request");
+    SendError(sock, "Bad request");
     }
 
 state = confHdr;
@@ -484,66 +485,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);
-            if (send(sock, buffS, 8, 0) < 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)