@ -1,8 +1,10 @@
package org.openrs2.archive.key
package org.openrs2.archive.key
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.treeToValue
import org.openrs2.crypto.XteaKey
import org.openrs2.crypto.XteaKey
import org.openrs2.json.Json
import org.openrs2.json.Json
import java.io.IOException
import java.io.InputStream
import java.io.InputStream
import javax.inject.Inject
import javax.inject.Inject
import javax.inject.Singleton
import javax.inject.Singleton
@ -12,21 +14,24 @@ public class JsonKeyReader @Inject constructor(
@Json private val mapper : ObjectMapper
@Json private val mapper : ObjectMapper
) : KeyReader {
) : KeyReader {
override fun read ( input : InputStream ) : Sequence < XteaKey > {
override fun read ( input : InputStream ) : Sequence < XteaKey > {
return sequence {
val keys = mutableListOf < XteaKey > ( )
for ( mapSquare in mapper . readTree ( input ) ) {
val root = mapper . readTree ( input )
val key = mapSquare [ " key " ] ?: mapSquare [ " keys " ] ?: continue
if ( key . size ( ) != 4 ) {
when {
continue
root . isArray -> {
for ( entry in root ) {
val key = entry [ " key " ] ?: entry [ " keys " ] ?: throw IOException ( " Missing 'key' or 'keys' field " )
keys += mapper . treeToValue < XteaKey > ( key ) ?: throw IOException ( " Key must be non-null " )
}
}
val k0 = key [ 0 ] . asText ( ) . toIntOrNull ( ) ?: continue
val k1 = key [ 1 ] . asText ( ) . toIntOrNull ( ) ?: continue
val k2 = key [ 2 ] . asText ( ) . toIntOrNull ( ) ?: continue
val k3 = key [ 3 ] . asText ( ) . toIntOrNull ( ) ?: continue
yield ( XteaKey ( k0 , k1 , k2 , k3 ) )
}
}
root . isObject -> {
for ( entry in root . fields ( ) ) {
keys += mapper . treeToValue < XteaKey > ( entry . value ) ?: throw IOException ( " Key must be non-null " )
}
}
else -> throw IOException ( " Root element must be an array or object " )
}
}
return keys . asSequence ( )
}
}
}
}