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