]> git.stg.codes - stg.git/blob - stglibs/srvconf.lib/servconf.cpp
User parser refactoring.
[stg.git] / stglibs / srvconf.lib / servconf.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.8 $
23  $Date: 2010/08/04 00:40:38 $
24  $Author: faust $
25  */
26
27 #include <cstdio>
28 #include <cstring>
29
30 #include "stg/common.h"
31 #include "stg/servconf.h"
32
33 using namespace std;
34
35 //-----------------------------------------------------------------------------
36 int AnsRecv(void * data, list<string> * list1)
37 {
38 //NODE * node;
39 SERVCONF * sc;
40 char ans[ENC_MSG_LEN + 1];
41 int len, done = 0;
42
43 sc = (SERVCONF*)data;
44
45 XML_ParserReset(sc->parser, NULL);
46 XML_SetElementHandler(sc->parser, Start, End);
47 XML_SetUserData(sc->parser, data);
48
49 //loop parsing
50 list<string>::iterator node;
51 node = list1->begin();
52
53 if (node == list1->end())
54     {
55     return st_ok;
56     }
57
58 while (node != list1->end())
59     {
60     strncpy(ans, node->c_str(), ENC_MSG_LEN);
61     ans[ENC_MSG_LEN] = 0;
62        //printf("---> %s\n", ans);
63     len = strlen(ans);
64
65     if (XML_Parse(sc->parser, ans, len, done) == XML_STATUS_ERROR)
66         {
67         strprintf(&sc->errorMsg, "XML parse error at line %d: %s",
68                   static_cast<int>(XML_GetCurrentLineNumber(sc->parser)),
69                   XML_ErrorString(XML_GetErrorCode(sc->parser)));
70         return st_xml_parse_error;
71         }
72     ++node;
73
74     }
75
76 return 0;
77 }
78 //-----------------------------------------------------------------------------
79 void Start(void *data, const char *el, const char **attr)
80 {
81 SERVCONF * sc;
82 sc = (SERVCONF*)data;
83 sc->Start(el, attr);
84 }
85 //-----------------------------------------------------------------------------
86 void End(void *data, const char *el)
87 {
88 SERVCONF * sc;
89 sc = (SERVCONF*)data;
90 sc->End(el);
91 }
92 //-----------------------------------------------------------------------------
93 SERVCONF::SERVCONF()
94     : currParser(NULL),
95       parseDepth(0),
96       error(0),
97       RecvUserDataCb(NULL),
98       RecvGetUserDataCb(NULL),
99       RecvServerInfoDataCb(NULL),
100       RecvChgUserCb(NULL),
101       RecvCheckUserCb(NULL),
102       RecvSendMessageCb(NULL),
103       getUserDataDataCb(NULL),
104       getUserAuthByDataCb(NULL),
105       getUsersDataDataCb(NULL),
106       getServerInfoDataCb(NULL),
107       chgUserDataCb(NULL),
108       checkUserDataCb(NULL),
109       sendMessageDataCb(NULL)
110 {
111 parser = XML_ParserCreate(NULL);
112 }
113 //-----------------------------------------------------------------------------
114 void SERVCONF::SetServer(const char * server)
115 {
116 nt.SetServer(server);
117 }
118 //-----------------------------------------------------------------------------
119 void SERVCONF::SetPort(uint16_t port)
120 {
121 nt.SetServerPort(port);
122 }
123 //-----------------------------------------------------------------------------
124 void SERVCONF::SetAdmLogin(const char * login)
125 {
126 nt.SetLogin(login);
127 }
128 //-----------------------------------------------------------------------------
129 void SERVCONF::SetAdmPassword(const char * password)
130 {
131 nt.SetPassword(password);
132 }
133 //-----------------------------------------------------------------------------
134 int SERVCONF::GetUser(const char * l)
135 {
136 char request[255];
137 snprintf(request, 255, "<GetUser login=\"%s\"/>", l);
138 int ret;
139
140 currParser = &parserGetUser;
141 ((PARSER_GET_USER*)currParser)->SetUserDataRecvCb(RecvGetUserDataCb, getUserDataDataCb);
142
143 nt.Reset();
144 nt.SetRxCallback(this, AnsRecv);
145
146 if ((ret = nt.Connect()) != st_ok)
147     {
148     errorMsg = nt.GetError();
149     return ret;
150     }
151 if ((ret = nt.Transact(request)) != st_ok)
152     {
153     errorMsg = nt.GetError();
154     return ret;
155     }
156 if ((ret = nt.Disconnect()) != st_ok)
157     {
158     errorMsg = nt.GetError();
159     return ret;
160     }
161
162 return st_ok;
163 }
164 //-----------------------------------------------------------------------------
165 int SERVCONF::GetUserAuthBy(const char * l)
166 {
167 char request[255];
168 snprintf(request, 255, "<GetUserAuthBy login=\"%s\"/>", l);
169 int ret;
170
171 currParser = &parserAuthBy;
172 ((PARSER_AUTH_BY*)currParser)->SetRecvCb(RecvAuthByCb, getUserAuthByDataCb);
173
174 nt.Reset();
175 nt.SetRxCallback(this, AnsRecv);
176
177 if ((ret = nt.Connect()) != st_ok)
178     {
179     errorMsg = nt.GetError();
180     return ret;
181     }
182 if ((ret = nt.Transact(request)) != st_ok)
183     {
184     errorMsg = nt.GetError();
185     return ret;
186     }
187 if ((ret = nt.Disconnect()) != st_ok)
188     {
189     errorMsg = nt.GetError();
190     return ret;
191     }
192
193 return st_ok;
194 }
195 //-----------------------------------------------------------------------------
196 int SERVCONF::GetUsers()
197 {
198 char request[] = "<GetUsers/>";
199 int ret;
200
201 currParser = &parserGetUsers;
202 ((PARSER_GET_USERS*)currParser)->SetUserDataRecvCb(RecvUserDataCb, getUsersDataDataCb);
203
204 nt.Reset();
205 nt.SetRxCallback(this, AnsRecv);
206
207 if ((ret = nt.Connect()) != st_ok)
208     {
209     errorMsg = nt.GetError();
210     return ret;
211     }
212 if ((ret = nt.Transact(request)) != st_ok)
213     {
214     errorMsg = nt.GetError();
215     return ret;
216     }
217 if ((ret = nt.Disconnect()) != st_ok)
218     {
219     errorMsg = nt.GetError();
220     return ret;
221     }
222
223 return st_ok;
224 }
225 //-----------------------------------------------------------------------------
226 int SERVCONF::SendMessage(const char * login, const char * message, int prio)
227 {
228 char request[1000];
229 char msg[500];
230 Encode12(msg, message, strlen(message));
231 snprintf(request, 1000, "<Message login=\"%s\" priority=\"%d\" text=\"%s\"/>", login, prio, msg);
232 int ret;
233
234 currParser = &parserSendMessage;
235 parserSendMessage.SetSendMessageRecvCb(RecvSendMessageCb, sendMessageDataCb);
236
237 nt.Reset();
238 nt.SetRxCallback(this, AnsRecv);
239
240 if ((ret = nt.Connect()) != st_ok)
241     {
242     errorMsg = nt.GetError();
243     return ret;
244     }
245 if ((ret = nt.Transact(request)) != st_ok)
246     {
247     errorMsg = nt.GetError();
248     return ret;
249     }
250 if ((ret = nt.Disconnect()) != st_ok)
251     {
252     errorMsg = nt.GetError();
253     return ret;
254     }
255
256 return st_ok;
257 }
258 //-----------------------------------------------------------------------------
259 int SERVCONF::GetServerInfo()
260 {
261 char request[] = "<GetServerInfo/>";
262 int ret;
263
264 currParser = &parserServerInfo;
265 ((PARSER_GET_SERVER_INFO*)currParser)->SetServerInfoRecvCb(RecvServerInfoDataCb, getServerInfoDataCb);
266
267 nt.Reset();
268 nt.SetRxCallback(this, AnsRecv);
269
270 if ((ret = nt.Connect()) != st_ok)
271     {
272     errorMsg = nt.GetError();
273     return ret;
274     }
275 if ((ret = nt.Transact(request)) != st_ok)
276     {
277     errorMsg = nt.GetError();
278     return ret;
279     }
280 if ((ret = nt.Disconnect()) != st_ok)
281     {
282     errorMsg = nt.GetError();
283     return ret;
284     }
285
286 return st_ok;
287 }
288 //-----------------------------------------------------------------------------
289 int SERVCONF::ChgUser(const char * request)
290 {
291 int ret;
292
293 currParser = &parserChgUser;
294 ((PARSER_CHG_USER*)currParser)->SetChgUserRecvCb(RecvChgUserCb, chgUserDataCb);
295
296 nt.Reset();
297 nt.SetRxCallback(this, AnsRecv);
298
299 if ((ret = nt.Connect()) != st_ok)
300     {
301     errorMsg = nt.GetError();
302     return ret;
303     }
304 if ((ret = nt.Transact(request)) != st_ok)
305     {
306     errorMsg = nt.GetError();
307     return ret;
308     }
309 if ((ret = nt.Disconnect()) != st_ok)
310     {
311     errorMsg = nt.GetError();
312     return ret;
313     }
314
315 return st_ok;
316 }
317 //-----------------------------------------------------------------------------
318 //  TODO: remove this shit!
319 //-----------------------------------------------------------------------------
320 int SERVCONF::MsgUser(const char * request)
321 {
322 int ret;
323
324 currParser = &parserSendMessage;
325 parserSendMessage.SetSendMessageRecvCb(RecvSendMessageCb, sendMessageDataCb);
326
327 nt.Reset();
328 nt.SetRxCallback(this, AnsRecv);
329
330 if ((ret = nt.Connect()) != st_ok)
331     {
332     errorMsg = nt.GetError();
333     return ret;
334     }
335 if ((ret = nt.Transact(request)) != st_ok)
336     {
337     errorMsg = nt.GetError();
338     return ret;
339     }
340 if ((ret = nt.Disconnect()) != st_ok)
341     {
342     errorMsg = nt.GetError();
343     return ret;
344     }
345
346 return st_ok;
347 }
348 //-----------------------------------------------------------------------------
349 int SERVCONF::CheckUser(const char * login, const char * password)
350 {
351 char request[255];
352 snprintf(request, 255, "<CheckUser login=\"%s\" password=\"%s\"/>", login, password);
353 int ret;
354
355 currParser = &parserCheckUser;
356 ((PARSER_CHECK_USER*)currParser)->SetCheckUserRecvCb(RecvCheckUserCb, checkUserDataCb);
357
358 nt.Reset();
359 nt.SetRxCallback(this, AnsRecv);
360
361 if ((ret = nt.Connect()) != st_ok)
362     {
363     errorMsg = nt.GetError();
364     return ret;
365     }
366 if ((ret = nt.Transact(request)) != st_ok)
367     {
368     errorMsg = nt.GetError();
369     return ret;
370     }
371 if ((ret = nt.Disconnect()) != st_ok)
372     {
373     errorMsg = nt.GetError();
374     return ret;
375     }
376
377 return st_ok;
378 }
379 //-----------------------------------------------------------------------------
380 int SERVCONF::Start(const char *el, const char **attr)
381 {
382 currParser->ParseStart(el, attr);
383 return 0;
384 }
385 //-----------------------------------------------------------------------------
386 void SERVCONF::End(const char *el)
387 {
388 currParser->ParseEnd(el);
389 }
390 //-----------------------------------------------------------------------------
391 void SERVCONF::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
392 {
393 RecvUserDataCb = f;
394 getUsersDataDataCb = data;
395 }
396 //-----------------------------------------------------------------------------
397 void SERVCONF::SetGetUserDataRecvCb(RecvUserDataCb_t f, void * data)
398 {
399 RecvGetUserDataCb = f;            //GET_USER
400 getUserDataDataCb = data;
401 }
402 //-----------------------------------------------------------------------------
403 void SERVCONF::SetGetUserAuthByRecvCb(RecvAuthByDataCb_t f, void * data)
404 {
405 RecvAuthByCb = f;
406 getUserAuthByDataCb = data;
407 }
408 //-----------------------------------------------------------------------------
409 void SERVCONF::SetServerInfoRecvCb(RecvServerInfoDataCb_t f, void * data)
410 {
411 RecvServerInfoDataCb = f;
412 getServerInfoDataCb = data;
413 }
414 //-----------------------------------------------------------------------------
415 void SERVCONF::SetChgUserCb(RecvChgUserCb_t f, void * data)
416 {
417 RecvChgUserCb = f;
418 chgUserDataCb = data;
419 }
420 //-----------------------------------------------------------------------------
421 void SERVCONF::SetCheckUserCb(RecvCheckUserCb_t f, void * data)
422 {
423 RecvCheckUserCb = f;
424 checkUserDataCb = data;
425 }
426 //-----------------------------------------------------------------------------
427 void SERVCONF::SetSendMessageCb(RecvSendMessageCb_t f, void * data)
428 {
429 RecvSendMessageCb = f;
430 sendMessageDataCb = data;
431 }
432 //-----------------------------------------------------------------------------
433 const std::string & SERVCONF::GetStrError() const
434 {
435 return errorMsg;
436 }
437 //-----------------------------------------------------------------------------
438 int SERVCONF::GetError()
439 {
440 int e = error;
441 error = 0;
442 return e;
443 }
444 //-----------------------------------------------------------------------------