diff --git a/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaReadStream.kt b/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaReadStream.kt new file mode 100644 index 0000000..8e23f49 --- /dev/null +++ b/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaReadStream.kt @@ -0,0 +1,72 @@ +/* + * STAROPENSOURCE ENGINE SOURCE FILE + * Copyright (c) 2024 The StarOpenSource Engine Authors + * Licensed under the GNU General Public License v3. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.staropensource.engine.base.implementation.stream + +import de.staropensource.engine.base.annotation.NonKotlinContact +import de.staropensource.engine.base.exception.io.IOAccessException +import de.staropensource.engine.base.implementable.stream.ReadStream +import de.staropensource.engine.base.implementable.stream.Stream +import java.io.InputStream + +/** + * A [Stream] implementation forwarding + * it's calls instances of Java's + * [InputStream] class. + * + * @param inputStream Java's [InputStream] to read from + * @param autoCloseJavaStream if to automatically close the supplied [InputStream] if [close] is invoked + * @since v1-alpha10 + */ +@NonKotlinContact +open class JavaReadStream( + val inputStream: InputStream, + val autoCloseJavaStream: Boolean = false +) : ReadStream() { + // -----> Closure + /** + * Closes the Java's [InputStream] + * if [autoCloseJavaStream] is `true`. + * + * @throws IOAccessException on IO error + * @since v1-alpha10 + */ + override fun close() = super.close() + override fun closeStream() { + if (!autoCloseJavaStream) + return + + inputStream.close() + } + + + // -----> Reading + override fun remaining(): Boolean? = null + override fun available(): UInt = inputStream.available().toUInt() + override fun readNextByte(): Byte? { + val byte: Int = inputStream.read() + + return if (byte == -1) + null + else + internalPipe(byte.toByte()) + } + override fun readNBytes(n: UInt): ByteArray = internalPipe(inputStream.readNBytes(n.toInt())) + override fun readRemainingBytes(): ByteArray = internalPipe(inputStream.readAllBytes()) +} diff --git a/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaStream.kt b/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaStream.kt new file mode 100644 index 0000000..b5e2ed7 --- /dev/null +++ b/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaStream.kt @@ -0,0 +1,88 @@ +/* + * STAROPENSOURCE ENGINE SOURCE FILE + * Copyright (c) 2024 The StarOpenSource Engine Authors + * Licensed under the GNU General Public License v3. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.staropensource.engine.base.implementation.stream + +import de.staropensource.engine.base.annotation.NonKotlinContact +import de.staropensource.engine.base.exception.io.IOAccessException +import de.staropensource.engine.base.implementable.stream.Stream +import java.io.InputStream +import java.io.OutputStream + +/** + * A [Stream] implementation forwarding + * it's calls instances of Java's + * [InputStream] and [OutputStream] + * classes. + * + * @param inputStream Java's [InputStream] to read from + * @param outputStream Java's [OutputStream] to write to + * @param autoCloseJavaStreams if to automatically close the supplied [InputStream] and [OutputStream] if [close] is invoked + * @since v1-alpha10 + */ +@NonKotlinContact +@OptIn(ExperimentalStdlibApi::class) +open class JavaStream( + val inputStream: InputStream, + val outputStream: OutputStream, + val autoCloseJavaStreams: Boolean = true +) : Stream(streamMode = StreamMode.READ_WRITE) { + // -----> Closure + /** + * Closes the Java's [InputStream] + * and [OutputStream] if + * [autoCloseJavaStreams] is `true`. + * + * @throws IOAccessException on IO error + * @since v1-alpha10 + */ + override fun close() = super.close() + override fun closeStream() { + if (!autoCloseJavaStreams) + return + + inputStream.close() + outputStream.close() + } + + + // -----> Writing + override fun writeByte(byte: Byte): Stream { + outputStream.write(byte.toInt()) + return this + } + + override fun writeBytes(bytes: ByteArray): Stream { + outputStream.write(bytes) + return this + } + + override fun flush(): Stream { + outputStream.flush() + return this + } + + + // -----> Reading + override fun remaining(): Boolean? = null + override fun available(): UInt = inputStream.available().toUInt() + override fun readNextByte(): Byte? = inputStream.read().toByte() + override fun readNBytes(n: UInt): ByteArray = inputStream.readNBytes(n.toInt()) + override fun readRemainingBytes(): ByteArray = inputStream.readAllBytes() +} diff --git a/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaWriteStream.kt b/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaWriteStream.kt new file mode 100644 index 0000000..64db776 --- /dev/null +++ b/base/src/main/kotlin/de/staropensource/engine/base/implementation/stream/JavaWriteStream.kt @@ -0,0 +1,79 @@ +/* + * STAROPENSOURCE ENGINE SOURCE FILE + * Copyright (c) 2024 The StarOpenSource Engine Authors + * Licensed under the GNU General Public License v3. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.staropensource.engine.base.implementation.stream + +import de.staropensource.engine.base.annotation.NonKotlinContact +import de.staropensource.engine.base.exception.io.IOAccessException +import de.staropensource.engine.base.implementable.stream.Stream +import de.staropensource.engine.base.implementable.stream.WriteStream +import java.io.OutputStream + +/** + * A [Stream] implementation forwarding + * it's calls instances of Java's + * [OutputStream] class. + * + * @param outputStream Java's [OutputStream] to write to + * @param autoCloseJavaStream if to automatically close the supplied [OutputStream] if [close] is invoked + * @param autoFlushAfter after which amount of bytes to automatically flush. May be ignored by some implementations. Implementations should expose this argument in their constructor + * @since v1-alpha10 + */ +@NonKotlinContact +@OptIn(ExperimentalStdlibApi::class) +open class JavaWriteStream( + val outputStream: OutputStream, + val autoCloseJavaStream: Boolean = false, + autoFlushAfter: ULong = 100UL, +) : WriteStream( + autoFlushAfter = autoFlushAfter, +) { + // -----> Closure + /** + * Closes the Java's [OutputStream] + * if [autoCloseJavaStream] is `true`. + * + * @throws IOAccessException on IO error + * @since v1-alpha10 + */ + override fun close() = super.close() + override fun closeStream() { + if (!autoCloseJavaStream) + return + + outputStream.close() + } + + + // -----> Writing + override fun writeByte(byte: Byte): Stream { + outputStream.write(internalRedirect(byte).toInt()) + return this + } + + override fun writeBytes(bytes: ByteArray): Stream { + outputStream.write(internalRedirect(bytes)) + return this + } + + override fun flush(): Stream { + outputStream.flush() + return this + } +}