]> git.stg.codes - stg.git/blob - stglibs/srvconf.lib/parser.cpp
В функторе для рассылки данных об авторизованных пользователях по
[stg.git] / stglibs / srvconf.lib / parser.cpp
1 /*
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.
6  *
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.
11  *
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
15  */
16
17 /*
18  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
19  */
20
21  /*
22  $Revision: 1.18 $
23  $Date: 2010/08/04 00:40:00 $
24  $Author: faust $
25  */
26
27 #include <stdio.h>
28 #include <string.h>
29 #include <stdlib.h>
30 #include <sys/types.h>
31 #include <sys/socket.h>
32 #include <netinet/in.h>
33 #include <arpa/inet.h>
34 #include <string>
35
36 #include "common.h"
37 //#include "srvconf_common.h"
38 #include "stg_const.h"
39 #include "servconf.h"
40
41 using namespace std;
42
43 //-----------------------------------------------------------------------------
44 PARSER::PARSER()
45 {
46 }
47 //-----------------------------------------------------------------------------
48 //-----------------------------------------------------------------------------
49 //-----------------------------------------------------------------------------
50 PARSER_GET_USERS::PARSER_GET_USERS()
51 {
52 depth = 0;
53 error = false;
54 RecvUserDataCb = NULL;
55 }
56 //-----------------------------------------------------------------------------
57 void PARSER_GET_USERS::Reset()
58 {
59
60 }
61 //-----------------------------------------------------------------------------
62 int PARSER_GET_USERS::ParseStart(const char *el, const char **attr)
63 {
64 depth++;
65 if (depth == 1)
66     {
67     ParseUsers(el, attr);
68     }
69
70 if (depth == 2)
71     {
72     ParseUser(el, attr);
73     }
74
75 if (depth == 3)
76     {
77     ParseUserParams(el, attr);
78     }
79 return 0;
80 }
81 //-----------------------------------------------------------------------------
82 void PARSER_GET_USERS::ParseEnd(const char *)
83 {
84 depth--;
85 if (depth == 1)
86     {
87     if (RecvUserDataCb)
88         {
89         RecvUserDataCb(&user, userDataCb);
90         }
91     }
92 }
93 //-----------------------------------------------------------------------------
94 void PARSER_GET_USERS::ParseUsers(const char * el, const char ** attr)
95 {
96 if (strcasecmp(el, "users") == 0)
97     {
98     if (*attr != NULL)
99         return;
100     return;
101     }
102 }
103 //-----------------------------------------------------------------------------
104 void PARSER_GET_USERS::ParseUser(const char * el, const char ** attr)
105 {
106 if (el && attr[0])
107     {
108     if (strcasecmp(el, "user") != 0)
109         {
110         return;
111         }
112
113     if (strcasecmp(attr[0], "login") != 0)
114         {
115         return;
116         }
117     user.login = attr[1];
118     }
119 }
120 //-----------------------------------------------------------------------------
121 void PARSER_GET_USERS::ParseUserParams(const char * el, const char ** attr)
122 {
123 if (strcasecmp(el, "cash") == 0)
124     {
125     if (strtodouble2(attr[1], user.cash) < 0)
126         {
127         return;
128         }
129     }
130
131 /*if (strcasecmp(el, "LastCash") == 0)
132     {
133     if (strtodouble2(attr[1], user.lastCash) < 0)
134         {
135         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
136         return 0;
137         }
138     }*/
139
140 /*if (strcasecmp(el, "LastActivityTime") == 0)
141     {
142     if (strtol(attr[1], user.lastActivityTime) < 0)
143         {
144         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
145         return 0;
146         }
147     }*/
148
149
150 /*if (strcasecmp(el, "LastTimeCash") == 0)
151     {
152     if (strtol(attr[1], user.lastTimeCash) < 0)
153         {
154         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
155         return 0;
156         }
157     }*/
158
159 /*if (strcasecmp(el, "CashExpire") == 0)
160     {
161     if (strtol(attr[1], user.cashExpire) < 0)
162         {
163         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
164         return 0;
165         }
166     }*/
167
168 if (strcasecmp(el, "credit") == 0)
169     {
170     if (strtodouble2(attr[1], user.credit) < 0)
171         {
172         return;
173         }
174     }
175
176 /*if (strcasecmp(el, "freemb") == 0)
177     {
178     if (strtodouble2(attr[1], user.freeMb) < 0)
179         {
180         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
181         return 0;
182         }
183     }*/
184
185 if (strcasecmp(el, "down") == 0)
186     {
187     if (str2x(attr[1], user.down) < 0)
188         {
189         return;
190         }
191     }
192
193 if (strcasecmp(el, "passive") == 0)
194     {
195     if (str2x(attr[1], user.passive) < 0)
196         {
197         return;
198         }
199     }
200
201 if (strcasecmp(el, "disableDetailStat") == 0)
202     {
203     if (str2x(attr[1], user.disableDetailStat) < 0)
204         {
205         return;
206         }
207     }
208
209
210 if (strcasecmp(el, "status") == 0)
211     {
212     if (str2x(attr[1], user.connected) < 0)
213         {
214         return;
215         }
216     }
217
218 if (strcasecmp(el, "aonline") == 0)
219     {
220     if (str2x(attr[1], user.alwaysOnline) < 0)
221         {
222         return;
223         }
224     }
225
226 if (strcasecmp(el, "currip") == 0)
227     {
228     user.ip = inet_addr(attr[1]);
229     }
230
231 if (strcasecmp(el, "ip") == 0)
232     {
233     user.ips = attr[1];
234     }
235
236
237 if (strcasecmp(el, "tariff") == 0)
238     {
239     //KOIToWin(user.tariff, *(attr+1), TARIFF_LEN);
240     user.tariff = attr[1];
241     return;
242     }
243
244 if (strcasecmp(el, "password") == 0)
245     {
246     user.password = *(attr+1);
247     return;
248     }
249
250 if (strcasecmp(el, "iface") == 0)
251     {
252     user.iface = attr[1];
253     return;
254     }
255
256 /*if (strcasecmp(el, "name") == 0)
257     {
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]);
264     return;
265     }*/
266
267 if (strcasecmp(el, "address") == 0)
268     {
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]);
275     return;
276     }
277
278 if (strcasecmp(el, "phone") == 0)
279     {
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]);
286     return;
287     }
288
289 if (strcasecmp(el, "note") == 0)
290     {
291     /*char noteEnc[NOTE_LEN * 2 + 1];
292     char note[NOTE_LEN];
293     strncpy(noteEnc, attr[1], NOTE_LEN * 2 + 1);*/
294     //KOIToWin(user.note, note, NOTE_LEN);
295     //user.note = note;
296     Decode21str(user.note, attr[1]);
297     return;
298     }
299
300 if (strcasecmp(el, "email") == 0)
301     {
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]);
309     return;
310     }
311
312 if (strcasecmp(el, "group") == 0)
313     {
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]);
321     return;
322     }
323
324 if (strcasecmp(el, "traff") == 0)
325     {
326     ParseUserLoadStat(el, attr);
327     return;
328     }
329
330 }
331 //-----------------------------------------------------------------------------
332 void PARSER_GET_USERS::ParseUserLoadStat(const char *, const char ** attr)
333 {
334 int i = 0;
335 char dir[6];
336 while (attr[i])
337     {
338     for (int j = 0; j < DIR_NUM; j++)
339         {
340         sprintf(dir, "MU%d", j);
341         if (strcasecmp(dir, attr[i]) == 0)
342             {
343             str2x(attr[i+1], user.stat.mu[j]);
344             break;
345             }
346         }
347     for (int j = 0; j < DIR_NUM; j++)
348         {
349         sprintf(dir, "MD%d", j);
350         if (strcasecmp(dir, attr[i]) == 0)
351             {
352             str2x(attr[i+1], user.stat.md[j]);
353             break;
354             }
355         }
356     for (int j = 0; j < DIR_NUM; j++)
357         {
358         sprintf(dir, "SU%d", j);
359         if (strcasecmp(dir, attr[i]) == 0)
360             {
361             str2x(attr[i+1], user.stat.su[j]);
362             break;
363             }
364         }
365     for (int j = 0; j < DIR_NUM; j++)
366         {
367         sprintf(dir, "SD%d", j);
368         if (strcasecmp(dir, attr[i]) == 0)
369             {
370             str2x(attr[i+1], user.stat.sd[j]);
371             break;
372             }
373         }
374     i+=2;
375     }
376 return;
377 }
378 //-----------------------------------------------------------------------------
379 void PARSER_GET_USERS::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
380 {
381 RecvUserDataCb = f;
382 userDataCb = data;
383 }
384 //-----------------------------------------------------------------------------
385 //-----------------------------------------------------------------------------
386 //-----------------------------------------------------------------------------
387 PARSER_GET_USER::PARSER_GET_USER()
388 {
389 depth = 0;
390 error = false;
391 RecvUserDataCb = NULL;
392 }
393 //-----------------------------------------------------------------------------
394 void PARSER_GET_USER::Reset()
395 {
396
397 }
398 //-----------------------------------------------------------------------------
399 int PARSER_GET_USER::ParseStart(const char *el, const char **attr)
400 {
401 depth++;
402 if (depth == 1)
403     {
404     ParseUser(el, attr);
405     }
406
407 if (depth == 2)
408     {
409     ParseUserParams(el, attr);
410     }
411 return 0;
412 }
413 //-----------------------------------------------------------------------------
414 void PARSER_GET_USER::ParseEnd(const char *)
415 {
416 depth--;
417 if (depth == 0)
418     {
419     if (RecvUserDataCb)
420         {
421         RecvUserDataCb(&user, userDataCb);
422         }
423     }
424 }
425 //-----------------------------------------------------------------------------
426 void PARSER_GET_USER::ParseUser(const char * el, const char ** attr)
427 {
428 if (strcasecmp(el, "user") == 0)
429     {
430     if (strcasecmp(attr[1], "error") == 0)
431         user.login = "";
432     return;
433     }
434 }
435 //-----------------------------------------------------------------------------
436 struct ParsedStringParams
437 {
438 string    * param;
439 string      paramName;
440 };
441 //-----------------------------------------------------------------------------
442 struct ParsedDoubleParams
443 {
444 double    * param;
445 string      paramName;
446 };
447 //-----------------------------------------------------------------------------
448 void PARSER_GET_USER::ParseUserParams(const char * el, const char ** attr)
449 {
450 //printf("PARSER_GET_USER::ParseUserParams el=%s attr[1]=%s\n", el, attr[1]);
451
452 if (strcasecmp(el, "login") == 0)
453     {
454     user.login = attr[1];
455     }
456
457
458 /*if (strcasecmp(el, "LastActivityTime") == 0)
459     {
460     if (strtol(attr[1], user.lastActivityTime) < 0)
461         {
462         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
463         return 0;
464         }
465     }
466
467
468 if (strcasecmp(el, "LastTimeCash") == 0)
469     {
470     if (strtol(attr[1], user.lastTimeCash) < 0)
471         {
472         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
473         return 0;
474         }
475     }
476
477 if (strcasecmp(el, "CashExpire") == 0)
478     {
479     if (strtol(attr[1], user.cashExpire) < 0)
480         {
481         MessageDlg("Error in answer", mtError, TMsgDlgButtons() << mbOK, 0);
482         return 0;
483         }
484     }
485 */
486
487 if (strcasecmp(el, "down") == 0)
488     {
489     if (str2x(attr[1], user.down) < 0)
490         {
491         return;
492         }
493     }
494
495 if (strcasecmp(el, "passive") == 0)
496     {
497     if (str2x(attr[1], user.passive) < 0)
498         {
499         return;
500         }
501     }
502
503 if (strcasecmp(el, "disableDetailStat") == 0)
504     {
505     if (str2x(attr[1], user.disableDetailStat) < 0)
506         {
507         return;
508         }
509     }
510
511
512 if (strcasecmp(el, "status") == 0)
513     {
514     if (str2x(attr[1], user.connected) < 0)
515         {
516         return;
517         }
518     }
519
520 if (strcasecmp(el, "aonline") == 0)
521     {
522     if (str2x(attr[1], user.alwaysOnline) < 0)
523         {
524         return;
525         }
526     }
527
528 if (strcasecmp(el, "currip") == 0)
529     {
530     user.ip = inet_addr(attr[1]);
531     }
532
533 for (int i = 0; i < USERDATA_NUM; i++)
534     {
535     string num;
536     x2str(i, num);
537     string udName = "UserData" + num;
538     if (strcasecmp(el, udName.c_str()) == 0)
539         {
540         Decode21str(user.userData[i], attr[1]);
541         return;
542         }
543     }
544
545 ParsedStringParams psp[] =
546 {
547     {&user.ips,         "ip"},
548     {&user.tariff,      "tariff"},
549     {&user.password,    "password"},
550     {&user.iface,       "iface"},
551 };
552
553 for (unsigned i = 0; i < sizeof(psp)/sizeof(ParsedStringParams); i++)
554     {
555     if (strcasecmp(el, psp[i].paramName.c_str()) == 0)
556         {
557         *psp[i].param = attr[1];
558         return;
559         }
560     }
561
562 ParsedStringParams pspEnc[] =
563 {
564     {&user.note,    "note"},
565     {&user.email,   "email"},
566     {&user.group,   "group"},
567     {&user.name,    "name"},
568     {&user.address, "address"},
569     {&user.phone,   "phone"}
570 };
571
572 for (unsigned i = 0; i < sizeof(pspEnc)/sizeof(ParsedStringParams); i++)
573     {
574     if (strcasecmp(el, pspEnc[i].paramName.c_str()) == 0)
575         {
576         Decode21str(*pspEnc[i].param, attr[1]);
577         return;
578         }
579     }
580
581 ParsedDoubleParams pdp[] =
582 {
583     {&user.cash,            "cash"},
584     {&user.credit,          "credit"},
585     {&user.lastCash,        "lastCash"},
586     {&user.prepaidTraff,    "freemb"},
587 };
588
589 for (unsigned i = 0; i < sizeof(pdp)/sizeof(ParsedDoubleParams); i++)
590     {
591     if (strcasecmp(el, pdp[i].paramName.c_str()) == 0)
592         {
593         strtodouble2(attr[1], *pdp[i].param);
594         return;
595         }
596     }
597
598 if (strcasecmp(el, "traff") == 0)
599     {
600     ParseUserLoadStat(el, attr);
601     return;
602     }
603 }
604 //-----------------------------------------------------------------------------
605 void PARSER_GET_USER::ParseUserLoadStat(const char *, const char ** attr)
606 {
607 int i = 0;
608 char dir[6];
609 while (attr[i])
610     {
611     for (int j = 0; j < DIR_NUM; j++)
612         {
613         sprintf(dir, "MU%d", j);
614         if (strcasecmp(dir, attr[i]) == 0)
615             {
616             str2x(attr[i+1], user.stat.mu[j]);
617             break;
618             }
619         }
620     for (int j = 0; j < DIR_NUM; j++)
621         {
622         sprintf(dir, "MD%d", j);
623         if (strcasecmp(dir, attr[i]) == 0)
624             {
625             str2x(attr[i+1], user.stat.md[j]);
626             break;
627             }
628         }
629     for (int j = 0; j < DIR_NUM; j++)
630         {
631         sprintf(dir, "SU%d", j);
632         if (strcasecmp(dir, attr[i]) == 0)
633             {
634             str2x(attr[i+1], user.stat.su[j]);
635             break;
636             }
637         }
638     for (int j = 0; j < DIR_NUM; j++)
639         {
640         sprintf(dir, "SD%d", j);
641         if (strcasecmp(dir, attr[i]) == 0)
642             {
643             str2x(attr[i+1], user.stat.sd[j]);
644             break;
645             }
646         }
647     i+=2;
648     }
649 return;
650 }
651 //-----------------------------------------------------------------------------
652 void PARSER_GET_USER::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
653 {
654 RecvUserDataCb = f;
655 userDataCb = data;
656 }
657 //-----------------------------------------------------------------------------
658 //-----------------------------------------------------------------------------
659 //-----------------------------------------------------------------------------
660 PARSER_GET_SERVER_INFO::PARSER_GET_SERVER_INFO()
661 {
662 depth = 0;
663 error = false;
664 RecvServerInfoDataCb = NULL;
665 }
666 //-----------------------------------------------------------------------------
667 void PARSER_GET_SERVER_INFO::Reset()
668 {
669
670 }
671 //-----------------------------------------------------------------------------
672 int PARSER_GET_SERVER_INFO::ParseStart(const char *el, const char **attr)
673 {
674 depth++;
675 if (depth == 1)
676     {
677     if (strcasecmp(el, "ServerInfo") != 0)
678         {
679         //printf("%s\n", el);
680         }
681     }
682 else
683     {
684     if (depth == 2)
685         {
686         if (strcasecmp(el, "uname") == 0)
687             {
688             ParseUname(attr);
689             return 0;
690             }
691         if (strcasecmp(el, "version") == 0)
692             {
693             ParseServerVersion(attr);
694             return 0;
695             }
696         if (strcasecmp(el, "tariff") == 0)
697             {
698             ParseTariffType(attr);
699             return 0;
700             }
701         if (strcasecmp(el, "dir_num") == 0)
702             {
703             ParseDirNum(attr);
704             return 0;
705             }
706         if (strcasecmp(el, "users_num") == 0)
707             {
708             ParseUsersNum(attr);
709             return 0;
710             }
711         if (strcasecmp(el, "tariff_num") == 0)
712             {
713             ParseTariffsNum(attr);
714             return 0;
715             }
716
717         for (int j = 0; j < DIR_NUM; j++)
718             {
719             char str[16];
720             sprintf(str, "dir_name_%d", j);
721             if (strcasecmp(el, str) == 0)
722                 {
723                 ParseDirName(attr, j);
724                 }
725             }
726
727         }
728     }
729 return 0;
730 }
731 //-----------------------------------------------------------------------------
732 void PARSER_GET_SERVER_INFO::ParseEnd(const char *)
733 {
734 depth--;
735 if (depth == 0)
736     {
737     RecvServerInfoDataCb(&serverInfo, serverInfoDataCb);
738     }
739 }
740 //-----------------------------------------------------------------------------
741 /*void PARSER_GET_SERVER_INFO::ParseServerInfo(const char * el, const char ** attr)
742     {
743     }*/
744 //-----------------------------------------------------------------------------
745 void PARSER_GET_SERVER_INFO::SetServerInfoRecvCb(RecvServerInfoDataCb_t f, void * data)
746 {
747 RecvServerInfoDataCb = f;
748 serverInfoDataCb = data;
749 }
750 //-----------------------------------------------------------------------------
751 void PARSER_GET_SERVER_INFO::ParseUname(const char ** attr)
752 {
753 if (strcmp(*attr, "value") == 0)
754     serverInfo.uname = attr[1];
755 }
756 //-----------------------------------------------------------------------------
757 void PARSER_GET_SERVER_INFO::ParseServerVersion(const char ** attr)
758 {
759 if (strcmp(*attr, "value") == 0)
760     serverInfo.version = attr[1];
761 }
762 //-----------------------------------------------------------------------------
763 void PARSER_GET_SERVER_INFO::ParseUsersNum(const char ** attr)
764 {
765 if (strcmp(*attr, "value") == 0)
766     {
767     if (str2x(attr[1], serverInfo.usersNum) < 0)
768         {
769         serverInfo.usersNum = -1;
770         return;
771         }
772     }
773 }
774 //-----------------------------------------------------------------------------
775 void PARSER_GET_SERVER_INFO::ParseTariffsNum(const char ** attr)
776 {
777 if (strcmp(*attr, "value") == 0)
778     {
779     if (str2x(attr[1], serverInfo.tariffNum) < 0)
780         {
781         serverInfo.tariffNum = -1;
782         return;
783         }
784     }
785 }
786 //-----------------------------------------------------------------------------
787 void PARSER_GET_SERVER_INFO::ParseTariffType(const char ** attr)
788 {
789 if (strcmp(*attr, "value") == 0)
790     {
791     if (str2x(attr[1], serverInfo.tariffType) < 0)
792         {
793         serverInfo.tariffType = -1;
794         return;
795         }
796     }
797 }
798 //-----------------------------------------------------------------------------
799 void PARSER_GET_SERVER_INFO::ParseDirNum(const char **attr)
800 {
801 if (strcasecmp(*attr, "value") == 0)
802     {
803     if (str2x(attr[1], serverInfo.dirNum) < 0)
804         {
805         serverInfo.dirNum = -1;
806         return;
807         }
808     }
809 }
810 //-----------------------------------------------------------------------------
811 void PARSER_GET_SERVER_INFO::ParseDirName(const char **attr, int d)
812 {
813 if (strcmp(attr[0], "value") == 0)
814     {
815     char str[2*DIRNAME_LEN + 1];
816     Decode21(str, attr[1]);
817     serverInfo.dirName[d] = str;
818     }
819 }
820 //-----------------------------------------------------------------------------
821 //-----------------------------------------------------------------------------
822 //-----------------------------------------------------------------------------
823 PARSER_CHG_USER::PARSER_CHG_USER()
824 {
825 depth = 0;
826 error = false;
827 RecvChgUserCb = NULL;
828 }
829 //-----------------------------------------------------------------------------
830 int PARSER_CHG_USER::ParseStart(const char *el, const char **attr)
831 {
832 depth++;
833 if (depth == 1)
834     {
835     if (strcasecmp(el, "SetUser") == 0)
836         {
837         ParseAnswer(el, attr);
838         }
839     else if (strcasecmp(el, "DelUser") == 0)
840         {
841         ParseAnswer(el, attr);
842         }
843     else if (strcasecmp(el, "AddUser") == 0)
844         {
845         ParseAnswer(el, attr);
846         }
847     }
848 return 0;
849 }
850 //-----------------------------------------------------------------------------
851 void PARSER_CHG_USER::ParseEnd(const char *)
852 {
853 depth--;
854 }
855 //-----------------------------------------------------------------------------
856 void PARSER_CHG_USER::Reset()
857 {
858
859 }
860 //-----------------------------------------------------------------------------
861 void PARSER_CHG_USER::ParseAnswer(const char *, const char **attr)
862 {
863 if (RecvChgUserCb)
864     {
865     RecvChgUserCb(attr[1], chgUserCbData);
866     }
867 }
868 //-----------------------------------------------------------------------------
869 void PARSER_CHG_USER::SetChgUserRecvCb(RecvChgUserCb_t f, void * data)
870 {
871 RecvChgUserCb = f;
872 chgUserCbData = data;
873 }
874 //-----------------------------------------------------------------------------
875 //-----------------------------------------------------------------------------
876 //-----------------------------------------------------------------------------
877 PARSER_CHECK_USER::PARSER_CHECK_USER()
878 {
879 depth = 0;
880 error = false;
881 RecvCheckUserCb = NULL;
882 }
883 //-----------------------------------------------------------------------------
884 int PARSER_CHECK_USER::ParseStart(const char *el, const char **attr)
885 {
886 depth++;
887 if (depth == 1)
888     {
889     if (strcasecmp(el, "CheckUser") == 0)
890         {
891         //printf("el=%s attr[0]=%s attr[1]=%s\n", el, attr[0], attr[1]);
892         ParseAnswer(el, attr);
893         }
894     }
895 return 0;
896 }
897 //-----------------------------------------------------------------------------
898 void PARSER_CHECK_USER::ParseEnd(const char *)
899 {
900 depth--;
901 }
902 //-----------------------------------------------------------------------------
903 void PARSER_CHECK_USER::ParseAnswer(const char *, const char **attr)
904 {
905 if (RecvCheckUserCb)
906     {
907     RecvCheckUserCb(attr[1], checkUserCbData);
908     }
909 }
910 //-----------------------------------------------------------------------------
911 void PARSER_CHECK_USER::SetCheckUserRecvCb(RecvCheckUserCb_t f, void * data)
912 {
913 RecvCheckUserCb = f;
914 checkUserCbData = data;
915 }
916 //-----------------------------------------------------------------------------
917 //-----------------------------------------------------------------------------
918 //-----------------------------------------------------------------------------
919 PARSER_SEND_MESSAGE::PARSER_SEND_MESSAGE()
920 {
921 depth = 0;
922 error = false;
923 RecvSendMessageCb = NULL;
924 }
925 //-----------------------------------------------------------------------------
926 int  PARSER_SEND_MESSAGE::ParseStart(const char *el, const char **attr)
927 {
928 depth++;
929 if (depth == 1)
930     {
931     if (strcasecmp(el, "SendMessageResult") == 0)
932         {
933         ParseAnswer(el, attr);
934         }
935     }
936 return 0;
937 }
938 //-----------------------------------------------------------------------------
939 void PARSER_SEND_MESSAGE::ParseEnd(const char *)
940 {
941 depth--;
942 }
943 //-----------------------------------------------------------------------------
944 void PARSER_SEND_MESSAGE::Reset()
945 {
946
947 }
948 //-----------------------------------------------------------------------------
949 void PARSER_SEND_MESSAGE::ParseAnswer(const char *, const char **attr)
950 {
951 if (RecvSendMessageCb)
952     RecvSendMessageCb(attr[1], sendMessageCbData);
953 }
954 //-----------------------------------------------------------------------------
955 void PARSER_SEND_MESSAGE::SetSendMessageRecvCb(RecvSendMessageCb_t f, void * data)
956 {
957 RecvSendMessageCb = f;
958 sendMessageCbData = data;
959 }
960 //-----------------------------------------------------------------------------
961