]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/configproto.cpp
Massive refactoring.
[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(PLUGIN_LOGGER & l)
90     : answerList(),
91       requestList(),
92       adminIP(0),
93       adminLogin(),
94       adminPassword(),
95       port(0),
96       thrReciveSendConf(),
97       nonstop(true),
98       state(0),
99       currAdmin(NULL),
100       logger(l),
101       listenSocket(-1),
102       parserGetServInfo(),
103       parserGetUsers(),
104       parserGetUser(),
105       parserChgUser(),
106       parserAddUser(),
107       parserDelUser(),
108       parserCheckUser(),
109       parserSendMessage(),
110       parserGetAdmins(),
111       parserAddAdmin(),
112       parserDelAdmin(),
113       parserChgAdmin(),
114       parserGetTariffs(),
115       parserAddTariff(),
116       parserDelTariff(),
117       parserChgTariff(),
118       admins(NULL),
119       currParser(NULL),
120       dataParser(),
121       xmlParser(),
122       errorStr()
123 {
124 dataParser.push_back(&parserGetServInfo);
125
126 dataParser.push_back(&parserGetUsers);
127 dataParser.push_back(&parserGetUser);
128 dataParser.push_back(&parserChgUser);
129 dataParser.push_back(&parserAddUser);
130 dataParser.push_back(&parserDelUser);
131 dataParser.push_back(&parserCheckUser);
132 dataParser.push_back(&parserSendMessage);
133
134 dataParser.push_back(&parserGetTariffs);
135 dataParser.push_back(&parserAddTariff);
136 dataParser.push_back(&parserDelTariff);
137 dataParser.push_back(&parserChgTariff);
138
139 dataParser.push_back(&parserGetAdmins);
140 dataParser.push_back(&parserChgAdmin);
141 dataParser.push_back(&parserDelAdmin);
142 dataParser.push_back(&parserAddAdmin);
143
144 xmlParser = XML_ParserCreate(NULL);
145
146 if (!xmlParser)
147     {
148     logger("Couldn't allocate memory for parser.");
149     exit(1);
150     }
151
152 }
153 //-----------------------------------------------------------------------------
154 CONFIGPROTO::~CONFIGPROTO()
155 {
156 XML_ParserFree(xmlParser);
157 }
158 //-----------------------------------------------------------------------------
159 int CONFIGPROTO::ParseCommand()
160 {
161 std::list<std::string>::iterator n;
162 int done = 0;
163 char str[9];
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     size_t 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(), static_cast<int>(len), done) == XML_STATUS_ERROR)
189         {
190         logger("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 //-----------------------------------------------------------------------------