package com.faforever.client.map; import com.faforever.client.api.FafApiAccessor; import com.faforever.client.i18n.I18n; import com.faforever.client.io.ByteCountListener; import com.faforever.client.io.Zipper; import com.faforever.client.preferences.PreferencesService; import com.faforever.client.task.CompletableTask; import com.faforever.client.task.ResourceLocks; import com.faforever.client.util.Validator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.BufferedOutputStream; import java.lang.invoke.MethodHandles; import java.nio.file.Files; import java.nio.file.Path; import java.util.Locale; import java.util.zip.ZipOutputStream; import static com.faforever.client.io.Bytes.formatSize; import static java.nio.file.Files.createTempFile; import static java.nio.file.Files.newOutputStream; public class MapUploadTask extends CompletableTask<Void> { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @Resource PreferencesService preferencesService; @Resource FafApiAccessor fafApiAccessor; @Resource I18n i18n; private Path mapPath; private Boolean isRanked; public MapUploadTask() { super(Priority.HIGH); } @PostConstruct void postConstruct() { updateTitle(i18n.get("mapVault.upload.uploading")); } @Override protected Void call() throws Exception { Validator.notNull(mapPath, "mapPath must not be null"); Validator.notNull(isRanked, "isRanked must not be null"); ResourceLocks.acquireUploadLock(); Path cacheDirectory = preferencesService.getCacheDirectory(); Files.createDirectories(cacheDirectory); Path tmpFile = createTempFile(cacheDirectory, "map", ".zip"); try { logger.debug("Zipping map {} to {}", mapPath, tmpFile); updateTitle(i18n.get("mapVault.upload.compressing")); Locale locale = i18n.getLocale(); ByteCountListener byteListener = (written, total) -> { updateMessage(i18n.get("bytesProgress", formatSize(written, locale), formatSize(total, locale))); updateProgress(written, total); }; try (ZipOutputStream zipOutputStream = new ZipOutputStream(new BufferedOutputStream(newOutputStream(tmpFile)))) { Zipper.of(mapPath) .to(zipOutputStream) .listener(byteListener) .zip(); } logger.debug("Uploading map {} as {}", mapPath, tmpFile); updateTitle(i18n.get("mapVault.upload.uploading")); fafApiAccessor.uploadMap(tmpFile, isRanked, byteListener); return null; } finally { Files.delete(tmpFile); ResourceLocks.freeUploadLock(); } } public void setMapPath(Path mapPath) { this.mapPath = mapPath; } public void setRanked(boolean ranked) { isRanked = ranked; } }