diff --git a/api/logic/FileSystem.cpp b/api/logic/FileSystem.cpp index b3115988..1f9f0e43 100644 --- a/api/logic/FileSystem.cpp +++ b/api/logic/FileSystem.cpp @@ -225,7 +225,7 @@ bool deletePath(QString path) } -QString PathCombine(QString path1, QString path2) +QString PathCombine(const QString & path1, const QString & path2) { if(!path1.size()) return path2; @@ -234,11 +234,16 @@ QString PathCombine(QString path1, QString path2) return QDir::cleanPath(path1 + QDir::separator() + path2); } -QString PathCombine(QString path1, QString path2, QString path3) +QString PathCombine(const QString & path1, const QString & path2, const QString & path3) { return PathCombine(PathCombine(path1, path2), path3); } +QString PathCombine(const QString & path1, const QString & path2, const QString & path3, const QString & path4) +{ + return PathCombine(PathCombine(path1, path2, path3), path4); +} + QString AbsolutePath(QString path) { return QFileInfo(path).absolutePath(); diff --git a/api/logic/FileSystem.h b/api/logic/FileSystem.h index a09ee557..de8774ff 100644 --- a/api/logic/FileSystem.h +++ b/api/logic/FileSystem.h @@ -83,8 +83,9 @@ private: */ MULTIMC_LOGIC_EXPORT bool deletePath(QString path); -MULTIMC_LOGIC_EXPORT QString PathCombine(QString path1, QString path2); -MULTIMC_LOGIC_EXPORT QString PathCombine(QString path1, QString path2, QString path3); +MULTIMC_LOGIC_EXPORT QString PathCombine(const QString &path1, const QString &path2); +MULTIMC_LOGIC_EXPORT QString PathCombine(const QString &path1, const QString &path2, const QString &path3); +MULTIMC_LOGIC_EXPORT QString PathCombine(const QString &path1, const QString &path2, const QString &path3, const QString &path4); MULTIMC_LOGIC_EXPORT QString AbsolutePath(QString path); diff --git a/api/logic/InstanceImportTask.cpp b/api/logic/InstanceImportTask.cpp index 5a824cb1..2bbdd897 100644 --- a/api/logic/InstanceImportTask.cpp +++ b/api/logic/InstanceImportTask.cpp @@ -297,8 +297,8 @@ void InstanceImportTask::processFlame() m_filesNetJob.reset(new NetJob(tr("Mod download"))); for(auto result: results.files) { - auto path = FS::PathCombine(m_stagingPath, "minecraft/mods", result.fileName); - auto dl = Net::Download::makeFile(result.url,path); + auto path = FS::PathCombine(m_stagingPath ,"minecraft", result.targetFolder, result.fileName); + auto dl = Net::Download::makeFile(result.url, path); m_filesNetJob->addNetAction(dl); } m_modIdResolver.reset(); diff --git a/api/logic/minecraft/flame/FileResolvingTask.cpp b/api/logic/minecraft/flame/FileResolvingTask.cpp index d55beb63..2194983a 100644 --- a/api/logic/minecraft/flame/FileResolvingTask.cpp +++ b/api/logic/minecraft/flame/FileResolvingTask.cpp @@ -49,6 +49,51 @@ void Flame::FileResolvingTask::netJobFinished() } out.fileName = Json::requireString(obj, "FileNameOnDisk"); out.url = Json::requireString(obj, "DownloadURL"); + // This is a piece of a Flame project JSON pulled out into the file metadata (here) for convenience + // It is also optional + QJsonObject projObj = Json::ensureObject(obj, "_Project", {}); + if(!projObj.isEmpty()) + { + QString strType = Json::ensureString(projObj, "PackageType", "mod").toLower(); + if(strType == "singlefile") + { + out.type = File::Type::SingleFile; + } + // FIXME: what are these? + /* + else if(strType == "ctoc") + { + out.type = File::Type::Ctoc; + } + else if(strType == "cmod2") + { + out.type = File::Type::Cmod2; + } + */ + else if(strType == "mod") + { + out.type = File::Type::Mod; + } + // FIXME: how to handle nested packs and folders? + /* + else if(strType == "folder") + { + out.type = File::Type::Folder; + } + else if(strType == "modpack") + { + out.type = File::Type::Modpack; + } + */ + else + { + qCritical() << "Resolving of" << out.projectId << out.fileId << "failed because of unknown file type:" << strType; + out.type = File::Type::Unknown; + failed = true; + continue; + } + out.targetFolder = Json::ensureString(projObj, "Path", "mods"); + } out.resolved = true; } catch(JSONValidationError & e) diff --git a/api/logic/minecraft/flame/PackManifest.cpp b/api/logic/minecraft/flame/PackManifest.cpp index 62921493..6a9324fe 100644 --- a/api/logic/minecraft/flame/PackManifest.cpp +++ b/api/logic/minecraft/flame/PackManifest.cpp @@ -5,7 +5,6 @@ static void loadFileV1(Flame::File & f, QJsonObject & file) { f.projectId = Json::requireInteger(file, "projectID"); f.fileId = Json::requireInteger(file, "fileID"); - // FIXME: what does this mean? f.required = Json::ensureBoolean(file, QString("required"), true); } diff --git a/api/logic/minecraft/flame/PackManifest.h b/api/logic/minecraft/flame/PackManifest.h index ae91bffb..07bf92b6 100644 --- a/api/logic/minecraft/flame/PackManifest.h +++ b/api/logic/minecraft/flame/PackManifest.h @@ -9,12 +9,24 @@ struct File { int projectId = 0; int fileId = 0; + // NOTE: the opposite to 'optional'. This is at the time of writing unused. bool required = true; // our bool resolved = false; QString fileName; QString url; + QString targetFolder = QLatin1Literal("mods"); + enum class Type + { + Unknown, + Folder, + Ctoc, + SingleFile, + Cmod2, + Modpack, + Mod + } type = Type::Mod; }; struct Modloader