package com.faforever.client.map; import com.faforever.client.i18n.I18n; import com.faforever.client.io.Unzipper; import com.faforever.client.preferences.PreferencesService; import com.faforever.client.task.CompletableTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Resource; import java.io.BufferedInputStream; import java.lang.invoke.MethodHandles; import java.net.URL; import java.net.URLConnection; import java.nio.file.Path; import java.util.Objects; import java.util.zip.ZipInputStream; public class DownloadMapTask extends CompletableTask<Void> { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Resource PreferencesService preferencesService; @Resource I18n i18n; private URL mapUrl; private String folderName; public DownloadMapTask() { super(Priority.HIGH); } @Override protected Void call() throws Exception { Objects.requireNonNull(mapUrl, "mapUrl has not been set"); Objects.requireNonNull(folderName, "folderName has not been set"); updateTitle(i18n.get("mapDownloadTask.title", folderName)); logger.info("Downloading map {} from {}", folderName, mapUrl); URLConnection urlConnection = mapUrl.openConnection(); int bytesToRead = urlConnection.getContentLength(); Path targetDirectory = preferencesService.getPreferences().getForgedAlliance().getCustomMapsDirectory(); try (ZipInputStream inputStream = new ZipInputStream(new BufferedInputStream(urlConnection.getInputStream()))) { Unzipper.from(inputStream) .to(targetDirectory) .totalBytes(bytesToRead) .listener(this::updateProgress) .unzip(); } return null; } public void setMapUrl(URL mapUrl) { this.mapUrl = mapUrl; } public void setFolderName(String folderName) { this.folderName = folderName; } }