Prechádzať zdrojové kódy

Fixed bug with double concurrent initialization caused by language qcombobox, fixed logging

Ivan Arkhipov 4 rokov pred
rodič
commit
b516159475

+ 23 - 2
src/Legacy/models/patchinstaller.cpp

@@ -82,8 +82,18 @@ PatchInstaller::AppliedPatchesInfo PatchInstaller::getPatchesInfo() {
 }
 
 void PatchInstaller::installPatch(QString patch_name, LOTRO_DAT::Database* database) {
+    const QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
+    const QString database_path = QApplication::applicationDirPath() + "/data/" + patch_name + "_" + locale_prefix + "_orig.db";
+    const QString database_path_old = QApplication::applicationDirPath() + "/data/" + patch_name + "_orig.db";
+    if (FileSystem::fileExists(database_path_old)) {
+        if (!FileSystem::fileExists(database_path)) {
+            QFile::rename(database_path_old, database_path);
+        } else {
+            QFile::remove(database_path_old);
+        }
+    }
 
-    DatOriginalFilesDatabase orig_files_db(QApplication::applicationDirPath() + "/data/" + patch_name + "_orig.db");
+    DatOriginalFilesDatabase orig_files_db(database_path);
     LOTRO_DAT::SubfileData file;
     qDebug() << "Total files in database " << database->CountRows();
     qDebug() << "Patching all files from database..." << database;
@@ -172,7 +182,18 @@ void PatchInstaller::installPatch(QString patch_name, LOTRO_DAT::Database* datab
 void PatchInstaller::installOriginalPatch(QString patch_name)
 {
     qDebug() << "Installing original version of patch " << patch_name;
-    DatOriginalFilesDatabase orig_db(QApplication::applicationDirPath() + "/data/" + patch_name + "_orig.db");
+    const QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
+    const QString database_path = QApplication::applicationDirPath() + "/data/" + patch_name + "_" + locale_prefix + "_orig.db";
+    const QString database_path_old = QApplication::applicationDirPath() + "/data/" + patch_name + "_orig.db";
+    if (FileSystem::fileExists(database_path_old)) {
+        if (!FileSystem::fileExists(database_path)) {
+            QFile::rename(database_path_old, database_path);
+        } else {
+            QFile::remove(database_path_old);
+        }
+    }
+
+    DatOriginalFilesDatabase orig_db(database_path);
 
     DatOriginalFilesDatabase::FileOperation operation = [this](int file_id, int dat_id, int version, int iteration, const LOTRO_DAT::SubfileData& data) {
         int original_file_version = 0;

+ 36 - 10
src/Legacy/utils.cpp

@@ -70,21 +70,25 @@ void logMessageHandler(QtMsgType type, const QMessageLogContext &context, const
                 .arg(function);
 
 #ifndef QT_DEBUG
-    QFile log_file("legacy_log.txt");
-    QFileInfo log_file_info(log_file);
-    if (log_file_info.size() >= 10 * 1024 * 1024) {
-        QFile::remove("legacy_log.old.txt");
-        QFile::copy("legacy_log.txt", "legacy_log.old.txt");
-        QFile::remove("legacy_log.txt");
+    if (type != QtDebugMsg) {
+        QFile log_file("legacy_log.txt");
+        QFileInfo log_file_info(log_file);
+        if (log_file_info.size() >= 10 * 1024 * 1024) {
+            QFile::remove("legacy_log.old.txt");
+            QFile::copy("legacy_log.txt", "legacy_log.old.txt");
+            QFile::remove("legacy_log.txt");
+        }
+        log_file.open(QIODevice::ReadWrite | QIODevice::Append);
+        QTextStream stream(&log_file);
+        stream << s;
+        log_file.close();
     }
-    log_file.open(QIODevice::ReadWrite | QIODevice::Append);
-    QTextStream stream(&log_file);
-    stream << s;
-    log_file.close();
 #endif
 
+#if defined(QT_DEBUG) || defined(DEBUG)
     fprintf(stderr, "%s", qUtf8Printable(s));
     fflush(stderr);
+#endif
 }
 
 bool isRunning(const QString &process) {
@@ -101,20 +105,27 @@ bool isRunning(const QString &process) {
 
 
 AppErrorStatus CheckAppPrerequesities() {
+    qInfo() << "Starting CheckAppPrerequisities...";
     if (isRunning("LotroLauncher.exe") || isRunning("lotroclient.exe") || isRunning("lotroclient64.exe")) {
+        qCritical() << "Failed CheckAppPrerequisites: found running LOTRO client!";
         return E_LOTRO_RUNNING;
     }
 
     QString game_folder_path = Settings::getValue("Lotro/game_path").toString();
     QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
 
+    qInfo() << "CheckAppPrerequisities: game folder path=" << game_folder_path;
+    qInfo() << "CheckAppPrerequisities: locale prefix =" << locale_prefix;
+
     // Checking LotroLauncher.exe availability
     QFileInfo lotro_launcher_exe(game_folder_path + "/LotroLauncher.exe");
     if (!lotro_launcher_exe.exists()) {
+        qCritical() << "Failed CheckAppPrerequisities: cannot find file LotroLauncher.exe";
         return E_WRONG_GAME_FOLDER;
     } else {
         if (!QFile::setPermissions(lotro_launcher_exe.absoluteFilePath(),
                 QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ExeUser)) {
+            qCritical() << "Failed CheckAppPrerequisities: cannot check executable permissions for LotroLauncher.exe";
             return E_WRONG_FILE_PERMISSIONS;
         }
     }
@@ -123,16 +134,23 @@ AppErrorStatus CheckAppPrerequesities() {
     QString client_local_filepath = game_folder_path + "/client_local_" + locale_prefix + ".dat";
     QString client_general_filepath = game_folder_path + "/client_general.dat";
 
+    qInfo() << "CheckAppPrerequisities: client_local_filepath = " << client_local_filepath;
+    qInfo() << "CheckAppPrerequisities: client_general_filepath = " << client_general_filepath;
+
+
     QFileInfo client_local_file(client_local_filepath);
     QFileInfo client_general_file(client_general_filepath);
 
     if (!client_general_file.exists() || !client_local_file.exists()) {
+        qCritical() << "Failed CheckAppPrerequisities: dat files do not exist!";
         return E_DAT_FILES_MISSING;
     } else {
         if (!QFile::setPermissions(client_general_filepath,
                                    QFileDevice::ReadUser |
                                    QFileDevice::WriteUser |
                                    QFileDevice::ExeUser)) {
+
+            qCritical() << "Failed CheckAppPrerequisities: incorrect client general permissions!";
             return E_WRONG_FILE_PERMISSIONS;
         }
 
@@ -140,23 +158,29 @@ AppErrorStatus CheckAppPrerequesities() {
                                    QFileDevice::ReadUser |
                                    QFileDevice::WriteUser |
                                    QFileDevice::ExeUser)) {
+
+            qCritical() << "Failed CheckAppPrerequisities: incorrect client local permissions!";
             return E_WRONG_FILE_PERMISSIONS;
         }
 
         if (LOTRO_DAT::DatFile::checkIfPatchedByLegacyV1(client_local_file.absoluteFilePath().toStdString())) {
+            qCritical() << "Failed CheckAppPrerequisities: found Legacy v1 patch mark in client local!";
             return E_PATCHED_BY_OLD_LEGACY;
         }
         if (LOTRO_DAT::DatFile::checkIfPatchedByLegacyV1(client_general_file.absoluteFilePath().toStdString())) {
+            qCritical() << "Failed CheckAppPrerequisities: found Legacy v1 patch mark in client general!";
             return E_PATCHED_BY_OLD_LEGACY;
         }
 
         LOTRO_DAT::DatFile file(0);
         if (!file.Init(client_local_file.absoluteFilePath().toStdString())) {
+            qCritical() << "Failed CheckAppPrerequisities: initialization of client local dat file failed!";
             return E_DAT_FILE_INCORRECT;
         } else {
             file.Deinit();
         }
         if (!file.Init(client_general_file.absoluteFilePath().toStdString())) {
+            qCritical() << "Failed CheckAppPrerequisities: initialization of client general dat file failed!";
             return E_DAT_FILE_INCORRECT;
         } else {
             file.Deinit();
@@ -164,9 +188,11 @@ AppErrorStatus CheckAppPrerequesities() {
     }
 
     if (!checkInternetConnection(QUrl(Settings::getValue("Network/patch_updates_url").toString()))) {
+        qCritical() << "Failed CheckAppPrerequisities: no server connection!";
         return E_NO_SERVER_CONNECTION;
     }
 
+    qInfo() << "CheckAppPrerequisities: successful, no errors found!";
     return E_NO_ERRORS;
 }
 

+ 6 - 1
src/Legacy/widgets/gamesettings.cpp

@@ -9,6 +9,7 @@
 #include "fonts.h"
 
 #include <QFileDialog>
+#include <QComboBox>
 
 GameSettings::GameSettings(QWidget *parent) :
     QWidget(parent),
@@ -18,6 +19,8 @@ GameSettings::GameSettings(QWidget *parent) :
     setAttribute(Qt::WA_StyledBackground, true);
     setActualParametersValues();
 
+
+    connect(ui->lotro_base_language_combobox, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &GameSettings::onLanguageChanged);
     connect(&PatchInstaller::instance(), &PatchInstaller::started, this, &GameSettings::onPatchTotalOperationsStarted);
     connect(&PatchInstaller::instance(), &PatchInstaller::finished, this, &GameSettings::onPatchTotalOperationsFinished);
     connect(&PatchDownloader::instance(), &PatchDownloader::started, this, &GameSettings::onPatchTotalOperationsStarted);
@@ -60,7 +63,9 @@ void GameSettings::setActualParametersValues()
         index = 1;
     if (original_locale == "FR")
         index = 2;
+    ui->lotro_base_language_combobox->blockSignals(true);
     ui->lotro_base_language_combobox->setCurrentIndex(index);
+    ui->lotro_base_language_combobox->blockSignals(false);
 }
 
 void GameSettings::on_change_folder_button_clicked()
@@ -81,7 +86,7 @@ void GameSettings::on_change_folder_button_clicked()
     QMetaObject::invokeMethod(&LegacyApplication::instance(), &LegacyApplication::InitModules, Qt::DirectConnection);
 }
 
-void GameSettings::on_lotro_base_language_combobox_currentIndexChanged(int index)
+void GameSettings::onLanguageChanged(int index)
 {
     QString value = "English";
 

+ 2 - 2
src/Legacy/widgets/gamesettings.h

@@ -21,13 +21,13 @@ public slots:
 protected:
     void resizeEvent(QResizeEvent *event) override;
 
-public slots:
+private:
     void setActualParametersValues();
 
 private slots:
     void on_change_folder_button_clicked();
 
-    void on_lotro_base_language_combobox_currentIndexChanged(int index);
+    void onLanguageChanged(int index);
 
     void onPatchTotalOperationsStarted();
 

+ 0 - 10
src/Legacy/widgets/statuswidget.ui

@@ -210,11 +210,6 @@ QPushButton#game_button:disabled {
 	background-attachment: fixed
 }</string>
    </property>
-   <layout class="QGridLayout" name="gridLayout">
-    <property name="verticalSpacing">
-     <number>10</number>
-    </property>
-   </layout>
   </widget>
   <widget class="TranslationComponents" name="b_components_status" native="true">
    <property name="geometry">
@@ -233,11 +228,6 @@ QPushButton#game_button:disabled {
     background-attachment: fixed;
 }</string>
    </property>
-   <layout class="QVBoxLayout" name="verticalLayout_2">
-    <property name="spacing">
-     <number>12</number>
-    </property>
-   </layout>
   </widget>
   <zorder>news_label</zorder>
   <zorder>game_button</zorder>