package com.faforever.client.update;
import com.faforever.client.i18n.I18n;
import com.faforever.client.io.ByteCopier;
import com.faforever.client.preferences.PreferencesService;
import com.faforever.client.task.CompletableTask;
import com.faforever.client.task.ResourceLocks;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.invoke.MethodHandles;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
public class DownloadUpdateTask extends CompletableTask<Path> {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@Resource
I18n i18n;
@Resource
PreferencesService preferencesService;
private UpdateInfo updateInfo;
public DownloadUpdateTask() {
super(Priority.MEDIUM);
}
@Override
protected Path call() throws Exception {
updateTitle(i18n.get("clientUpdateDownloadTask.title"));
URL url = updateInfo.getUrl();
Path updateDirectory = preferencesService.getCacheDirectory().resolve("update");
Path targetFile = updateDirectory.resolve(updateInfo.getFileName());
Files.createDirectories(targetFile.getParent());
Path tempFile = Files.createTempFile(targetFile.getParent(), "update", null);
try (InputStream inputStream = url.openStream();
OutputStream outputStream = Files.newOutputStream(tempFile)) {
ResourceLocks.acquireDownloadLock();
ByteCopier.from(inputStream)
.to(outputStream)
.totalBytes(updateInfo.getSize())
.listener(this::updateProgress)
.copy();
Files.move(tempFile, targetFile, StandardCopyOption.REPLACE_EXISTING);
} finally {
ResourceLocks.freeDownloadLock();
try {
Files.deleteIfExists(tempFile);
} catch (IOException e) {
logger.warn("Could not delete temporary file: " + tempFile.toAbsolutePath(), e);
}
}
return targetFile;
}
public void setUpdateInfo(UpdateInfo updateInfo) {
this.updateInfo = updateInfo;
}
}