]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/configproto.cpp
Fixed problems with connect/disconnect notification.
[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 list<string>::iterator n;
162 int done = 0;
163 char str[9];
164 int len;
165
166 if (requestList.empty())
167     return 0;
168
169 n = requestList.begin();
170
171 strncpy(str, (*n).c_str(), 8);
172 str[8] = 0;
173
174 XML_ParserReset(xmlParser, NULL);
175 XML_SetElementHandler(xmlParser, ParseXMLStart, ParseXMLEnd);
176 XML_SetUserData(xmlParser, this);
177
178 while(nonstop)
179     {
180     strncpy(str, (*n).c_str(), 8);
181     str[8] = 0;
182     len = strlen(str);
183
184     ++n;
185     if (n == requestList.end())
186         done = 1;
187     --n;
188
189     if (XML_Parse(xmlParser, (*n).c_str(), len, done) == XML_STATUS_ERROR)
190         {
191         logger("Invalid configuration request");
192         printfd(__FILE__, "Parse error at line %d:\n%s\n",
193            XML_GetCurrentLineNumber(xmlParser),
194            XML_ErrorString(XML_GetErrorCode(xmlParser)));
195         if (currParser)
196             {
197             printfd(__FILE__, "Parser reset\n");
198             currParser->Reset();
199             currParser = NULL;
200             }
201
202         return -1;
203         }
204
205     if (done)
206         return 0;
207
208     ++n;
209     }
210
211 return 0;
212 }
213 //-----------------------------------------------------------------------------
214 void CONFIGPROTO::SetPort(uint16_t p)
215 {
216 port = p;
217 }
218 //-----------------------------------------------------------------------------
219 void CONFIGPROTO::SetAdmins(ADMINS * a)
220 {
221 admins = a;
222 for (size_t i = 0; i < dataParser.size(); i++)
223     {
224     dataParser[i]->SetAdmins(a);
225     }
226
227 }
228 //-----------------------------------------------------------------------------
229 void CONFIGPROTO::SetUsers(USERS * u)
230 {
231 for (size_t i = 0; i < dataParser.size(); i++)
232     {
233     dataParser[i]->SetUsers(u);
234     }
235
236 }
237 //-----------------------------------------------------------------------------
238 void CONFIGPROTO::SetTariffs(TARIFFS * t)
239 {
240 for (size_t i = 0; i < dataParser.size(); i++)
241     {
242     dataParser[i]->SetTariffs(t);
243     }
244 }
245 //-----------------------------------------------------------------------------
246 void CONFIGPROTO::SetStore(STORE * s)
247 {
248 for (size_t i = 0; i < dataParser.size(); i++)
249     {
250     dataParser[i]->SetStore(s);
251     }
252 }
253 //-----------------------------------------------------------------------------
254 void CONFIGPROTO::SetStgSettings(const SETTINGS * s)
255 {
256 for (size_t i = 0; i < dataParser.size(); i++)
257     {
258     dataParser[i]->SetStgSettings(s);
259     }
260 }
261 //-----------------------------------------------------------------------------