]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig2/configproto.cpp
Merge branch 'naffanya-dev'
[stg.git] / projects / stargazer / plugins / configuration / sgconfig2 / 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.20 $
27  $Date: 2009/10/20 11:53:40 $
28  $Author: faust $
29  */
30
31
32 //#include <string.h>
33 //#include <stdio.h>
34 #include <unistd.h>
35
36 #include "configproto.h"
37
38 //-----------------------------------------------------------------------------
39 void ParseXMLStart(void *data, const char *el, const char **attr)
40 {
41 CONFIGPROTO * cp = (CONFIGPROTO*)(data);
42
43 if (cp->currParser)
44     {
45     cp->currParser->SetAnswerList(&cp->answerList);
46     cp->currParser->SetCurrAdmin(cp->currAdmin);
47     cp->currParser->ParseStart(data, el, attr);
48     }
49 else
50     {
51     for (unsigned int i = 0; i < cp->dataParser.size(); i++)
52         {
53         cp->dataParser[i]->SetAnswerList(&cp->answerList);
54         cp->currAdmin->SetAdminIP(cp->GetAdminIP());
55         cp->dataParser[i]->SetCurrAdmin(cp->currAdmin);
56         cp->dataParser[i]->Reset();
57         if (cp->dataParser[i]->ParseStart(data, el, attr) == 0)
58             {
59             cp->currParser = cp->dataParser[i];
60             break;
61             }
62         else
63             {
64             cp->dataParser[i]->Reset();
65             }
66         }
67     }
68 }
69 //-----------------------------------------------------------------------------
70 void ParseXMLEnd(void *data, const char *el)
71 {
72 CONFIGPROTO * cp = (CONFIGPROTO*)(data);
73 if (cp->currParser)
74     {
75     if (cp->currParser->ParseEnd(data, el) == 0)
76         {
77         cp->currParser = NULL;
78         }
79     }
80 else
81     {
82     for (unsigned int i = 0; i < cp->dataParser.size(); i++)
83         {
84         if (cp->dataParser[i]->ParseEnd(data, el) == 0)
85             {
86             break;
87             }
88         }
89     }
90 }
91 //-----------------------------------------------------------------------------
92 CONFIGPROTO::CONFIGPROTO()
93     : adminIP(0),
94       port(0),
95       nonstop(1),
96       state(0),
97       currAdmin(NULL),
98       WriteServLog(GetStgLogger()),
99       outerSocket(0),
100       listenSocket(0),
101       admins(NULL),
102       users(NULL),
103       tariffs(NULL),
104       store(NULL),
105       settings(NULL),
106       currParser(NULL)
107 {
108 dataParser.push_back(&parserGetServInfo);
109
110 dataParser.push_back(&parserGetUsers);
111 dataParser.push_back(&parserGetUser);
112 dataParser.push_back(&parserChgUser);
113 dataParser.push_back(&parserAddUser);
114 dataParser.push_back(&parserDelUser);
115 dataParser.push_back(&parserCheckUser);
116 dataParser.push_back(&parserSendMessage);
117
118 dataParser.push_back(&parserGetTariffs);
119 dataParser.push_back(&parserAddTariff);
120 dataParser.push_back(&parserDelTariff);
121 dataParser.push_back(&parserChgTariff);
122
123 dataParser.push_back(&parserGetAdmins);
124 dataParser.push_back(&parserChgAdmin);
125 dataParser.push_back(&parserDelAdmin);
126 dataParser.push_back(&parserAddAdmin);
127
128 xmlParser = XML_ParserCreate(NULL);
129
130 if (!xmlParser)
131     {
132     WriteServLog("Couldn't allocate memory for parser.");
133     exit(1);
134     }
135
136 //XML_SetElementHandler(parser, ParseXMLStart, ParseXMLEnd);
137 }
138 //-----------------------------------------------------------------------------
139 CONFIGPROTO::~CONFIGPROTO()
140 {
141 XML_ParserFree(xmlParser);
142 }
143 //-----------------------------------------------------------------------------
144 int CONFIGPROTO::ParseCommand()
145 {
146 list<string>::iterator n;
147 int done = 0;
148 char str[9];
149 int len;
150
151 if (requestList.empty())
152     return 0;
153
154 n = requestList.begin();
155
156 strncpy(str, (*n).c_str(), 8);
157 str[8] = 0;
158
159 XML_ParserReset(xmlParser, NULL);
160 XML_SetElementHandler(xmlParser, ParseXMLStart, ParseXMLEnd);
161 XML_SetUserData(xmlParser, this);
162
163 while(nonstop)
164     {
165     strncpy(str, (*n).c_str(), 8);
166     str[8] = 0;
167     len = strlen(str);
168
169     n++;
170     if (n == requestList.end())
171         done = 1;
172     n--;
173
174     if (XML_Parse(xmlParser, (*n).c_str(), len, done) == XML_STATUS_ERROR)
175         {
176         WriteServLog("Invalid configuration request");
177         printfd(__FILE__, "Parse error at line %d:\n%s\n",
178            XML_GetCurrentLineNumber(xmlParser),
179            XML_ErrorString(XML_GetErrorCode(xmlParser)));
180         if (currParser)
181             {
182             printfd(__FILE__, "Parser reset\n");
183             currParser->Reset();
184             currParser = NULL;
185             }
186
187         return -1;
188         }
189
190     if (done)
191         return 0;
192
193     n++;
194     }
195
196 return 0;
197 }
198 //-----------------------------------------------------------------------------
199 void CONFIGPROTO::SetPort(uint16_t p)
200 {
201 port = p;
202 }
203 //-----------------------------------------------------------------------------
204 /*void CONFIGPROTO::SetHostAllow(HOSTALLOW *)
205 {
206 //hostAllow = ha;
207 }*/
208 //-----------------------------------------------------------------------------
209 void CONFIGPROTO::SetAdmins(ADMINS * a)
210 {
211 admins = a;
212 for (unsigned int i = 0; i < dataParser.size(); i++)
213     {
214     dataParser[i]->SetAdmins(admins);
215     }
216
217 }
218 //-----------------------------------------------------------------------------
219 void CONFIGPROTO::SetUsers(USERS * u)
220 {
221 users = u;
222 for (unsigned int i = 0; i < dataParser.size(); i++)
223     {
224     dataParser[i]->SetUsers(users);
225     }
226
227 }
228 //-----------------------------------------------------------------------------
229 void CONFIGPROTO::SetTariffs(TARIFFS * t)
230 {
231 tariffs = t;
232 for (unsigned int i = 0; i < dataParser.size(); i++)
233     {
234     dataParser[i]->SetTariffs(tariffs);
235     }
236 }
237 //-----------------------------------------------------------------------------
238 void CONFIGPROTO::SetStore(STORE * s)
239 {
240 store = s;
241 for (unsigned int i = 0; i < dataParser.size(); i++)
242     {
243     dataParser[i]->SetStore(s);
244     }
245 }
246 //-----------------------------------------------------------------------------
247 void CONFIGPROTO::SetStgSettings(const SETTINGS * s)
248 {
249 settings = s;
250 for (unsigned int i = 0; i < dataParser.size(); i++)
251     {
252     dataParser[i]->SetStgSettings(settings);
253     }
254 }
255 //-----------------------------------------------------------------------------
256 /*void CONFIGPROTO::Start()
257 {
258 finished = false;
259 threadExited = false;
260 status = starting;
261
262 xmlParser = XML_ParserCreate(NULL);
263
264 if (!xmlParser)
265     {
266     WriteServLog("Couldn't allocate memory for parser.");
267     }
268
269 pthread_create(&thrReciveSendConf, NULL, ReciveSendConf, this);
270 status = started;
271 }*/
272 //-----------------------------------------------------------------------------
273 /*int CONFIGPROTO::Stop()
274 {
275 nonstop = true;
276 close(outerSocket);
277 return 0;
278 }*/
279 //-----------------------------------------------------------------------------
280 /*void CONFIGPROTO::Restart()
281 {
282 //Stop();
283 //Start();
284 }*/
285 //-----------------------------------------------------------------------------
286 /*CONF_STATUS CONFIGPROTO::Status()
287 {
288 //return status;
289 }
290 //-----------------------------------------------------------------------------
291 */
292 const string & CONFIGPROTO::GetStrError()
293 {
294 return errorStr;
295 }
296 //-----------------------------------------------------------------------------
297 uint32_t CONFIGPROTO::GetAdminIP()
298 {
299 return adminIP;
300 }
301 //-----------------------------------------------------------------------------