Open-source multiplayer game server compatible with the RuneScape client https://www.openrs2.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
openrs2/cache/src/main/kotlin/org/openrs2/cache/CacheArchive.kt

99 lines
3.4 KiB

package org.openrs2.cache
import io.netty.buffer.ByteBuf
import io.netty.buffer.ByteBufAllocator
import io.netty.buffer.ByteBufUtil
import org.openrs2.buffer.crc32
import org.openrs2.crypto.whirlpool
public class CacheArchive internal constructor(
alloc: ByteBufAllocator,
index: Js5Index,
archive: Int,
unpackedCache: UnpackedCache,
private val store: Store
) : Archive(alloc, index, archive, unpackedCache) {
override fun packedExists(group: Int): Boolean {
return store.exists(archive, group)
}
override fun readPacked(group: Int): ByteBuf {
return store.read(archive, group)
}
override fun writePacked(group: Int, buf: ByteBuf) {
store.write(archive, group, buf)
}
override fun writePackedIndex(buf: ByteBuf) {
store.write(Store.ARCHIVESET, archive, buf)
}
override fun removePacked(group: Int) {
store.remove(archive, group)
}
override fun appendVersion(buf: ByteBuf, version: Int) {
buf.writeShort(version)
}
override fun verifyCompressed(buf: ByteBuf, entry: Js5Index.MutableGroup) {
val version = VersionTrailer.strip(buf)
val truncatedVersion = entry.version and 0xFFFF
if (version != truncatedVersion) {
throw StoreCorruptException(
"Archive $archive group ${entry.id} is out of date " +
"(expected version $truncatedVersion, actual version $version)"
)
}
val checksum = buf.crc32()
if (checksum != entry.checksum) {
throw StoreCorruptException(
"Archive $archive group ${entry.id} is corrupt " +
"(expected checksum ${entry.checksum}, actual checksum $checksum)"
)
}
val length = buf.readableBytes()
if (index.hasLengths && length != entry.length) {
throw StoreCorruptException(
"Archive $archive group ${entry.id} is corrupt " +
"(expected length ${entry.length}, actual length $length)"
)
}
if (index.hasDigests) {
val digest = buf.whirlpool()
if (!digest.contentEquals(entry.digest!!)) {
throw StoreCorruptException(
"Archive $archive group ${entry.id} is corrupt " +
"(expected digest ${ByteBufUtil.hexDump(entry.digest)}, " +
"actual digest ${ByteBufUtil.hexDump(digest)})"
)
}
}
}
override fun verifyUncompressed(buf: ByteBuf, entry: Js5Index.MutableGroup) {
val length = buf.readableBytes()
if (index.hasLengths && length != entry.uncompressedLength) {
throw StoreCorruptException(
"Archive $archive group ${entry.id} is corrupt " +
"(expected uncompressed length ${entry.uncompressedLength}, " +
"actual length $length)"
)
}
if (index.hasUncompressedChecksums) {
val uncompressedChecksum = buf.crc32()
if (uncompressedChecksum != entry.uncompressedChecksum) {
throw StoreCorruptException(
"Archive $archive group ${entry.id} is corrupt " +
"(expected uncompressed checksum ${entry.uncompressedChecksum}, " +
"actual uncompressed checksum $uncompressedChecksum)"
)
}
}
}
}