package net.minecraft.launcher.updater; import com.google.gson.JsonSyntaxException; import net.minecraft.launcher.Launcher; import net.minecraft.launcher.OperatingSystem; import net.minecraft.launcher.versions.CompleteVersion; import net.minecraft.launcher.versions.ReleaseType; import net.minecraft.launcher.versions.Version; import java.io.*; import java.util.Set; public class LocalVersionList extends FileBasedVersionList { private final File baseDirectory; private final File baseVersionsDir; public LocalVersionList(File baseDirectory) { if ((baseDirectory == null) || (!baseDirectory.isDirectory())) throw new IllegalArgumentException("Base directory is not a folder!"); this.baseDirectory = baseDirectory; this.baseVersionsDir = new File(this.baseDirectory, "versions"); if (!this.baseVersionsDir.isDirectory()) this.baseVersionsDir.mkdirs(); } protected InputStream getFileInputStream(String uri) throws FileNotFoundException { return new FileInputStream(new File(this.baseDirectory, uri)); } public void refreshVersions() throws IOException { clearCache(); File[] files = this.baseVersionsDir.listFiles(); if (files == null) return; for (File directory : files) { String id = directory.getName(); File jsonFile = new File(directory, id + ".json"); if ((directory.isDirectory()) && (jsonFile.exists())) { try { String path = "versions/" + id + "/" + id + ".json"; CompleteVersion version = (CompleteVersion) this.gson.fromJson(getContent(path), CompleteVersion.class); if (version.getId().equals(id)) addVersion(version); else if (Launcher.getInstance() != null) Launcher.getInstance().println("Ignoring: " + path + "; it contains id: '" + version.getId() + "' expected '" + id + "'"); } catch (RuntimeException ex) { if (Launcher.getInstance() != null) Launcher.getInstance().println("Couldn't load local version " + jsonFile.getAbsolutePath(), ex); else { throw new JsonSyntaxException("Loading file: " + jsonFile.toString(), ex); } } } } for (Version version : getVersions()) { ReleaseType type = version.getType(); if ((getLatestVersion(type) == null) || (getLatestVersion(type).getUpdatedTime().before(version.getUpdatedTime()))) setLatestVersion(version); } } public void saveVersionList() throws IOException { String text = serializeVersionList(); PrintWriter writer = new PrintWriter(new File(this.baseVersionsDir, "versions.json")); writer.print(text); writer.close(); } public void saveVersion(CompleteVersion version) throws IOException { String text = serializeVersion(version); File target = new File(this.baseVersionsDir, version.getId() + "/" + version.getId() + ".json"); if (target.getParentFile() != null) target.getParentFile().mkdirs(); PrintWriter writer = new PrintWriter(target); writer.print(text); writer.close(); } public File getBaseDirectory() { return this.baseDirectory; } public boolean hasAllFiles(CompleteVersion version, OperatingSystem os) { Set files = version.getRequiredFiles(os); for (String file : (Set<String>) files) { if (!new File(this.baseDirectory, file).isFile()) { return false; } } return true; } }