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

package io.netty.handler.codec.http.websocketx.extensions.compression;

import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionDecoder;
import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionEncoder;
import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtension;
import java.util.Collections;
import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionData;
import io.netty.util.internal.ObjectUtil;
import io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionFilterProvider;
import io.netty.handler.codec.http.websocketx.extensions.WebSocketClientExtensionHandshaker;

public final class DeflateFrameClientExtensionHandshaker implements WebSocketClientExtensionHandshaker
{
    private final int compressionLevel;
    private final boolean useWebkitExtensionName;
    private final WebSocketExtensionFilterProvider extensionFilterProvider;
    private final int maxAllocation;
    
    @Deprecated
    public DeflateFrameClientExtensionHandshaker(final boolean useWebkitExtensionName) {
        this(6, useWebkitExtensionName, 0);
    }
    
    public DeflateFrameClientExtensionHandshaker(final boolean useWebkitExtensionName, final int maxAllocation) {
        this(6, useWebkitExtensionName, maxAllocation);
    }
    
    @Deprecated
    public DeflateFrameClientExtensionHandshaker(final int compressionLevel, final boolean useWebkitExtensionName) {
        this(compressionLevel, useWebkitExtensionName, 0);
    }
    
    public DeflateFrameClientExtensionHandshaker(final int compressionLevel, final boolean useWebkitExtensionName, final int maxAllocation) {
        this(compressionLevel, useWebkitExtensionName, WebSocketExtensionFilterProvider.DEFAULT, maxAllocation);
    }
    
    @Deprecated
    public DeflateFrameClientExtensionHandshaker(final int compressionLevel, final boolean useWebkitExtensionName, final WebSocketExtensionFilterProvider extensionFilterProvider) {
        this(compressionLevel, useWebkitExtensionName, extensionFilterProvider, 0);
    }
    
    public DeflateFrameClientExtensionHandshaker(final int compressionLevel, final boolean useWebkitExtensionName, final WebSocketExtensionFilterProvider extensionFilterProvider, final int maxAllocation) {
        if (compressionLevel < 0 || compressionLevel > 9) {
            throw new IllegalArgumentException("compressionLevel: " + compressionLevel + " (expected: 0-9)");
        }
        this.compressionLevel = compressionLevel;
        this.useWebkitExtensionName = useWebkitExtensionName;
        this.extensionFilterProvider = ObjectUtil.checkNotNull(extensionFilterProvider, "extensionFilterProvider");
        this.maxAllocation = ObjectUtil.checkPositiveOrZero(maxAllocation, "maxAllocation");
    }
    
    @Override
    public WebSocketExtensionData newRequestData() {
        return new WebSocketExtensionData(this.useWebkitExtensionName ? "x-webkit-deflate-frame" : "deflate-frame", Collections.emptyMap());
    }
    
    @Override
    public WebSocketClientExtension handshakeExtension(final WebSocketExtensionData extensionData) {
        if (!"x-webkit-deflate-frame".equals(extensionData.name()) && !"deflate-frame".equals(extensionData.name())) {
            return null;
        }
        if (extensionData.parameters().isEmpty()) {
            return new DeflateFrameClientExtension(this.compressionLevel, this.extensionFilterProvider, this.maxAllocation);
        }
        return null;
    }
    
    private static class DeflateFrameClientExtension implements WebSocketClientExtension
    {
        private final int compressionLevel;
        private final WebSocketExtensionFilterProvider extensionFilterProvider;
        private final int maxAllocation;
        
        DeflateFrameClientExtension(final int compressionLevel, final WebSocketExtensionFilterProvider extensionFilterProvider, final int maxAllocation) {
            this.compressionLevel = compressionLevel;
            this.extensionFilterProvider = extensionFilterProvider;
            this.maxAllocation = maxAllocation;
        }
        
        @Override
        public int rsv() {
            return 4;
        }
        
        @Override
        public WebSocketExtensionEncoder newExtensionEncoder() {
            return new PerFrameDeflateEncoder(this.compressionLevel, 15, false, this.extensionFilterProvider.encoderFilter());
        }
        
        @Override
        public WebSocketExtensionDecoder newExtensionDecoder() {
            return new PerFrameDeflateDecoder(false, this.extensionFilterProvider.decoderFilter(), this.maxAllocation);
        }
    }
}
