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 //-----------------------------------------------------------------------------
47 //-----------------------------------------------------------------------------
48 //-----------------------------------------------------------------------------
49 //-----------------------------------------------------------------------------
50 PARSER_GET_USERS::PARSER_GET_USERS()
54 RecvUserDataCb = NULL;
56 //-----------------------------------------------------------------------------
57 void PARSER_GET_USERS::Reset()
61 //-----------------------------------------------------------------------------
62 int PARSER_GET_USERS::ParseStart(const char *el, const char **attr)
77 ParseUserParams(el, attr);
81 //-----------------------------------------------------------------------------
82 void PARSER_GET_USERS::ParseEnd(const char *)
89 RecvUserDataCb(&user, userDataCb);
93 //-----------------------------------------------------------------------------
94 void PARSER_GET_USERS::ParseUsers(const char * el, const char ** attr)
96 if (strcasecmp(el, "users") == 0)
103 //-----------------------------------------------------------------------------
104 void PARSER_GET_USERS::ParseUser(const char * el, const char ** attr)
108 if (strcasecmp(el, "user") != 0)
113 if (strcasecmp(attr[0], "login") != 0)
117 user.login = attr[1];
120 //-----------------------------------------------------------------------------
121 void PARSER_GET_USERS::ParseUserParams(const char * el, const char ** attr)
123 if (strcasecmp(el, "cash") == 0)
125 if (strtodouble2(attr[1], user.cash) < 0)
131 /*if (strcasecmp(el, "LastCash") == 0)
133 if (strtodouble2(attr[1], user.lastCash) < 0)
135 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
140 /*if (strcasecmp(el, "LastActivityTime") == 0)
142 if (strtol(attr[1], user.lastActivityTime) < 0)
144 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
150 /*if (strcasecmp(el, "LastTimeCash") == 0)
152 if (strtol(attr[1], user.lastTimeCash) < 0)
154 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
159 /*if (strcasecmp(el, "CashExpire") == 0)
161 if (strtol(attr[1], user.cashExpire) < 0)
163 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
168 if (strcasecmp(el, "credit") == 0)
170 if (strtodouble2(attr[1], user.credit) < 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()
391 RecvUserDataCb = NULL;
393 //-----------------------------------------------------------------------------
394 void PARSER_GET_USER::Reset()
398 //-----------------------------------------------------------------------------
399 int PARSER_GET_USER::ParseStart(const char *el, const char **attr)
409 ParseUserParams(el, attr);
413 //-----------------------------------------------------------------------------
414 void PARSER_GET_USER::ParseEnd(const char *)
421 RecvUserDataCb(&user, userDataCb);
425 //-----------------------------------------------------------------------------
426 void PARSER_GET_USER::ParseUser(const char * el, const char ** attr)
428 if (strcasecmp(el, "user") == 0)
430 if (strcasecmp(attr[1], "error") == 0)
435 //-----------------------------------------------------------------------------
436 struct ParsedStringParams
441 //-----------------------------------------------------------------------------
442 struct ParsedDoubleParams
447 //-----------------------------------------------------------------------------
448 void PARSER_GET_USER::ParseUserParams(const char * el, const char ** attr)
450 //printf("PARSER_GET_USER::ParseUserParams el=%s attr[1]=%s\n", el, attr[1]);
452 if (strcasecmp(el, "login") == 0)
454 user.login = attr[1];
458 /*if (strcasecmp(el, "LastActivityTime") == 0)
460 if (strtol(attr[1], user.lastActivityTime) < 0)
462 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
468 if (strcasecmp(el, "LastTimeCash") == 0)
470 if (strtol(attr[1], user.lastTimeCash) < 0)
472 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
477 if (strcasecmp(el, "CashExpire") == 0)
479 if (strtol(attr[1], user.cashExpire) < 0)
481 MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
487 if (strcasecmp(el, "down") == 0)
489 if (str2x(attr[1], user.down) < 0)
495 if (strcasecmp(el, "passive") == 0)
497 if (str2x(attr[1], user.passive) < 0)
503 if (strcasecmp(el, "disableDetailStat") == 0)
505 if (str2x(attr[1], user.disableDetailStat) < 0)
512 if (strcasecmp(el, "status") == 0)
514 if (str2x(attr[1], user.connected) < 0)
520 if (strcasecmp(el, "aonline") == 0)
522 if (str2x(attr[1], user.alwaysOnline) < 0)
528 if (strcasecmp(el, "currip") == 0)
530 user.ip = inet_addr(attr[1]);
533 for (int i = 0; i < USERDATA_NUM; i++)
537 string udName = "UserData" + num;
538 if (strcasecmp(el, udName.c_str()) == 0)
540 Decode21str(user.userData[i], attr[1]);
545 ParsedStringParams psp[] =
548 {&user.tariff, "tariff"},
549 {&user.password, "password"},
550 {&user.iface, "iface"},
553 for (unsigned i = 0; i < sizeof(psp)/sizeof(ParsedStringParams); i++)
555 if (strcasecmp(el, psp[i].paramName.c_str()) == 0)
557 *psp[i].param = attr[1];
562 ParsedStringParams pspEnc[] =
564 {&user.note, "note"},
565 {&user.email, "email"},
566 {&user.group, "group"},
567 {&user.name, "name"},
568 {&user.address, "address"},
569 {&user.phone, "phone"}
572 for (unsigned i = 0; i < sizeof(pspEnc)/sizeof(ParsedStringParams); i++)
574 if (strcasecmp(el, pspEnc[i].paramName.c_str()) == 0)
576 Decode21str(*pspEnc[i].param, attr[1]);
581 ParsedDoubleParams pdp[] =
583 {&user.cash, "cash"},
584 {&user.credit, "credit"},
585 {&user.lastCash, "lastCash"},
586 {&user.prepaidTraff, "freemb"},
589 for (unsigned i = 0; i < sizeof(pdp)/sizeof(ParsedDoubleParams); i++)
591 if (strcasecmp(el, pdp[i].paramName.c_str()) == 0)
593 strtodouble2(attr[1], *pdp[i].param);
598 if (strcasecmp(el, "traff") == 0)
600 ParseUserLoadStat(el, attr);
604 //-----------------------------------------------------------------------------
605 void PARSER_GET_USER::ParseUserLoadStat(const char *, const char ** attr)
611 for (int j = 0; j < DIR_NUM; j++)
613 sprintf(dir, "MU%d", j);
614 if (strcasecmp(dir, attr[i]) == 0)
616 str2x(attr[i+1], user.stat.mu[j]);
620 for (int j = 0; j < DIR_NUM; j++)
622 sprintf(dir, "MD%d", j);
623 if (strcasecmp(dir, attr[i]) == 0)
625 str2x(attr[i+1], user.stat.md[j]);
629 for (int j = 0; j < DIR_NUM; j++)
631 sprintf(dir, "SU%d", j);
632 if (strcasecmp(dir, attr[i]) == 0)
634 str2x(attr[i+1], user.stat.su[j]);
638 for (int j = 0; j < DIR_NUM; j++)
640 sprintf(dir, "SD%d", j);
641 if (strcasecmp(dir, attr[i]) == 0)
643 str2x(attr[i+1], user.stat.sd[j]);
651 //-----------------------------------------------------------------------------
652 void PARSER_GET_USER::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
657 //-----------------------------------------------------------------------------
658 //-----------------------------------------------------------------------------
659 //-----------------------------------------------------------------------------
660 PARSER_GET_SERVER_INFO::PARSER_GET_SERVER_INFO()
664 RecvServerInfoDataCb = NULL;
666 //-----------------------------------------------------------------------------
667 void PARSER_GET_SERVER_INFO::Reset()
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()
827 RecvChgUserCb = NULL;
829 //-----------------------------------------------------------------------------
830 int PARSER_CHG_USER::ParseStart(const char *el, const char **attr)
835 if (strcasecmp(el, "SetUser") == 0)
837 ParseAnswer(el, attr);
839 else if (strcasecmp(el, "DelUser") == 0)
841 ParseAnswer(el, attr);
843 else if (strcasecmp(el, "AddUser") == 0)
845 ParseAnswer(el, attr);
850 //-----------------------------------------------------------------------------
851 void PARSER_CHG_USER::ParseEnd(const char *)
855 //-----------------------------------------------------------------------------
856 void PARSER_CHG_USER::Reset()
860 //-----------------------------------------------------------------------------
861 void PARSER_CHG_USER::ParseAnswer(const char *, const char **attr)
865 RecvChgUserCb(attr[1], chgUserCbData);
868 //-----------------------------------------------------------------------------
869 void PARSER_CHG_USER::SetChgUserRecvCb(RecvChgUserCb_t f, void * data)
872 chgUserCbData = data;
874 //-----------------------------------------------------------------------------
875 //-----------------------------------------------------------------------------
876 //-----------------------------------------------------------------------------
877 PARSER_CHECK_USER::PARSER_CHECK_USER()
881 RecvCheckUserCb = NULL;
883 //-----------------------------------------------------------------------------
884 int PARSER_CHECK_USER::ParseStart(const char *el, const char **attr)
889 if (strcasecmp(el, "CheckUser") == 0)
891 //printf("el=%s attr[0]=%s attr[1]=%s\n", el, attr[0], attr[1]);
892 ParseAnswer(el, attr);
897 //-----------------------------------------------------------------------------
898 void PARSER_CHECK_USER::ParseEnd(const char *)
902 //-----------------------------------------------------------------------------
903 void PARSER_CHECK_USER::ParseAnswer(const char *, const char **attr)
907 RecvCheckUserCb(attr[1], checkUserCbData);
910 //-----------------------------------------------------------------------------
911 void PARSER_CHECK_USER::SetCheckUserRecvCb(RecvCheckUserCb_t f, void * data)
914 checkUserCbData = data;
916 //-----------------------------------------------------------------------------
917 //-----------------------------------------------------------------------------
918 //-----------------------------------------------------------------------------
919 PARSER_SEND_MESSAGE::PARSER_SEND_MESSAGE()
923 RecvSendMessageCb = NULL;
925 //-----------------------------------------------------------------------------
926 int PARSER_SEND_MESSAGE::ParseStart(const char *el, const char **attr)
931 if (strcasecmp(el, "SendMessageResult") == 0)
933 ParseAnswer(el, attr);
938 //-----------------------------------------------------------------------------
939 void PARSER_SEND_MESSAGE::ParseEnd(const char *)
943 //-----------------------------------------------------------------------------
944 void PARSER_SEND_MESSAGE::Reset()
948 //-----------------------------------------------------------------------------
949 void PARSER_SEND_MESSAGE::ParseAnswer(const char *, const char **attr)
951 if (RecvSendMessageCb)
952 RecvSendMessageCb(attr[1], sendMessageCbData);
954 //-----------------------------------------------------------------------------
955 void PARSER_SEND_MESSAGE::SetSendMessageRecvCb(RecvSendMessageCb_t f, void * data)
957 RecvSendMessageCb = f;
958 sendMessageCbData = data;
960 //-----------------------------------------------------------------------------