void OneSixUpdate::executeTask() { QString intendedVersion = m_inst->intendedVersionId(); // Make directories QDir mcDir(m_inst->minecraftRoot()); if (!mcDir.exists() && !mcDir.mkpath(".")) { emitFailed("Failed to create bin folder."); return; } // Get a pointer to the version object that corresponds to the instance's version. targetVersion = std::dynamic_pointer_cast<MinecraftVersion>( MMC->minecraftlist()->findVersion(intendedVersion)); if (targetVersion == nullptr) { // don't do anything if it was invalid emitSucceeded(); return; } if (m_inst->shouldUpdate()) { versionFileStart(); } else { jarlibStart(); } }
void OneSixUpdate::versionFileFinished() { NetActionPtr DlJob = specificVersionDownloadJob->first(); OneSixInstance *inst = (OneSixInstance *)m_inst; QString version_id = targetVersion->descriptor(); QString inst_dir = m_inst->instanceRoot(); // save the version file in $instanceId/version.json { QString version1 = PathCombine(inst_dir, "/version.json"); ensureFilePathExists(version1); // FIXME: detect errors here, download to a temp file, swap QSaveFile vfile1(version1); if (!vfile1.open(QIODevice::Truncate | QIODevice::WriteOnly)) { emitFailed("Can't open " + version1 + " for writing."); return; } auto data = std::dynamic_pointer_cast<ByteArrayDownload>(DlJob)->m_data; qint64 actual = 0; if ((actual = vfile1.write(data)) != data.size()) { emitFailed("Failed to write into " + version1 + ". Written " + actual + " out of " + data.size() + '.'); return; } if (!vfile1.commit()) { emitFailed("Can't commit changes to " + version1); return; } } // the version is downloaded safely. update is 'done' at this point m_inst->setShouldUpdate(false); // delete any custom version inside the instance (it's no longer relevant, we did an update) QString custom = PathCombine(inst_dir, "/custom.json"); QFile finfo(custom); if (finfo.exists()) { finfo.remove(); } inst->reloadFullVersion(); jarlibStart(); }