8 #include "../../../tariffs.h"
9 #include "../../../admins.h"
10 #include "../../../users.h"
12 class STGCONFIG_CREATOR
15 STG_CONFIG * stgconfig;
19 : stgconfig(new STG_CONFIG())
27 STG_CONFIG * GetPlugin()
33 STGCONFIG_CREATOR stgc;
35 BASE_PLUGIN * GetPlugin()
37 return stgc.GetPlugin();
40 STG_CONFIG_SETTINGS::STG_CONFIG_SETTINGS()
45 const string& STG_CONFIG_SETTINGS::GetStrError() const
50 int STG_CONFIG_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
54 vector<PARAM_VALUE>::const_iterator pvi;
55 ///////////////////////////
57 pvi = find(s.moduleParams.begin(), s.moduleParams.end(), pv);
58 if (pvi == s.moduleParams.end())
60 errorStr = "Parameter \'Port\' not found.";
61 printfd(__FILE__, "Parameter 'Port' not found\n");
64 if (ParseIntInRange(pvi->value[0], 2, 65535, &p))
66 errorStr = "Cannot parse parameter \'Port\': " + errorStr;
67 printfd(__FILE__, "%s\n", errorStr.c_str());
75 uint16_t STG_CONFIG_SETTINGS::GetPort()
80 STG_CONFIG::STG_CONFIG()
86 string STG_CONFIG::GetVersion() const
88 return "Stg configurator v.2.00";
91 int STG_CONFIG::ParseSettings()
93 int ret = stgConfigSettings.ParseSettings(settings);
95 errorStr = stgConfigSettings.GetStrError();
99 int STG_CONFIG::Start()
104 if (PrepareNetwork())
109 config.SetPort(stgConfigSettings.GetPort());
110 config.SetAdmins(admins);
111 config.SetUsers(users);
112 config.SetTariffs(tariffs);
113 config.SetStgSettings(stgSettings);
114 config.SetStore(store);
116 if (config.Prepare())
118 errorStr = config.GetStrError();
122 if (pthread_create(&thread, NULL, Run, this))
124 errorStr = "Cannot create thread.";
125 printfd(__FILE__, "Cannot create thread\n");
133 int STG_CONFIG::Stop()
142 //5 seconds to thread stops itself
144 for (i = 0; i < 25 && !stopped; i++)
149 //after 5 seconds waiting thread still running. now killing it
152 //TODO pthread_cancel()
153 if (pthread_kill(thread, SIGINT))
155 errorStr = "Cannot kill thread.";
156 printfd(__FILE__, "Cannot kill thread\n");
157 return FinalizeNetwork();
159 printfd(__FILE__, "STG_CONFIG killed\n");
162 return FinalizeNetwork();
165 void * STG_CONFIG::Run(void * d)
167 STG_CONFIG * stgConf = static_cast<STG_CONFIG *>(d);
168 stgConf->running = true;
172 stgConf->stopped = true;
176 uint16_t STG_CONFIG::GetStartPosition() const
181 uint16_t STG_CONFIG::GetStopPosition() const
186 bool PrepareNetwork()
188 struct sockaddr_in local;
190 local.sin_family = AF_INET;
191 local.sin_port = htons(port);
192 local.sin_addr.s_addr = INADDR_ANY;
194 sd = socket(AF_INET, SOCK_STREAM, 0);
197 errorStr = "Error creating socket: '";
198 errorStr += strerror(errno);
203 if (bind(sd, static_cast<struct sockaddr *>(&local), sizeof(local)) < 0)
205 errorStr = "Error binding socket: '";
206 errorStr += strerror(errno);
214 bool FinalizeNetwork()
218 errorStr = "Error closing socket: '";
219 errorStr += strerror(errno);
226 void STG_CONFIG::RealRun()
228 if (listen(sd, 64) < 0)
230 errorStr = "Error listening socket: '";
231 errorStr += strerror(errno);
248 int res = select(sd + 1, &rfds, NULL, NULL, &tv);
260 if (FD_ISSET(sd, &rfds))
266 // Reorder: right part is done
267 std::list<ConnectionThread *>::iterator done(
271 std::not1(std::mem_fun(&ConnectionThread::isDone))
280 std::erase(done, connections.end());
286 void STG_CONFIG::AcceptConnection()
288 struct sockaddr_in remoteAddr;
289 socklen_t len = sizeof(struct sockaddr_in);
290 int rsd = accept(sd, &remoteAddr, &len);
297 connections.push_back(new ConnectionThread(this, rsd, remoteAddr, users, admins, tariffs, store, stgSettings));