diff options
Diffstat (limited to 'src/Core/GameInfo/loadsupportedgames.cpp')
| -rw-r--r-- | src/Core/GameInfo/loadsupportedgames.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/Core/GameInfo/loadsupportedgames.cpp b/src/Core/GameInfo/loadsupportedgames.cpp new file mode 100644 index 0000000..9a73947 --- /dev/null +++ b/src/Core/GameInfo/loadsupportedgames.cpp @@ -0,0 +1,97 @@ +#include "loadsupportedgames.h" + +QHash<QString, GameInfo> loadSupportedGames (const QString &applicationPath) +{ + // return hash + QHash<QString, GameInfo> supportedGames; + + // supported games file path (following README structure) + const QString supportPath = applicationPath + "/" + _supportedPath; + + // determine if file exists + if ( ! QFile(supportPath).exists() ) + { + // no game info file exists + logPrimitive() << "No games file found at " << supportPath << endl + << "Please provide the correct file . " << endl; + return supportedGames; + } + + // load config file + QFile supportedFile(supportPath); + if ( ! supportedFile.open(QIODevice::ReadOnly) ) + { + // error occurred. report and quit. + logPrimitive() << "Unable to open the game file. Is the file open or in use?" << endl; + return supportedGames; + } + + // stats + int total = 0; + + // load as json object + QJsonDocument supportedJsonData(QJsonDocument::fromJson(supportedFile.readAll())); + + /* Optimisation for web interface: add games to the database. + * + * If database/json data do not match, replace database table + * with json data. This should only occur during database creation + * or when manual changes were made to the json file (which is rare). + */ + bool dbInsert = supportedJsonData.array().count() != getNumGames(0).value("numTotal", 0); + QSqlQuery q; + if (dbInsert) + { + // no game info file exists + logPrimitive() << "Game info mismatch in database. Reloading json data. (" + << supportedJsonData.array().count() << "/" + << getNumGames(0).value("numTotal", 0) << ")" << endl; + + // void existing data + q.prepare("DELETE FROM gameinfo"); + if ( ! q.exec() ) + reportQuery(q); + } + + for (int i = 0; i < supportedJsonData.array().count(); i++) + { + // get the game object + QJsonObject thisGame = supportedJsonData.array().at(i).toObject(); + + GameInfo gameInfo; + gameInfo.gamename = thisGame.value("gamename").toString(""); + gameInfo.cipher = thisGame.value("cipher").toString(""); + gameInfo.port = static_cast<unsigned short>(thisGame.value("port").toDouble(0)); + gameInfo.label = thisGame.value("label").toString(""); + + // insert in db if needed + if (dbInsert) + { + QString insertString = "INSERT INTO gameinfo (gamename, label) " + "VALUES (:gamename, :label)"; + + q.prepare(insertString); + q.bindValue(":gamename", gameInfo.gamename ); + q.bindValue(":label", gameInfo.label); + + if ( ! q.exec() ) + reportQuery(q); + } + + // add to list + supportedGames.insert(gameInfo.gamename, gameInfo); + total++; + } + + // no games found? report this! + if (total <= 0) + { + // no game info exists + logPrimitive() << "No game info found in file at " << supportPath << endl + << "Please provide the correct file . " << endl; + return supportedGames; + } + + // all games parsed. done. + return supportedGames; +} |
