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.
82 lines
2.2 KiB
82 lines
2.2 KiB
package org.openrs2.decompiler
|
|
|
|
import org.jetbrains.java.decompiler.main.extern.IBytecodeProvider
|
|
import org.jetbrains.java.decompiler.main.extern.IResultSaver
|
|
import org.openrs2.util.io.useAtomicBufferedWriter
|
|
import java.io.Closeable
|
|
import java.nio.file.Files
|
|
import java.nio.file.Path
|
|
import java.util.jar.JarFile
|
|
import java.util.jar.Manifest
|
|
|
|
public class DecompilerIo(private val destination: Path) : IBytecodeProvider, IResultSaver, Closeable {
|
|
private val inputJars = mutableMapOf<String, JarFile>()
|
|
|
|
override fun getBytecode(externalPath: String, internalPath: String?): ByteArray {
|
|
if (internalPath == null) {
|
|
throw UnsupportedOperationException()
|
|
}
|
|
|
|
val jar = inputJars.computeIfAbsent(externalPath) {
|
|
JarFile(it)
|
|
}
|
|
|
|
jar.getInputStream(jar.getJarEntry(internalPath)).use {
|
|
return it.readBytes()
|
|
}
|
|
}
|
|
|
|
override fun saveFolder(path: String) {
|
|
// ignore
|
|
}
|
|
|
|
override fun copyFile(source: String, path: String, entryName: String) {
|
|
throw UnsupportedOperationException()
|
|
}
|
|
|
|
override fun saveClassFile(
|
|
path: String,
|
|
qualifiedName: String,
|
|
entryName: String,
|
|
content: String,
|
|
mapping: IntArray
|
|
) {
|
|
throw UnsupportedOperationException()
|
|
}
|
|
|
|
override fun createArchive(path: String, archiveName: String, manifest: Manifest?) {
|
|
// ignore
|
|
}
|
|
|
|
override fun saveDirEntry(path: String, archiveName: String, entryName: String) {
|
|
// ignore
|
|
}
|
|
|
|
override fun copyEntry(source: String, path: String, archiveName: String, entry: String) {
|
|
// ignore
|
|
}
|
|
|
|
override fun saveClassEntry(
|
|
path: String,
|
|
archiveName: String,
|
|
qualifiedName: String,
|
|
entryName: String,
|
|
content: String
|
|
) {
|
|
val p = destination.resolve(entryName)
|
|
Files.createDirectories(p.parent)
|
|
p.useAtomicBufferedWriter {
|
|
it.write(content)
|
|
}
|
|
}
|
|
|
|
override fun closeArchive(path: String, archiveName: String) {
|
|
// ignore
|
|
}
|
|
|
|
override fun close() {
|
|
for (jar in inputJars.values) {
|
|
jar.close()
|
|
}
|
|
}
|
|
}
|
|
|