2430eacc创建于 2024年11月20日历史提交
/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2022-2024. All rights reserved.
 */
package zip4cj.io.outputstream

class CountingOutputStream <: OutputStream & Resource & OutputStreamWithSplitZipSupport {
    var outputStream: OutputStream
    var closed = false
    private var numberOfBytesWritten: Int64 = 0

    public init(outputStream: OutputStream) {
        this.outputStream = outputStream
    }

    public func write(b: Array<UInt8>): Unit {
        this.outputStream.write(b)
        numberOfBytesWritten += b.size
    }

    public func getCurrentSplitFileCounter(): Int32 {
        if (isSplitZipFile()) {
            return (outputStream as SplitOutputStream).getOrThrow().getCurrentSplitFileCounter()
        }
        return 0
    }

    public func getOffsetForNextEntry(): Int64 {
        if (outputStream is SplitOutputStream) {
            return (outputStream as SplitOutputStream).getOrThrow().getFilePointer()
        }

        return numberOfBytesWritten
    }

    public func getSplitLength(): Int64 {
        if (isSplitZipFile()) {
            return (outputStream as SplitOutputStream).getOrThrow().getSplitLength()
        }

        return 0
    }

    public func isSplitZipFile(): Bool {
        if (let Some(output) <- (outputStream as SplitOutputStream)) {
            output.isSplitZipFile()
        } else {
            false
        }
    }

    public func getNumberOfBytesWritten(): Int64 {
        if (outputStream is SplitOutputStream) {
            return (outputStream as SplitOutputStream).getOrThrow().getFilePointer()
        }

        return numberOfBytesWritten
    }

    public func checkBuffSizeAndStartNextSplitFile(bufferSize: Int32): Bool {
        if (!isSplitZipFile()) {
            return false
        }
        return (outputStream as SplitOutputStream).getOrThrow().checkBufferSizeAndStartNextSplitFile(Int64(bufferSize))
    }

    public func getFilePointer(): Int64 {
        if (outputStream is SplitOutputStream) {
            return (outputStream as SplitOutputStream).getOrThrow().getFilePointer()
        }

        return numberOfBytesWritten
    }

    public func flush(): Unit {
        outputStream.flush()
    }

    public func isClosed(): Bool {
        closed
    }

    public func close(): Unit {
        this.outputStream.flush()
        match ((outputStream as Resource)) {
            case Some(v) => v.close()
            case None => ()
        }
        closed = true
    }
}