Kotlin conversion: CRLFGeneratorStream

This commit is contained in:
Paul Schaub 2023-09-20 13:57:16 +02:00
parent 068aa0ec27
commit a50be47fa4
Signed by: vanitasvitae
GPG Key ID: 62BEE9264BF17311
2 changed files with 52 additions and 55 deletions

View File

@ -1,55 +0,0 @@
// SPDX-FileCopyrightText: 2021 David Hook <dgh@cryptoworkshop.com>
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.encryption_signing;
import org.pgpainless.algorithm.StreamEncoding;
import java.io.IOException;
import java.io.OutputStream;
/**
* {@link OutputStream} which applies CR-LF encoding of its input data, based on the desired {@link StreamEncoding}.
* This implementation originates from the Bouncy Castle library.
*/
public class CRLFGeneratorStream extends OutputStream {
protected final OutputStream crlfOut;
private final boolean isBinary;
private int lastB = 0;
public CRLFGeneratorStream(OutputStream crlfOut, StreamEncoding encoding) {
this.crlfOut = crlfOut;
this.isBinary = encoding == StreamEncoding.BINARY;
}
public void write(int b) throws IOException {
if (!isBinary) {
if (b == '\n' && lastB != '\r') { // Unix
crlfOut.write('\r');
} else if (lastB == '\r') { // MAC
if (b != '\n') {
crlfOut.write('\n');
}
}
lastB = b;
}
crlfOut.write(b);
}
public void close() throws IOException {
if (!isBinary && lastB == '\r') { // MAC
crlfOut.write('\n');
}
crlfOut.close();
}
@Override
public void flush() throws IOException {
super.flush();
crlfOut.flush();
}
}

View File

@ -0,0 +1,52 @@
// SPDX-FileCopyrightText: 2021 David Hook <dgh@cryptoworkshop.com>
// SPDX-FileCopyrightText: 2023 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package org.pgpainless.encryption_signing
import org.pgpainless.algorithm.StreamEncoding
import java.io.OutputStream
/**
* [OutputStream] which applies CR-LF encoding of its input data, based on the desired [StreamEncoding].
* This implementation originates from the Bouncy Castle library.
*/
class CRLFGeneratorStream(
private val crlfOut: OutputStream,
encoding: StreamEncoding
) : OutputStream() {
private val isBinary: Boolean
private var lastB = 0
init {
isBinary = encoding == StreamEncoding.BINARY
}
override fun write(b: Int) {
if (!isBinary) {
if (b == '\n'.code && lastB != '\r'.code) { // Unix
crlfOut.write('\r'.code)
} else if (lastB == '\r'.code) { // MAC
if (b != '\n'.code) {
crlfOut.write('\n'.code)
}
}
lastB = b
}
crlfOut.write(b)
}
override fun close() {
if (!isBinary && lastB == 'r'.code) {
crlfOut.write('\n'.code)
}
crlfOut.close()
}
override fun flush() {
super.flush()
crlfOut.flush()
}
}