diff options
Diffstat (limited to 'libs/installer_fomod_plus/scanner')
| -rw-r--r-- | libs/installer_fomod_plus/scanner/CMakeLists.txt | 54 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/FomodPlusScanner.cpp | 128 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/FomodPlusScanner.h | 64 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/archiveparser.h | 97 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/fomod_plus_scanner_de.ts | 57 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/fomod_plus_scanner_en.ts | 57 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/fomod_plus_scanner_zh_CN.ts | 57 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/fomodplusscanner.json | 8 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/resources.qrc | 6 | ||||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/resources/fomod_icon.png | bin | 1782 -> 0 bytes | |||
| -rw-r--r-- | libs/installer_fomod_plus/scanner/resources/wizard.gif | bin | 5263 -> 0 bytes |
11 files changed, 0 insertions, 528 deletions
diff --git a/libs/installer_fomod_plus/scanner/CMakeLists.txt b/libs/installer_fomod_plus/scanner/CMakeLists.txt deleted file mode 100644 index f50dea2..0000000 --- a/libs/installer_fomod_plus/scanner/CMakeLists.txt +++ /dev/null @@ -1,54 +0,0 @@ -cmake_minimum_required(VERSION 3.16) -project(fomod_plus_scanner) - -include(FetchContent) -set(project_type plugin) - -file(GLOB_RECURSE SCANNER_SOURCES CONFIGURE_DEPENDS - ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/*.h - ${CMAKE_CURRENT_SOURCE_DIR}/*.ui - ${CMAKE_CURRENT_SOURCE_DIR}/*.qrc -) - -add_library(fomod_plus_scanner SHARED ${SCANNER_SOURCES}) - -FetchContent_Declare(json URL https://github.com/nlohmann/json/releases/download/v3.11.3/json.tar.xz DOWNLOAD_EXTRACT_TIMESTAMP TRUE) -FetchContent_Declare(pugixml GIT_REPOSITORY https://github.com/zeux/pugixml GIT_TAG v1.14) -FetchContent_MakeAvailable(pugixml json) - -target_include_directories( - fomod_plus_scanner - PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/../share - ${CMAKE_CURRENT_SOURCE_DIR}/../share/FOMODData - ${MO2_UIBASE_INCLUDE_DIRS} - ${MO2_ARCHIVE_INCLUDE_DIRS} -) - -if (MSVC) - target_compile_options( - fomod_plus_scanner - PRIVATE - /bigobj - /W4 - /WX - /wd4201 - /wd4458 - ) -endif () - -target_link_libraries(fomod_plus_scanner PRIVATE mo2::uibase mo2::archive pugixml nlohmann_json::nlohmann_json) -mo2_configure_plugin(fomod_plus_scanner NO_SOURCES WARNINGS OFF PRIVATE_DEPENDS archive) - -if (MSVC) - target_compile_options(fomod_plus_scanner PRIVATE $<$<CONFIG:RelWithDebInfo>:/Zi>) - target_link_options(fomod_plus_scanner PRIVATE $<$<CONFIG:RelWithDebInfo>:/DEBUG>) - install(FILES $<TARGET_PDB_FILE:fomod_plus_scanner> - DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO} - CONFIGURATIONS RelWithDebInfo - OPTIONAL) -endif () - -mo2_install_target(fomod_plus_scanner) diff --git a/libs/installer_fomod_plus/scanner/FomodPlusScanner.cpp b/libs/installer_fomod_plus/scanner/FomodPlusScanner.cpp deleted file mode 100644 index 4770178..0000000 --- a/libs/installer_fomod_plus/scanner/FomodPlusScanner.cpp +++ /dev/null @@ -1,128 +0,0 @@ -#include "FomodPlusScanner.h" - -#include "archiveparser.h" -#include "FomodDBEntry.h" - -#include <QDialog> -#include <QPushButton> -#include <QProgressBar> -#include <QVBoxLayout> -#include <QMessageBox> -#include <archive.h> - -#include <QLabel> -#include <QMovie> -#include <iostream> - -#include "stringutil.h" - -using ScanCallbackFn = std::function<bool(IModInterface*, ScanResult result)>; - -bool FomodPlusScanner::init(IOrganizer* organizer) -{ - mOrganizer = organizer; - - mDialog = new QDialog(); - mDialog->setWindowTitle(tr("FOMOD Scanner")); - - const auto layout = new QVBoxLayout(mDialog); - - const QString description = tr("Greetings, traveler.\n" - "This tool will scan your load order for mods installed via FOMOD.\n" - "It will also fix up any erroneous FOMOD flags from previous versions of FOMOD Plus :) \n\n" - "Safe travels, and may your load order be free of conflicts."); - - const auto descriptionLabel = new QLabel(description, mDialog); - descriptionLabel->setWordWrap(true); // Enable word wrap for large text - descriptionLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - descriptionLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); // Align text to the top-left corner - - const auto gifLabel = new QLabel(mDialog); - const auto movie = new QMovie(":/fomod/wizard"); - gifLabel->setMovie(movie); - movie->start(); - - mProgressBar = new QProgressBar(mDialog); - mProgressBar->setRange(0, mOrganizer->modList()->allMods().size()); - mProgressBar->setVisible(false); - - const auto scanButton = new QPushButton(tr("Scan"), mDialog); - const auto cancelButton = new QPushButton(tr("Cancel"), mDialog); - - layout->addWidget(descriptionLabel, 1); - layout->addWidget(gifLabel, 1); - layout->addWidget(mProgressBar, 1); - layout->addWidget(scanButton, 1); - layout->addWidget(cancelButton, 1); - - connect(cancelButton, &QPushButton::clicked, mDialog, &QDialog::reject); - connect(scanButton, &QPushButton::clicked, this, &FomodPlusScanner::onScanClicked); - connect(mDialog, &QDialog::finished, this, &FomodPlusScanner::cleanup); - - mDialog->setLayout(layout); - mDialog->setMinimumSize(400, 300); - mDialog->adjustSize(); - descriptionLabel->adjustSize(); - return true; -} - -void FomodPlusScanner::onScanClicked() const -{ - mProgressBar->setVisible(true); - const int added = scanLoadOrder(setFomodInfoForMod); - mDialog->accept(); - QMessageBox::information(mDialog, tr("Scan Complete"), - tr("The load order scan is complete. Updated filter info for ") + QString::number(added) + tr(" mods.")); - mOrganizer->refresh(); -} - -void FomodPlusScanner::cleanup() const -{ - mProgressBar->reset(); - mProgressBar->setVisible(false); -} - -void FomodPlusScanner::display() const -{ - mDialog->exec(); -} - -int FomodPlusScanner::scanLoadOrder(const ScanCallbackFn& callback) const -{ - int progress = 0; - int modified = 0; - for (const auto& modName : mOrganizer->modList()->allMods()) { - const auto mod = mOrganizer->modList()->getMod(modName); - if (const ScanResult result = openInstallationArchive(mod); callback(mod, result)) { - modified++; - } - mProgressBar->setValue(++progress); - } - return modified; -} - -ScanResult FomodPlusScanner::openInstallationArchive(const IModInterface* mod) const -{ - const auto downloadsDir = mOrganizer->downloadsPath(); - const auto installationFilePath = mod->installationFile(); - return ArchiveParser::scanForFomodFiles(downloadsDir, installationFilePath, mod->name()); -} - -bool FomodPlusScanner::setFomodInfoForMod(IModInterface* mod, const ScanResult result) -{ - const auto pluginName = "FOMOD Plus"; - const auto setting = mod->pluginSetting(pluginName, "fomod", 0); - if (setting == 0 && ScanResult::HAS_FOMOD == result) { - return mod->setPluginSetting(pluginName, "fomod", "{}"); - } - if (setting != 0 && ScanResult::NO_FOMOD == result) { - return mod->setPluginSetting(pluginName, "fomod", 0); - } - return false; -} - -bool FomodPlusScanner::removeFomodInfoFromMod(IModInterface* mod, ScanResult) -{ - const auto pluginName = QString::fromStdString("FOMOD Plus"); - return mod->setPluginSetting(pluginName, "fomod", 0); -} diff --git a/libs/installer_fomod_plus/scanner/FomodPlusScanner.h b/libs/installer_fomod_plus/scanner/FomodPlusScanner.h deleted file mode 100644 index b7893f7..0000000 --- a/libs/installer_fomod_plus/scanner/FomodPlusScanner.h +++ /dev/null @@ -1,64 +0,0 @@ -#ifndef FOMODPLUSSCANNER_H -#define FOMODPLUSSCANNER_H - -#include "archiveparser.h" - -#include <iplugin.h> -#include <iplugintool.h> - -#include <QDialog> -#include <QProgressBar> - -using namespace MOBase; - -class FomodPlusScanner final : public IPluginTool { - Q_OBJECT - Q_INTERFACES(MOBase::IPlugin MOBase::IPluginTool) -#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) - Q_PLUGIN_METADATA(IID "io.clearing.FomodPlusScanner" FILE "fomodplusscanner.json") -#endif - -public: - ~FomodPlusScanner() override - { - delete mDialog; - mDialog = nullptr; - mProgressBar = nullptr; - } - - bool init(IOrganizer* organizer) override; - - void onScanClicked() const; - - void cleanup() const; - - [[nodiscard]] QString name() const override { return "FOMOD Scanner"; } // This should not be translated - [[nodiscard]] QString author() const override { return "clearing"; } - [[nodiscard]] QString description() const override { return tr("Scans modlist for files installed via FOMOD"); } - [[nodiscard]] VersionInfo version() const override { return {1, 0, 0, VersionInfo::RELEASE_FINAL}; } - - [[nodiscard]] QList<PluginSetting> settings() const override { return {}; } - - [[nodiscard]] QString displayName() const override { return tr("FOMOD Scanner"); } - - [[nodiscard]] QString tooltip() const override { return tr("Scan modlist for files installed via FOMOD"); } - - [[nodiscard]] QIcon icon() const override { return QIcon(":/fomod/hat"); } - - void display() const override; - - int scanLoadOrder(const std::function<bool(IModInterface*, ScanResult result)> &callback) const; - - ScanResult openInstallationArchive(const IModInterface* mod) const; - - static bool setFomodInfoForMod(IModInterface *mod, ScanResult result); - - static bool removeFomodInfoFromMod(IModInterface *mod, ScanResult); - -private: - QDialog* mDialog{ nullptr }; - QProgressBar* mProgressBar{ nullptr }; - IOrganizer* mOrganizer{ nullptr }; -}; - -#endif // FOMODPLUSSCANNER_H
\ No newline at end of file diff --git a/libs/installer_fomod_plus/scanner/archiveparser.h b/libs/installer_fomod_plus/scanner/archiveparser.h deleted file mode 100644 index 8819a84..0000000 --- a/libs/installer_fomod_plus/scanner/archiveparser.h +++ /dev/null @@ -1,97 +0,0 @@ -#pragma once -#include "stringutil.h" - -#include <QDir> -#include <QString> -#include <archive.h> -#include <iostream> -#include <ostream> - -inline std::ostream& operator<<(std::ostream& os, const Archive::Error& error) -{ - switch (error) { - case Archive::Error::ERROR_NONE: - os << "No error"; - break; - case Archive::Error::ERROR_ARCHIVE_NOT_FOUND: - os << "File not found"; - break; - case Archive::Error::ERROR_FAILED_TO_OPEN_ARCHIVE: - os << "Failed to open file"; - break; - case Archive::Error::ERROR_INVALID_ARCHIVE_FORMAT: - os << "Invalid archive format"; - break; - default: - os << "Unknown error??"; - } - return os; -} - -inline bool hasFomodFiles(const std::vector<FileData*>& files) -{ - bool hasModuleXml = false; - bool hasInfoXml = false; - - for (const auto* file : files) { - if (endsWithCaseInsensitive(file->getArchiveFilePath(), StringConstants::FomodFiles::W_MODULE_CONFIG.data())) { - hasModuleXml = true; - } - if (endsWithCaseInsensitive(file->getArchiveFilePath(), StringConstants::FomodFiles::W_INFO_XML.data())) { - hasInfoXml = true; - } - } - return hasModuleXml && hasInfoXml; -} - -/* This class can do the following: - * 1.) Detects if an archive has FOMOD files in it (without extracting) - * - This is used by the FOMOD scanner to set content flags - * - * 2.) It may support extracting ESPs and FOMODs, but this might be better served - * by a separate class. Maybe it could return a ModuleConfiguration to use like - * the installer. - */ - -enum class ScanResult { - HAS_FOMOD, - NO_FOMOD, - NO_ARCHIVE -}; - -class ArchiveParser { -public: - static ScanResult scanForFomodFiles(const QString& downloadsPath, const QString& installationFilePath, - const QString& modName) - { - if (installationFilePath.isEmpty()) { - return ScanResult::NO_ARCHIVE; - } - const auto qualifiedInstallerPath = QDir(installationFilePath).isAbsolute() - ? installationFilePath - : downloadsPath + "/" + installationFilePath; - - const auto archive = CreateArchive(); - - if (!archive->isValid()) { - logErrorForMod(modName, "Failed to load the archive module ", archive); - return ScanResult::NO_ARCHIVE; - } - if (!archive->open(qualifiedInstallerPath.toStdWString(), nullptr)) { - logErrorForMod(modName, "Failed to open archive [" + qualifiedInstallerPath + "]", archive); - return ScanResult::NO_ARCHIVE; - } - - if (hasFomodFiles(archive->getFileList())) { - return ScanResult::HAS_FOMOD; - } - return ScanResult::NO_FOMOD; - } - -private: - static void logErrorForMod(const QString& modName, const QString& message, const std::unique_ptr<Archive>& archive) - { - std::cerr << "[" << modName.toStdString() << "] " << message.toStdString() << " (" << archive->getLastError() << - ")" << std::endl; - } -};
\ No newline at end of file diff --git a/libs/installer_fomod_plus/scanner/fomod_plus_scanner_de.ts b/libs/installer_fomod_plus/scanner/fomod_plus_scanner_de.ts deleted file mode 100644 index 759824f..0000000 --- a/libs/installer_fomod_plus/scanner/fomod_plus_scanner_de.ts +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1" language="de_DE"> -<context> - <name>FomodPlusScanner</name> - <message> - <location filename="FomodPlusScanner.cpp" line="23"/> - <location filename="FomodPlusScanner.h" line="47"/> - <source>FOMOD Scanner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="27"/> - <source>Sei gegrüßt, Reisender. -Dieses Tool scannt deine Ladereihenfolge nach Mods, die über einen FOMOD installiert wurden. -Es wird außerdem fehlerhafte FOMOD-Selektierungen aus früheren Versionen von FOMOD Plus beheben. :) - -Gute Reise, und möge deine Ladereihenfolge frei von Konflikten sein.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="46"/> - <source>Scannen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="47"/> - <source>Abbrechen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="71"/> - <source>Scan Abgeschlossen</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="72"/> - <source>Der Scan der Ladereihenfolge ist abgeschlossen. Aktualisierte Filterinformationen für </source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="72"/> - <source> Mods.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.h" line="42"/> - <source>Scannt die Modliste nach Dateien, die über einen FOMOD installiert wurden.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.h" line="49"/> - <source>Modliste nach Dateien durchsuchen, die über einen FOMOD installiert wurden.</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/libs/installer_fomod_plus/scanner/fomod_plus_scanner_en.ts b/libs/installer_fomod_plus/scanner/fomod_plus_scanner_en.ts deleted file mode 100644 index 83a310b..0000000 --- a/libs/installer_fomod_plus/scanner/fomod_plus_scanner_en.ts +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1" language="en_US"> -<context> - <name>FomodPlusScanner</name> - <message> - <location filename="FomodPlusScanner.cpp" line="26"/> - <location filename="FomodPlusScanner.h" line="42"/> - <source>FOMOD Scanner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="30"/> - <source>Greetings, traveler. -This tool will scan your load order for mods installed via FOMOD. -It will also fix up any erroneous FOMOD flags from previous versions of FOMOD Plus :) - -Safe travels, and may your load order be free of conflicts.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="49"/> - <source>Scan</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="50"/> - <source>Cancel</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="74"/> - <source>Scan Complete</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="75"/> - <source>The load order scan is complete. Updated filter info for </source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="75"/> - <source> mods.</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.h" line="37"/> - <source>Scans modlist for files installed via FOMOD</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.h" line="44"/> - <source>Scan modlist for files installed via FOMOD</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/libs/installer_fomod_plus/scanner/fomod_plus_scanner_zh_CN.ts b/libs/installer_fomod_plus/scanner/fomod_plus_scanner_zh_CN.ts deleted file mode 100644 index 01f84c8..0000000 --- a/libs/installer_fomod_plus/scanner/fomod_plus_scanner_zh_CN.ts +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS> -<TS version="2.1" language="zh_CN"> -<context> - <name>FomodPlusScanner</name> - <message> - <location filename="FomodPlusScanner.cpp" line="23"/> - <location filename="FomodPlusScanner.h" line="47"/> - <source>FOMOD Scanner</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="27"/> - <source>你好,旅行者。 -该工具将扫描模组列表来查找通过 FOMOD 安装的模组, -并修正旧版本错误的 FOMOD 标志(需保留安装包才能被检测到):) - -一路平安,祝您的 load order 没有冲突。</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="46"/> - <source>扫描</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="47"/> - <source>取消</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="71"/> - <source>扫描完成</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="72"/> - <source>模组扫描已完成。更新了 </source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.cpp" line="72"/> - <source> 个模组筛选框信息。</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.h" line="42"/> - <source>扫描模组列表查找通过 FOMOD 安装的文件</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="FomodPlusScanner.h" line="49"/> - <source>扫描模组列表查找通过 FOMOD 安装的文件</source> - <translation type="unfinished"></translation> - </message> -</context> -</TS> diff --git a/libs/installer_fomod_plus/scanner/fomodplusscanner.json b/libs/installer_fomod_plus/scanner/fomodplusscanner.json deleted file mode 100644 index f6643ea..0000000 --- a/libs/installer_fomod_plus/scanner/fomodplusscanner.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "author" : "clearing", - "date" : "2025/02/06", - "name" : "FOMOD Plus - Scanner", - "version" : "1.0.0", - "des" : "Scans load order for FOMOD installations", - "dependencies" : [] -} diff --git a/libs/installer_fomod_plus/scanner/resources.qrc b/libs/installer_fomod_plus/scanner/resources.qrc deleted file mode 100644 index df7c48c..0000000 --- a/libs/installer_fomod_plus/scanner/resources.qrc +++ /dev/null @@ -1,6 +0,0 @@ -<RCC> - <qresource prefix="/fomod"> - <file alias="hat">resources/fomod_icon.png</file> - <file alias="wizard">resources/wizard.gif</file> - </qresource> -</RCC>
\ No newline at end of file diff --git a/libs/installer_fomod_plus/scanner/resources/fomod_icon.png b/libs/installer_fomod_plus/scanner/resources/fomod_icon.png Binary files differdeleted file mode 100644 index e044052..0000000 --- a/libs/installer_fomod_plus/scanner/resources/fomod_icon.png +++ /dev/null diff --git a/libs/installer_fomod_plus/scanner/resources/wizard.gif b/libs/installer_fomod_plus/scanner/resources/wizard.gif Binary files differdeleted file mode 100644 index c1f75d3..0000000 --- a/libs/installer_fomod_plus/scanner/resources/wizard.gif +++ /dev/null |
