// 
// Decompiled by Procyon v0.6.0
// 

package io.netty.handler.codec.http3;

import java.util.Objects;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import io.netty.handler.codec.quic.QuicStreamChannel;
import io.netty.util.concurrent.Promise;
import io.netty.handler.codec.quic.QuicChannel;

final class QpackAttributes
{
    private final QuicChannel channel;
    private final boolean dynamicTableDisabled;
    private final Promise<QuicStreamChannel> encoderStreamPromise;
    private final Promise<QuicStreamChannel> decoderStreamPromise;
    private QuicStreamChannel encoderStream;
    private QuicStreamChannel decoderStream;
    
    QpackAttributes(final QuicChannel channel, final boolean disableDynamicTable) {
        this.channel = channel;
        this.dynamicTableDisabled = disableDynamicTable;
        this.encoderStreamPromise = (this.dynamicTableDisabled ? null : channel.eventLoop().newPromise());
        this.decoderStreamPromise = (this.dynamicTableDisabled ? null : channel.eventLoop().newPromise());
    }
    
    boolean dynamicTableDisabled() {
        return this.dynamicTableDisabled;
    }
    
    boolean decoderStreamAvailable() {
        return !this.dynamicTableDisabled && this.decoderStream != null;
    }
    
    boolean encoderStreamAvailable() {
        return !this.dynamicTableDisabled && this.encoderStream != null;
    }
    
    void whenEncoderStreamAvailable(final GenericFutureListener<Future<? super QuicStreamChannel>> listener) {
        assert !this.dynamicTableDisabled;
        assert this.encoderStreamPromise != null;
        this.encoderStreamPromise.addListener((GenericFutureListener<? extends Future<? super QuicStreamChannel>>)listener);
    }
    
    void whenDecoderStreamAvailable(final GenericFutureListener<Future<? super QuicStreamChannel>> listener) {
        assert !this.dynamicTableDisabled;
        assert this.decoderStreamPromise != null;
        this.decoderStreamPromise.addListener((GenericFutureListener<? extends Future<? super QuicStreamChannel>>)listener);
    }
    
    QuicStreamChannel decoderStream() {
        assert this.decoderStreamAvailable();
        return this.decoderStream;
    }
    
    QuicStreamChannel encoderStream() {
        assert this.encoderStreamAvailable();
        return this.encoderStream;
    }
    
    void decoderStream(final QuicStreamChannel decoderStream) {
        assert this.channel.eventLoop().inEventLoop();
        assert !this.dynamicTableDisabled;
        assert this.decoderStreamPromise != null;
        assert this.decoderStream == null;
        this.decoderStream = Objects.requireNonNull(decoderStream);
        this.decoderStreamPromise.setSuccess(decoderStream);
    }
    
    void encoderStream(final QuicStreamChannel encoderStream) {
        assert this.channel.eventLoop().inEventLoop();
        assert !this.dynamicTableDisabled;
        assert this.encoderStreamPromise != null;
        assert this.encoderStream == null;
        this.encoderStream = Objects.requireNonNull(encoderStream);
        this.encoderStreamPromise.setSuccess(encoderStream);
    }
    
    void encoderStreamInactive(final Throwable cause) {
        assert this.channel.eventLoop().inEventLoop();
        assert !this.dynamicTableDisabled;
        assert this.encoderStreamPromise != null;
        this.encoderStreamPromise.tryFailure(cause);
    }
    
    void decoderStreamInactive(final Throwable cause) {
        assert this.channel.eventLoop().inEventLoop();
        assert !this.dynamicTableDisabled;
        assert this.decoderStreamPromise != null;
        this.decoderStreamPromise.tryFailure(cause);
    }
}
