]> git.stg.codes - stg.git/blob - projects/stargazer/plugins/configuration/sgconfig/stgconfig.cpp
d2ad12b79d2944e5234210cc9e1a6a276448ecac
[stg.git] / projects / stargazer / plugins / configuration / sgconfig / stgconfig.cpp
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <signal.h>
4
5 #include "stgconfig.h"
6 #include "../../../tariffs.h"
7 #include "../../../admins.h"
8 #include "../../../users.h"
9
10 class STGCONFIG_CREATOR
11 {
12 private:
13     STG_CONFIG * stgconfig;
14
15 public:
16     STGCONFIG_CREATOR()
17         : stgconfig(new STG_CONFIG())
18         {
19         };
20     ~STGCONFIG_CREATOR()
21         {
22         delete stgconfig;
23         };
24
25     STG_CONFIG * GetPlugin()
26         {
27         return stgconfig;
28         };
29 };
30 //-----------------------------------------------------------------------------
31 //-----------------------------------------------------------------------------
32 //-----------------------------------------------------------------------------
33 STGCONFIG_CREATOR stgc;
34 //-----------------------------------------------------------------------------
35 //-----------------------------------------------------------------------------
36 //-----------------------------------------------------------------------------
37 STG_CONFIG_SETTINGS::STG_CONFIG_SETTINGS()
38     : port(0)
39 {
40 }
41 //-----------------------------------------------------------------------------
42 const string& STG_CONFIG_SETTINGS::GetStrError() const
43 {
44 return errorStr;
45 }
46 //-----------------------------------------------------------------------------
47 int STG_CONFIG_SETTINGS::ParseIntInRange(const string & str, int min, int max, int * val)
48 {
49 if (str2x(str.c_str(), *val))
50     {
51     errorStr = "Incorrect value \'" + str + "\'.";
52     return -1;
53     }
54 if (*val < min || *val > max)
55     {
56     errorStr = "Value \'" + str + "\' out of range.";
57     return -1;
58     }
59 return 0;
60 }
61 //-----------------------------------------------------------------------------
62 int STG_CONFIG_SETTINGS::ParseSettings(const MODULE_SETTINGS & s)
63 {
64 int p;
65 PARAM_VALUE pv;
66 vector<PARAM_VALUE>::const_iterator pvi;
67 ///////////////////////////
68 pv.param = "Port";
69 pvi = find(s.moduleParams.begin(), s.moduleParams.end(), pv);
70 if (pvi == s.moduleParams.end())
71     {
72     errorStr = "Parameter \'Port\' not found.";
73     printfd(__FILE__, "Parameter 'Port' not found\n");
74     return -1;
75     }
76 if (ParseIntInRange(pvi->value[0], 2, 65535, &p))
77     {
78     errorStr = "Cannot parse parameter \'Port\': " + errorStr;
79     printfd(__FILE__, "%s\n", errorStr.c_str());
80     return -1;
81     }
82 port = p;
83
84 return 0;
85 }
86 //-----------------------------------------------------------------------------
87 uint16_t STG_CONFIG_SETTINGS::GetPort() const
88 {
89 return port;
90 }
91 //-----------------------------------------------------------------------------
92 //-----------------------------------------------------------------------------
93 //-----------------------------------------------------------------------------
94 BASE_PLUGIN * GetPlugin()
95 {
96 return stgc.GetPlugin();
97 }
98 //-----------------------------------------------------------------------------
99 //-----------------------------------------------------------------------------
100 //-----------------------------------------------------------------------------
101 const string STG_CONFIG::GetVersion() const
102 {
103 return "Stg configurator v.0.08";
104 }
105 //-----------------------------------------------------------------------------
106 STG_CONFIG::STG_CONFIG()
107     : nonstop(false),
108       isRunning(false),
109       users(NULL),
110       admins(NULL),
111       tariffs(NULL),
112       store(NULL),
113       stgSettings(NULL)
114 {
115 }
116 //-----------------------------------------------------------------------------
117 void STG_CONFIG::SetUsers(USERS * u)
118 {
119 users = u;
120 }
121 //-----------------------------------------------------------------------------
122 void STG_CONFIG::SetTariffs(TARIFFS * t)
123 {
124 tariffs = t;
125 }
126 //-----------------------------------------------------------------------------
127 void STG_CONFIG::SetAdmins(ADMINS * a)
128 {
129 admins = a;
130 }
131 //-----------------------------------------------------------------------------
132 void STG_CONFIG::SetStore(BASE_STORE * s)
133 {
134 store = s;
135 }
136 //-----------------------------------------------------------------------------
137 void STG_CONFIG::SetStgSettings(const SETTINGS * s)
138 {
139 stgSettings = s;
140 }
141 //-----------------------------------------------------------------------------
142 void STG_CONFIG::SetSettings(const MODULE_SETTINGS & s)
143 {
144 settings = s;
145 }
146 //-----------------------------------------------------------------------------
147 int STG_CONFIG::ParseSettings()
148 {
149 int ret = stgConfigSettings.ParseSettings(settings);
150 if (ret)
151     errorStr = stgConfigSettings.GetStrError();
152 return ret;
153 }
154 //-----------------------------------------------------------------------------
155 const string & STG_CONFIG::GetStrError() const
156 {
157 return errorStr;
158 }
159 //-----------------------------------------------------------------------------
160 int STG_CONFIG::Start()
161 {
162 if (isRunning)
163     return 0;
164
165 nonstop = true;
166
167 config.SetPort(stgConfigSettings.GetPort());
168 config.SetAdmins(admins);
169 config.SetUsers(users);
170 config.SetTariffs(tariffs);
171 config.SetStgSettings(stgSettings);
172 config.SetStore(store);
173
174 if (config.Prepare())
175     {
176     errorStr = config.GetStrError();
177     return -1;
178     }
179
180 if (pthread_create(&thread, NULL, Run, this))
181     {
182     errorStr = "Cannot create thread.";
183     printfd(__FILE__, "Cannot create thread\n");
184     return -1;
185     }
186 errorStr = "";
187 return 0;
188 }
189 //-----------------------------------------------------------------------------
190 int STG_CONFIG::Stop()
191 {
192 if (!isRunning)
193     return 0;
194
195 config.Stop();
196
197 //5 seconds to thread stops itself
198 int i;
199 for (i = 0; i < 25; i++)
200     {
201     if (!isRunning)
202         break;
203
204     usleep(200000);
205     }
206
207 //after 5 seconds waiting thread still running. now killing it
208 if (isRunning)
209     {
210     //TODO pthread_cancel()
211     if (pthread_kill(thread, SIGINT))
212         {
213         errorStr = "Cannot kill thread.";
214         printfd(__FILE__, "Cannot kill thread\n");
215         return -1;
216         }
217     printfd(__FILE__, "STG_CONFIG killed\n");
218     }
219
220 return 0;
221 }
222 //-----------------------------------------------------------------------------
223 bool STG_CONFIG::IsRunning()
224 {
225 return isRunning;
226 }
227 //-----------------------------------------------------------------------------
228 void * STG_CONFIG::Run(void * d)
229 {
230 STG_CONFIG * stgConf = (STG_CONFIG *)d;
231 stgConf->isRunning = true;
232
233 stgConf->config.Run(&stgConf->config);
234
235 stgConf->isRunning = false;
236 return NULL;
237 }
238 //-----------------------------------------------------------------------------
239 uint16_t STG_CONFIG::GetStartPosition() const
240 {
241 return 220;
242 }
243 //-----------------------------------------------------------------------------
244 uint16_t STG_CONFIG::GetStopPosition() const
245 {
246 return 220;
247 }
248 //-----------------------------------------------------------------------------
249
250