use of net.runelite.cache.fs.Archive in project runelite by runelite.
the class NpcManager method load.
public void load() throws IOException {
NpcLoader loader = new NpcLoader();
Storage storage = store.getStorage();
Index index = store.getIndex(IndexType.CONFIGS);
Archive archive = index.getArchive(ConfigType.NPC.getId());
byte[] archiveData = storage.loadArchive(archive);
ArchiveFiles files = archive.getFiles(archiveData);
for (FSFile f : files.getFiles()) {
NpcDefinition npc = loader.load(f.getFileId(), f.getContents());
npcs.add(npc);
}
}
use of net.runelite.cache.fs.Archive in project runelite by runelite.
the class ArchiveRequestHandler method handleRequest.
private void handleRequest(ChannelHandlerContext ctx, int index, int archiveId) throws IOException {
logger.info("Client {} requests index {} archive {}", ctx.channel().remoteAddress(), index, archiveId);
Index i = store.findIndex(index);
assert i != null;
Archive archive = i.getArchive(archiveId);
assert archive != null;
Storage storage = store.getStorage();
// is compressed, includes length and type
byte[] packed = storage.loadArchive(archive);
if (packed == null) {
logger.warn("Missing archive {}/{}", index, archiveId);
// is it possible to notify the client of an error with this?
return;
}
byte compression = packed[0];
int compressedSize = Ints.fromBytes(packed[1], packed[2], packed[3], packed[4]);
// size the client expects the data to be
int expectedSize = // compression type
1 + // compressed size
4 + compressedSize + (compression != CompressionType.NONE ? 4 : 0);
if (packed.length != expectedSize) {
// the update server will never have it
assert packed.length - expectedSize == 2 : "packed length != expected size";
packed = Arrays.copyOf(packed, packed.length - 2);
}
ArchiveResponsePacket response = new ArchiveResponsePacket();
response.setIndex(index);
response.setArchive(archiveId);
response.setData(packed);
ctx.writeAndFlush(response);
}
use of net.runelite.cache.fs.Archive in project runelite by runelite.
the class CacheStorage method load.
@Override
public void load(Store store) throws IOException {
List<IndexEntry> indexes = cacheDao.findIndexesForCache(con, cacheEntry);
for (IndexEntry indexEntry : indexes) {
Index index = store.addIndex(indexEntry.getIndexId());
index.setCrc(indexEntry.getCrc());
index.setRevision(indexEntry.getRevision());
try (ResultSetIterable<ArchiveEntry> archives = cacheDao.findArchivesForIndex(con, indexEntry)) {
for (ArchiveEntry archiveEntry : archives) {
if (index.getArchive(archiveEntry.getArchiveId()) != null) {
throw new IOException("Duplicate archive " + archiveEntry + " on " + indexEntry);
}
Archive archive = index.addArchive(archiveEntry.getArchiveId());
archive.setNameHash(archiveEntry.getNameHash());
archive.setCrc(archiveEntry.getCrc());
archive.setRevision(archiveEntry.getRevision());
archive.setHash(archiveEntry.getHash());
// File data is not necessary for cache updating
}
}
}
}
use of net.runelite.cache.fs.Archive in project runelite by runelite.
the class CacheUpdater method update.
public void update() throws IOException, InvalidEndpointException, InvalidPortException, InterruptedException {
int rsVersion = RuneLiteAPI.getRsVersion();
try (Connection con = sql2o.beginTransaction()) {
CacheDAO cacheDao = new CacheDAO();
CacheEntry cache = cacheDao.findMostRecent(con);
boolean created = false;
if (cache == null) {
created = true;
cache = cacheDao.createCache(con, rsVersion, Instant.now());
}
CacheStorage storage = new CacheStorage(cache, cacheDao, con);
Store store = new Store(storage);
store.load();
ExecutorService executor = Executors.newSingleThreadExecutor();
CacheClient client = new CacheClient(store, rsVersion, (Archive archive, byte[] data) -> executor.submit(new CacheUploader(minioClient, minioBucket, archive, data)));
client.connect();
HandshakeResponseType result = client.handshake().join();
if (result != HandshakeResponseType.RESPONSE_OK) {
logger.warn("Out of date!");
return;
}
List<IndexInfo> indexes = client.requestIndexes();
List<IndexEntry> entries = cacheDao.findIndexesForCache(con, cache);
if (!checkOutOfDate(indexes, entries)) {
logger.info("All up to date.");
return;
}
client.download();
CacheEntry newCache = created ? cache : cacheDao.createCache(con, rsVersion, Instant.now());
storage.setCacheEntry(newCache);
store.save();
// ensure objects are added to the store before they become
// visible in the database
executor.shutdown();
while (!executor.awaitTermination(1, TimeUnit.SECONDS)) {
logger.debug("Waiting for termination of executor...");
}
// commit database
con.commit();
}
}
use of net.runelite.cache.fs.Archive in project runelite by runelite.
the class ObjectManager method load.
public void load() throws IOException {
ObjectLoader loader = new ObjectLoader();
Storage storage = store.getStorage();
Index index = store.getIndex(IndexType.CONFIGS);
Archive archive = index.getArchive(ConfigType.OBJECT.getId());
byte[] archiveData = storage.loadArchive(archive);
ArchiveFiles files = archive.getFiles(archiveData);
for (FSFile f : files.getFiles()) {
ObjectDefinition def = loader.load(f.getFileId(), f.getContents());
objects.put(f.getFileId(), def);
}
}
Aggregations