]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/configproto.cpp
Pre-allocate DIR_TRAFF container with DIR_NUM items.
[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       parserAuthBy(),
111       parserGetAdmins(),
112       parserAddAdmin(),
113       parserDelAdmin(),
114       parserChgAdmin(),
115       parserGetTariffs(),
116       parserAddTariff(),
117       parserDelTariff(),
118       parserChgTariff(),
119       admins(NULL),
120       currParser(NULL),
121       dataParser(),
122       xmlParser(),
123       errorStr()
124 {
125 dataParser.push_back(&parserGetServInfo);
126
127 dataParser.push_back(&parserGetUsers);
128 dataParser.push_back(&parserGetUser);
129 dataParser.push_back(&parserChgUser);
130 dataParser.push_back(&parserAddUser);
131 dataParser.push_back(&parserDelUser);
132 dataParser.push_back(&parserCheckUser);
133 dataParser.push_back(&parserSendMessage);
134 dataParser.push_back(&parserAuthBy);
135
136 dataParser.push_back(&parserGetTariffs);
137 dataParser.push_back(&parserAddTariff);
138 dataParser.push_back(&parserDelTariff);
139 dataParser.push_back(&parserChgTariff);
140
141 dataParser.push_back(&parserGetAdmins);
142 dataParser.push_back(&parserChgAdmin);
143 dataParser.push_back(&parserDelAdmin);
144 dataParser.push_back(&parserAddAdmin);
145
146 xmlParser = XML_ParserCreate(NULL);
147
148 if (!xmlParser)
149     {
150     logger("Couldn't allocate memory for parser.");
151     exit(1);
152     }
153
154 }
155 //-----------------------------------------------------------------------------
156 CONFIGPROTO::~CONFIGPROTO()
157 {
158 XML_ParserFree(xmlParser);
159 }
160 //-----------------------------------------------------------------------------
161 int CONFIGPROTO::ParseCommand()
162 {
163 std::list<std::string>::iterator n;
164 int done = 0;
165 char str[9];
166
167 if (requestList.empty())
168     return 0;
169
170 n = requestList.begin();
171
172 strncpy(str, (*n).c_str(), 8);
173 str[8] = 0;
174
175 XML_ParserReset(xmlParser, NULL);
176 XML_SetElementHandler(xmlParser, ParseXMLStart, ParseXMLEnd);
177 XML_SetUserData(xmlParser, this);
178
179 while(nonstop)
180     {
181     strncpy(str, (*n).c_str(), 8);
182     str[8] = 0;
183     size_t len = strlen(str);
184
185     ++n;
186     if (n == requestList.end())
187         done = 1;
188     --n;
189
190     if (XML_Parse(xmlParser, (*n).c_str(), static_cast<int>(len), done) == XML_STATUS_ERROR)
191         {
192         logger("Invalid configuration request");
193         printfd(__FILE__, "Parse error at line %d:\n%s\n",
194            XML_GetCurrentLineNumber(xmlParser),
195            XML_ErrorString(XML_GetErrorCode(xmlParser)));
196         if (currParser)
197             {
198             printfd(__FILE__, "Parser reset\n");
199             currParser->Reset();
200             currParser = NULL;
201             }
202
203         return -1;
204         }
205
206     if (done)
207         return 0;
208
209     ++n;
210     }
211
212 return 0;
213 }
214 //-----------------------------------------------------------------------------
215 void CONFIGPROTO::SetPort(uint16_t p)
216 {
217 port = p;
218 }
219 //-----------------------------------------------------------------------------
220 void CONFIGPROTO::SetAdmins(ADMINS * a)
221 {
222 admins = a;
223 for (size_t i = 0; i < dataParser.size(); i++)
224     {
225     dataParser[i]->SetAdmins(a);
226     }
227
228 }
229 //-----------------------------------------------------------------------------
230 void CONFIGPROTO::SetUsers(USERS * u)
231 {
232 for (size_t i = 0; i < dataParser.size(); i++)
233     {
234     dataParser[i]->SetUsers(u);
235     }
236
237 }
238 //-----------------------------------------------------------------------------
239 void CONFIGPROTO::SetTariffs(TARIFFS * t)
240 {
241 for (size_t i = 0; i < dataParser.size(); i++)
242     {
243     dataParser[i]->SetTariffs(t);
244     }
245 }
246 //-----------------------------------------------------------------------------
247 void CONFIGPROTO::SetStore(STORE * s)
248 {
249 for (size_t i = 0; i < dataParser.size(); i++)
250     {
251     dataParser[i]->SetStore(s);
252     }
253 }
254 //-----------------------------------------------------------------------------
255 void CONFIGPROTO::SetStgSettings(const SETTINGS * s)
256 {
257 for (size_t i = 0; i < dataParser.size(); i++)
258     {
259     dataParser[i]->SetStgSettings(s);
260     }
261 }
262 //-----------------------------------------------------------------------------