* to get rid of global state * to have a testable architecture * to allow for authenticated encryption * to have a backup format version * to potentially allow for other storage plugins
50 lines
1.6 KiB
Kotlin
50 lines
1.6 KiB
Kotlin
package com.stevesoltys.backup.header
|
|
|
|
import java.io.IOException
|
|
import java.io.OutputStream
|
|
import java.nio.ByteBuffer
|
|
|
|
interface HeaderWriter {
|
|
@Throws(IOException::class)
|
|
fun writeVersion(outputStream: OutputStream, header: VersionHeader)
|
|
|
|
fun getEncodedVersionHeader(header: VersionHeader): ByteArray
|
|
|
|
@Throws(IOException::class)
|
|
fun writeSegmentHeader(outputStream: OutputStream, header: SegmentHeader)
|
|
}
|
|
|
|
internal class HeaderWriterImpl : HeaderWriter {
|
|
|
|
@Throws(IOException::class)
|
|
override fun writeVersion(outputStream: OutputStream, header: VersionHeader) {
|
|
val headerBytes = ByteArray(1)
|
|
headerBytes[0] = header.version
|
|
outputStream.write(headerBytes)
|
|
}
|
|
|
|
override fun getEncodedVersionHeader(header: VersionHeader): ByteArray {
|
|
val packageBytes = header.packageName.toByteArray(Utf8)
|
|
val keyBytes = header.key?.toByteArray(Utf8)
|
|
val size = 1 + 2 + packageBytes.size + 2 + (keyBytes?.size ?: 0)
|
|
return ByteBuffer.allocate(size).apply {
|
|
put(header.version)
|
|
putShort(packageBytes.size.toShort())
|
|
put(packageBytes)
|
|
if (keyBytes == null) {
|
|
putShort(0.toShort())
|
|
} else {
|
|
putShort(keyBytes.size.toShort())
|
|
put(keyBytes)
|
|
}
|
|
}.array()
|
|
}
|
|
|
|
override fun writeSegmentHeader(outputStream: OutputStream, header: SegmentHeader) {
|
|
val buffer = ByteBuffer.allocate(SEGMENT_HEADER_SIZE)
|
|
.putShort(header.segmentLength)
|
|
.put(header.nonce)
|
|
outputStream.write(buffer.array())
|
|
}
|
|
|
|
}
|