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