refactor: abstract metadata handling and clarify names
This commit is contained in:
		| @@ -322,6 +322,7 @@ set(MINECRAFT_SOURCES | ||||
|     minecraft/WorldList.h | ||||
|     minecraft/WorldList.cpp | ||||
|  | ||||
|     minecraft/mod/MetadataHandler.h | ||||
|     minecraft/mod/Mod.h | ||||
|     minecraft/mod/Mod.cpp | ||||
|     minecraft/mod/ModDetails.h | ||||
|   | ||||
| @@ -151,23 +151,23 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const | ||||
|             continue; | ||||
|         if (mod.type() == Mod::MOD_ZIPFILE) | ||||
|         { | ||||
|             if (!mergeZipFiles(&zipOut, mod.filename(), addedFiles)) | ||||
|             if (!mergeZipFiles(&zipOut, mod.fileinfo(), addedFiles)) | ||||
|             { | ||||
|                 zipOut.close(); | ||||
|                 QFile::remove(targetJarPath); | ||||
|                 qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar."; | ||||
|                 qCritical() << "Failed to add" << mod.fileinfo().fileName() << "to the jar."; | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|         else if (mod.type() == Mod::MOD_SINGLEFILE) | ||||
|         { | ||||
|             // FIXME: buggy - does not work with addedFiles | ||||
|             auto filename = mod.filename(); | ||||
|             auto filename = mod.fileinfo(); | ||||
|             if (!JlCompress::compressFile(&zipOut, filename.absoluteFilePath(), filename.fileName())) | ||||
|             { | ||||
|                 zipOut.close(); | ||||
|                 QFile::remove(targetJarPath); | ||||
|                 qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar."; | ||||
|                 qCritical() << "Failed to add" << mod.fileinfo().fileName() << "to the jar."; | ||||
|                 return false; | ||||
|             } | ||||
|             addedFiles.insert(filename.fileName()); | ||||
| @@ -176,7 +176,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const | ||||
|         { | ||||
|             // untested, but seems to be unused / not possible to reach | ||||
|             // FIXME: buggy - does not work with addedFiles | ||||
|             auto filename = mod.filename(); | ||||
|             auto filename = mod.fileinfo(); | ||||
|             QString what_to_zip = filename.absoluteFilePath(); | ||||
|             QDir dir(what_to_zip); | ||||
|             dir.cdUp(); | ||||
| @@ -193,7 +193,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const | ||||
|             { | ||||
|                 zipOut.close(); | ||||
|                 QFile::remove(targetJarPath); | ||||
|                 qCritical() << "Failed to add" << mod.filename().fileName() << "to the jar."; | ||||
|                 qCritical() << "Failed to add" << mod.fileinfo().fileName() << "to the jar."; | ||||
|                 return false; | ||||
|             } | ||||
|             qDebug() << "Adding folder " << filename.fileName() << " from " | ||||
| @@ -204,7 +204,7 @@ bool MMCZip::createModdedJar(QString sourceJarPath, QString targetJarPath, const | ||||
|             // Make sure we do not continue launching when something is missing or undefined... | ||||
|             zipOut.close(); | ||||
|             QFile::remove(targetJarPath); | ||||
|             qCritical() << "Failed to add unknown mod type" << mod.filename().fileName() << "to the jar."; | ||||
|             qCritical() << "Failed to add unknown mod type" << mod.fileinfo().fileName() << "to the jar."; | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -659,23 +659,23 @@ QStringList MinecraftInstance::verboseDescription(AuthSessionPtr session, Minecr | ||||
|             out << QString("%1:").arg(label); | ||||
|             auto modList = model.allMods(); | ||||
|             std::sort(modList.begin(), modList.end(), [](Mod &a, Mod &b) { | ||||
|                 auto aName = a.filename().completeBaseName(); | ||||
|                 auto bName = b.filename().completeBaseName(); | ||||
|                 auto aName = a.fileinfo().completeBaseName(); | ||||
|                 auto bName = b.fileinfo().completeBaseName(); | ||||
|                 return aName.localeAwareCompare(bName) < 0; | ||||
|             }); | ||||
|             for(auto & mod: modList) | ||||
|             { | ||||
|                 if(mod.type() == Mod::MOD_FOLDER) | ||||
|                 { | ||||
|                     out << u8"  [📁] " + mod.filename().completeBaseName() + " (folder)"; | ||||
|                     out << u8"  [📁] " + mod.fileinfo().completeBaseName() + " (folder)"; | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 if(mod.enabled()) { | ||||
|                     out << u8"  [✔️] " + mod.filename().completeBaseName(); | ||||
|                     out << u8"  [✔️] " + mod.fileinfo().completeBaseName(); | ||||
|                 } | ||||
|                 else { | ||||
|                     out << u8"  [❌] " + mod.filename().completeBaseName() + " (disabled)"; | ||||
|                     out << u8"  [❌] " + mod.fileinfo().completeBaseName() + " (disabled)"; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|   | ||||
							
								
								
									
										41
									
								
								launcher/minecraft/mod/MetadataHandler.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								launcher/minecraft/mod/MetadataHandler.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <memory> | ||||
|  | ||||
| #include "modplatform/packwiz/Packwiz.h" | ||||
|  | ||||
| // launcher/minecraft/mod/Mod.h | ||||
| class Mod; | ||||
|  | ||||
| /* Abstraction file for easily changing the way metadata is stored / handled | ||||
|  * Needs to be a class because of -Wunused-function and no C++17 [[maybe_unused]] | ||||
|  * */ | ||||
| class Metadata { | ||||
|    public: | ||||
|     using ModStruct = Packwiz::V1::Mod; | ||||
|  | ||||
|     static auto create(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> ModStruct | ||||
|     { | ||||
|         return Packwiz::V1::createModFormat(index_dir, mod_pack, mod_version); | ||||
|     } | ||||
|  | ||||
|     static auto create(QDir& index_dir, Mod& internal_mod) -> ModStruct | ||||
|     { | ||||
|         return Packwiz::V1::createModFormat(index_dir, internal_mod); | ||||
|     } | ||||
|  | ||||
|     static void update(QDir& index_dir, ModStruct& mod) | ||||
|     { | ||||
|         Packwiz::V1::updateModIndex(index_dir, mod); | ||||
|     } | ||||
|  | ||||
|     static void remove(QDir& index_dir, QString& mod_name) | ||||
|     { | ||||
|         Packwiz::V1::deleteModIndex(index_dir, mod_name); | ||||
|     } | ||||
|  | ||||
|     static auto get(QDir& index_dir, QString& mod_name) -> ModStruct | ||||
|     { | ||||
|         return Packwiz::V1::getIndexForMod(index_dir, mod_name); | ||||
|     } | ||||
| }; | ||||
| @@ -20,6 +20,7 @@ | ||||
|  | ||||
| #include <FileSystem.h> | ||||
| #include <QDebug> | ||||
| #include "MetadataHandler.h" | ||||
|  | ||||
| namespace { | ||||
|  | ||||
| @@ -33,7 +34,7 @@ Mod::Mod(const QFileInfo& file) | ||||
|     m_changedDateTime = file.lastModified(); | ||||
| } | ||||
|  | ||||
| Mod::Mod(const QDir& mods_dir, const Packwiz::Mod& metadata) | ||||
| Mod::Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata) | ||||
|     : m_file(mods_dir.absoluteFilePath(metadata.filename)) | ||||
|     // It is weird, but name is not reliable for comparing with the JAR files name | ||||
|     // FIXME: Maybe use hash when implemented? | ||||
| @@ -121,8 +122,7 @@ bool Mod::enable(bool value) | ||||
|  | ||||
| bool Mod::destroy(QDir& index_dir) | ||||
| { | ||||
|     // Delete metadata | ||||
|     Packwiz::deleteModIndex(index_dir, m_name); | ||||
|     Metadata::remove(index_dir, m_name); | ||||
|  | ||||
|     m_type = MOD_UNKNOWN; | ||||
|     return FS::deletePath(m_file.filePath()); | ||||
|   | ||||
| @@ -21,7 +21,7 @@ | ||||
| #include <memory> | ||||
|  | ||||
| #include "ModDetails.h" | ||||
| #include "modplatform/packwiz/Packwiz.h" | ||||
| #include "minecraft/mod/MetadataHandler.h" | ||||
|  | ||||
| class Mod | ||||
| { | ||||
| @@ -37,9 +37,9 @@ public: | ||||
|  | ||||
|     Mod() = default; | ||||
|     Mod(const QFileInfo &file); | ||||
|     explicit Mod(const QDir& mods_dir, const Packwiz::Mod& metadata); | ||||
|     explicit Mod(const QDir& mods_dir, const Metadata::ModStruct& metadata); | ||||
|  | ||||
|     QFileInfo filename()        const { return m_file; } | ||||
|     QFileInfo fileinfo()        const { return m_file; } | ||||
|     QDateTime dateTimeChanged() const { return m_changedDateTime; } | ||||
|     QString   internal_id()     const { return m_internal_id; } | ||||
|     ModType   type()            const { return m_type; } | ||||
| @@ -82,6 +82,7 @@ protected: | ||||
|     QDateTime m_changedDateTime; | ||||
|  | ||||
|     QString m_internal_id; | ||||
|     /* Name as reported via the file name */ | ||||
|     QString m_name; | ||||
|     ModType m_type = MOD_UNKNOWN; | ||||
|     bool m_from_metadata = false; | ||||
|   | ||||
| @@ -180,7 +180,7 @@ void ModFolderModel::resolveMod(Mod& m) | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     auto task = new LocalModParseTask(nextResolutionTicket, m.type(), m.filename()); | ||||
|     auto task = new LocalModParseTask(nextResolutionTicket, m.type(), m.fileinfo()); | ||||
|     auto result = task->result(); | ||||
|     result->id = m.internal_id(); | ||||
|     activeTickets.insert(nextResolutionTicket, result); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| #include <toml.h> | ||||
|  | ||||
| #include "FileSystem.h" | ||||
| #include "modplatform/packwiz/Packwiz.h" | ||||
| #include "minecraft/mod/MetadataHandler.h" | ||||
|  | ||||
| LocalModUpdateTask::LocalModUpdateTask(QDir index_dir, ModPlatform::IndexedPack& mod, ModPlatform::IndexedVersion& mod_version) | ||||
|     : m_index_dir(index_dir), m_mod(mod), m_mod_version(mod_version) | ||||
| @@ -18,8 +18,8 @@ void LocalModUpdateTask::executeTask() | ||||
| { | ||||
|     setStatus(tr("Updating index for mod:\n%1").arg(m_mod.name)); | ||||
|  | ||||
|     auto pw_mod = Packwiz::createModFormat(m_index_dir, m_mod, m_mod_version); | ||||
|     Packwiz::updateModIndex(m_index_dir, pw_mod); | ||||
|     auto pw_mod = Metadata::create(m_index_dir, m_mod, m_mod_version); | ||||
|     Metadata::update(m_index_dir, pw_mod); | ||||
|  | ||||
|     emitSucceeded(); | ||||
| } | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| #include "ModFolderLoadTask.h" | ||||
| #include <QDebug> | ||||
|  | ||||
| #include "modplatform/packwiz/Packwiz.h" | ||||
| #include "minecraft/mod/MetadataHandler.h" | ||||
|  | ||||
| ModFolderLoadTask::ModFolderLoadTask(QDir& mods_dir, QDir& index_dir)  | ||||
|     : m_mods_dir(mods_dir), m_index_dir(index_dir), m_result(new Result()) | ||||
| @@ -17,7 +17,7 @@ void ModFolderLoadTask::run() | ||||
|             continue; | ||||
|  | ||||
|         entry.chop(5);  // Remove .toml at the end | ||||
|         Mod mod(m_mods_dir, Packwiz::getIndexForMod(m_index_dir, entry)); | ||||
|         Mod mod(m_mods_dir, Metadata::get(m_index_dir, entry)); | ||||
|         m_result->mods[mod.internal_id()] = mod; | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -9,13 +9,15 @@ | ||||
| #include "modplatform/ModIndex.h" | ||||
| #include "minecraft/mod/Mod.h" | ||||
|  | ||||
| namespace Packwiz { | ||||
|  | ||||
| // Helpers | ||||
| static inline QString indexFileName(QString const& mod_name) | ||||
| { | ||||
|     return QString("%1.toml").arg(mod_name); | ||||
| } | ||||
|  | ||||
| auto Packwiz::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod | ||||
| auto V1::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pack, ModPlatform::IndexedVersion& mod_version) -> Mod | ||||
| { | ||||
|     Mod mod; | ||||
|  | ||||
| @@ -33,7 +35,7 @@ auto Packwiz::createModFormat(QDir& index_dir, ModPlatform::IndexedPack& mod_pac | ||||
|     return mod; | ||||
| } | ||||
|  | ||||
| auto Packwiz::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod | ||||
| auto V1::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod | ||||
| { | ||||
|     auto mod_name = internal_mod.name(); | ||||
|  | ||||
| @@ -44,7 +46,7 @@ auto Packwiz::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod | ||||
|  | ||||
|     // Manually construct packwiz mod | ||||
|     mod.name = internal_mod.name(); | ||||
|     mod.filename = internal_mod.filename().fileName(); | ||||
|     mod.filename = internal_mod.fileinfo().fileName(); | ||||
|  | ||||
|     // TODO: Have a mechanism for telling the UI subsystem that we want to gather user information | ||||
|     // (i.e. which mod provider we want to use). Maybe an object parameter with a signal for that? | ||||
| @@ -52,7 +54,7 @@ auto Packwiz::createModFormat(QDir& index_dir, ::Mod& internal_mod) -> Mod | ||||
|     return mod; | ||||
| } | ||||
|  | ||||
| void Packwiz::updateModIndex(QDir& index_dir, Mod& mod) | ||||
| void V1::updateModIndex(QDir& index_dir, Mod& mod) | ||||
| { | ||||
|     if(!mod.isValid()){ | ||||
|         qCritical() << QString("Tried to update metadata of an invalid mod!"); | ||||
| @@ -94,7 +96,7 @@ void Packwiz::updateModIndex(QDir& index_dir, Mod& mod) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void Packwiz::deleteModIndex(QDir& index_dir, QString& mod_name) | ||||
| void V1::deleteModIndex(QDir& index_dir, QString& mod_name) | ||||
| { | ||||
|     QFile index_file(index_dir.absoluteFilePath(indexFileName(mod_name))); | ||||
|  | ||||
| @@ -108,7 +110,7 @@ void Packwiz::deleteModIndex(QDir& index_dir, QString& mod_name) | ||||
|     } | ||||
| } | ||||
|  | ||||
| auto Packwiz::getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod | ||||
| auto V1::getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod | ||||
| { | ||||
|     Mod mod; | ||||
|  | ||||
| @@ -201,3 +203,5 @@ auto Packwiz::getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod | ||||
|  | ||||
|     return mod; | ||||
| } | ||||
|  | ||||
| } // namespace Packwiz | ||||
|   | ||||
| @@ -11,7 +11,9 @@ class QDir; | ||||
| // Mod from launcher/minecraft/mod/Mod.h | ||||
| class Mod; | ||||
|  | ||||
| class Packwiz { | ||||
| namespace Packwiz { | ||||
|  | ||||
| class V1 { | ||||
|    public: | ||||
|     struct Mod { | ||||
|         QString name {}; | ||||
| @@ -58,3 +60,5 @@ class Packwiz { | ||||
|      * */ | ||||
|     static auto getIndexForMod(QDir& index_dir, QString& mod_name) -> Mod; | ||||
| }; | ||||
|  | ||||
| } // namespace Packwiz | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 flow
					flow