2  *    This program is free software; you can redistribute it and/or modify
 
   3  *    it under the terms of the GNU General Public License as published by
 
   4  *    the Free Software Foundation; either version 2 of the License, or
 
   5  *    (at your option) any later version.
 
   7  *    This program is distributed in the hope that it will be useful,
 
   8  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
   9  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  10  *    GNU General Public License for more details.
 
  12  *    You should have received a copy of the GNU General Public License
 
  13  *    along with this program; if not, write to the Free Software
 
  14  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
  18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
 
  23  $Date: 2010/08/04 00:40:00 $
 
  30 #include <sys/types.h>
 
  31 #include <sys/socket.h>
 
  32 #include <netinet/in.h>
 
  33 #include <arpa/inet.h>
 
  37 //#include "srvconf_common.h"
 
  38 #include "stg_const.h"
 
  43 //-----------------------------------------------------------------------------
 
  44 //-----------------------------------------------------------------------------
 
  45 //-----------------------------------------------------------------------------
 
  46 PARSER_GET_USERS::PARSER_GET_USERS()
 
  47     : RecvUserDataCb(NULL),
 
  53 //-----------------------------------------------------------------------------
 
  54 int PARSER_GET_USERS::ParseStart(const char *el, const char **attr)
 
  69     ParseUserParams(el, attr);
 
  73 //-----------------------------------------------------------------------------
 
  74 void PARSER_GET_USERS::ParseEnd(const char *)
 
  81         RecvUserDataCb(&user, userDataCb);
 
  85 //-----------------------------------------------------------------------------
 
  86 void PARSER_GET_USERS::ParseUsers(const char * el, const char ** attr)
 
  88 if (strcasecmp(el, "users") == 0)
 
  95 //-----------------------------------------------------------------------------
 
  96 void PARSER_GET_USERS::ParseUser(const char * el, const char ** attr)
 
 100     if (strcasecmp(el, "user") != 0)
 
 105     if (strcasecmp(attr[0], "login") != 0)
 
 109     user.login = attr[1];
 
 112 //-----------------------------------------------------------------------------
 
 113 void PARSER_GET_USERS::ParseUserParams(const char * el, const char ** attr)
 
 115 if (strcasecmp(el, "cash") == 0)
 
 117     if (strtodouble2(attr[1], user.cash) < 0)
 
 123 /*if (strcasecmp(el, "LastCash") == 0)
 
 125     if (strtodouble2(attr[1], user.lastCash) < 0)
 
 127         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 132 /*if (strcasecmp(el, "LastActivityTime") == 0)
 
 134     if (strtol(attr[1], user.lastActivityTime) < 0)
 
 136         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 142 /*if (strcasecmp(el, "LastTimeCash") == 0)
 
 144     if (strtol(attr[1], user.lastTimeCash) < 0)
 
 146         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 151 /*if (strcasecmp(el, "CashExpire") == 0)
 
 153     if (strtol(attr[1], user.cashExpire) < 0)
 
 155         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 160 if (strcasecmp(el, "credit") == 0)
 
 162     if (strtodouble2(attr[1], user.credit) < 0)
 
 168 if (strcasecmp(el, "creditExpire") == 0)
 
 170     if (str2x(attr[1], user.creditExpire) < 0)
 
 176 /*if (strcasecmp(el, "freemb") == 0)
 
 178     if (strtodouble2(attr[1], user.freeMb) < 0)
 
 180         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 185 if (strcasecmp(el, "down") == 0)
 
 187     if (str2x(attr[1], user.down) < 0)
 
 193 if (strcasecmp(el, "passive") == 0)
 
 195     if (str2x(attr[1], user.passive) < 0)
 
 201 if (strcasecmp(el, "disableDetailStat") == 0)
 
 203     if (str2x(attr[1], user.disableDetailStat) < 0)
 
 210 if (strcasecmp(el, "status") == 0)
 
 212     if (str2x(attr[1], user.connected) < 0)
 
 218 if (strcasecmp(el, "aonline") == 0)
 
 220     if (str2x(attr[1], user.alwaysOnline) < 0)
 
 226 if (strcasecmp(el, "currip") == 0)
 
 228     user.ip = inet_addr(attr[1]);
 
 231 if (strcasecmp(el, "ip") == 0)
 
 237 if (strcasecmp(el, "tariff") == 0)
 
 239     //KOIToWin(user.tariff, *(attr+1), TARIFF_LEN);
 
 240     user.tariff = attr[1];
 
 244 if (strcasecmp(el, "password") == 0)
 
 246     user.password = *(attr+1);
 
 250 if (strcasecmp(el, "iface") == 0)
 
 252     user.iface = attr[1];
 
 256 /*if (strcasecmp(el, "name") == 0)
 
 258     / *char nameEnc[REALNM_LEN * 2 + 1];
 
 259     char name[REALNM_LEN];
 
 260     strncpy(nameEnc, attr[1], REALNM_LEN * 2 + 1);
 
 261     Decode21(name, nameEnc);
 
 262     KOIToWin(user.realName, name, REALNM_LEN);* /
 
 263     Decode21str(user.realName, attr[1]);
 
 267 if (strcasecmp(el, "address") == 0)
 
 269     /*char addressEnc[ADDR_LEN * 2 + 1];
 
 270     char address[ADDR_LEN];
 
 271     strncpy(addressEnc, attr[1], ADDR_LEN * 2 + 1);
 
 272     Decode21(address, addressEnc);
 
 273     KOIToWin(user.address, address, ADDR_LEN);*/
 
 274     Decode21str(user.address, attr[1]);
 
 278 if (strcasecmp(el, "phone") == 0)
 
 280     /*char phoneEnc[PHONE_LEN * 2 + 1];
 
 281     char phone[PHONE_LEN];
 
 282     strncpy(phoneEnc, attr[1], PHONE_LEN * 2 + 1);
 
 283     Decode21(phone, phoneEnc);
 
 284     KOIToWin(user.phone, phone, PHONE_LEN);*/
 
 285     Decode21str(user.phone, attr[1]);
 
 289 if (strcasecmp(el, "note") == 0)
 
 291     /*char noteEnc[NOTE_LEN * 2 + 1];
 
 293     strncpy(noteEnc, attr[1], NOTE_LEN * 2 + 1);*/
 
 294     //KOIToWin(user.note, note, NOTE_LEN);
 
 296     Decode21str(user.note, attr[1]);
 
 300 if (strcasecmp(el, "email") == 0)
 
 302     /*char emailEnc[EMAIL_LEN * 2 + 1];
 
 303     char email[EMAIL_LEN];
 
 304     strncpy(emailEnc, attr[1], EMAIL_LEN * 2 + 1);
 
 305     Decode21(email, emailEnc);
 
 306     //KOIToWin(user.email, email, EMAIL_LEN);
 
 307     user.email = email;*/
 
 308     Decode21str(user.email, attr[1]);
 
 312 if (strcasecmp(el, "group") == 0)
 
 314     /*char groupEnc[GROUP_LEN * 2 + 1];
 
 315     char group[GROUP_LEN];
 
 316     strncpy(groupEnc, attr[1], GROUP_LEN * 2 + 1);
 
 317     Decode21(group, groupEnc);
 
 318     //KOIToWin(user.group, group, GROUP_LEN);
 
 319     user.group = group;*/
 
 320     Decode21str(user.group, attr[1]);
 
 324 if (strcasecmp(el, "traff") == 0)
 
 326     ParseUserLoadStat(el, attr);
 
 331 //-----------------------------------------------------------------------------
 
 332 void PARSER_GET_USERS::ParseUserLoadStat(const char *, const char ** attr)
 
 338     for (int j = 0; j < DIR_NUM; j++)
 
 340         sprintf(dir, "MU%d", j);
 
 341         if (strcasecmp(dir, attr[i]) == 0)
 
 343             str2x(attr[i+1], user.stat.mu[j]);
 
 347     for (int j = 0; j < DIR_NUM; j++)
 
 349         sprintf(dir, "MD%d", j);
 
 350         if (strcasecmp(dir, attr[i]) == 0)
 
 352             str2x(attr[i+1], user.stat.md[j]);
 
 356     for (int j = 0; j < DIR_NUM; j++)
 
 358         sprintf(dir, "SU%d", j);
 
 359         if (strcasecmp(dir, attr[i]) == 0)
 
 361             str2x(attr[i+1], user.stat.su[j]);
 
 365     for (int j = 0; j < DIR_NUM; j++)
 
 367         sprintf(dir, "SD%d", j);
 
 368         if (strcasecmp(dir, attr[i]) == 0)
 
 370             str2x(attr[i+1], user.stat.sd[j]);
 
 378 //-----------------------------------------------------------------------------
 
 379 void PARSER_GET_USERS::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
 
 384 //-----------------------------------------------------------------------------
 
 385 //-----------------------------------------------------------------------------
 
 386 //-----------------------------------------------------------------------------
 
 387 PARSER_GET_USER::PARSER_GET_USER()
 
 388     : RecvUserDataCb(NULL),
 
 394 //-----------------------------------------------------------------------------
 
 395 int PARSER_GET_USER::ParseStart(const char *el, const char **attr)
 
 405     ParseUserParams(el, attr);
 
 409 //-----------------------------------------------------------------------------
 
 410 void PARSER_GET_USER::ParseEnd(const char *)
 
 417         RecvUserDataCb(&user, userDataCb);
 
 421 //-----------------------------------------------------------------------------
 
 422 void PARSER_GET_USER::ParseUser(const char * el, const char ** attr)
 
 424 if (strcasecmp(el, "user") == 0)
 
 426     if (strcasecmp(attr[1], "error") == 0)
 
 431 //-----------------------------------------------------------------------------
 
 432 struct ParsedStringParams
 
 437 //-----------------------------------------------------------------------------
 
 438 struct ParsedDoubleParams
 
 443 //-----------------------------------------------------------------------------
 
 444 void PARSER_GET_USER::ParseUserParams(const char * el, const char ** attr)
 
 446 //printf("PARSER_GET_USER::ParseUserParams el=%s attr[1]=%s\n", el, attr[1]);
 
 448 if (strcasecmp(el, "login") == 0)
 
 450     user.login = attr[1];
 
 454 /*if (strcasecmp(el, "LastActivityTime") == 0)
 
 456     if (strtol(attr[1], user.lastActivityTime) < 0)
 
 458         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 464 if (strcasecmp(el, "LastTimeCash") == 0)
 
 466     if (strtol(attr[1], user.lastTimeCash) < 0)
 
 468         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 473 if (strcasecmp(el, "CashExpire") == 0)
 
 475     if (strtol(attr[1], user.cashExpire) < 0)
 
 477         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
 
 483 if (strcasecmp(el, "down") == 0)
 
 485     if (str2x(attr[1], user.down) < 0)
 
 491 if (strcasecmp(el, "passive") == 0)
 
 493     if (str2x(attr[1], user.passive) < 0)
 
 499 if (strcasecmp(el, "disableDetailStat") == 0)
 
 501     if (str2x(attr[1], user.disableDetailStat) < 0)
 
 508 if (strcasecmp(el, "status") == 0)
 
 510     if (str2x(attr[1], user.connected) < 0)
 
 516 if (strcasecmp(el, "aonline") == 0)
 
 518     if (str2x(attr[1], user.alwaysOnline) < 0)
 
 524 if (strcasecmp(el, "currip") == 0)
 
 526     user.ip = inet_addr(attr[1]);
 
 529 if (strcasecmp(el, "creditExpire") == 0)
 
 531     if (str2x(attr[1], user.creditExpire) < 0)
 
 537 for (int i = 0; i < USERDATA_NUM; i++)
 
 541     string udName = "UserData" + num;
 
 542     if (strcasecmp(el, udName.c_str()) == 0)
 
 544         Decode21str(user.userData[i], attr[1]);
 
 549 ParsedStringParams psp[] =
 
 552     {&user.tariff,      "tariff"},
 
 553     {&user.password,    "password"},
 
 554     {&user.iface,       "iface"},
 
 557 for (unsigned i = 0; i < sizeof(psp)/sizeof(ParsedStringParams); i++)
 
 559     if (strcasecmp(el, psp[i].paramName.c_str()) == 0)
 
 561         *psp[i].param = attr[1];
 
 566 ParsedStringParams pspEnc[] =
 
 568     {&user.note,    "note"},
 
 569     {&user.email,   "email"},
 
 570     {&user.group,   "group"},
 
 571     {&user.name,    "name"},
 
 572     {&user.address, "address"},
 
 573     {&user.phone,   "phone"}
 
 576 for (unsigned i = 0; i < sizeof(pspEnc)/sizeof(ParsedStringParams); i++)
 
 578     if (strcasecmp(el, pspEnc[i].paramName.c_str()) == 0)
 
 580         Decode21str(*pspEnc[i].param, attr[1]);
 
 585 ParsedDoubleParams pdp[] =
 
 587     {&user.cash,            "cash"},
 
 588     {&user.credit,          "credit"},
 
 589     {&user.lastCash,        "lastCash"},
 
 590     {&user.prepaidTraff,    "freemb"},
 
 593 for (unsigned i = 0; i < sizeof(pdp)/sizeof(ParsedDoubleParams); i++)
 
 595     if (strcasecmp(el, pdp[i].paramName.c_str()) == 0)
 
 597         strtodouble2(attr[1], *pdp[i].param);
 
 602 if (strcasecmp(el, "traff") == 0)
 
 604     ParseUserLoadStat(el, attr);
 
 608 //-----------------------------------------------------------------------------
 
 609 void PARSER_GET_USER::ParseUserLoadStat(const char *, const char ** attr)
 
 615     for (int j = 0; j < DIR_NUM; j++)
 
 617         sprintf(dir, "MU%d", j);
 
 618         if (strcasecmp(dir, attr[i]) == 0)
 
 620             str2x(attr[i+1], user.stat.mu[j]);
 
 624     for (int j = 0; j < DIR_NUM; j++)
 
 626         sprintf(dir, "MD%d", j);
 
 627         if (strcasecmp(dir, attr[i]) == 0)
 
 629             str2x(attr[i+1], user.stat.md[j]);
 
 633     for (int j = 0; j < DIR_NUM; j++)
 
 635         sprintf(dir, "SU%d", j);
 
 636         if (strcasecmp(dir, attr[i]) == 0)
 
 638             str2x(attr[i+1], user.stat.su[j]);
 
 642     for (int j = 0; j < DIR_NUM; j++)
 
 644         sprintf(dir, "SD%d", j);
 
 645         if (strcasecmp(dir, attr[i]) == 0)
 
 647             str2x(attr[i+1], user.stat.sd[j]);
 
 655 //-----------------------------------------------------------------------------
 
 656 void PARSER_GET_USER::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
 
 661 //-----------------------------------------------------------------------------
 
 662 //-----------------------------------------------------------------------------
 
 663 //-----------------------------------------------------------------------------
 
 664 PARSER_GET_SERVER_INFO::PARSER_GET_SERVER_INFO()
 
 665     : RecvServerInfoDataCb(NULL),
 
 666       serverInfoDataCb(NULL),
 
 671 //-----------------------------------------------------------------------------
 
 672 int PARSER_GET_SERVER_INFO::ParseStart(const char *el, const char **attr)
 
 677     if (strcasecmp(el, "ServerInfo") != 0)
 
 679         //printf("%s\n", el);
 
 686         if (strcasecmp(el, "uname") == 0)
 
 691         if (strcasecmp(el, "version") == 0)
 
 693             ParseServerVersion(attr);
 
 696         if (strcasecmp(el, "tariff") == 0)
 
 698             ParseTariffType(attr);
 
 701         if (strcasecmp(el, "dir_num") == 0)
 
 706         if (strcasecmp(el, "users_num") == 0)
 
 711         if (strcasecmp(el, "tariff_num") == 0)
 
 713             ParseTariffsNum(attr);
 
 717         for (int j = 0; j < DIR_NUM; j++)
 
 720             sprintf(str, "dir_name_%d", j);
 
 721             if (strcasecmp(el, str) == 0)
 
 723                 ParseDirName(attr, j);
 
 731 //-----------------------------------------------------------------------------
 
 732 void PARSER_GET_SERVER_INFO::ParseEnd(const char *)
 
 737     RecvServerInfoDataCb(&serverInfo, serverInfoDataCb);
 
 740 //-----------------------------------------------------------------------------
 
 741 /*void PARSER_GET_SERVER_INFO::ParseServerInfo(const char * el, const char ** attr)
 
 744 //-----------------------------------------------------------------------------
 
 745 void PARSER_GET_SERVER_INFO::SetServerInfoRecvCb(RecvServerInfoDataCb_t f, void * data)
 
 747 RecvServerInfoDataCb = f;
 
 748 serverInfoDataCb = data;
 
 750 //-----------------------------------------------------------------------------
 
 751 void PARSER_GET_SERVER_INFO::ParseUname(const char ** attr)
 
 753 if (strcmp(*attr, "value") == 0)
 
 754     serverInfo.uname = attr[1];
 
 756 //-----------------------------------------------------------------------------
 
 757 void PARSER_GET_SERVER_INFO::ParseServerVersion(const char ** attr)
 
 759 if (strcmp(*attr, "value") == 0)
 
 760     serverInfo.version = attr[1];
 
 762 //-----------------------------------------------------------------------------
 
 763 void PARSER_GET_SERVER_INFO::ParseUsersNum(const char ** attr)
 
 765 if (strcmp(*attr, "value") == 0)
 
 767     if (str2x(attr[1], serverInfo.usersNum) < 0)
 
 769         serverInfo.usersNum = -1;
 
 774 //-----------------------------------------------------------------------------
 
 775 void PARSER_GET_SERVER_INFO::ParseTariffsNum(const char ** attr)
 
 777 if (strcmp(*attr, "value") == 0)
 
 779     if (str2x(attr[1], serverInfo.tariffNum) < 0)
 
 781         serverInfo.tariffNum = -1;
 
 786 //-----------------------------------------------------------------------------
 
 787 void PARSER_GET_SERVER_INFO::ParseTariffType(const char ** attr)
 
 789 if (strcmp(*attr, "value") == 0)
 
 791     if (str2x(attr[1], serverInfo.tariffType) < 0)
 
 793         serverInfo.tariffType = -1;
 
 798 //-----------------------------------------------------------------------------
 
 799 void PARSER_GET_SERVER_INFO::ParseDirNum(const char **attr)
 
 801 if (strcasecmp(*attr, "value") == 0)
 
 803     if (str2x(attr[1], serverInfo.dirNum) < 0)
 
 805         serverInfo.dirNum = -1;
 
 810 //-----------------------------------------------------------------------------
 
 811 void PARSER_GET_SERVER_INFO::ParseDirName(const char **attr, int d)
 
 813 if (strcmp(attr[0], "value") == 0)
 
 815     char str[2*DIRNAME_LEN + 1];
 
 816     Decode21(str, attr[1]);
 
 817     serverInfo.dirName[d] = str;
 
 820 //-----------------------------------------------------------------------------
 
 821 //-----------------------------------------------------------------------------
 
 822 //-----------------------------------------------------------------------------
 
 823 PARSER_CHG_USER::PARSER_CHG_USER()
 
 824     : RecvChgUserCb(NULL),
 
 830 //-----------------------------------------------------------------------------
 
 831 int PARSER_CHG_USER::ParseStart(const char *el, const char **attr)
 
 836     if (strcasecmp(el, "SetUser") == 0)
 
 838         ParseAnswer(el, attr);
 
 840     else if (strcasecmp(el, "DelUser") == 0)
 
 842         ParseAnswer(el, attr);
 
 844     else if (strcasecmp(el, "AddUser") == 0)
 
 846         ParseAnswer(el, attr);
 
 851 //-----------------------------------------------------------------------------
 
 852 void PARSER_CHG_USER::ParseEnd(const char *)
 
 856 //-----------------------------------------------------------------------------
 
 857 void PARSER_CHG_USER::ParseAnswer(const char *, const char **attr)
 
 861     RecvChgUserCb(attr[1], chgUserCbData);
 
 864 //-----------------------------------------------------------------------------
 
 865 void PARSER_CHG_USER::SetChgUserRecvCb(RecvChgUserCb_t f, void * data)
 
 868 chgUserCbData = data;
 
 870 //-----------------------------------------------------------------------------
 
 871 //-----------------------------------------------------------------------------
 
 872 //-----------------------------------------------------------------------------
 
 873 PARSER_CHECK_USER::PARSER_CHECK_USER()
 
 874     : RecvCheckUserCb(NULL),
 
 875       checkUserCbData(NULL),
 
 880 //-----------------------------------------------------------------------------
 
 881 int PARSER_CHECK_USER::ParseStart(const char *el, const char **attr)
 
 886     if (strcasecmp(el, "CheckUser") == 0)
 
 888         //printf("el=%s attr[0]=%s attr[1]=%s\n", el, attr[0], attr[1]);
 
 889         ParseAnswer(el, attr);
 
 894 //-----------------------------------------------------------------------------
 
 895 void PARSER_CHECK_USER::ParseEnd(const char *)
 
 899 //-----------------------------------------------------------------------------
 
 900 void PARSER_CHECK_USER::ParseAnswer(const char *, const char **attr)
 
 904     RecvCheckUserCb(attr[1], checkUserCbData);
 
 907 //-----------------------------------------------------------------------------
 
 908 void PARSER_CHECK_USER::SetCheckUserRecvCb(RecvCheckUserCb_t f, void * data)
 
 911 checkUserCbData = data;
 
 913 //-----------------------------------------------------------------------------
 
 914 //-----------------------------------------------------------------------------
 
 915 //-----------------------------------------------------------------------------
 
 916 PARSER_SEND_MESSAGE::PARSER_SEND_MESSAGE()
 
 917     : RecvSendMessageCb(NULL),
 
 918       sendMessageCbData(NULL),
 
 923 //-----------------------------------------------------------------------------
 
 924 int  PARSER_SEND_MESSAGE::ParseStart(const char *el, const char **attr)
 
 929     if (strcasecmp(el, "SendMessageResult") == 0)
 
 931         ParseAnswer(el, attr);
 
 936 //-----------------------------------------------------------------------------
 
 937 void PARSER_SEND_MESSAGE::ParseEnd(const char *)
 
 941 //-----------------------------------------------------------------------------
 
 942 void PARSER_SEND_MESSAGE::ParseAnswer(const char *, const char **attr)
 
 944 if (RecvSendMessageCb)
 
 945     RecvSendMessageCb(attr[1], sendMessageCbData);
 
 947 //-----------------------------------------------------------------------------
 
 948 void PARSER_SEND_MESSAGE::SetSendMessageRecvCb(RecvSendMessageCb_t f, void * data)
 
 950 RecvSendMessageCb = f;
 
 951 sendMessageCbData = data;
 
 953 //-----------------------------------------------------------------------------