/*
 * Samira & Aymeric
 * RTM1
 * 16/11/2004
 * Java - M1 - TP2 - WinZip
 * fichier : ourZip.java
 *
 * Cette classe permet de zipper, dézipper et voir le contenu d'un fichier zippé
 */

import javax.swing.table.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.util.zip.*;
import java.util.*;
import java.text.*;
import sun.text.Normalizer;

public class ourZip
{ 
	public ourZip()
	{
	}
	
	/*
	 * Fonction recursive permettant de voir si on traite un repertoire ou un fichier simple
	 * si c'est un fichier on le compresse, sinon on réapplique la fonction au sous-repertoire
	 *
	 * Remarque : on ne tient pas compte de l'arborescence qui sera perdu lors de la
	 * décompression.
	 */
	public void myZipDir(File inFiles, ZipOutputStream out)
	{
		if (inFiles.isDirectory() == false) myCompress(inFiles,out);
		else
		{
			File[] inSide=inFiles.listFiles();
		
			for (int j=0; j < inSide.length; j++)
				myZipDir(inSide[j],out);
		}
	}

	/*
	 * Fonction qui zip un fichier passé en paramètre
	 */
	public void myCompress(File toZip, ZipOutputStream out)
	{
		final int BUFFER = 2048;
		byte data[] = new byte[BUFFER];
		
		try
		{
			FileInputStream fi = new FileInputStream(toZip);
			BufferedInputStream buffi = new BufferedInputStream(fi, BUFFER);
			
			try
			{
				ZipEntry entry = new ZipEntry(unAccent(toZip.getName()));
				out.putNextEntry(entry);
			}
			catch(IOException ioe){}
			
			int count;
			try
			{
				while ( (count = buffi.read(data, 0, BUFFER)) != -1)
					out.write(data, 0, count);
					
				out.closeEntry();
				
				buffi.close();
			}
			catch(IOException ioe){}
			
		}
		catch(FileNotFoundException fnfe){}
	}


	/*
	 * Fonction appelé lorsqu'on veut zipper un(des) fichier(s)
	 */
	public void myZip(File[] inFiles, String outFile, int taux, int method)
	{
		try
		{
			FileOutputStream dest = new FileOutputStream(outFile);
			BufferedOutputStream buff = new BufferedOutputStream(dest);

			ZipOutputStream out = new ZipOutputStream(buff);
	
			out.setMethod(method);
			out.setLevel(taux);
		
			for (int i=0; i < inFiles.length; i++)
			{
				myZipDir(inFiles[i],out);
			}
			
			try
			{
				out.close();
			}
			catch(IOException ioe){}
		}
		catch(FileNotFoundException fnfe){}
		
	}
	
	/*
	 * Fonction qui permet de voir le contenu d'une archive zip
	 */
	public void myViewZip(File inFile, SamAymZip SAZ)
	{
		try
		{
			ZipFile zf = new ZipFile(inFile);
			Enumeration entries = zf.entries();
			
			while (entries.hasMoreElements())
			{
				ZipEntry e = (ZipEntry)entries.nextElement();
				DateFormat df = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss");
				Date d = null;
				d = new Date(e.getTime());
				double ratio=(e.getSize() - e.getCompressedSize()) * 100 / e.getSize();
				SAZ.ajoute(e.getName(),e.getSize(),d.toString(),new String(ratio + "%"));
			}
		}
		catch(IOException ioe){}
	}
	
	/*
	 * Fonction qui permet de dézipper une archive
	 */
	public void myUnZip(String inFile, String outDir)
	{
		final int BUFFER = 2048;
		byte data[] = new byte[BUFFER];
		
		BufferedOutputStream dest = null;
		
		try
		{
			FileInputStream fis = new FileInputStream(inFile);
			
			BufferedInputStream buffi = new BufferedInputStream(fis);
			
			ZipInputStream zis = new ZipInputStream(buffi);
			
			ZipEntry entry;
			
			try
			{
				while ((entry = zis.getNextEntry()) != null)
				{
					
					FileOutputStream fos = new FileOutputStream(outDir + File.separator + entry.getName());
					
					dest = new BufferedOutputStream(fos, BUFFER);
					
					int count;
					while ((count = zis.read(data, 0, BUFFER)) != -1)
						dest.write(data, 0, count);
					
					dest.flush();
				
					dest.close();
				}
				
				zis.close();
			}
			catch(IOException ioe){}
			
		}
		catch(FileNotFoundException fnfe){}
	}
	
	public static String unAccent(String s)
	{
		String temp = Normalizer.normalize(s, Normalizer.DECOMP, 0);
		return temp.replaceAll("[^\\p{ASCII}]","");
	}
}

