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

package io.netty.handler.codec.quic;

import io.netty.channel.ChannelPromise;
import java.net.SocketAddress;
import org.jetbrains.annotations.Nullable;
import java.nio.ByteBuffer;
import java.util.function.Consumer;
import io.netty.buffer.ByteBuf;
import java.net.InetSocketAddress;
import io.netty.channel.ChannelHandlerContext;
import java.util.concurrent.Executor;
import java.util.function.Function;

final class QuicheQuicClientCodec extends QuicheQuicCodec
{
    private final Function<QuicChannel, ? extends QuicSslEngine> sslEngineProvider;
    private final Executor sslTaskExecutor;
    
    QuicheQuicClientCodec(final QuicheConfig config, final Function<QuicChannel, ? extends QuicSslEngine> sslEngineProvider, final Executor sslTaskExecutor, final int localConnIdLength, final FlushStrategy flushStrategy) {
        super(config, localConnIdLength, flushStrategy);
        this.sslEngineProvider = sslEngineProvider;
        this.sslTaskExecutor = sslTaskExecutor;
    }
    
    @Nullable
    @Override
    protected QuicheQuicChannel quicPacketRead(final ChannelHandlerContext ctx, final InetSocketAddress sender, final InetSocketAddress recipient, final QuicPacketType type, final long version, final ByteBuf scid, final ByteBuf dcid, final ByteBuf token, final ByteBuf senderSockaddrMemory, final ByteBuf recipientSockaddrMemory, final Consumer<QuicheQuicChannel> freeTask, final int localConnIdLength, final QuicheConfig config) {
        final ByteBuffer key = dcid.internalNioBuffer(dcid.readerIndex(), dcid.readableBytes());
        return this.getChannel(key);
    }
    
    @Override
    protected void connectQuicChannel(final QuicheQuicChannel channel, final SocketAddress remoteAddress, final SocketAddress localAddress, final ByteBuf senderSockaddrMemory, final ByteBuf recipientSockaddrMemory, final Consumer<QuicheQuicChannel> freeTask, final int localConnIdLength, final QuicheConfig config, final ChannelPromise promise) {
        try {
            channel.connectNow(this.sslEngineProvider, this.sslTaskExecutor, freeTask, config.nativeAddress(), localConnIdLength, config.isDatagramSupported(), senderSockaddrMemory.internalNioBuffer(0, senderSockaddrMemory.capacity()), recipientSockaddrMemory.internalNioBuffer(0, recipientSockaddrMemory.capacity()));
        }
        catch (final Throwable cause) {
            promise.setFailure(cause);
            return;
        }
        this.addChannel(channel);
        channel.finishConnect();
        promise.setSuccess();
    }
}
