]> git.stg.codes - stg.git/blob - stglibs/srvconf.lib/servconf.cpp
Improved release version checking.
[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       error(0),
96       RecvUserDataCb(NULL),
97       RecvGetUserDataCb(NULL),
98       RecvServerInfoDataCb(NULL),
99       RecvChgUserCb(NULL),
100       RecvCheckUserCb(NULL),
101       RecvSendMessageCb(NULL),
102       getUserDataDataCb(NULL),
103       getUserAuthByDataCb(NULL),
104       getUsersDataDataCb(NULL),
105       getServerInfoDataCb(NULL),
106       chgUserDataCb(NULL),
107       checkUserDataCb(NULL),
108       sendMessageDataCb(NULL)
109 {
110 parser = XML_ParserCreate(NULL);
111 }
112 //-----------------------------------------------------------------------------
113 void SERVCONF::SetServer(const char * server)
114 {
115 nt.SetServer(server);
116 }
117 //-----------------------------------------------------------------------------
118 void SERVCONF::SetPort(uint16_t port)
119 {
120 nt.SetServerPort(port);
121 }
122 //-----------------------------------------------------------------------------
123 void SERVCONF::SetAdmLogin(const char * login)
124 {
125 nt.SetLogin(login);
126 }
127 //-----------------------------------------------------------------------------
128 void SERVCONF::SetAdmPassword(const char * password)
129 {
130 nt.SetPassword(password);
131 }
132 //-----------------------------------------------------------------------------
133 int SERVCONF::GetUser(const char * l)
134 {
135 char request[255];
136 snprintf(request, 255, "<GetUser login=\"%s\"/>", l);
137 int ret;
138
139 currParser = &parserGetUser;
140 ((PARSER_GET_USER*)currParser)->SetUserDataRecvCb(RecvGetUserDataCb, getUserDataDataCb);
141
142 nt.Reset();
143 nt.SetRxCallback(this, AnsRecv);
144
145 if ((ret = nt.Connect()) != st_ok)
146     {
147     errorMsg = nt.GetError();
148     return ret;
149     }
150 if ((ret = nt.Transact(request)) != st_ok)
151     {
152     errorMsg = nt.GetError();
153     return ret;
154     }
155 if ((ret = nt.Disconnect()) != st_ok)
156     {
157     errorMsg = nt.GetError();
158     return ret;
159     }
160
161 return st_ok;
162 }
163 //-----------------------------------------------------------------------------
164 int SERVCONF::GetUserAuthBy(const char * l)
165 {
166 char request[255];
167 snprintf(request, 255, "<GetUserAuthBy login=\"%s\"/>", l);
168 int ret;
169
170 currParser = &parserAuthBy;
171 ((PARSER_AUTH_BY*)currParser)->SetRecvCb(RecvAuthByCb, getUserAuthByDataCb);
172
173 nt.Reset();
174 nt.SetRxCallback(this, AnsRecv);
175
176 if ((ret = nt.Connect()) != st_ok)
177     {
178     errorMsg = nt.GetError();
179     return ret;
180     }
181 if ((ret = nt.Transact(request)) != st_ok)
182     {
183     errorMsg = nt.GetError();
184     return ret;
185     }
186 if ((ret = nt.Disconnect()) != st_ok)
187     {
188     errorMsg = nt.GetError();
189     return ret;
190     }
191
192 return st_ok;
193 }
194 //-----------------------------------------------------------------------------
195 int SERVCONF::GetUsers()
196 {
197 char request[] = "<GetUsers/>";
198 int ret;
199
200 currParser = &parserGetUsers;
201 ((PARSER_GET_USERS*)currParser)->SetUserDataRecvCb(RecvUserDataCb, getUsersDataDataCb);
202
203 nt.Reset();
204 nt.SetRxCallback(this, AnsRecv);
205
206 if ((ret = nt.Connect()) != st_ok)
207     {
208     errorMsg = nt.GetError();
209     return ret;
210     }
211 if ((ret = nt.Transact(request)) != st_ok)
212     {
213     errorMsg = nt.GetError();
214     return ret;
215     }
216 if ((ret = nt.Disconnect()) != st_ok)
217     {
218     errorMsg = nt.GetError();
219     return ret;
220     }
221
222 return st_ok;
223 }
224 //-----------------------------------------------------------------------------
225 int SERVCONF::SendMessage(const char * login, const char * message, int prio)
226 {
227 char request[1000];
228 char msg[500];
229 Encode12(msg, message, strlen(message));
230 snprintf(request, 1000, "<Message login=\"%s\" priority=\"%d\" text=\"%s\"/>", login, prio, msg);
231 int ret;
232
233 currParser = &parserSendMessage;
234 parserSendMessage.SetSendMessageRecvCb(RecvSendMessageCb, sendMessageDataCb);
235
236 nt.Reset();
237 nt.SetRxCallback(this, AnsRecv);
238
239 if ((ret = nt.Connect()) != st_ok)
240     {
241     errorMsg = nt.GetError();
242     return ret;
243     }
244 if ((ret = nt.Transact(request)) != st_ok)
245     {
246     errorMsg = nt.GetError();
247     return ret;
248     }
249 if ((ret = nt.Disconnect()) != st_ok)
250     {
251     errorMsg = nt.GetError();
252     return ret;
253     }
254
255 return st_ok;
256 }
257 //-----------------------------------------------------------------------------
258 int SERVCONF::GetServerInfo()
259 {
260 char request[] = "<GetServerInfo/>";
261 int ret;
262
263 currParser = &parserServerInfo;
264 ((PARSER_GET_SERVER_INFO*)currParser)->SetServerInfoRecvCb(RecvServerInfoDataCb, getServerInfoDataCb);
265
266 nt.Reset();
267 nt.SetRxCallback(this, AnsRecv);
268
269 if ((ret = nt.Connect()) != st_ok)
270     {
271     errorMsg = nt.GetError();
272     return ret;
273     }
274 if ((ret = nt.Transact(request)) != st_ok)
275     {
276     errorMsg = nt.GetError();
277     return ret;
278     }
279 if ((ret = nt.Disconnect()) != st_ok)
280     {
281     errorMsg = nt.GetError();
282     return ret;
283     }
284
285 return st_ok;
286 }
287 //-----------------------------------------------------------------------------
288 int SERVCONF::ChgUser(const char * request)
289 {
290 int ret;
291
292 currParser = &parserChgUser;
293 ((PARSER_CHG_USER*)currParser)->SetChgUserRecvCb(RecvChgUserCb, chgUserDataCb);
294
295 nt.Reset();
296 nt.SetRxCallback(this, AnsRecv);
297
298 if ((ret = nt.Connect()) != st_ok)
299     {
300     errorMsg = nt.GetError();
301     return ret;
302     }
303 if ((ret = nt.Transact(request)) != st_ok)
304     {
305     errorMsg = nt.GetError();
306     return ret;
307     }
308 if ((ret = nt.Disconnect()) != st_ok)
309     {
310     errorMsg = nt.GetError();
311     return ret;
312     }
313
314 return st_ok;
315 }
316 //-----------------------------------------------------------------------------
317 //  TODO: remove this shit!
318 //-----------------------------------------------------------------------------
319 int SERVCONF::MsgUser(const char * request)
320 {
321 int ret;
322
323 currParser = &parserSendMessage;
324 parserSendMessage.SetSendMessageRecvCb(RecvSendMessageCb, sendMessageDataCb);
325
326 nt.Reset();
327 nt.SetRxCallback(this, AnsRecv);
328
329 if ((ret = nt.Connect()) != st_ok)
330     {
331     errorMsg = nt.GetError();
332     return ret;
333     }
334 if ((ret = nt.Transact(request)) != st_ok)
335     {
336     errorMsg = nt.GetError();
337     return ret;
338     }
339 if ((ret = nt.Disconnect()) != st_ok)
340     {
341     errorMsg = nt.GetError();
342     return ret;
343     }
344
345 return st_ok;
346 }
347 //-----------------------------------------------------------------------------
348 int SERVCONF::CheckUser(const char * login, const char * password)
349 {
350 char request[255];
351 snprintf(request, 255, "<CheckUser login=\"%s\" password=\"%s\"/>", login, password);
352 int ret;
353
354 currParser = &parserCheckUser;
355 ((PARSER_CHECK_USER*)currParser)->SetCheckUserRecvCb(RecvCheckUserCb, checkUserDataCb);
356
357 nt.Reset();
358 nt.SetRxCallback(this, AnsRecv);
359
360 if ((ret = nt.Connect()) != st_ok)
361     {
362     errorMsg = nt.GetError();
363     return ret;
364     }
365 if ((ret = nt.Transact(request)) != st_ok)
366     {
367     errorMsg = nt.GetError();
368     return ret;
369     }
370 if ((ret = nt.Disconnect()) != st_ok)
371     {
372     errorMsg = nt.GetError();
373     return ret;
374     }
375
376 return st_ok;
377 }
378 //-----------------------------------------------------------------------------
379 int SERVCONF::Start(const char *el, const char **attr)
380 {
381 currParser->ParseStart(el, attr);
382 return 0;
383 }
384 //-----------------------------------------------------------------------------
385 void SERVCONF::End(const char *el)
386 {
387 currParser->ParseEnd(el);
388 }
389 //-----------------------------------------------------------------------------
390 void SERVCONF::SetUserDataRecvCb(RecvUserDataCb_t f, void * data)
391 {
392 RecvUserDataCb = f;
393 getUsersDataDataCb = data;
394 }
395 //-----------------------------------------------------------------------------
396 void SERVCONF::SetGetUserDataRecvCb(RecvUserDataCb_t f, void * data)
397 {
398 RecvGetUserDataCb = f;            //GET_USER
399 getUserDataDataCb = data;
400 }
401 //-----------------------------------------------------------------------------
402 void SERVCONF::SetGetUserAuthByRecvCb(RecvAuthByDataCb_t f, void * data)
403 {
404 RecvAuthByCb = f;
405 getUserAuthByDataCb = data;
406 }
407 //-----------------------------------------------------------------------------
408 void SERVCONF::SetServerInfoRecvCb(RecvServerInfoDataCb_t f, void * data)
409 {
410 RecvServerInfoDataCb = f;
411 getServerInfoDataCb = data;
412 }
413 //-----------------------------------------------------------------------------
414 void SERVCONF::SetChgUserCb(RecvChgUserCb_t f, void * data)
415 {
416 RecvChgUserCb = f;
417 chgUserDataCb = data;
418 }
419 //-----------------------------------------------------------------------------
420 void SERVCONF::SetCheckUserCb(RecvCheckUserCb_t f, void * data)
421 {
422 RecvCheckUserCb = f;
423 checkUserDataCb = data;
424 }
425 //-----------------------------------------------------------------------------
426 void SERVCONF::SetSendMessageCb(RecvSendMessageCb_t f, void * data)
427 {
428 RecvSendMessageCb = f;
429 sendMessageDataCb = data;
430 }
431 //-----------------------------------------------------------------------------
432 const std::string & SERVCONF::GetStrError() const
433 {
434 return errorMsg;
435 }
436 //-----------------------------------------------------------------------------
437 int SERVCONF::GetError()
438 {
439 int e = error;
440 error = 0;
441 return e;
442 }
443 //-----------------------------------------------------------------------------