]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/configproto.cpp
Added modification time for session traffic.
[stg.git] / projects / stargazer / plugins / configuration / sgconfig / configproto.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  *    Date: 27.10.2002
19  */
20
21 /*
22  *    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
23  */
24
25  /*
26  $Revision: 1.22 $
27  $Date: 2010/10/04 20:24:14 $
28  $Author: faust $
29  */
30
31
32 #include "parser.h"
33 #include "parser_auth_by.h"
34 #include "parser_user_info.h"
35
36 #include "stg/users.h"
37 #include "stg/admins.h"
38 #include "stg/tariffs.h"
39 #include "stg/logger.h"
40
41 #include <unistd.h>
42
43 #include "configproto.h"
44
45 //-----------------------------------------------------------------------------
46 void ParseXMLStart(void *data, const char *el, const char **attr)
47 {
48 CONFIGPROTO * cp = static_cast<CONFIGPROTO *>(data);
49
50 if (cp->currParser)
51     {
52     cp->currParser->SetAnswerList(&cp->answerList);
53     cp->currParser->SetCurrAdmin(*cp->currAdmin);
54     cp->currParser->ParseStart(data, el, attr);
55     }
56 else
57     {
58     for (size_t i = 0; i < cp->dataParser.size(); i++)
59         {
60         cp->dataParser[i]->SetAnswerList(&cp->answerList);
61         cp->dataParser[i]->SetCurrAdmin(*cp->currAdmin);
62         cp->dataParser[i]->Reset();
63         if (cp->dataParser[i]->ParseStart(data, el, attr) == 0)
64             {
65             cp->currParser = cp->dataParser[i];
66             break;
67             }
68         else
69             {
70             cp->dataParser[i]->Reset();
71             }
72         }
73     }
74 }
75 //-----------------------------------------------------------------------------
76 void ParseXMLEnd(void *data, const char *el)
77 {
78 CONFIGPROTO * cp = static_cast<CONFIGPROTO *>(data);
79 if (cp->currParser)
80     {
81     if (cp->currParser->ParseEnd(data, el) == 0)
82         {
83         cp->currParser = NULL;
84         }
85     }
86 else
87     {
88     for (size_t i = 0; i < cp->dataParser.size(); i++)
89         {
90         if (cp->dataParser[i]->ParseEnd(data, el) == 0)
91             {
92             break;
93             }
94         }
95     }
96 }
97 //-----------------------------------------------------------------------------
98 CONFIGPROTO::CONFIGPROTO(PLUGIN_LOGGER & l)
99     : answerList(),
100       requestList(),
101       adminIP(0),
102       adminLogin(),
103       adminPassword(),
104       port(0),
105       thrReciveSendConf(),
106       nonstop(true),
107       state(0),
108       currAdmin(NULL),
109       logger(l),
110       listenSocket(-1),
111       parserGetServInfo(),
112       parserGetUsers(),
113       parserGetUser(),
114       parserChgUser(),
115       parserAddUser(),
116       parserDelUser(),
117       parserCheckUser(),
118       parserSendMessage(),
119       parserAuthBy(),
120       parserGetAdmins(),
121       parserAddAdmin(),
122       parserDelAdmin(),
123       parserChgAdmin(),
124       parserGetTariffs(),
125       parserAddTariff(),
126       parserDelTariff(),
127       parserChgTariff(),
128       admins(NULL),
129       currParser(NULL),
130       dataParser(),
131       xmlParser(),
132       errorStr()
133 {
134 dataParser.push_back(new PARSER_GET_SERVER_INFO);
135
136 dataParser.push_back(new PARSER_GET_USERS);
137 dataParser.push_back(new PARSER_GET_USER);
138 dataParser.push_back(new PARSER_CHG_USER);
139 dataParser.push_back(new PARSER_ADD_USER);
140 dataParser.push_back(new PARSER_DEL_USER);
141 dataParser.push_back(new PARSER_CHECK_USER);
142 dataParser.push_back(new PARSER_SEND_MESSAGE);
143 dataParser.push_back(new PARSER_AUTH_BY);
144 dataParser.push_back(new PARSER_USER_INFO);
145
146 dataParser.push_back(new PARSER_GET_TARIFFS);
147 dataParser.push_back(new PARSER_ADD_TARIFF);
148 dataParser.push_back(new PARSER_DEL_TARIFF);
149 dataParser.push_back(new PARSER_CHG_TARIFF);
150
151 dataParser.push_back(new PARSER_GET_ADMINS);
152 dataParser.push_back(new PARSER_CHG_ADMIN);
153 dataParser.push_back(new PARSER_DEL_ADMIN);
154 dataParser.push_back(new PARSER_ADD_ADMIN);
155
156 xmlParser = XML_ParserCreate(NULL);
157
158 if (!xmlParser)
159     {
160     logger("Couldn't allocate memory for parser.");
161     exit(1);
162     }
163
164 }
165 //-----------------------------------------------------------------------------
166 CONFIGPROTO::~CONFIGPROTO()
167 {
168 for (size_t i = 0; i < dataParser.size(); ++i)
169     delete dataParser[i];
170 XML_ParserFree(xmlParser);
171 }
172 //-----------------------------------------------------------------------------
173 int CONFIGPROTO::ParseCommand()
174 {
175 std::list<std::string>::iterator n;
176 int done = 0;
177 char str[9];
178
179 if (requestList.empty())
180     return 0;
181
182 n = requestList.begin();
183
184 strncpy(str, (*n).c_str(), 8);
185 str[8] = 0;
186
187 XML_ParserReset(xmlParser, NULL);
188 XML_SetElementHandler(xmlParser, ParseXMLStart, ParseXMLEnd);
189 XML_SetUserData(xmlParser, this);
190
191 while(nonstop)
192     {
193     strncpy(str, (*n).c_str(), 8);
194     str[8] = 0;
195     size_t len = strlen(str);
196
197     ++n;
198     if (n == requestList.end())
199         done = 1;
200     --n;
201
202     if (XML_Parse(xmlParser, (*n).c_str(), static_cast<int>(len), done) == XML_STATUS_ERROR)
203         {
204         logger("Invalid configuration request");
205         printfd(__FILE__, "Parse error at line %d:\n%s\n",
206            XML_GetCurrentLineNumber(xmlParser),
207            XML_ErrorString(XML_GetErrorCode(xmlParser)));
208         if (currParser)
209             {
210             printfd(__FILE__, "Parser reset\n");
211             currParser->Reset();
212             currParser = NULL;
213             }
214
215         return -1;
216         }
217
218     if (done)
219         return 0;
220
221     ++n;
222     }
223
224 return 0;
225 }
226 //-----------------------------------------------------------------------------
227 void CONFIGPROTO::SetPort(uint16_t p)
228 {
229 port = p;
230 }
231 //-----------------------------------------------------------------------------
232 void CONFIGPROTO::SetAdmins(ADMINS * a)
233 {
234 admins = a;
235 for (size_t i = 0; i < dataParser.size(); i++)
236     {
237     dataParser[i]->SetAdmins(a);
238     }
239
240 }
241 //-----------------------------------------------------------------------------
242 void CONFIGPROTO::SetUsers(USERS * u)
243 {
244 for (size_t i = 0; i < dataParser.size(); i++)
245     {
246     dataParser[i]->SetUsers(u);
247     }
248
249 }
250 //-----------------------------------------------------------------------------
251 void CONFIGPROTO::SetTariffs(TARIFFS * t)
252 {
253 for (size_t i = 0; i < dataParser.size(); i++)
254     {
255     dataParser[i]->SetTariffs(t);
256     }
257 }
258 //-----------------------------------------------------------------------------
259 void CONFIGPROTO::SetStore(STORE * s)
260 {
261 for (size_t i = 0; i < dataParser.size(); i++)
262     {
263     dataParser[i]->SetStore(s);
264     }
265 }
266 //-----------------------------------------------------------------------------
267 void CONFIGPROTO::SetStgSettings(const SETTINGS * s)
268 {
269 for (size_t i = 0; i < dataParser.size(); i++)
270     {
271     dataParser[i]->SetStgSettings(s);
272     }
273 }
274 //-----------------------------------------------------------------------------