1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#include "loadsettings.h"
SettingStructure loadSettings (const QString &applicationPath)
{
// return object
SettingStructure settings;
// determine if file exists
QString settingsFilePath = applicationPath + "/" + _settingsPath;
if ( ! QFile(settingsFilePath).exists() )
{
// no settings file exists. ask to generate clean settings file.
logPrimitive() << "No valid settings file was found at " << settingsFilePath << endl
<< "Do you want to generate a clean settings file? [y/N]" << endl;
// if opted for new config, create a new config file at the provided location
if ( QTextStream(stdin).readLine().startsWith("y") )
{
// generate new settings file
writeSettings(settingsFilePath);
// inform that a file was written
logPrimitive() << "A new settings file was generated. Please update your "
<< "settings in " << settingsFilePath << endl
<< "and restart the application." << endl;
}
// do NOT init = true, the application is now intended to shut down due to init==false
return settings;
}
// open settings
QSettings settingsFile(settingsFilePath, QSettings::IniFormat);
if ( settingsFile.status() != QSettings::NoError )
{
// error occurred. report and quit.
logPrimitive() << "An error occurred while loading the configuration (" << QString::number( settingsFile.status() ) << ").";
// do NOT init = true, the application is now intended to shut down due to init==false
return settings;
}
// logging settings
settings.LoggingSettings.cycle = settingsFile.value("Logging/CycleLogs", settings.LoggingSettings.cycle).toString();
settings.LoggingSettings.suppressLog = settingsFile.value("Logging/SuppressLog", settings.LoggingSettings.suppressLog).toString();
settings.LoggingSettings.suppressDisplay = settingsFile.value("Logging/SuppressDisplay", settings.LoggingSettings.suppressDisplay).toString();
// beacon server settings (udp server)
settings.BeaconServerSettings.beaconPort = static_cast<unsigned short>( settingsFile.value("BeaconServer/BeaconPort", settings.BeaconServerSettings.beaconPort).toInt() );
settings.BeaconServerSettings.doUplink = settingsFile.value("BeaconServer/DoUplink", settings.BeaconServerSettings.doUplink).toBool();
// listen server settings (tcp server)
settings.ListenServerSettings.listenPort = static_cast<unsigned short>( settingsFile.value("ListenServer/ListenPort", settings.ListenServerSettings.listenPort).toInt() );
settings.ListenServerSettings.serverttl_s = settingsFile.value("ListenServer/ServerLifeTime_s", settings.ListenServerSettings.serverttl_s).toInt();
// syncer settings (tcp client)
settings.SyncerSettings.doSync = settingsFile.value("Syncer/DoSync", settings.SyncerSettings.doSync).toBool();
settings.SyncerSettings.syncGames = settingsFile.value("Syncer/SyncGames", settings.SyncerSettings.syncGames).toString().toLower();
settings.SyncerSettings.syncInterval_s = settingsFile.value("Syncer/SyncInterval_s", settings.SyncerSettings.syncInterval_s).toInt();
// error and number of items
int parseError = -1;
int len = settingsFile.beginReadArray("Syncer");
// read list of syncer items
for (int i = 0; i < len; i++)
{
settingsFile.setArrayIndex(i);
SyncServer syncServer;
QStringList strServer = settingsFile.value("SyncServer").toString().split(",");
if ( strServer.length() >= 3 )
{
// parse
syncServer.remoteAddress = strServer.value(0).trimmed();
syncServer.beaconPort = strServer.value(1).toUShort();
syncServer.listenPort = strServer.value(2).toUShort();
// sanity checks
if (! syncServer.remoteAddress.isEmpty() and
syncServer.beaconPort > 0 and
syncServer.listenPort > 0)
{
// add
settings.SyncerSettings.syncServers.append(syncServer);
continue;
}
}
// else input error, do not continue parsing
parseError = i;
break;
}
settingsFile.endArray();
// server checker (udp client ticker)
settings.CheckerSettings.doCheck = settingsFile.value("Checker/DoCheck", settings.CheckerSettings.doCheck).toBool();
settings.CheckerSettings.getExtendedInfo = settingsFile.value("Checker/GetExtendedInformation", settings.CheckerSettings.getExtendedInfo).toBool();
settings.CheckerSettings.timeServerInterval_ms = settingsFile.value("Checker/ServerCheckInterval_ms", settings.CheckerSettings.timeServerInterval_ms).toInt();
settings.CheckerSettings.timeCheckerReset_s = settingsFile.value("Checker/CycleInterval_s", settings.CheckerSettings.timeCheckerReset_s).toInt();
// maintenance settings
settings.MaintenanceSettings.doMaintenance = settingsFile.value("Maintenance/DoMaintenance", settings.MaintenanceSettings.doMaintenance).toBool();
settings.MaintenanceSettings.timeMaintenanceInterval_s = settingsFile.value("Maintenance/MaintainRate_s", settings.MaintenanceSettings.timeMaintenanceInterval_s).toInt();
// public details
settings.PublicInformationSettings.hostname = settingsFile.value("PublicDetails/Hostname", "").toString();
settings.PublicInformationSettings.adminName = settingsFile.value("PublicDetails/AdminName", "").toString();
settings.PublicInformationSettings.contact = settingsFile.value("PublicDetails/Contact", "").toString();
// sanity checks
try {
// beacon / udp server
if ( settings.BeaconServerSettings.beaconPort <= 0 ) throw QString("BeaconServer/BeaconPort");
// listen / tcp server
if ( settings.ListenServerSettings.listenPort <= 0 ) throw QString("ListenServer/ListenPort");
if ( settings.ListenServerSettings.serverttl_s < 0) throw QString("ListenServer/ServerLifeTimeSeconds");
// syncer / tcp client
if ( settings.SyncerSettings.syncGames.isEmpty() ) throw QString("Syncer/SyncGames");
if ( settings.SyncerSettings.syncInterval_s <= 0 ) throw QString();
if (parseError >= 0) throw QStringLiteral("Syncer/SyncServer[%1]").arg(QString::number(parseError+1));
// server checker / udp client
if ( settings.CheckerSettings.timeServerInterval_ms < 10 ) throw QString("Checker/ServerCheckInterval_ms");
if ( settings.CheckerSettings.timeCheckerReset_s < 1 ) throw QString("Checker/CycleInterval_s");
// make sure that details are filled in
if (settings.PublicInformationSettings.hostname.isEmpty()) throw QString("PublicDetails/Hostname");
if (settings.PublicInformationSettings.adminName.isEmpty()) throw QString("PublicDetails/AdminName");
if (settings.PublicInformationSettings.contact.isEmpty()) throw QString("PublicDetails/Contact");
}
catch (QString error)
{
logPrimitive() << "One or more settings are incorrect: setting \"" << error << "\" has an incorrect value! "
<< "Please correct the value and restart the application." << endl;
return settings;
}
// loading settings complete
settings.init = true;
return settings;
}
|