package novotnyr.zip;

import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.util.Arrays;
import java.util.zip.ZipInputStream;

public class AutodetectingZipInputStream extends FilterInputStream {
    private boolean inputIsCompressed = false;
  
    public AutodetectingZipInputStream(InputStream inputStream) throws IOException {
        this(inputStream, false);
    }
    
    public AutodetectingZipInputStream(InputStream inputStream, boolean doNotDecompress)
        throws IOException
    {
        super(inputStream);

        PushbackInputStream pbIn = new PushbackInputStream(inputStream, 4);
        if(inputStream instanceof ZipInputStream) {
            inputIsCompressed = true;
        } else {           
            byte[] buffer = new byte[4];
            pbIn.read(buffer);            
            if(Arrays.equals(buffer, new byte[] {0x50, 0x4b, 0x03, 0x04})) {
                inputIsCompressed = true;
            }            
            pbIn.unread(buffer);
        }        
        if(inputIsCompressed && !doNotDecompress) {
            ZipInputStream z = new ZipInputStream(pbIn);
            z.getNextEntry();
            super.in = z;            
        } else {
            super.in = pbIn;
        }
    }

      
    public boolean isInputCompressed() {
        return inputIsCompressed;
    }

    public void setInputIsCompressed(boolean inputIsCompressed) {
        this.inputIsCompressed = inputIsCompressed;
    } 
}
