package net.minecraft.launcher.updater; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.Date; import java.util.Set; 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; 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 { CompleteVersion version = (CompleteVersion)this.gson.fromJson(getUrl("versions/" + id + "/" + id + ".json"), CompleteVersion.class); addVersion(version); } catch (JsonSyntaxException 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 : files) { if (!new File(this.baseDirectory, file).isFile()) { return false; } } return true; } }