Ivan Arkhipov 6 years ago
parent
commit
08b893c084
14 changed files with 170 additions and 128 deletions
  1. 4 4
      Legacy.pro
  2. 51 67
      anetwork.cpp
  3. 14 9
      anetwork.h
  4. 1 1
      app.h
  5. 1 1
      config.cpp
  6. 3 11
      downloadmanager.cpp
  7. 1 0
      dpi.stml
  8. 38 22
      lotromanager.cpp
  9. 2 1
      lotromanager.h
  10. 3 3
      main.cpp
  11. 45 7
      mainwindow.cpp
  12. 3 2
      mainwindow.h
  13. 3 0
      mainwindow.ui
  14. 1 0
      ui_mainwindow.h

+ 4 - 4
Legacy.pro

@@ -30,21 +30,21 @@ SOURCES += \
     main.cpp \
     mainwindow.cpp \
     config.cpp \
-    network.cpp \
     helper.cpp \
     downloadmanager.cpp \
     filesystem.cpp \
-    lotromanager.cpp
+    lotromanager.cpp \
+    anetwork.cpp
 
 HEADERS += \
         mainwindow.h \
     app.h \
     config.h \
-    network.h \
     helper.h \
     downloadmanager.h \
     filesystem.h \
-    lotromanager.h
+    lotromanager.h \
+    anetwork.h
 
 FORMS += \
         mainwindow.ui

+ 51 - 67
network.cpp → anetwork.cpp

@@ -12,20 +12,10 @@
 #include <QDir>
 #include <QMap>
 
-ANetwork::ANetwork() {
+ANetwork::ANetwork(QObject*) {
 
 }
 
-ANetwork::ANetwork(const ANetwork&) {
-    throw QException(); // Выкидываем QException, в случае если
-                        // вообще попытались скопировать объект
-}
-
-ANetwork& ANetwork::operator=(ANetwork&) {
-    throw QException(); // Выкидываем QException, в случае если
-                        // вообще попытались скопировать объект
-}
-
 QString ANetwork::query(QUrl url){
     App *app = &App::getInstance();
     QNetworkAccessManager* manager = new QNetworkAccessManager(app->window);
@@ -37,7 +27,6 @@ QString ANetwork::query(QUrl url){
     QString content = reply->readAll();
     if (reply->error() != QNetworkReply::NoError){
         content = "error";
-        // пишем в лог
         qDebug() << reply->errorString();
     }
     reply->deleteLater();
@@ -107,7 +96,6 @@ QString ANetwork::getFootMessage(){
     return content;
 }
 
-
 QString ANetwork::getServers(){
     App *app = &App::getInstance();
     QString time = "";
@@ -168,62 +156,66 @@ QString ANetwork::getServers(){
     return content;
 }
 
-
-void ANetwork::getPaths(){
+void ANetwork::UpdatePatches(){
     App *app = &App::getInstance();
     QUrlQuery query;
     QStringList names;
     QString version;
     qInfo("%s:%i: %s", __FILE__, __LINE__, "Начинаем проверку актуальности патчей.");
-    names  << "sound" << "text" << "image" << "video" << "screen" << "texture" << "font";
+    names  << "sounds" << "texts" << "images" << "videos" << "loadscreens" << "textures" << "fonts";
     QUrl url(app->config->getValue("Network", "releases"));
 
     QString datafolder = QApplication::applicationDirPath() + "/data";
     QDir dir(datafolder);
     if(!dir.exists()) QDir().mkdir(datafolder);
 
-    foreach(QString s, names){
-        if(app->config->getValue("Editor", s + "s") == "true"){
-            if(s == "screen") s = "loadscreen";// поправка для заставок
-
-            QStringList paths = dir.entryList(QStringList(s + "*"));
-
-            if(!paths.empty()) {
-                 version = QString::number(app->helper->getVersion(paths.first()));
-                 QString hash = FileSystem::fileHash(datafolder + "/" + paths.first(), QCryptographicHash::Md5);
-                 if(hash != app->config->getValue("Hashes", s + "s")){
-                     qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Эталон хэша отсутствует (удаляю файл): ", paths.first().toLocal8Bit().data());
-                     QFile base(datafolder + "/" + paths.first());
-                     base.remove();
-                     version="100";
-                 }
-
-                 QString dateline = app->config->getValue("Datetime", s + "s");
-                 if(dateline != "-1"){
-                    qDebug("%s:%i: %s", __FILE__, __LINE__, "Проставляем даты патчей.");
-                    QLabel* obj = app->window->ui->mainbox->findChild<QLabel*>(s + "sStatus");
-                    if (obj != nullptr){
-                        QStringList date = dateline.split(" ");
-                        obj->setText(date[0]);
-                    }
-
-                 }
-
-            } else {
-                qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Патч отсутствует: ", s.toLocal8Bit().data());
-                version = "100";
-                QLabel* obj = app->window->ui->mainbox->findChild<QLabel*>(s + "sStatus");
-                if (obj != nullptr) {
-                    obj->setText("Оригинал");
-                }
+    foreach(QString s, names) {
 
-            }
-            query.addQueryItem(s, version);
+        if(app->config->getValue("Editor", s) == "false") {
+            emit changePatchStatus(s, "Не выбран");
+            continue;
+        }
+
+        QStringList paths = dir.entryList(QStringList(s + "*"));
+
+        QString dateline = app->config->getValue("Datetime", s);
+        if (dateline != "-1") {
+            qDebug("%s:%i: %s", __FILE__, __LINE__, "Проставляем даты патчей.");
+            QStringList date = dateline.split(" ");
+            emit changePatchStatus(s, date[0]);
+        }
+
+        if (paths.empty()) {
+            qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Патч отсутствует: ", s.toLocal8Bit().data());
+            version = "100";
+            emit changePatchStatus(s, "Отсутствует");
+
+            query.addQueryItem(s.left(s.length() - 1), version);
+            continue;
         }
+
+        version = QString::number(app->helper->getVersion(paths.first()));
+        QString hash = FileSystem::fileHash(datafolder + "/" + paths.first(), QCryptographicHash::Md5);
+        if(hash != app->config->getValue("Hashes", s)) {
+            qDebug("%s:%i: %s\n%s%s\n%s%s\n%s%s", __FILE__, __LINE__, "Неверный хэш файла! (удаляю файл)",
+                   "Файл: " , paths.first().toLocal8Bit().data(),
+                   "Высчитанный хэш: ", hash.toLocal8Bit().data(),
+                   "Хэш конфигурации: ", app->config->getValue("Hashes", s).toLocal8Bit().data()
+                   );
+
+            QFile base(datafolder + "/" + paths.first());
+            base.remove();
+            version="100";
+
+            emit changePatchStatus(s, "Ошибка хэша");
+        }
+
+        query.addQueryItem(s.left(s.length() - 1), version);
     }
 
     url.setQuery(query.query());
     qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Запрашиваем информацию о патчах: ", url.fileName().toLocal8Bit().data());
+    qDebug() << "\nЗапрос на сервер: " << url;
     QString content = this->query(url);
     if(content == "error"){
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствует связь с сервером. Прервано.");
@@ -231,12 +223,14 @@ void ANetwork::getPaths(){
         return;
     }
 
-    qDebug() << content;
-    if(content == "") {
+    qDebug() << "\nОтвет сервера: " << content;
+    if (content == "Запросы GET или POST отсутствуют!!!!") {
+        qInfo("%s:%i: %s", __FILE__, __LINE__, "Отсутствуют запросы к серверу.");
+        return;
+    }
+
+    if (content == "") {
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Все версии патчей соответствуют актуальным.");
-        app->helper->setState("busy");
-        //LotroManager::getInstance().applyGlobal();
-        app->helper->setState("free");
         return;
     }
 
@@ -268,7 +262,6 @@ void ANetwork::getPaths(){
 }
 
 QString ANetwork::getMicroPath(int timestamp){
-
     App *app = &App::getInstance();
 
     app->logSectionStart("Загрузка последних обновлений");
@@ -308,12 +301,3 @@ QString ANetwork::getMicroPath(int timestamp){
 
 }
 
-
-
-
-
-
-
-
-
-

+ 14 - 9
network.h → anetwork.h

@@ -6,22 +6,25 @@
 #include <QtNetwork/QNetworkReply>
 #include <QProgressBar>
 #include <QFile>
+#include <QObject>
 
 class MainWindow;
 
-class ANetwork {
-
+class ANetwork : public QObject {
+    Q_OBJECT
 public:
-    ANetwork();
-    ANetwork( const ANetwork&);
-    ANetwork& operator=( ANetwork& );
+    explicit ANetwork(QObject *parent = nullptr);
+    ANetwork( const ANetwork&) = delete;
+    ANetwork& operator=( ANetwork& ) = delete;
 
     QNetworkReply* currentDownload;
     QFile output;
 
     void getUrl();
     QString getCoupon();
-    void getPaths();
+
+    void UpdatePatches();
+
     QString getServers();
     QString getFootMessage();
     QString getMicroPath(int timestamp);
@@ -31,10 +34,12 @@ public:
 
     QString micropatch;
 
-private slots:
-    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
-    void downloadFinished();
+signals:
+    void changePatchStatus(QString patch_name, QString new_status);
 
+//private slots:
+//    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
+//    void downloadFinished();
 };
 
 #endif // NETWORK_H

+ 1 - 1
app.h

@@ -5,7 +5,7 @@
 #include "ui_mainwindow.h"
 
 #include "config.h"
-#include "network.h"
+#include "anetwork.h"
 #include "helper.h"
 #include "downloadmanager.h"
 

+ 1 - 1
config.cpp

@@ -28,7 +28,7 @@ void AConfig::saveConfig(){
     settings.setValue("Editor/images", true);
     settings.setValue("Editor/sounds", true);
     settings.setValue("Editor/videos", false);
-    settings.setValue("Editor/screens", true);
+    settings.setValue("Editor/loadscreens", true);
     settings.setValue("Editor/textures", true);
 
     //Network

+ 3 - 11
downloadmanager.cpp

@@ -68,10 +68,7 @@ void DownloadManager::startNextDownload()
     app->writtenLabel = app->window->ui->mainbox->findChild<QLabel *>(name);
 
     if (!output.open(QIODevice::WriteOnly)) {
-        qCritical("%s:%i: %s%s", __FILE__, __LINE__, "Произошла остановка скачивания ", filename.toLocal8Bit().data());
-        /*fprintf(stderr, "Problem opening save file '%s' for download '%s': %s\n",
-                qPrintable(filename), url.toEncoded().constData(),
-                qPrintable(output.errorString()));*/
+        qWarning("%s:%i: %s%s", __FILE__, __LINE__, "Произошла остановка скачивания ", filename.toLocal8Bit().data());
         if(app->writtenLabel != nullptr) app->writtenLabel->setText("Не удалась");
         startNextDownload();
         return;
@@ -117,22 +114,18 @@ void DownloadManager::downloadProgress(qint64 bytesReceived, qint64 bytesTotal)
     if(app->writtenLabel != nullptr) app->writtenLabel->setText("Загрузка ... <br/>" + percenttext+ "% (" + speedtext + ")");
 }
 
-void DownloadManager::downloadFinished()
-{
+void DownloadManager::downloadFinished() {
     output.close();
     App *app = &App::getInstance();
     app->helper->setState("free");// говорим что приложение освободилось
 
     if (currentDownload->error()) {
          qWarning("%s:%i: %s%s", __FILE__, __LINE__, "Загрузка не удалась: ", currentDownload->errorString().toLocal8Bit().data());
-        //fprintf(stderr, "Failed: %s\n", qPrintable(currentDownload->errorString()));
-        if(app->writtenLabel != nullptr) app->writtenLabel->setText("Не удалась.");
+         if(app->writtenLabel != nullptr) app->writtenLabel->setText("Не удалась.");
     } else {       
         if(app->writtenLabel != nullptr) app->writtenLabel->setText("Готово");
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Все загрузки завершены. Загрузчик завершил свою работу.");
         ++downloadedCount;
-        app->network->getPaths();
-
     }
 
     currentDownload->deleteLater();
@@ -151,7 +144,6 @@ void DownloadManager::abortDownload(QString name){
             qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Пользователь прервал закачку файла ", download_name.toLocal8Bit().data());
             if(app->writtenLabel != nullptr) app->writtenLabel->setText("Не выбран");
             currentDownload->abort();
-
        }
     }
 }

+ 1 - 0
dpi.stml

@@ -0,0 +1 @@
+1.5

+ 38 - 22
lotromanager.cpp

@@ -224,34 +224,40 @@ bool LotroManager::openDatFile(int id) {
 
 void LotroManager::applyPatch(QString name){
     App *app = &App::getInstance();
-    app->window->ui->hintLabel->setText("Установка патчей");
-    app->window->ui->exthintLabel->setText("Ожидайте. Идет установка выбранных патчей");
+    emit changeHint("Применение патчей", "Ожидайте. Идёт применение выбранных патчей");
+
     qDebug("%s:%i: %s%s", __FILE__, __LINE__, "Начинаем применение патча ", name.toLocal8Bit().data());
-    QLabel* label = app->window->findChild<QLabel*>(name + "Status");
+
     QDir dir(QApplication::applicationDirPath() + "/data");
     if (!dir.exists()) {
-        app->window->ui->hintLabel->setText("Установка патчей завершена с ошибкой");
-        app->window->ui->exthintLabel->setText("Ошибка - не найдена папка data");
+        emit changeHint("Ошибка применения патчей", "Не найдена папка data!");
         return;
     }
 
     QStringList paths = dir.entryList(QStringList(name + "*"));
     qDebug() << QString("data/" + paths.first()).toLocal8Bit().data();
+
     if(!paths.empty()) {
-       database_.InitDatabase(QString("data/" + paths.first()).toLocal8Bit().data());
+        qInfo("%s:%i: %s%s", __FILE__, __LINE__, "Инициализируем базу данных: ", QString("data/" + paths.first()).toLocal8Bit().data());
+        database_.InitDatabase(QString("data/" + paths.first()).toLocal8Bit().data());
+
         int indb = database_.CountRows();
         qInfo("%s:%i: %s%d", __FILE__, __LINE__, "Файлов в обновлении: ", indb);
+
         for(int i = 0; i<=indb; i++){
             processFile();
-            if (label != nullptr)
-                label->setText(QString("Применение ... ") + QString::fromLatin1("%1").arg(i*100.0/indb, 3, 'f', 1) + QString("%"));
+            emit changePatchStatus(name, QString("Применение ... ")
+                                         + QString::fromLatin1("%1").arg(i*100.0/indb, 3, 'f', 1)
+                                         + QString("%"));
         }
-        if(label != nullptr) label->setText("Готово");
+
+        emit changePatchStatus(name, "Готово");
+
         app->config->setValue("Applied", name, paths.first());
         database_.CloseDatabase();
+
+        emit changeHint("Применение патча завершено", "Патч " + name + " успешно установлен");
     }
-    app->window->ui->hintLabel->setText("Установка патчей завершена");
-    app->window->ui->exthintLabel->setText("Применение выбранных вами патчей закончено");
 }
 
 int LotroManager::checkDatFile(){
@@ -355,17 +361,20 @@ void LotroManager::applyLoadscreens(){
 }
 
 void LotroManager::processFile(){
-    App *app = &App::getInstance();
     SubfileData subfile;
+
     subfile = database_.GetNextFile();
     if (subfile.Empty()){
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Достигнут конец файла.");
-    } else {
-        int dat_id = subfile.options["did"].as<int>();
-        int dat_state = dat_files_[dat_id].InitDatFile(app->config->getDatPath(dat_id), dat_id);
-        //qDebug("%s:%i: %s%d", __FILE__, __LINE__, "Состояние dat-файла: ", dat_state);
-        if(dat_state > 0) dat_files_[dat_id].PatchFile(subfile);
+        return;
     }
+
+    App* app = &App::getInstance();
+    int dat_id = subfile.options["did"].as<int>();
+    int dat_state = dat_files_[dat_id].InitDatFile(app->config->getDatPath(dat_id), dat_id);
+    //qDebug("%s:%i: %s%d", __FILE__, __LINE__, "Состояние dat-файла: ", dat_state);
+    if (dat_state > 0)
+        dat_files_[dat_id].PatchFile(subfile);
 }
 
 void LotroManager::installMicroPatch(){
@@ -427,13 +436,20 @@ bool LotroManager::setGameLocale(QString locale){
         LOCALE loc = dat_files_[0].current_locale();
         dat_locale_ = loc;
 
-        if(loc == PATCHED) qDebug() << "Starting " + locale + " version. Current locale is PATCHED";
-        if(loc == ORIGINAL) qDebug() << "Starting " + locale + " version. Current locale is ORIGINAL";
-        if(loc != ORIGINAL && loc != PATCHED) qDebug() << "Starting " + locale + " version. Current locale is UNKNOWN";
+        qDebug() << "Starting " + locale + " version. Current locale is " << loc;
 
-        if(locale == "RU" && loc != PATCHED){ qDebug()<< "Current locale Original"; dat_files_[0].SetLocale(PATCHED); dat_locale_ = PATCHED;}
-        if(locale == "Original" && loc != ORIGINAL){ qDebug()<< "Current locale RU"; dat_files_[0].SetLocale(ORIGINAL); dat_locale_ = ORIGINAL;}
+        if (locale == "RU" && loc == ORIGINAL) {
+            dat_files_[0].SetLocale(PATCHED);
+            dat_locale_ = PATCHED;
+        }
+
+        if(locale == "Original" && loc == PATCHED){
+            dat_files_[0].SetLocale(ORIGINAL);
+            dat_locale_ = ORIGINAL;
+        }
         saveDatFiles();
+
+        qDebug() << "Successfully set locale " << locale;
     }
     return true;
 }

+ 2 - 1
lotromanager.h

@@ -79,7 +79,8 @@ private:
 signals:
     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);
+    void changePatchStatus(QString patch_name, QString new_status);
+    void changeHint(QString head, QString hint);
 
 private slots:
     void on_dat_operation_started(QString command, QString args, QString name);

+ 3 - 3
main.cpp

@@ -38,6 +38,9 @@ void myMessageOutput(QtMsgType type, const QMessageLogContext &, const QString &
 }
 
 int main(int argc, char *argv[]){
+    freopen("log.txt", "w", stdout);
+    freopen("log.txt", "a", stderr);
+
     if (argc <= 1 || (argc > 1 && std::string(argv[1]) != "-prelaunched")) {
         QApplication a(argc, argv);
         QMessageBox msgBox;
@@ -48,9 +51,6 @@ int main(int argc, char *argv[]){
         return 0;
     }
 
-    freopen("log.txt", "w", stdout);
-    freopen("log.txt", "a", stderr);
-
     setbuf(stdout, NULL);
     setbuf(stderr, NULL);
     setvbuf (stdout, NULL, _IONBF, BUFSIZ);

+ 45 - 7
mainwindow.cpp

@@ -70,11 +70,37 @@ MainWindow::MainWindow( double scale_factor, QMainWindow* parent) :
     show();
 
     connect(app->window->ui->skinSelect, SIGNAL(currentIndexChanged(int)), this, SLOT(saveSkin()));
-    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)));
 
+    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))
+            );
+
+
+    connect(std::addressof(LotroManager::getInstance()),
+            SIGNAL(changePatchStatus(QString, QString)),
+            this,
+            SLOT(on_change_patch_status(QString, QString))
+            );
+
+    connect(std::addressof(LotroManager::getInstance()),
+            SIGNAL(changeHint(QString, QString)),
+            this,
+            SLOT(on_change_hint(QString, QString))
+            );
+
+    connect(app->network,
+            SIGNAL(changePatchStatus(QString, QString)),
+            this,
+            SLOT(on_change_patch_status(QString, QString))
+            );
 
     app->helper->loadNews();
     app->network->getFootMessage();
@@ -127,6 +153,18 @@ void MainWindow::on_lotro_manager_finished(QString command, QString args, QStrin
     app->helper->setState("free");
 }
 
+void MainWindow::on_change_patch_status(QString patch_name, QString new_status) {
+    QLabel* obj = ui->mainbox->findChild<QLabel*>(patch_name + "Status");
+    if (obj != nullptr){
+        obj->setText(new_status);
+    }
+}
+
+void MainWindow::on_change_hint(QString title, QString hint) {
+    ui->hintLabel->setText(title);
+    ui->exthintLabel->setText(hint);
+}
+
 void MainWindow::PostDatFileCheckTransactions(int check_result) {
     ui->hintLabel->setText("Проверка .dat файла...");
     ui->exthintLabel->setText("Успешно!");
@@ -168,7 +206,7 @@ void MainWindow::PostDatFileCheckTransactions(int check_result) {
     // Если приготовления выполнены загружаем патчи
     if(app->state == "free" && app->ready == true){
         app->logSectionStart("Загрузка патчей");
-        app->network->getPaths();
+        app->network->UpdatePatches();
         qInfo("%s:%i: %s", __FILE__, __LINE__, "Выполнено.");
         app->logSectionEnd();
     }
@@ -261,7 +299,7 @@ void MainWindow::on_mainButton_clicked(){
     App *app = &App::getInstance();
     app->helper->checkTab("mainbox");
     app->window->ui->titleLabel->setText("Патчи");
-    if(app->state != "busy") app->network->getPaths();
+    if (app->state != "busy") app->network->UpdatePatches();
 }
 
 void MainWindow::on_optButton_clicked(){
@@ -535,7 +573,7 @@ void MainWindow::on_okButton_clicked(){
         if(command == "applypaths"){
             app->ready = true;
             app->config->deleteSection("Applied");
-            app->network->getPaths();
+            app->network->UpdatePatches();
             app->helper->checkTab("mainbox");
         }
 

+ 3 - 2
mainwindow.h

@@ -26,10 +26,11 @@ public:
 
 signals:
     void datFileChecked(int result);
-public slots:
+private slots:
     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);
+    void on_change_patch_status(QString patch_name, QString new_status);
+    void on_change_hint(QString title, QString hint);
 
 private:
     void PostDatFileCheckTransactions(int check_result);

+ 3 - 0
mainwindow.ui

@@ -13,6 +13,9 @@
   <property name="windowTitle">
    <string>MainWindow</string>
   </property>
+  <property name="windowOpacity">
+   <double>1.000000000000000</double>
+  </property>
   <property name="styleSheet">
    <string notr="true"/>
   </property>

+ 1 - 0
ui_mainwindow.h

@@ -152,6 +152,7 @@ public:
         if (MainWindow->objectName().isEmpty())
             MainWindow->setObjectName(QStringLiteral("MainWindow"));
         MainWindow->resize(848, 387);
+        MainWindow->setWindowOpacity(1);
         MainWindow->setStyleSheet(QStringLiteral(""));
         centralWidget = new QWidget(MainWindow);
         centralWidget->setObjectName(QStringLiteral("centralWidget"));