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