//
//  ========================================================================
//  Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd.
//  ------------------------------------------------------------------------
//  All rights reserved. This program and the accompanying materials
//  are made available under the terms of the Eclipse Public License v1.0
//  and Apache License v2.0 which accompanies this distribution.
//
//      The Eclipse Public License is available at
//      http://www.eclipse.org/legal/epl-v10.html
//
//      The Apache License v2.0 is available at
//      http://www.opensource.org/licenses/apache2.0.php
//
//  You may elect to redistribute this code under either of these licenses.
//  ========================================================================
//

package org.eclipse.jetty.spdy;

import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
import java.util.zip.ZipException;

public class StandardCompressionFactory implements CompressionFactory
{
    @Override
    public Compressor newCompressor()
    {
        return new StandardCompressor();
    }

    @Override
    public Decompressor newDecompressor()
    {
        return new StandardDecompressor();
    }

    public static class StandardCompressor implements Compressor
    {
        private final Deflater deflater = new Deflater();

        @Override
        public void setInput(byte[] input)
        {
            deflater.setInput(input);
        }

        @Override
        public void setDictionary(byte[] dictionary)
        {
            deflater.setDictionary(dictionary);
        }

        @Override
        public int compress(byte[] output)
        {
            return deflater.deflate(output, 0, output.length, Deflater.SYNC_FLUSH);
        }
    }

    public static class StandardDecompressor implements CompressionFactory.Decompressor
    {
        private final Inflater inflater = new Inflater();

        @Override
        public void setDictionary(byte[] dictionary)
        {
            inflater.setDictionary(dictionary);
        }

        @Override
        public void setInput(byte[] input)
        {
            inflater.setInput(input);
        }

        @Override
        public int decompress(byte[] output) throws ZipException
        {
            try
            {
                return inflater.inflate(output);
            }
            catch (DataFormatException x)
            {
                throw (ZipException)new ZipException().initCause(x);
            }
        }
    }
}
