legacyapplication.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "legacyapplication.h"
  2. #include "models/lotrodatmanager.h"
  3. #include "models/patchlist.h"
  4. #include "widgets/mainwindow.h"
  5. #include <QLockFile>
  6. #include <QMessageBox>
  7. #include <QResource>
  8. #include <QFontDatabase>
  9. #include <QMessageLogContext>
  10. #include "utils.h"
  11. extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
  12. LegacyApplication::LegacyApplication(int &argc, char **argv)
  13. : QApplication(argc, argv)
  14. {
  15. qInstallMessageHandler(logMessageHandler);
  16. try_to_init_functional_modules_timer_.setInterval(1 * 1000); // one second
  17. connect(&try_to_init_functional_modules_timer_, &QTimer::timeout, this, &LegacyApplication::TryToInitFunctionalModules);
  18. try_to_init_functional_modules_timer_.stop();
  19. }
  20. bool LegacyApplication::init()
  21. {
  22. qt_ntfs_permission_lookup++;
  23. qDebug() << "Starting initialisation...";
  24. QCoreApplication::setOrganizationName("LotroLegacy");
  25. QCoreApplication::setOrganizationDomain("translate.lotros.ru");
  26. QCoreApplication::setApplicationName("Legacy_v2");
  27. QSettings::setDefaultFormat(QSettings::IniFormat);
  28. QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, QApplication::applicationDirPath());
  29. QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, QApplication::applicationDirPath());
  30. qDebug() << "Checking if there's another instance of Legacy";
  31. QLockFile lockFile(QDir::temp().absoluteFilePath("rulotro.lock"));
  32. if(!lockFile.tryLock(1)){
  33. qDebug() << "Lock file already exists! Some other application is already running...";
  34. QMessageBox msgBox;
  35. msgBox.setIcon(QMessageBox::Warning);
  36. msgBox.setText("Приложение уже запущено.\nРазрешено запускать только один экземпляр приложения.");
  37. msgBox.exec();
  38. return false;
  39. }
  40. qDebug() << "Initialising fonts and resources";
  41. QDir::setCurrent(QApplication::applicationDirPath());
  42. if (!FileSystem::folderExists("backup")) {
  43. QDir dir;
  44. dir.mkdir("backup");
  45. }
  46. QResource::registerResource(QApplication::applicationDirPath() + "/data01.gtr");
  47. QResource::registerResource(QApplication::applicationDirPath() + "/data02.gtr");
  48. QFontDatabase::addApplicationFont(":/fonts/trpro.ttf");
  49. QFontDatabase::addApplicationFont(":/fonts/CrimsonText.ttf");
  50. QFontDatabase::addApplicationFont(":/fonts/EBGaramond.ttf");
  51. QFontDatabase::addApplicationFont(":/fonts/aniron.ttf");
  52. qDebug() << "Starting Lotro Manager initialization...";
  53. lotro_dat_manager = new LotroDatManager();
  54. lotro_dat_manager_thread = new QThread();
  55. connect(lotro_dat_manager_thread, &QThread::finished, lotro_dat_manager, &LotroDatManager::deleteLater);
  56. lotro_dat_manager->moveToThread(lotro_dat_manager_thread);
  57. lotro_dat_manager_thread->start();
  58. qDebug() << "Starting Patch list initialisation...";
  59. patch_list = new PatchList(lotro_dat_manager);
  60. qDebug() << "Starting GUI initialisation...";
  61. gui = new MainWindow(patch_list);
  62. connect(this, &LegacyApplication::ErrorStatusChanged, gui, &MainWindow::onErrorStatusChanged);
  63. connect(this, &LegacyApplication::SecondsToNextTryToInitChanged, gui, &MainWindow::onSecondsToNextTryToInitChanged);
  64. qDebug() << "Starting functional modules initialisation...";
  65. TryToInitFunctionalModules();
  66. return true;
  67. }
  68. LegacyApplication::ErrorStatus LegacyApplication::CheckErrorStatus()
  69. {
  70. size_t status = E_NO_ERRORS;
  71. QString game_folder_path = Settings::getValue("Lotro/game_path").toString();
  72. QString locale_prefix = Settings::getValue("Lotro/original_locale").toString();
  73. // Checking LotroLauncher.exe availability
  74. QFileInfo lotro_launcher_exe(game_folder_path + "/LotroLauncher.exe");
  75. if (!lotro_launcher_exe.exists()) {
  76. status |= E_WRONG_GAME_FOLDER;
  77. } else {
  78. if (!QFile::setPermissions(lotro_launcher_exe.absoluteFilePath(),
  79. QFileDevice::ReadUser | QFileDevice::WriteUser | QFileDevice::ExeUser)) {
  80. status |= E_WRONG_FILE_PERMISSIONS;
  81. }
  82. }
  83. // Checking DAT files availability & correctness
  84. if (!patch_list->getManager()->Initialised() || !patch_list->getManager()->DatPathIsRelevant()) {
  85. QString client_local_filepath = game_folder_path + "/client_local_" + locale_prefix + ".dat";
  86. QString client_general_filepath = game_folder_path + "/client_general.dat";
  87. QFileInfo client_local_file(client_local_filepath);
  88. QFileInfo client_general_file(client_general_filepath);
  89. if (!client_general_file.exists() || !client_local_file.exists()) {
  90. status |= E_DAT_FILES_MISSING;
  91. } else {
  92. if (!QFile::setPermissions(client_general_filepath,
  93. QFileDevice::ReadUser |
  94. QFileDevice::WriteUser |
  95. QFileDevice::ExeUser)) {
  96. status |= E_WRONG_FILE_PERMISSIONS;
  97. status |= E_CANNOT_ACCESS_DAT_FILES;
  98. }
  99. if (!QFile::setPermissions(client_local_filepath,
  100. QFileDevice::ReadUser |
  101. QFileDevice::WriteUser |
  102. QFileDevice::ExeUser)) {
  103. status |= E_WRONG_FILE_PERMISSIONS;
  104. status |= E_CANNOT_ACCESS_DAT_FILES;
  105. }
  106. }
  107. LOTRO_DAT::DatFile test_file;
  108. auto result = test_file.Initialise(client_local_filepath.toStdString(), 0);
  109. if (!result.result) {
  110. if (result.msg == "DATINIT: Error, cannot initialize dat due to internal IO error") {
  111. status |= E_CANNOT_ACCESS_DAT_FILES;
  112. } else {
  113. status |= E_DAT_FILE_INCORRECT;
  114. }
  115. }
  116. result = test_file.Initialise(client_general_filepath.toStdString(), 0);
  117. if (!result.result) {
  118. if (result.msg == "DATINIT: Error, cannot initialize dat due to internal IO error") {
  119. status |= E_CANNOT_ACCESS_DAT_FILES;
  120. } else {
  121. status |= E_DAT_FILE_INCORRECT;
  122. }
  123. }
  124. }
  125. if (!checkInternetConnection(QUrl(Settings::getValue("Network/patch_updates_url").toString()))) {
  126. status |= E_NO_SERVER_CONNECTION;
  127. }
  128. qDebug() << "LegacyApplication: StatusCheck: " << ErrorStatus(status);
  129. return ErrorStatus(status);
  130. }
  131. void LegacyApplication::TryToInitFunctionalModules()
  132. {
  133. if (seconds_after_previous_try_to_init_ + 1 < try_to_init_timeout_) {
  134. seconds_after_previous_try_to_init_++;
  135. emit SecondsToNextTryToInitChanged(try_to_init_timeout_ - seconds_after_previous_try_to_init_);
  136. return;
  137. }
  138. try_to_init_functional_modules_timer_.stop();
  139. seconds_after_previous_try_to_init_ = 0;
  140. ErrorStatus status = CheckErrorStatus();
  141. emit ErrorStatusChanged(status);
  142. if (status == E_NO_ERRORS) {
  143. patch_list->initialize();
  144. patch_list->startAutoUpdate();
  145. } else {
  146. qWarning() << "LegacyApplication: Couldnt init functional modules!";
  147. try_to_init_functional_modules_timer_.start();
  148. }
  149. }
  150. QDebug operator<<(QDebug dbg, const LegacyApplication::ErrorStatus &status)
  151. {
  152. bool wrong_game_folder = (status & LegacyApplication::E_WRONG_GAME_FOLDER);
  153. bool dat_files_missing = (status & LegacyApplication::E_DAT_FILES_MISSING);
  154. bool wrong_file_permissions = (status & LegacyApplication::E_WRONG_FILE_PERMISSIONS);
  155. bool cannot_access_dat_files = (status & LegacyApplication::E_CANNOT_ACCESS_DAT_FILES);
  156. bool dat_file_incorrect = (status & LegacyApplication::E_DAT_FILE_INCORRECT);
  157. bool no_server_connection = (status & LegacyApplication::E_NO_SERVER_CONNECTION);
  158. dbg.nospace() << "ErrorStatus ( "
  159. << (wrong_game_folder ? "Wrong game folder! " : "")
  160. << (dat_files_missing ? "Dat files missing! " : "")
  161. << (wrong_file_permissions ? "Wrong file permissions! " : "")
  162. << (cannot_access_dat_files ? "Cannot access dat files! " : "")
  163. << (dat_file_incorrect ? "Incorrect dat file! " : "")
  164. << (no_server_connection ? "No server connection! " : "")
  165. << ")";
  166. return dbg;
  167. }