diff --git a/cache/src/main/java/net/runelite/cache/client/CacheClient.java b/cache/src/main/java/net/runelite/cache/client/CacheClient.java index 47243bc9c8..c5948d2ebc 100644 --- a/cache/src/main/java/net/runelite/cache/client/CacheClient.java +++ b/cache/src/main/java/net/runelite/cache/client/CacheClient.java @@ -68,6 +68,7 @@ public class CacheClient implements AutoCloseable private final Store store; // store cache will be written to private final String host; private final int clientRevision; + private DownloadWatcher watcher; private ClientState state; @@ -89,6 +90,12 @@ public class CacheClient implements AutoCloseable this.clientRevision = clientRevision; } + public CacheClient(Store store, int clientRevision, DownloadWatcher watcher) + { + this(store, clientRevision); + this.watcher = watcher; + } + public void connect() { Bootstrap b = new Bootstrap(); @@ -226,8 +233,9 @@ public class CacheClient implements AutoCloseable } else { + // despite the index being up to date, not everything + // can be downloaded, eg. for tracks. logger.info("Index {} is up to date", index.getId()); - continue; } logger.info("Downloading index {}", i); @@ -250,11 +258,10 @@ public class CacheClient implements AutoCloseable { index = store.addIndex(i); } - else - { - // update index crc - index.setCrc(crc); - } + + // update index crc and revision + index.setCrc(crc); + index.setRevision(revision); logger.info("Index {} has {} archives", i, index.getArchives().size()); @@ -262,50 +269,58 @@ public class CacheClient implements AutoCloseable { Archive existing = index.getArchive(ad.getId()); - if (existing == null || existing.getRevision() != ad.getRevision()) + if (existing != null && existing.getRevision() == ad.getRevision()) { - if (existing == null) - { - logger.info("Archive {}/{} in index {} is out of date, downloading", - ad.getId(), indexData.getArchives().length, index.getId()); - } - else if (ad.getRevision() < existing.getRevision()) - { - logger.warn("Archive {}/{} in index {} revision is going BACKWARDS! (our revision {}, their revision {})", - ad.getId(), indexData.getArchives().length, index.getId(), - existing.getRevision(), ad.getRevision()); - } - else - { - logger.info("Archive {}/{} in index {} is out of date ({} != {}), downloading", - ad.getId(), indexData.getArchives().length, index.getId(), - existing.getRevision(), ad.getRevision()); - } + logger.info("Archive {}/{} in index {} is up to date", + ad.getId(), indexData.getArchives().length, index.getId()); + continue; + } - final Archive archive = existing == null - ? index.addArchive(ad.getId()) - : existing; - - // Add files - archive.getFiles().clear(); - for (FileData fd : ad.getFiles()) - { - FSFile file = archive.addFile(fd.getId()); - file.setNameHash(fd.getNameHash()); - } - - CompletableFuture future = requestFile(index.getId(), ad.getId(), false); - future.handle((fr, ex) -> - { - archive.setData(fr.getCompressedData()); - return null; - }); + if (existing == null) + { + logger.info("Archive {}/{} in index {} is out of date, downloading", + ad.getId(), indexData.getArchives().length, index.getId()); + } + else if (ad.getRevision() < existing.getRevision()) + { + logger.warn("Archive {}/{} in index {} revision is going BACKWARDS! (our revision {}, their revision {})", + ad.getId(), indexData.getArchives().length, index.getId(), + existing.getRevision(), ad.getRevision()); } else { - logger.info("Active {}/{} in index {} is up to date", - ad.getId(), indexData.getArchives().length, index.getId()); + logger.info("Archive {}/{} in index {} is out of date ({} != {}), downloading", + ad.getId(), indexData.getArchives().length, index.getId(), + existing.getRevision(), ad.getRevision()); } + + final Archive archive = existing == null + ? index.addArchive(ad.getId()) + : existing; + + archive.setRevision(ad.getRevision()); + archive.setCrc(ad.getCrc()); + archive.setNameHash(ad.getNameHash()); + + // Add files + archive.clearFiles(); + for (FileData fd : ad.getFiles()) + { + FSFile file = archive.addFile(fd.getId()); + file.setNameHash(fd.getNameHash()); + } + + CompletableFuture future = requestFile(index.getId(), ad.getId(), false); + future.handle((fr, ex) -> + { + archive.setData(fr.getCompressedData()); + + if (watcher != null) + { + watcher.downloadComplete(archive); + } + return null; + }); } } diff --git a/cache/src/main/java/net/runelite/cache/client/DownloadWatcher.java b/cache/src/main/java/net/runelite/cache/client/DownloadWatcher.java new file mode 100644 index 0000000000..cd3cd0369b --- /dev/null +++ b/cache/src/main/java/net/runelite/cache/client/DownloadWatcher.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.cache.client; + +import net.runelite.cache.fs.Archive; + +@FunctionalInterface +public interface DownloadWatcher +{ + void downloadComplete(Archive archive); +}