aboutsummaryrefslogtreecommitdiff
path: root/src/Settings/loadsettings.cpp
blob: 943311b0e73557a79ae737ced4f0db18cdefd7c0 (plain)
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;
}