summaryrefslogtreecommitdiffstats
path: root/logic/OneSixUpdate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'logic/OneSixUpdate.cpp')
-rw-r--r--logic/OneSixUpdate.cpp121
1 files changed, 31 insertions, 90 deletions
diff --git a/logic/OneSixUpdate.cpp b/logic/OneSixUpdate.cpp
index 380d5dab..fe8cf3b5 100644
--- a/logic/OneSixUpdate.cpp
+++ b/logic/OneSixUpdate.cpp
@@ -33,6 +33,7 @@
#include "logic/forge/ForgeMirrors.h"
#include "logic/net/URLConstants.h"
#include "logic/assets/AssetsUtils.h"
+#include "JarUtils.h"
OneSixUpdate::OneSixUpdate(OneSixInstance *inst, QObject *parent) : Task(parent), m_inst(inst)
{
@@ -287,23 +288,44 @@ void OneSixUpdate::jarlibFinished()
OneSixInstance *inst = (OneSixInstance *)m_inst;
std::shared_ptr<InstanceVersion> version = inst->getFullVersion();
+ // nuke obsolete stripped jar(s) if needed
+ QString version_id = version->id;
+ QString strippedPath = version_id + "/" + version_id + "-stripped.jar";
+ QFile strippedJar(strippedPath);
+ if(strippedJar.exists())
+ {
+ strippedJar.remove();
+ }
+ auto finalJarPath = QDir(m_inst->instanceRoot()).absoluteFilePath("temp.jar");
+ QFile finalJar(finalJarPath);
+ if(finalJar.exists())
+ {
+ if(!finalJar.remove())
+ {
+ emitFailed(tr("Couldn't remove stale jar file: %1").arg(finalJarPath));
+ return;
+ }
+ }
+
// create stripped jar, if needed
if (version->hasJarMods())
{
- // FIXME: good candidate for moving elsewhere (jar location resolving/version caching).
- QString version_id = version->id;
+ auto sourceJarPath = m_inst->versionsPath().absoluteFilePath(version->id + "/" + version->id + ".jar");
QString localPath = version_id + "/" + version_id + ".jar";
- QString strippedPath = version_id + "/" + version_id + "-stripped.jar";
auto metacache = MMC->metacache();
auto entry = metacache->resolveEntry("versions", localPath);
- auto entryStripped = metacache->resolveEntry("versions", strippedPath);
-
QString fullJarPath = entry->getFullPath();
- QString fullStrippedJarPath = entryStripped->getFullPath();
- QFileInfo finfo(fullStrippedJarPath);
- if (entry->md5sum != jarHashOnEntry || !finfo.exists())
+ //FIXME: remove need to convert to different objects here
+ QList<Mod> mods;
+ for (auto jarmod : version->jarMods)
+ {
+ QString filePath = m_inst->jarmodsPath().absoluteFilePath(jarmod->name);
+ mods.push_back(Mod(QFileInfo(filePath)));
+ }
+ if(!JarUtils::createModdedJar(sourceJarPath, finalJarPath, mods))
{
- stripJar(fullJarPath, fullStrippedJarPath);
+ emitFailed(tr("Failed to create the custom Minecraft jar file."));
+ return;
}
}
if (version->traits.contains("legacyFML"))
@@ -324,87 +346,6 @@ void OneSixUpdate::jarlibFailed()
tr("Failed to download the following files:\n%1\n\nPlease try again.").arg(failed_all));
}
-void OneSixUpdate::stripJar(QString origPath, QString newPath)
-{
- QFileInfo runnableJar(newPath);
- if (runnableJar.exists() && !QFile::remove(runnableJar.filePath()))
- {
- emitFailed("Failed to delete old minecraft.jar");
- return;
- }
-
- // TaskStep(); // STEP 1
- setStatus(tr("Creating stripped jar: Opening minecraft.jar ..."));
-
- QuaZip zipOut(runnableJar.filePath());
- if (!zipOut.open(QuaZip::mdCreate))
- {
- QFile::remove(runnableJar.filePath());
- emitFailed("Failed to open the minecraft.jar for stripping");
- return;
- }
- // Modify the jar
- setStatus(tr("Creating stripped jar: Adding files..."));
- if (!MergeZipFiles(&zipOut, origPath))
- {
- zipOut.close();
- QFile::remove(runnableJar.filePath());
- emitFailed("Failed to add " + origPath + " to the jar.");
- return;
- }
-}
-
-bool OneSixUpdate::MergeZipFiles(QuaZip *into, QString from)
-{
- setStatus(tr("Installing mods: Adding ") + from + " ...");
-
- QuaZip modZip(from);
- modZip.open(QuaZip::mdUnzip);
-
- QuaZipFile fileInsideMod(&modZip);
- QuaZipFile zipOutFile(into);
- for (bool more = modZip.goToFirstFile(); more; more = modZip.goToNextFile())
- {
- QString filename = modZip.getCurrentFileName();
- if (filename.contains("META-INF"))
- {
- QLOG_INFO() << "Skipping META-INF " << filename << " from " << from;
- continue;
- }
- QLOG_INFO() << "Adding file " << filename << " from " << from;
-
- if (!fileInsideMod.open(QIODevice::ReadOnly))
- {
- QLOG_ERROR() << "Failed to open " << filename << " from " << from;
- return false;
- }
- /*
- QuaZipFileInfo old_info;
- fileInsideMod.getFileInfo(&old_info);
- */
- QuaZipNewInfo info_out(fileInsideMod.getActualFileName());
- /*
- info_out.externalAttr = old_info.externalAttr;
- */
- if (!zipOutFile.open(QIODevice::WriteOnly, info_out))
- {
- QLOG_ERROR() << "Failed to open " << filename << " in the jar";
- fileInsideMod.close();
- return false;
- }
- if (!JlCompress::copyData(fileInsideMod, zipOutFile))
- {
- zipOutFile.close();
- fileInsideMod.close();
- QLOG_ERROR() << "Failed to copy data of " << filename << " into the jar";
- return false;
- }
- zipOutFile.close();
- fileInsideMod.close();
- }
- return true;
-}
-
void OneSixUpdate::fmllibsStart()
{
// Get the mod list