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