Mekanism-tilera-Edition/common/mekanism/client/ThreadClientUpdate.java

213 lines
5 KiB
Java
Raw Normal View History

package mekanism.client;
import java.io.File;
2014-01-12 04:19:51 +01:00
import java.io.FileInputStream;
import java.io.FileOutputStream;
2014-01-12 04:19:51 +01:00
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
2014-01-12 04:19:51 +01:00
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
2014-01-12 04:19:51 +01:00
import mekanism.api.EnumColor;
import mekanism.client.gui.GuiCredits;
2014-01-12 04:19:51 +01:00
import mekanism.common.IModule;
import mekanism.common.Mekanism;
2014-01-12 04:19:51 +01:00
import mekanism.common.Version;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* Thread that downloads the latest release of Mekanism. The older file is deleted and the newly downloaded file takes it's place.
* @author AidanBrady
*
*/
@SideOnly(Side.CLIENT)
public class ThreadClientUpdate extends Thread
{
private int bytesDownloaded;
private int lastBytesDownloaded;
private byte[] buffer = new byte[10240];
2014-01-12 04:19:51 +01:00
private static File modsDir = new File(Mekanism.proxy.getMinecraftDir(), "mods");
private static File tempDir = new File(modsDir, "temp");
private static URL zipUrl = createURL();
public static boolean hasUpdated;
2014-01-12 04:19:51 +01:00
public ThreadClientUpdate()
{
2014-01-12 04:19:51 +01:00
setDaemon(false);
start();
}
@Override
public void run()
2014-01-12 04:19:51 +01:00
{
try {
2014-01-12 04:19:51 +01:00
deleteTemp();
createTemp();
File download = new File(tempDir, "builds.zip");
prepareForDownload();
download.createNewFile();
2014-01-12 04:19:51 +01:00
GuiCredits.updateInfo("Downloading...");
FileOutputStream outputStream = new FileOutputStream(download.getAbsolutePath());
2014-01-12 04:19:51 +01:00
InputStream stream = zipUrl.openStream();
while((lastBytesDownloaded = stream.read(buffer)) > 0)
{
outputStream.write(buffer, 0, lastBytesDownloaded);
buffer = new byte[10240];
bytesDownloaded += lastBytesDownloaded;
}
outputStream.close();
stream.close();
2014-01-12 04:24:15 +01:00
if(Mekanism.versionNumber.comparedState(Version.get(Mekanism.latestVersionNumber)) == -1)
2014-01-12 04:19:51 +01:00
{
ZipInputStream zip = new ZipInputStream(new FileInputStream(download));
deployEntry(zip, "Mekanism-");
zip.close();
}
for(IModule module : Mekanism.modulesLoaded)
{
2014-01-12 04:24:15 +01:00
if(module.getVersion().comparedState(Version.get(Mekanism.latestVersionNumber)) == -1)
2014-01-12 04:19:51 +01:00
{
ZipInputStream zip = new ZipInputStream(new FileInputStream(download));
deployEntry(zip, "Mekanism" + module.getName());
zip.close();
}
}
deleteTemp();
hasUpdated = true;
GuiCredits.updateInfo("Update installed, reboot Minecraft for changes.");
System.out.println("[Mekanism] Successfully updated to latest version (" + Mekanism.latestVersionNumber + ").");
finalize();
2013-10-31 19:46:14 +01:00
} catch(Throwable t) {
2014-01-12 04:19:51 +01:00
GuiCredits.updateInfo(EnumColor.DARK_RED + "Error updating.");
hasUpdated = true;
2013-10-31 19:46:14 +01:00
System.err.println("[Mekanism] Error while finishing update thread: " + t.getMessage());
2014-01-12 04:19:51 +01:00
t.printStackTrace();
}
}
private void deployEntry(ZipInputStream zip, String filePrefix) throws IOException
{
byte[] zipBuffer = new byte[1024];
ZipEntry entry = zip.getNextEntry();
while(entry != null)
{
if(entry.isDirectory())
{
continue;
}
2013-10-31 19:46:14 +01:00
2014-01-12 04:19:51 +01:00
if(entry.getName().contains(filePrefix))
{
File modFile = new File(modsDir, entry.getName().replace("output/", ""));
if(modFile.exists())
{
modFile.delete();
}
modFile.createNewFile();
FileOutputStream outStream = new FileOutputStream(modFile);
int len;
while((len = zip.read(zipBuffer)) > 0)
{
outStream.write(zipBuffer, 0, len);
}
zip.closeEntry();
outStream.close();
break;
}
entry = zip.getNextEntry();
}
}
private void createTemp() throws IOException
{
if(!tempDir.exists())
{
tempDir.mkdir();
}
}
2014-01-12 04:19:51 +01:00
private void deleteTemp() throws IOException
{
if(tempDir.exists())
{
clearFiles(tempDir);
}
}
private void clearFiles(File file)
{
if(file.isDirectory())
{
for(File sub : file.listFiles())
{
clearFiles(sub);
}
}
file.delete();
}
private void prepareForDownload()
{
2013-07-20 18:10:14 +02:00
File[] modsList = new File(new StringBuilder().append(Mekanism.proxy.getMinecraftDir()).append(File.separator + "mods").toString()).listFiles();
2014-01-12 04:19:51 +01:00
if(Mekanism.versionNumber.comparedState(Version.get(Mekanism.latestVersionNumber)) == -1)
{
for(File file : modsList)
{
if(file.getName().startsWith("Mekanism-") && file.getName().endsWith(".jar") && !file.getName().contains(Mekanism.latestVersionNumber))
{
file.delete();
}
}
}
for(IModule module : Mekanism.modulesLoaded)
{
2014-01-12 04:19:51 +01:00
for(File file : modsList)
{
2014-01-12 04:19:51 +01:00
if(file.getName().startsWith("Mekanism" + module.getName()) && file.getName().endsWith(".jar") && !file.getName().contains(Mekanism.latestVersionNumber))
{
file.delete();
}
}
}
System.out.println("[Mekanism] Preparing to update...");
}
2014-01-12 04:19:51 +01:00
private static URL createURL()
{
try {
return new URL("http://ci.aidancbrady.com/job/Mekanism/Recommended/artifact/*zip*/archive.zip");
} catch(Exception e) {}
return null;
}
}