/*
* SK's Minecraft Launcher
* Copyright (C) 2010-2014 Albert Pham <http://www.sk89q.com> and contributors
* Please see LICENSE.txt for license information.
*/
package com.skcraft.launcher.bootstrap;
import com.skcraft.launcher.Bootstrap;
import lombok.extern.java.Log;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import static com.skcraft.launcher.bootstrap.BootstrapUtils.checkInterrupted;
import static com.skcraft.launcher.bootstrap.SharedLocale.tr;
@Log
public class Downloader implements Runnable, ProgressObservable {
private final Bootstrap bootstrap;
private DownloadFrame dialog;
private HttpRequest httpRequest;
private Thread thread;
public Downloader(Bootstrap bootstrap) {
this.bootstrap = bootstrap;
}
@Override
public void run() {
this.thread = Thread.currentThread();
try {
execute();
} catch (InterruptedException e) {
log.log(Level.WARNING, "Interrupted");
System.exit(0);
} catch (Throwable t) {
log.log(Level.WARNING, "Failed to download launcher", t);
SwingHelper.showErrorDialog(null, tr("errors.failedDownloadError"), tr("errorTitle"), t);
System.exit(0);
}
}
private void execute() throws Exception {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
Bootstrap.setSwingLookAndFeel();
dialog = new DownloadFrame(Downloader.this);
dialog.setVisible(true);
dialog.setDownloader(Downloader.this);
}
});
File finalFile = new File(bootstrap.getBinariesDir(), System.currentTimeMillis() + ".jar.pack");
File tempFile = new File(finalFile.getParentFile(), finalFile.getName() + ".tmp");
URL updateUrl = HttpRequest.url(bootstrap.getProperties().getProperty("latestUrl"));
log.info("Reading update URL " + updateUrl + "...");
try {
String data = HttpRequest
.get(updateUrl)
.execute()
.expectResponseCode(200)
.returnContent()
.asString("UTF-8");
Object object = JSONValue.parse(data);
URL url;
if (object instanceof JSONObject) {
String rawUrl = String.valueOf(((JSONObject) object).get("url"));
if (rawUrl != null) {
url = HttpRequest.url(rawUrl.trim());
} else {
log.warning("Did not get valid update document - got:\n\n" + data);
throw new IOException("Update URL did not return a valid result");
}
} else {
log.warning("Did not get valid update document - got:\n\n" + data);
throw new IOException("Update URL did not return a valid result");
}
checkInterrupted();
log.info("Downloading " + url + " to " + tempFile.getAbsolutePath());
httpRequest = HttpRequest.get(url);
httpRequest
.execute()
.expectResponseCode(200)
.saveContent(tempFile);
finalFile.delete();
tempFile.renameTo(finalFile);
} finally {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
dialog.setDownloader(null);
dialog.dispose();
}
});
}
LauncherBinary binary = new LauncherBinary(finalFile);
List<LauncherBinary> binaries = new ArrayList<LauncherBinary>();
binaries.add(binary);
bootstrap.launchExisting(binaries, false);
}
public void cancel() {
thread.interrupt();
}
public String getStatus() {
HttpRequest httpRequest = this.httpRequest;
if (httpRequest != null) {
double progress = httpRequest.getProgress();
if (progress >= 0) {
return String.format(tr("downloader.progressStatus"), progress * 100);
}
}
return tr("downloader.status");
}
@Override
public double getProgress() {
HttpRequest httpRequest = this.httpRequest;
return httpRequest != null ? httpRequest.getProgress() : -1;
}
}