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