package com.algobase.share.system;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;

import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;


public class MyZipFile {

  static final int buf_sz = 2048;


  public void progress(int count, int max) {}


  public boolean unzip(File zip_file, File out_path)
  { 
    try 
    {
      ZipFile zf = new ZipFile(zip_file);
      InputStream is = new FileInputStream(zip_file);
      ZipInputStream zis = new ZipInputStream(new BufferedInputStream(is));          
      int numEntries = zf.size();
      int countEntries = 0;

      progress(0,numEntries);

      ZipEntry ze;
      byte[] buffer = new byte[1024];
      int count;
  
      while ((ze = zis.getNextEntry()) != null) 
      {
         progress(++countEntries,numEntries);

          File f = new File(out_path,ze.getName());
  
          if (ze.isDirectory()) {
             f.mkdirs();
             continue;
          }
  
          FileOutputStream out = new FileOutputStream(f);
          while ((count = zis.read(buffer)) != -1) out.write(buffer,0,count);
          out.close();               

          zis.closeEntry();
      }
  
      zis.close();
    } catch(IOException e) { e.printStackTrace(); return false; }
  
    return true;
 }


public boolean zip(File source, File zipFile) 
{
   try {

     FileOutputStream out = new FileOutputStream(zipFile);
     ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(out));

      if (source.isDirectory())
          zipFolder(zout,source);
      else 
          { byte buffer[] = new byte[buf_sz];
            FileInputStream in = new FileInputStream(source);
            ZipEntry entry = new ZipEntry(source.getName());
            zout.putNextEntry(entry);
            int n = 0;
            while ((n = in.read(buffer)) != -1) zout.write(buffer,0,n);
            in.close();
           }

       zout.close();

    } catch (Exception e) { e.printStackTrace(); return false; }

    return true;
  }


 private void zipFolder(ZipOutputStream out, File folder) throws IOException 
 {
   File[] fileList = folder.listFiles();

   for (File file : fileList) 
   { 
     if (file.isDirectory()) 
     { zipFolder(out,file);
       continue;
      }

     byte buffer[] = new byte[buf_sz];

     FileInputStream in = new FileInputStream(file);
     ZipEntry entry = new ZipEntry(file.getName());
     out.putNextEntry(entry);

     int n;
     while ((n = in.read(buffer,0,buf_sz)) != -1) out.write(buffer,0,n);
     in.close();
   }
 }

  
}

