diff options
| author | Dark1-dev <shansarkar272@gmail.com> | 2023-03-01 21:30:57 +0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-03-01 21:30:57 +0600 |
| commit | 60a301a93b6057bb2c54ac04a7c38c38389037b3 (patch) | |
| tree | b09c5f8bc0045828c660654d8ed6744663856202 /src/Settings/loadsettings.cpp | |
| parent | c784240d1af68dbd8d0466822b34fd05d6ccdda1 (diff) | |
| download | Masterserver-Qt5-60a301a93b6057bb2c54ac04a7c38c38389037b3.tar.gz Masterserver-Qt5-60a301a93b6057bb2c54ac04a7c38c38389037b3.zip | |
Add files via upload
Diffstat (limited to 'src/Settings/loadsettings.cpp')
| -rw-r--r-- | src/Settings/loadsettings.cpp | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/Settings/loadsettings.cpp b/src/Settings/loadsettings.cpp new file mode 100644 index 0000000..943311b --- /dev/null +++ b/src/Settings/loadsettings.cpp @@ -0,0 +1,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; +} |
