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