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

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

import java.util.Collections;
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.WebSocketServerExtension;
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.WebSocketServerExtensionHandshaker;

public final class DeflateFrameServerExtensionHandshaker implements WebSocketServerExtensionHandshaker
{
    public static final int DEFAULT_COMPRESSION_LEVEL = 6;
    static final String X_WEBKIT_DEFLATE_FRAME_EXTENSION = "x-webkit-deflate-frame";
    static final String DEFLATE_FRAME_EXTENSION = "deflate-frame";
    private final int compressionLevel;
    private final WebSocketExtensionFilterProvider extensionFilterProvider;
    private final int maxAllocation;
    
    @Deprecated
    public DeflateFrameServerExtensionHandshaker() {
        this(6, 0);
    }
    
    @Deprecated
    public DeflateFrameServerExtensionHandshaker(final int compressionLevel) {
        this(compressionLevel, 0);
    }
    
    public DeflateFrameServerExtensionHandshaker(final int compressionLevel, final int maxAllocation) {
        this(compressionLevel, WebSocketExtensionFilterProvider.DEFAULT, maxAllocation);
    }
    
    @Deprecated
    public DeflateFrameServerExtensionHandshaker(final int compressionLevel, final WebSocketExtensionFilterProvider extensionFilterProvider) {
        this(compressionLevel, extensionFilterProvider, 0);
    }
    
    public DeflateFrameServerExtensionHandshaker(final int compressionLevel, final WebSocketExtensionFilterProvider extensionFilterProvider, final int maxAllocation) {
        if (compressionLevel < 0 || compressionLevel > 9) {
            throw new IllegalArgumentException("compressionLevel: " + compressionLevel + " (expected: 0-9)");
        }
        this.compressionLevel = compressionLevel;
        this.extensionFilterProvider = ObjectUtil.checkNotNull(extensionFilterProvider, "extensionFilterProvider");
        this.maxAllocation = ObjectUtil.checkPositiveOrZero(maxAllocation, "maxAllocation");
    }
    
    @Override
    public WebSocketServerExtension 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 DeflateFrameServerExtension(this.compressionLevel, extensionData.name(), this.extensionFilterProvider, this.maxAllocation);
        }
        return null;
    }
    
    private static class DeflateFrameServerExtension implements WebSocketServerExtension
    {
        private final String extensionName;
        private final int compressionLevel;
        private final WebSocketExtensionFilterProvider extensionFilterProvider;
        private final int maxAllocation;
        
        DeflateFrameServerExtension(final int compressionLevel, final String extensionName, final WebSocketExtensionFilterProvider extensionFilterProvider, final int maxAllocation) {
            this.extensionName = extensionName;
            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);
        }
        
        @Override
        public WebSocketExtensionData newReponseData() {
            return new WebSocketExtensionData(this.extensionName, Collections.emptyMap());
        }
    }
}
