aboutsummaryrefslogtreecommitdiff
path: root/libs/installer_fomod_plus/scanner/archiveparser.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/installer_fomod_plus/scanner/archiveparser.h')
-rw-r--r--libs/installer_fomod_plus/scanner/archiveparser.h97
1 files changed, 0 insertions, 97 deletions
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