Open-source multiplayer game server compatible with the RuneScape client
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/common/src/main/java/dev/openrs2/common/io/DeterministicJarOutputStrea...

46 lines
1.5 KiB

package dev.openrs2.common.io
import java.io.OutputStream
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.attribute.FileTime
import java.util.jar.JarInputStream
import java.util.jar.JarOutputStream
import java.util.jar.Manifest
import java.util.zip.ZipEntry
class DeterministicJarOutputStream : JarOutputStream {
private constructor(out: OutputStream) : super(out)
private constructor(out: OutputStream, man: Manifest) : super(out, man)
override fun putNextEntry(ze: ZipEntry) {
ze.creationTime = UNIX_EPOCH
ze.lastAccessTime = UNIX_EPOCH
ze.lastModifiedTime = UNIX_EPOCH
super.putNextEntry(ze)
}
companion object {
private val UNIX_EPOCH = FileTime.fromMillis(0)
fun create(out: OutputStream, manifest: Manifest? = null): JarOutputStream {
return if (manifest != null) {
DeterministicJarOutputStream(out, manifest)
} else {
DeterministicJarOutputStream(out)
}
}
fun repack(src: Path, dest: Path) {
JarInputStream(Files.newInputStream(src)).use { input ->
create(Files.newOutputStream(dest), input.manifest).use { output ->
while (true) {
val entry = input.nextJarEntry ?: break
output.putNextEntry(entry)
input.copyTo(output)
}
}
}
}
}
}