Browse Source

Moved error checks to Utils module

Ivan Arkhipov 4 năm trước cách đây
mục cha
commit
304b5305cc

+ 1 - 0
src/Legacy/Legacy.pro

@@ -18,6 +18,7 @@ SOURCES += \
     models/downloader.cpp \
     models/lotrodatmanager.cpp \
     models/selfupdater.cpp \
+    utils.cpp \
     widgets/helpwidget.cpp \
     widgets/mainwindow.cpp \
     widgets/menuentry.cpp \

+ 3 - 103
src/Legacy/legacyapplication.cpp

@@ -14,13 +14,11 @@
 extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
 
 
-LegacyApplication::LegacyApplication(int &argc, char **argv)
-    : QApplication(argc, argv)
-{
+LegacyApplication::LegacyApplication() {
     qInstallMessageHandler(logMessageHandler);
 
     modules_init_timer_.setInterval(1 * 1000); // one second.
-    connect(&modules_init_timer_, &QTimer::timeout, this, &LegacyApplication::HandleModulesInitTimer);
+    connect(&modules_init_timer_, &QTimer::timeout, this, &LegacyApplication::InitModules);
     modules_init_timer_.stop();
 }
 
@@ -81,83 +79,6 @@ bool LegacyApplication::init()
     return true;
 }
 
-LegacyApplication::ErrorStatus LegacyApplication::CheckErrorStatus()
-{
-    size_t status = E_NO_ERRORS;
-    QString game_folder_path = Settings::getValue("Lotro/game_path").toString();
-    QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
-
-    // Checking LotroLauncher.exe availability
-    QFileInfo lotro_launcher_exe(game_folder_path + "/LotroLauncher.exe");
-    if (!lotro_launcher_exe.exists()) {
-        status |= E_WRONG_GAME_FOLDER;
-    } else {
-        if (!QFile::setPermissions(lotro_launcher_exe.absoluteFilePath(),
-                QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ExeUser)) {
-            status |= E_WRONG_FILE_PERMISSIONS;
-        }
-    }
-
-    // Checking DAT files availability & correctness
-    if (!patch_list->getManager()->Initialised() || !patch_list->getManager()->DatPathIsRelevant()) {
-        QString client_local_filepath = game_folder_path + "/client_local_" + locale_prefix + ".dat";
-        QString client_general_filepath = game_folder_path + "/client_general.dat";
-
-        QFileInfo client_local_file(client_local_filepath);
-        QFileInfo client_general_file(client_general_filepath);
-
-        if (!client_general_file.exists() || !client_local_file.exists()) {
-            status |= E_DAT_FILES_MISSING;
-        } else {
-            if (!QFile::setPermissions(client_general_filepath,
-                                       QFileDevice::ReadUser |
-                                       QFileDevice::WriteUser |
-                                       QFileDevice::ExeUser)) {
-                status |= E_WRONG_FILE_PERMISSIONS;
-                status |= E_CANNOT_ACCESS_DAT_FILES;
-            }
-
-            if (!QFile::setPermissions(client_local_filepath,
-                                       QFileDevice::ReadUser |
-                                       QFileDevice::WriteUser |
-                                       QFileDevice::ExeUser)) {
-                status |= E_WRONG_FILE_PERMISSIONS;
-                status |= E_CANNOT_ACCESS_DAT_FILES;
-            }
-        }
-
-        LOTRO_DAT::DatFile test_file;
-        auto result = test_file.Initialise(client_local_filepath.toStdString(), 0);
-        if (!result.result) {
-            if (result.msg == "DATINIT: Error, cannot initialize dat due to internal IO error") {
-                status |= E_CANNOT_ACCESS_DAT_FILES;
-            } else {
-                status |= E_DAT_FILE_INCORRECT;
-            }
-        }
-
-        result = test_file.Initialise(client_general_filepath.toStdString(), 0);
-        if (!result.result) {
-            if (result.msg == "DATINIT: Error, cannot initialize dat due to internal IO error") {
-                status |= E_CANNOT_ACCESS_DAT_FILES;
-            } else {
-                status |= E_DAT_FILE_INCORRECT;
-            }
-        }
-    }
-
-    if (!checkInternetConnection(QUrl(Settings::getValue("Network/patch_updates_url").toString()))) {
-        status |= E_NO_SERVER_CONNECTION;
-    }
-
-    qDebug() << "LegacyApplication: StatusCheck: " << ErrorStatus(status);
-    return ErrorStatus(status);
-}
-
-void LegacyApplication::HandleModulesInitTimer()
-{
-
-}
 
 void LegacyApplication::InitModules()
 {
@@ -169,7 +90,7 @@ void LegacyApplication::InitModules()
 
     modules_init_timer_.stop();
     seconds_after_previous_try_to_init_ = 0;
-    ErrorStatus status = CheckErrorStatus();
+    AppErrorStatus status = CheckAppPrerequesities();
     emit ErrorStatusChanged(status);
 
     if (status == E_NO_ERRORS) {
@@ -180,24 +101,3 @@ void LegacyApplication::InitModules()
         modules_init_timer_.start();
     }
 }
-
-QDebug operator<<(QDebug dbg, const LegacyApplication::ErrorStatus &status)
-{
-    bool wrong_game_folder = (status & LegacyApplication::E_WRONG_GAME_FOLDER);
-    bool dat_files_missing = (status & LegacyApplication::E_DAT_FILES_MISSING);
-    bool wrong_file_permissions = (status & LegacyApplication::E_WRONG_FILE_PERMISSIONS);
-    bool cannot_access_dat_files = (status & LegacyApplication::E_CANNOT_ACCESS_DAT_FILES);
-    bool dat_file_incorrect = (status & LegacyApplication::E_DAT_FILE_INCORRECT);
-    bool no_server_connection = (status & LegacyApplication::E_NO_SERVER_CONNECTION);
-
-    dbg.nospace() << "ErrorStatus ( "
-        << (wrong_game_folder ? "Wrong game folder! " : "")
-        << (dat_files_missing ? "Dat files missing! " : "")
-        << (wrong_file_permissions ? "Wrong file permissions! " : "")
-        << (cannot_access_dat_files ? "Cannot access dat files! " : "")
-        << (dat_file_incorrect ? "Incorrect dat file! " : "")
-        << (no_server_connection ? "No server connection! " : "")
-        << ")";
-
-    return dbg;
-}

+ 13 - 22
src/Legacy/legacyapplication.h

@@ -1,45 +1,38 @@
 #ifndef LEGACYAPPLICATION_H
 #define LEGACYAPPLICATION_H
 
-#include <QApplication>
 #include <QThread>
 #include <QTimer>
 
+#include "utils.h"
+
 class LotroDatManager;
 class PatchList;
 class MainWindow;
 
-class LegacyApplication : public QApplication
+class LegacyApplication : public QObject
 {
     Q_OBJECT
 
 public:
-    enum ErrorStatus : int {
-        E_WRONG_GAME_FOLDER = 32,
-        E_DAT_FILES_MISSING = 16,
-        E_WRONG_FILE_PERMISSIONS = 8,
-        E_CANNOT_ACCESS_DAT_FILES = 4,
-        E_DAT_FILE_INCORRECT = 2,
-        E_NO_SERVER_CONNECTION = 1,
-        E_NO_ERRORS = 0
-    };
-
-    LegacyApplication(int &argc, char** argv);
+    static LegacyApplication& instance() {
+        static LegacyApplication instance;
+        return instance;
+    }
+
+private:
+    LegacyApplication();
 
+public:
     bool init();
 
 signals:
-    void ErrorStatusChanged(ErrorStatus status);
+    void ErrorStatusChanged(AppErrorStatus status);
 
     void SecondsToNextTryToInitChanged(size_t seconds_elapsed);
 
-private:
-    void InitModules();
-
-    ErrorStatus CheckErrorStatus();
-
 private slots:
-    void HandleModulesInitTimer();
+    void InitModules();
 
 private:
     LotroDatManager *lotro_dat_manager = nullptr;
@@ -52,6 +45,4 @@ private:
     const size_t try_to_init_timeout_ = 10;
 };
 
-QDebug operator<<(QDebug dbg, const LegacyApplication::ErrorStatus &status);
-
 #endif // LEGACYAPPLICATION_H

+ 3 - 3
src/Legacy/main.cpp

@@ -1,6 +1,6 @@
+#include <QApplication>
 #include "legacyapplication.h"
 
-
 // Global. Should be updated only by MainWindow!!!
 double window_height = 1000;
 double window_width = 648;
@@ -8,9 +8,9 @@ double window_width = 648;
 int main(int argc, char *argv[])
 {
     setlocale(LC_ALL,"Russian");
-    LegacyApplication app(argc, argv);
+    QApplication app(argc, argv);
 
-    if (!app.init()) {
+    if (!LegacyApplication::instance().init()) {
         return 1;
     }
 

+ 162 - 0
src/Legacy/utils.cpp

@@ -0,0 +1,162 @@
+/*
+ * This file contains minor utility functions
+ */
+
+#include <QNetworkAccessManager>
+#include <QNetworkReply>
+#include <QEventLoop>
+#include <QFile>
+#include <QTimer>
+#include <QLockFile>
+#include <QDir>
+#include <QMessageBox>
+
+#include "models/settings.h"
+#include "utils.h"
+
+bool checkInternetConnection(QUrl url) {
+    QNetworkAccessManager nam;
+    QNetworkRequest req(url);
+    QNetworkReply* reply = nam.get(req);
+    QEventLoop loop;
+    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+
+    QTimer request_timeout_timer;
+    QObject::connect(&request_timeout_timer, &QTimer::timeout, &loop, &QEventLoop::quit);
+    request_timeout_timer.start(5000); // 5 seconds connection timeout
+    loop.exec();
+    return reply->bytesAvailable();
+}
+
+void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
+{
+    QString message_type;
+
+    switch (type) {
+    case QtDebugMsg:
+        message_type = "[DEBG]";
+        break;
+    case QtInfoMsg:
+        message_type = "[INFO]";
+        break;
+    case QtWarningMsg:
+        message_type = "[WARN]";
+        break;
+    case QtCriticalMsg:
+        message_type = "[CRIT]";
+        break;
+    case QtFatalMsg:
+        message_type = "[FATL]";
+        break;
+    default:
+        message_type = "[UNKN]";
+        break;
+    }
+
+    QString filename = context.category;
+    QString function = context.function;
+    QString line_number = QString::number(context.line);
+
+    QString s = QString("%1: %2 ||| %3:%4 %5\n")
+                .arg(message_type)
+                .arg(msg)
+                .arg(filename)
+                .arg(line_number)
+                .arg(function);
+
+#ifdef QT_DEBUG
+    QFile log_file("legacy_v2.log");
+    log_file.open(QIODevice::ReadWrite | QIODevice::Append);
+    QTextStream stream(&log_file);
+    stream << s;
+    log_file.close();
+#endif
+
+    fprintf(stderr, "%s", qUtf8Printable(s));
+    fflush(stderr);
+}
+
+bool checkSingleAppInstance() {
+    QLockFile lockFile(QDir::temp().absoluteFilePath("rulotro.lock"));
+    if(!lockFile.tryLock(1)){
+        qDebug() << "Lock file already exists! Some other application is already running...";
+        QMessageBox msgBox;
+        msgBox.setIcon(QMessageBox::Warning);
+        msgBox.setText("Приложение уже запущено.\nРазрешено запускать только один экземпляр приложения.");
+        msgBox.exec();
+        return false;
+    }
+    return true;
+}
+
+AppErrorStatus CheckAppPrerequesities() {
+    size_t status = E_NO_ERRORS;
+    QString game_folder_path = Settings::getValue("Lotro/game_path").toString();
+    QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
+
+    // Checking LotroLauncher.exe availability
+    QFileInfo lotro_launcher_exe(game_folder_path + "/LotroLauncher.exe");
+    if (!lotro_launcher_exe.exists()) {
+        status |= E_WRONG_GAME_FOLDER;
+    } else {
+        if (!QFile::setPermissions(lotro_launcher_exe.absoluteFilePath(),
+                QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ExeUser)) {
+            status |= E_WRONG_FILE_PERMISSIONS;
+        }
+    }
+
+    // Checking DAT files availability & correctness
+    QString client_local_filepath = game_folder_path + "/client_local_" + locale_prefix + ".dat";
+    QString client_general_filepath = game_folder_path + "/client_general.dat";
+
+    QFileInfo client_local_file(client_local_filepath);
+    QFileInfo client_general_file(client_general_filepath);
+
+    if (!client_general_file.exists() || !client_local_file.exists()) {
+        status |= E_DAT_FILES_MISSING;
+    } else {
+        if (!QFile::setPermissions(client_general_filepath,
+                                   QFileDevice::ReadUser |
+                                   QFileDevice::WriteUser |
+                                   QFileDevice::ExeUser)) {
+            status |= E_WRONG_FILE_PERMISSIONS;
+            status |= E_CANNOT_ACCESS_DAT_FILES;
+        }
+
+        if (!QFile::setPermissions(client_local_filepath,
+                                   QFileDevice::ReadUser |
+                                   QFileDevice::WriteUser |
+                                   QFileDevice::ExeUser)) {
+            status |= E_WRONG_FILE_PERMISSIONS;
+            status |= E_CANNOT_ACCESS_DAT_FILES;
+        }
+    }
+
+    if (!checkInternetConnection(QUrl(Settings::getValue("Network/patch_updates_url").toString()))) {
+        status |= E_NO_SERVER_CONNECTION;
+    }
+
+    qDebug() << "LegacyApplication: StatusCheck: " << AppErrorStatus(status);
+    return AppErrorStatus(status);
+}
+
+QDebug operator<<(QDebug dbg, const AppErrorStatus &status)
+{
+    bool wrong_game_folder = (status & E_WRONG_GAME_FOLDER);
+    bool dat_files_missing = (status & E_DAT_FILES_MISSING);
+    bool wrong_file_permissions = (status & E_WRONG_FILE_PERMISSIONS);
+    bool cannot_access_dat_files = (status & E_CANNOT_ACCESS_DAT_FILES);
+    bool dat_file_incorrect = (status & E_DAT_FILE_INCORRECT);
+    bool no_server_connection = (status & E_NO_SERVER_CONNECTION);
+
+    dbg.nospace() << "ErrorStatus ( "
+        << (wrong_game_folder ? "Wrong game folder! " : "")
+        << (dat_files_missing ? "Dat files missing! " : "")
+        << (wrong_file_permissions ? "Wrong file permissions! " : "")
+        << (cannot_access_dat_files ? "Cannot access dat files! " : "")
+        << (dat_file_incorrect ? "Incorrect dat file! " : "")
+        << (no_server_connection ? "No server connection! " : "")
+        << ")";
+
+    return dbg;
+}

+ 17 - 77
src/Legacy/utils.h

@@ -5,88 +5,28 @@
 #ifndef UTILS_H
 #define UTILS_H
 
-#include <QNetworkAccessManager>
-#include <QNetworkReply>
-#include <QEventLoop>
-#include <QFile>
-#include <QTimer>
-#include <QLockFile>
-#include <QDir>
-#include <QMessageBox>
+#include <QUrl>
+#include <QDebug>
+#include <QMessageLogContext>
 
-bool checkInternetConnection(QUrl url) {
-    QNetworkAccessManager nam;
-    QNetworkRequest req(url);
-    QNetworkReply* reply = nam.get(req);
-    QEventLoop loop;
-    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
+bool checkInternetConnection(QUrl url);
 
-    QTimer request_timeout_timer;
-    QObject::connect(&request_timeout_timer, &QTimer::timeout, &loop, &QEventLoop::quit);
-    request_timeout_timer.start(5000); // 5 seconds connection timeout
-    loop.exec();
-    return reply->bytesAvailable();
-}
+void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg);
 
-void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
-{
-    QString message_type;
+bool checkSingleAppInstance();
 
-    switch (type) {
-    case QtDebugMsg:
-        message_type = "[DEBG]";
-        break;
-    case QtInfoMsg:
-        message_type = "[INFO]";
-        break;
-    case QtWarningMsg:
-        message_type = "[WARN]";
-        break;
-    case QtCriticalMsg:
-        message_type = "[CRIT]";
-        break;
-    case QtFatalMsg:
-        message_type = "[FATL]";
-        break;
-    default:
-        message_type = "[UNKN]";
-        break;
-    }
+enum AppErrorStatus : int {
+    E_WRONG_GAME_FOLDER = 32,
+    E_DAT_FILES_MISSING = 16,
+    E_WRONG_FILE_PERMISSIONS = 8,
+    E_CANNOT_ACCESS_DAT_FILES = 4,
+    E_DAT_FILE_INCORRECT = 2,
+    E_NO_SERVER_CONNECTION = 1,
+    E_NO_ERRORS = 0
+};
 
-    QString filename = context.category;
-    QString function = context.function;
-    QString line_number = QString::number(context.line);
+AppErrorStatus CheckAppPrerequesities();
 
-    QString s = QString("%1: %2 ||| %3:%4 %5\n")
-                .arg(message_type)
-                .arg(msg)
-                .arg(filename)
-                .arg(line_number)
-                .arg(function);
-
-#ifdef QT_DEBUG
-    QFile log_file("legacy_v2.log");
-    log_file.open(QIODevice::ReadWrite | QIODevice::Append);
-    QTextStream stream(&log_file);
-    stream << s;
-    log_file.close();
-#endif
-
-    fprintf(stderr, "%s", qUtf8Printable(s));
-    fflush(stderr);
-}
-
-bool checkSingleAppInstance() {
-    QLockFile lockFile(QDir::temp().absoluteFilePath("rulotro.lock"));
-    if(!lockFile.tryLock(1)){
-        qDebug() << "Lock file already exists! Some other application is already running...";
-        QMessageBox msgBox;
-        msgBox.setIcon(QMessageBox::Warning);
-        msgBox.setText("Приложение уже запущено.\nРазрешено запускать только один экземпляр приложения.");
-        msgBox.exec();
-        return false;
-    }
-    return true;
-}
+QDebug operator<<(QDebug dbg, const AppErrorStatus &status);
 
 #endif // UTILS_H

+ 1 - 1
src/Legacy/widgets/mainwindow.cpp

@@ -391,7 +391,7 @@ void MainWindow::hideChooseVersionDialog()
     choose_locale_dialog_->hide();
 }
 
-void MainWindow::onErrorStatusChanged(LegacyApplication::ErrorStatus status)
+void MainWindow::onErrorStatusChanged(AppErrorStatus status)
 {
     // TODO: Settings widget
     status_widget_->onErrorStatusChanged(status);

+ 1 - 2
src/Legacy/widgets/mainwindow.h

@@ -27,7 +27,6 @@ class MenuEntry;
 class DialogWindow;
 class PatchList;
 
-enum LegacyApplication::ErrorStatus;
 class MainWindow : public QMainWindow
 {
     Q_OBJECT
@@ -44,7 +43,7 @@ public slots:
     void showChooseVersionDialog();
     void hideChooseVersionDialog();
 
-    void onErrorStatusChanged(LegacyApplication::ErrorStatus status);
+    void onErrorStatusChanged(AppErrorStatus status);
     void onSecondsToNextTryToInitChanged(size_t seconds_elapsed);
 
     void showMessageDialog(QObject* emitter, QString message, QString ok_button_text = "Ок", QString cancel_button_text = "Отмена");

+ 8 - 8
src/Legacy/widgets/statuswidget.cpp

@@ -103,9 +103,9 @@ void StatusWidget::unsetToolTipMessage(StatusWidget::ToolTipState state)
     fadeBetweenToolTips(message_id);
 }
 
-void StatusWidget::onErrorStatusChanged(LegacyApplication::ErrorStatus status)
+void StatusWidget::onErrorStatusChanged(AppErrorStatus status)
 {
-    if (status == LegacyApplication::E_NO_ERRORS) {
+    if (status == E_NO_ERRORS) {
         init_error_type_message_ = "";
         unsetToolTipMessage(E_ERROR);
         ui->news_list->updateNewsWidget();
@@ -115,37 +115,37 @@ void StatusWidget::onErrorStatusChanged(LegacyApplication::ErrorStatus status)
     }
 
     error_timeout_message_ = "Повторная попытка инициализации через 10 секунд";
-    if (status & LegacyApplication::E_WRONG_GAME_FOLDER) {
+    if (status & E_WRONG_GAME_FOLDER) {
         init_error_type_message_ = "Ошибка инициализации: некорректная папка с игрой!\n";
         setToolTipMessage(init_error_type_message_ + error_timeout_message_, E_ERROR);
         return;
     }
 
-    if (status & LegacyApplication::E_DAT_FILES_MISSING) {
+    if (status & E_DAT_FILES_MISSING) {
         init_error_type_message_ = "Ошибка инициализации: отсутствуют файлы данных игры!\n";
         setToolTipMessage(init_error_type_message_ + error_timeout_message_, E_ERROR);
         return;
     }
 
-    if (status & LegacyApplication::E_WRONG_FILE_PERMISSIONS) {
+    if (status & E_WRONG_FILE_PERMISSIONS) {
         init_error_type_message_ = "Ошибка инициализации: недостаточно прав для изменения файлов данных!\n";
         setToolTipMessage(init_error_type_message_ + error_timeout_message_, E_ERROR);
         return;
     }
 
-    if (status & LegacyApplication::E_CANNOT_ACCESS_DAT_FILES) {
+    if (status & E_CANNOT_ACCESS_DAT_FILES) {
         init_error_type_message_ = "Ошибка инициализации: нет доступа к файлам данных!\n";
         setToolTipMessage(init_error_type_message_ + error_timeout_message_, E_ERROR);
         return;
     }
 
-    if (status & LegacyApplication::E_DAT_FILE_INCORRECT) {
+    if (status & E_DAT_FILE_INCORRECT) {
         init_error_type_message_ = "Ошибка инициализации: формат файла данных устарел или некорректен!\n";
         setToolTipMessage(init_error_type_message_ + error_timeout_message_, E_ERROR);
         return;
     }
 
-    if (status & LegacyApplication::E_NO_SERVER_CONNECTION) {
+    if (status & E_NO_SERVER_CONNECTION) {
         init_error_type_message_ = "Ошибка инициализации: нет связи с сервером Наследия!\n";
         setToolTipMessage(init_error_type_message_ + error_timeout_message_, E_ERROR);
         return;

+ 1 - 1
src/Legacy/widgets/statuswidget.h

@@ -40,7 +40,7 @@ public slots:
     void unsetToolTipMessage(ToolTipState state);
 
     // for LegacyApplication signals
-    void onErrorStatusChanged(LegacyApplication::ErrorStatus status);
+    void onErrorStatusChanged(AppErrorStatus status);
 
     void onSecondsToNextTryToInitChanged(size_t seconds_elapsed);