Browse Source

Almost finished LotroManager class imppl

Ivan Arkhipov 6 years ago
parent
commit
26a0571f08
6 changed files with 195 additions and 263 deletions
  1. 7 7
      config.cpp
  2. 77 192
      lotromanager.cpp
  3. 5 7
      lotromanager.h
  4. 90 43
      mainwindow.cpp
  5. 4 2
      mainwindow.h
  6. 12 12
      network.cpp

+ 7 - 7
config.cpp

@@ -50,13 +50,13 @@ void AConfig::saveConfig(){
     settings.setValue("Local/file", "client_local_English.dat");
 
     //Datetime
-    settings.setValue("Datetime/texts", true);
-    settings.setValue("Datetime/fonts", true);
-    settings.setValue("Datetime/images", true);
-    settings.setValue("Datetime/sounds", true);
-    settings.setValue("Datetime/videos", false);
-    settings.setValue("Datetime/loadscreens", true);
-    settings.setValue("Datetime/textures", true);
+    settings.setValue("Datetime/texts", "-1");
+    settings.setValue("Datetime/fonts", "-1");
+    settings.setValue("Datetime/images", "-1");
+    settings.setValue("Datetime/sounds", "-1");
+    settings.setValue("Datetime/videos", "-1");
+    settings.setValue("Datetime/loadscreens", "-1");
+    settings.setValue("Datetime/textures", "-1");
 
 
     //Updates

+ 77 - 192
lotromanager.cpp

@@ -4,121 +4,129 @@
 
 #include <QStringList>
 
-LotroManager::LotroManager(QObject *parent) : QObject(parent)
-{
+LotroManager::LotroManager(QObject *parent) : QObject(parent){
     dat_files_.resize(5);
-    operations_queue_.clear();
     busy_ = false;
 
-    connect(this, SIGNAL(dat_operation_started()), this, SLOT(on_dat_operation_started()));
+    connect(this, SIGNAL(dat_operation_started(QString)), this, SLOT(on_dat_operation_started(QString)));
+    connect(this, SIGNAL(dat_operation_finished(QString,QString)), this, SLOT(on_dat_operation_finished(QString,QString)));
 }
 
+bool LotroManager::execute(QString command, QString args, QString name) {
+    qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Вызываем execute() команды ", command.toLocal8Bit().data());
 
-bool LotroManager::execute(QStringList operation) {
-    qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Вызываем execute() команды ", cmd[0].toLocal8Bit().data());
-
-    if (busy_ || cmd.size() == 0) {
+    if (busy_) {
         qWarning("%s:%i: %s", __FILE__, __LINE__, "Ошибка! Уже выполняется другой процесс с данными!");
         return false;
     }
 
-    if (std::find(available_operations_.begin(), available_operations_.end(), cmd[0])
+    if (std::find(available_operations_.begin(), available_operations_.end(), command)
             == available_operations_.end()) {
 
-        qWarning("%s:%i: %s%s%s", __FILE__, __LINE__, "Ошибка! Операция ", cmd[0].toLocal8Bit().data(), " не найдена в списке доступных!");
+        qWarning("%s:%i: %s%s%s", __FILE__, __LINE__, "Ошибка! Операция ", command.toLocal8Bit().data(), " не найдена в списке доступных!");
         return false;
     }
 
-    if (operation[0] == "StartGame") {
+    if (command == "StartGame") {
         QtConcurrent::run([=]() {
-            emit dat_operation_started("StartGame");
+            emit dat_operation_started(command, args, name);
             startGame();
-            emit dat_operation_finished("StartGame");
-        });
-        return;
-    }
-
-    if (operation[0] == "SetLocale" && operation.size() == 2) {
-        QtConcurrent::run([=]() {
-            setGameLocale(operation[1]);
-            emit operation_finished("ApplyLoadScreens");
+            emit dat_operation_finished(command, args, name);
         });
-        return;
+        return true;
     }
 
-    if (operation[0] == "ChangeBaseLocale" && operation.size() == 2) {
+    if (command == "SetLocale") {
         QtConcurrent::run([=]() {
-            changeBaseLocale(operation[1]);
-            emit operation_finished("ApplyLoadScreens");
+            emit dat_operation_started(command, args, name);
+            setGameLocale(args);
+            emit dat_operation_finished(command, args, name);
         });
-        return;
+        return true;
     }
 
-    if (operation[0] == "ApplyPatch" && operation.size() == 2) {
+    if (command == "ApplyPatch") {
         QtConcurrent::run([=]() {
-            applyPatch(operation[1]);
-            emit operation_finished("ApplyLoadScreens");
+            emit dat_operation_started(command, args, name);
+            applyPatch(args);
+            emit dat_operation_finished(command, args, name);
         });
-        return;
+        return true;
     }
 
-    if (operation[0] == "ApplyMicroPatch") {
+    if (command == "ApplyMicroPatch") {
         QtConcurrent::run([=]() {
+            emit dat_operation_started(command, args, name);
             applyMicroPatch();
-            emit operation_finished("ApplyLoadScreens");
+            emit dat_operation_finished(command, args, name);
         });
-        return;
+        return true;
     }
 
-    if (operation[0] == "ApplyLoadScreens") {
+    if (command == "ApplyLoadScreens") {
         QtConcurrent::run([=]() {
+            emit dat_operation_started(command, args, name);
             applyLoadscreens();
-            emit operation_finished("ApplyLoadScreens");
+            emit dat_operation_finished(command, args, name);
         });
-
-        //applyLoadscreens();
-        return;
+        return true;
     }
 
-    if (operation[0] == "ApplyGlobal") {
+    if (command == "ApplyGlobal") {
         QtConcurrent::run([=]() {
+            emit dat_operation_started(command, args, name);
             applyPatch("fonts");
-            applyPatch("images");
-            applyPatch("texts");
             applyPatch("sounds");
+            applyPatch("texts");
+            applyPatch("images");
             applyLoadscreens();
             applyMicroPatch();
-            emit operation_finished("ApplyGlobal");
+            emit dat_operation_finished(command, args, name);
         });
-        return;
+        return true;
     }
 
-    if (operation[0] == "CheckDatFile") {
-        QtConcurrent::run(checkDatFile);
-        //checkDatFile();
-        return;
+    if (command == "CheckDatFile") {
+        QtConcurrent::run([=]() {
+            emit dat_operation_started(command, args, name);
+            int result = checkDatFile();
+            emit dat_operation_finished(command, args, name, QString::number(result));
+        });
+        return true;
     }
 
-    if (operation[0] == "SaveDatFiles") {
-        QtConcurrent::run(saveDatFiles);
-        //saveDatFiles();
-        return;
+    if (command == "SaveDatFiles") {
+        QtConcurrent::run([=]() {
+            emit dat_operation_started(command, args, name);
+            saveDatFiles();
+            emit dat_operation_finished(command, args, name);
+        });
+        return true;
     }
-
+    return false;
 }
 
-
-
 bool LotroManager::isBusy() {
     return busy_;
 }
 
+void LotroManager::on_dat_operation_started(QString command, QString, QString name) {
+    qInfo("%s:%i: %s%s %s %s", __FILE__, __LINE__, "Получен сигнал начала операции ", command.toLocal8Bit().data()
+          , "с именем", name.toLocal8Bit().data());
+    busy_ = true;
+}
+
+void LotroManager::on_dat_operation_finished(QString command, QString, QString name, QString result) {
+    qInfo("%s:%i: %s%s %s %s %s %s", __FILE__, __LINE__
+          , "Получен сигнал завершения операции ", command.toLocal8Bit().data()
+          , "с именем", name.toLocal8Bit().data()
+          , "с результатом", result.toLocal8Bit().data());
+    busy_ = false;
+}
 
 void LotroManager::saveDatFiles() {
     for (auto dat_file : dat_files_)
         dat_file.CloseDatFile();
-    App *app = &App::getInstance();
-    app->helper->setState("free");
 }
 
 void LotroManager::startGame(){
@@ -156,7 +164,7 @@ void LotroManager::startGame(){
     } else {
         QString text = "Запуск не удался";
         QString info = "Не удалось запустить игру. Не найден файл TurbineLauncher.exe или невозможно получить к нему доступ. "
-                       "Проверьте в 'Настройках', что у вас указан верный путь к игре, закрыт лаунчер игры и повторите попытку запуска.";
+                       "Проверьте в разделе 'Настройки', что у вас указан верный путь к игре, закрыт лаунчер игры и повторите попытку запуска.";
         app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 160, true, false);
     }
 }
@@ -201,8 +209,7 @@ bool LotroManager::openDatFile(int id) {
         int dat_state = dat_files_[id].InitDatFile(filename.toLocal8Bit().toStdString(), id);
         qDebug("%s:%i: %s%d", __FILE__, __LINE__, "Состояние dat-файла: ", dat_state);
 
-        if(dat_state > 0){
-            app->helper->setState("busy");
+        if(dat_state > 0) {
             return true;
         } else {
             QString text = "Нет доступа к  файлам игры";
@@ -230,7 +237,7 @@ void LotroManager::applyPatch(QString name){
 
     QStringList paths = dir.entryList(QStringList(name + "*"));
     qDebug() << QString("data/" + paths.first()).toLocal8Bit().data();
-    if(!paths.empty()){
+    if(!paths.empty()) {
        database_.InitDatabase(QString("data/" + paths.first()).toLocal8Bit().data());
         int indb = database_.CountRows();
         qInfo("%s:%i: %s%d", __FILE__, __LINE__, "Файлов в обновлении: ", indb);
@@ -239,8 +246,7 @@ void LotroManager::applyPatch(QString name){
             if (label != nullptr)
                 label->setText(QString("Применение ... ") + QString::fromLatin1("%1").arg(i*100.0/indb, 3, 'f', 1) + QString("%"));
         }
-        if(label != nullptr)label->setText("Готово");
-        //for (int i = 0; i < 5; i++) app->datfiles[i].CommitChanges();
+        if(label != nullptr) label->setText("Готово");
         app->config->setValue("Applied", name, paths.first());
         database_.CloseDatabase();
     }
@@ -248,109 +254,21 @@ void LotroManager::applyPatch(QString name){
     app->window->ui->exthintLabel->setText("Применение выбранных вами патчей закончено");
 }
 
-void LotroManager::applyGlobal(){
-    App *app = &App::getInstance();
-
-    // Применяем патч с заставочными экранами
-    if(app->config->getValue("Editor", "screens") == "true"){
-        applyLoadscreens();
-    } else {
-        QString dateline = app->config->getValue("Datetime", "loadscreens");
-        if(dateline != "-1"){
-            QStringList date = dateline.split(" ");
-            app->window->ui->loadscreensStatus->setText(date[0]);
-        }
-    }
-
-    // Применяем остальные патчи
-    QStringList names;
-    QStringList need;
-    QFuture<void> f;
-    f = QtConcurrent::run([=]() {});
-    names  << "fonts" << "sounds" << "texts" << "images" << "videos" << "textures";
-    QDir dir(QApplication::applicationDirPath() + "/data");
-
-    foreach(QString name, names) {
-
-        QStringList list = dir.entryList(QStringList(name + "*"));
-
-        if (list.size() > 0 && list.first() != ""){
-            QString isset = app->config->getValue("Applied", name);
-            if (list.first() != isset && app->config->getValue("Editor", name) == "true") {
-                need.append(name);
-            }
-        }
-    }
-
-    Helper *helper = new Helper();
-    QFutureWatcher<void> * watcher = new QFutureWatcher<void>();
-    connect(watcher, SIGNAL(finished()), helper, SLOT(handleFinisheddd()));
-
-    if(need.size() > 0){
-        watcher->setFuture(QtConcurrent::run([=]() {
-            if(openDatFile(0)){
-                foreach(QString name, need) {
-                    applyPatch(name);
-                }
-                saveDatFiles();
-            }
-        }));
-    } else {
-        installMicroPatch();
-    }
-
-}
-
-bool LotroManager::isDatReady(){
-    App *app = &App::getInstance();
-    bool free;
-    QString dir = app->config->getValue("Local", "folder");
-    QString file = app->config->getValue("Local", "file");
-    QFile fl(dir+"/" + file);
-    qDebug() << fl.fileName();
-    if(FileSystem::fileExists(fl.fileName())){
-        QDir game_dir(dir);
-        free = game_dir.rename(fl.fileName(), fl.fileName() + "99");
-        game_dir.rename(fl.fileName() + "99", fl.fileName());
-    } else {
-        free = false;
-    }
-    if(free == true) qDebug() << "Dat is FREE"; else qDebug() << "Dat is BUSY";
-    return free;
-}
-
 int LotroManager::checkDatFile(){
-    //bool CheckIfUpdatedByGame(); // Обновлялся ли игрой
-    //bool CheckIfNotPatched(); // Был ли хоть раз пропатчен новым лаунчером
-    //bool CheckIfPatchedByOldLauncher(); // Был ли хоть раз пропатчен старым лаунчером
+    App* app = &App::getInstance();
 
-    App *app = &App::getInstance();
-    if (!openDatFile(0)) {
+    if (openDatFile(0) < 0)
         return 0;
-    }
 
-    if(dat_files_[0].CheckIfUpdatedByGame()){
+    if(dat_files_[0].CheckIfUpdatedByGame())
         return 1;
-        //app->ready = false;
-        //QString text = "Файлы локализации изменены";
-        //QString info = "В процессе последнего запуска игры были установлены обновления игрового клиента. Это могло затронуть файлы локализации. Желаете провести проверку и исправить поврежденные участки перевода? Вы можете в любой момент сделать это самостоятельно, нажав кнопку «Применить патчи заново».";
-        //app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "applypaths", "", 400, 220, true, true);
-    }
 
-    if(dat_files_[0].CheckIfNotPatched() && app->config->getValue("Local", "runfirst") == "1"){
+    if(dat_files_[0].CheckIfNotPatched() && app->config->getValue("Local", "runfirst") == "1")
         return 2;
-        //app->ready = false;
-        //QString text = "Файлы локализации отсутствуют";
-        //QString info = "Текущий файл локализации не содержит патчей. Возможно это первый запуск «Наследия» с данным игровым клиентом, или клиент был обновлён игровым лаунчером. Применить выбранные патчи в данному файлу?";
-        //app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "applypaths", "", 420, 200, true, true);
-    }
 
-    if(dat_files_[0].CheckIfPatchedByOldLauncher()){
+    if(dat_files_[0].CheckIfPatchedByOldLauncher())
         return 3;
-        //QString text = "Файлы локализации не являются оригинальными";
-        //QString info = "Внимание! Присутствующие в вашем игровом клиенте файлы локализации не являются оригинальными, поскольку были модифицированы другой программой.<br/><strong>Мы настоятельно рекомендуем перекачать оригинальные версии файлов, поскольку правильная работа Наследия с данными файлами не гарантируется!</strong>";
-        //app->helper->myDialogBox(text, info, "Перекачать", "Не надо", "gandalf.png", "loaddatfile", "", 550, 200, true, true);
-    }
+
     return 0;
 }
 
@@ -504,31 +422,7 @@ void LotroManager::prepareMicroPatch(){
     app->logSectionEnd();
 }
 
-void LotroManager::changeBaseLocale(QString locale) {
-    App *app = &App::getInstance();
-    QString file;
-
-    if(locale == "en") file = "client_local_English.dat";
-    if(locale == "de") file = "client_local_DE.dat";
-    if(locale == "fr") file = "client_local_FR.dat";
-
-    if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) {
-        app->config->setValue("Local", "file", file);
-    } else {
-        QString text = "Данная локализация отсутствует";
-        QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится.";
-        app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false);
-    }
-}
-
 bool LotroManager::setGameLocale(QString locale){
-    App *app = &App::getInstance();
-    app->window->ui->goHint->show();
-    app->helper->setState("busy");
-    app->window->ui->goLocal->setEnabled(false);
-    app->window->ui->goOriginal->setEnabled(false);
-    app->window->ui->goCancel->setEnabled(false);
-
     if(openDatFile(0)){
         LOCALE loc = dat_files_[0].current_locale();
         dat_locale_ = loc;
@@ -541,18 +435,9 @@ bool LotroManager::setGameLocale(QString locale){
         if(locale == "Original" && loc != ORIGINAL){ qDebug()<< "Current locale RU"; dat_files_[0].SetLocale(ORIGINAL); dat_locale_ = ORIGINAL;}
         saveDatFiles();
     }
-
-    app->window->ui->goHint->hide();
-    app->window->ui->goProgress->hide();
-    app->window->ui->startbox->hide();
-    app->window->ui->goLocal->setEnabled(true);
-    app->window->ui->goOriginal->setEnabled(true);
-    app->window->ui->goCancel->setEnabled(true);
-    app->helper->setState("free");
-    qDebug() << "Locale changed";
     return true;
 }
 
-void LotroManager::handleFinisheddd(){
-   installMicroPatch();
-}
+//void LotroManager::handleFinisheddd(){
+//   installMicroPatch();
+//}

+ 5 - 7
lotromanager.h

@@ -21,7 +21,7 @@ public:
        return lotro_mgr_instance;
     }
 
-    bool execute(QStringList operation);
+    bool execute(QString command, QString args, QString name);
 
     bool isBusy();
 
@@ -62,8 +62,6 @@ private:
     std::vector<LOTRO_DAT::DatFile> dat_files_;
     LOTRO_DAT::Database database_;
 
-    std::deque<QStringList> operations_queue_;
-
     const std::vector<QString> available_operations_ = {
         "StartGame",
         "SetLocale",
@@ -79,13 +77,13 @@ private:
     };
 
 signals:
-    void dat_operation_started(QString operation);
-    void dat_operation_finished(QString operation, QString result = "");
+    void dat_operation_started(QString command, QString args, QString name);
+    void dat_operation_finished(QString command, QString args, QString name, QString result = "");
     void update_hint_label(QString head, QString content);
 
 private slots:
-    void on_dat_operation_started(QString operation);
-    void on_dat_operation_finished(QString operation, QString result = "");
+    void on_dat_operation_started(QString command, QString args, QString name);
+    void on_dat_operation_finished(QString command, QString args, QString name, QString result = "");
 };
 
 #endif // LOTROMANAGER_H

+ 90 - 43
mainwindow.cpp

@@ -70,7 +70,10 @@ MainWindow::MainWindow( double scale_factor, QMainWindow* parent) :
     show();
 
     connect(app->window->ui->skinSelect, SIGNAL(currentIndexChanged(int)), this, SLOT(saveSkin()));
-    connect(this, SIGNAL(datFileChecked(int)), this, SLOT(PostDatFileCheckTransactions(int)));
+    connect(std::addressof(LotroManager::getInstance()), SIGNAL(dat_operation_finished(QString, QString, QString, QString)),
+            this, SLOT(on_lotro_manager_finished(QString, QString, QString, QString)));
+    connect(std::addressof(LotroManager::getInstance()), SIGNAL(dat_operation_started(QString, QString, QString)),
+            this, SLOT(on_lotro_manager_started(QString, QString, QString)));
 
 
     app->helper->loadNews();
@@ -81,12 +84,47 @@ MainWindow::MainWindow( double scale_factor, QMainWindow* parent) :
     ui->hintLabel->setText("Проверка .dat файла");
     ui->exthintLabel->setText("Выполняется предварительная проверка файлов данных...");
 
-    QFuture<void> future = QtConcurrent::run([=]() {
-        qInfo("%s:%i: %s", __FILE__, __LINE__, "Инициализация закончена.");
-        // Проверяем файл локализации
-        int result = LotroManager::getInstance().checkDatFile();
-        emit(datFileChecked(result));
-    });
+    LotroManager::getInstance().execute("CheckDatFile", "", "init_check_dat");
+}
+
+void MainWindow::on_lotro_manager_started(QString command, QString args, QString name) {
+    App* app = &App::getInstance();
+    app->helper->setState("busy");
+}
+
+void MainWindow::on_lotro_manager_finished(QString command, QString args, QString name, QString result) {
+    App* app = &App::getInstance();
+
+    if (name == "init_check_dat") {
+        PostDatFileCheckTransactions(result.toInt());
+        return;
+    }
+
+    if (name == "delete_before_start_game") {
+        QString filename = app->config->getDatPath(0);
+        QFile::remove(filename);
+        if (!FileSystem::fileExists(filename))
+            LotroManager::getInstance().execute("StartGame", "", "start_game");
+        return;
+    }
+
+    if (name == "save_before_start_game") {
+        app->window->ui->goHint->hide();
+        app->window->ui->goProgress->hide();
+        app->window->ui->startbox->hide();
+        app->window->ui->goLocal->setEnabled(true);
+        app->window->ui->goOriginal->setEnabled(true);
+        app->window->ui->goCancel->setEnabled(true);
+        LotroManager::getInstance().execute("StartGame", "", "start_game");
+        return;
+    }
+
+    if (name == "start_game") {
+        QApplication::exit();
+        return;
+    }
+
+    app->helper->setState("free");
 }
 
 void MainWindow::PostDatFileCheckTransactions(int check_result) {
@@ -130,7 +168,6 @@ void MainWindow::PostDatFileCheckTransactions(int check_result) {
     // Если приготовления выполнены загружаем патчи
     if(app->state == "free" && app->ready == true){
         app->logSectionStart("Загрузка патчей");
-        //for (int i = 0; i < 5; i++) app->datfiles[i].CommitChanges();
         app->network->getPaths();
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
         app->logSectionEnd();
@@ -281,20 +318,24 @@ void MainWindow::on_goCancel_clicked(){
 
 void MainWindow::on_goOriginal_clicked(){
     App *app = &App::getInstance();
+    app->window->ui->goHint->show();
+    app->window->ui->goLocal->setEnabled(false);
+    app->window->ui->goOriginal->setEnabled(false);
+    app->window->ui->goCancel->setEnabled(false);
     app->window->ui->goProgress->show();
-    QtConcurrent::run([=]() {
-        LotroManager::getInstance().setGameLocale("Original");
-        LotroManager::getInstance().startGame();
-    });
+
+    LotroManager::getInstance().execute("SetLocale", "Original", "save_before_start_game");
 }
 
 void MainWindow::on_goLocal_clicked(){
     App *app = &App::getInstance();
+    app->window->ui->goHint->show();
+    app->window->ui->goLocal->setEnabled(false);
+    app->window->ui->goOriginal->setEnabled(false);
+    app->window->ui->goCancel->setEnabled(false);
     app->window->ui->goProgress->show();
-    QtConcurrent::run([=]() {
-        if(LotroManager::getInstance().setGameLocale("RU"))
-            LotroManager::getInstance().startGame();
-    });
+
+    LotroManager::getInstance().execute("SetLocale", "RU", "save_before_start_game");
 }
 
 void MainWindow::on_minimizeButton_clicked(){
@@ -313,20 +354,44 @@ void MainWindow::on_couponButton_clicked(){
 
 void MainWindow::on_enButton_clicked(){
     App *app = &App::getInstance();
-    LotroManager::getInstance().saveLocale(0, this->ui->enButton);
-    app->config->setValue("Local", "lang", "en");
+    QString file = "client_local_English.dat";
+
+    if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) {
+        app->config->setValue("Local", "file", file);
+        app->config->setValue("Local", "lang", "en");
+    } else {
+        QString text = "Данная локализация отсутствует";
+        QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится.";
+        app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false);
+    }
 }
 
 void MainWindow::on_deButton_clicked(){
     App *app = &App::getInstance();
-    LotroManager::getInstance().saveLocale(1, this->ui->deButton);
-    app->config->setValue("Local", "lang", "de");
+    QString file = "client_local_DE.dat";
+
+    if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) {
+        app->config->setValue("Local", "file", file);
+        app->config->setValue("Local", "lang", "de");
+    } else {
+        QString text = "Данная локализация отсутствует";
+        QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится.";
+        app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false);
+    }
 }
 
 void MainWindow::on_frButton_clicked(){
     App *app = &App::getInstance();
-    LotroManager::getInstance().saveLocale(2, this->ui->frButton);
-    app->config->setValue("Local", "lang", "fr");
+    QString file = "client_local_FR.dat";
+
+    if (FileSystem::fileExists(app->config->getValue("Local", "folder") + "/" + file)) {
+        app->config->setValue("Local", "file", file);
+        app->config->setValue("Local", "lang", "fr");
+    } else {
+        QString text = "Данная локализация отсутствует";
+        QString info = "В настоящий момент вы не можете выбрать данную опцию, поскольку файл " + file + " отсутствует в вашем игровом клиенте. Чтобы скачать его, запустите официальный лаунчер, выберите желаемый язык в верхней правой части окна и дождитесь, когда загрузка необходимых файлов завершится.";
+        app->helper->myDialogBox(text, info, "OK", "Отмена", "gandalf.png", "", "", 400, 220, true, false);
+    }
 }
 
 void MainWindow::saveSkin(){
@@ -346,31 +411,26 @@ void MainWindow::on_checkFonts_stateChanged(int arg1){
 void MainWindow::on_checkTexts_stateChanged(int arg1){
     App *app = &App::getInstance();
     app->config->setValue("Editor", "texts", arg1 ? "true" : "false");;
-    app->downloader->abortDownload("texts");
 }
 
 void MainWindow::on_checkSounds_stateChanged(int arg1){
     App *app = &App::getInstance();
     app->config->setValue("Editor", "sounds", arg1 ? "true" : "false");
-    app->downloader->abortDownload("sounds");
 }
 
 void MainWindow::on_checkMaps_stateChanged(int arg1){
     App *app = &App::getInstance();
     app->config->setValue("Editor", "images", arg1 ? "true" : "false");
-    app->downloader->abortDownload("images");
 }
 
 void MainWindow::on_checkScreens_stateChanged(int arg1){
     App *app = &App::getInstance();
     app->config->setValue("Editor", "screens", arg1 ? "true" : "false");
-    app->downloader->abortDownload("screens");
 }
 
 void MainWindow::on_checkVideos_stateChanged(int arg1){
     App *app = &App::getInstance();
     app->config->setValue("Editor", "videos", arg1 ? "true" : "false");
-    app->downloader->abortDownload("videos");
 }
 
 void MainWindow::on_checkMicro_stateChanged(int arg1){
@@ -400,12 +460,11 @@ void MainWindow::on_designButton_clicked(){
 void MainWindow::on_repairButton_clicked(){
    App *app = &App::getInstance();
    app->config->deleteSection("Applied");
-   LotroManager::getInstance().applyGlobal();
+   LotroManager::getInstance().execute("ApplyGlobal", "", "");
    app->helper->checkTab("mainbox");
 }
 
 void MainWindow::on_okButton_clicked(){
-
     App *app = &App::getInstance();
     QStringList commands = app->helper->dialog_ok_answer.split(" ");
     foreach(QString command, commands){
@@ -444,7 +503,7 @@ void MainWindow::on_okButton_clicked(){
             qDebug() << folders;
         }
 
-        if (command == "choosedatpath") {
+        if(command == "choosedatpath") {
             app->helper->checkTab("optbox");
             emit app->window->ui->lotropathButton->clicked(true);
         }
@@ -484,32 +543,20 @@ void MainWindow::on_okButton_clicked(){
             app->config->deleteSection("Applied");
             QString filename = app->config->getDatPath(0);
             qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Удаляем файл: ", filename.toUtf8().data());
-            LotroManager::getInstance().saveDatFiles();
-            QFile::remove(filename);
-            if (!FileSystem::fileExists(filename)) {
-                LotroManager::getInstance().startGame();
-                qApp->exit();
-            }
-
+            LotroManager::getInstance().execute("SaveDatFiles", "", "delete_before_start_game");
         }
     }
-
-
 }
 
 void MainWindow::on_cancelButton_clicked(){
-
     App *app = &App::getInstance();
     QStringList commands = app->helper->dialog_cancel_answer.split(" ");
     foreach(QString command, commands){
         if(command == "close")
             this->ui->dialogbox->hide();
-
         if (command == "exit")
             QApplication::exit(0);
     }
-
-
 }
 
 

+ 4 - 2
mainwindow.h

@@ -27,10 +27,12 @@ public:
 signals:
     void datFileChecked(int result);
 public slots:
-    void PostDatFileCheckTransactions(int check_result);
+    void on_lotro_manager_finished(QString command, QString args, QString name, QString result = "");
+    void on_lotro_manager_started(QString command, QString args, QString name);
+    //void on_change_hint(QString head, QString msg);
 
 private:
-
+    void PostDatFileCheckTransactions(int check_result);
 
 private slots:
     void minimize();

+ 12 - 12
network.cpp

@@ -235,7 +235,7 @@ void ANetwork::getPaths(){
     if(content == "") {
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Все версии патчей соответствуют актуальным.");
         app->helper->setState("busy");
-        LotroManager::getInstance().applyGlobal();
+        //LotroManager::getInstance().applyGlobal();
         app->helper->setState("free");
         return;
     }
@@ -249,11 +249,11 @@ void ANetwork::getPaths(){
         QStringList pathline = values[0].split( "_" );
         pathline = pathline[0].split( "/" );
         QUrl url = values[0];
-        app->config->setValue("Hashes", pathline[3], values[1]);
-        app->config->setValue("Datetime", pathline[3], values[2]);
+        app->config->setValue("Hashes", pathline.last(), values[1]);
+        app->config->setValue("Datetime", pathline.last(), values[2]);
 
         // Удаляем устаревшие патчи
-        QStringList old = dir.entryList(QStringList(pathline[3] + "*"));
+        QStringList old = dir.entryList(QStringList(pathline.last() + "*"));
         if(old.count() > 0){
             foreach(QString filename, old){
                 QFile::remove(QApplication::applicationDirPath() + "/data/" + filename);
@@ -295,14 +295,14 @@ QString ANetwork::getMicroPath(int timestamp){
     qInfo("%s:%i: %s", __FILE__, __LINE__, "Загрузка микропатча завершена.");
 
 
-    LotroManager::getInstance().database_.InitDatabase(filename.toLocal8Bit().data());
-    int indb = LotroManager::getInstance().database_.CountRows();
-    qInfo("%s:%i: %s%i", __FILE__, __LINE__, "Патч содержит строк: ", indb);
-    for(int i = 0; i<=indb; i++) LotroManager::getInstance().processFile();
-    qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
-    LotroManager::getInstance().saveDatFiles();
-    LotroManager::getInstance().database_.CloseDatabase();
-    app->logSectionEnd();
+    //LotroManager::getInstance().database_.InitDatabase(filename.toLocal8Bit().data());
+    //int indb = LotroManager::getInstance().database_.CountRows();
+    //qInfo("%s:%i: %s%i", __FILE__, __LINE__, "Патч содержит строк: ", indb);
+    //for(int i = 0; i<=indb; i++) LotroManager::getInstance().processFile();
+    //qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
+    //LotroManager::getInstance().saveDatFiles();
+    //LotroManager::getInstance().database_.CloseDatabase();
+    //app->logSectionEnd();
 
     return filename;