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