/* Zipper.java - unzips files.
 *
 * Copyright (c) 2012 Andrew Krizhanovsky <andrew.krizhanovsky at gmail.com>
 * Distributed under EPL/LGPL/GPL/AL/BSD multi-license.
 */

package wikokit.base.wikt.db;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import android.os.Environment;

public class Zipper {	
        
	/* Unzips files from the dir/zipname location at SD card.
	 * 
	 * @see http://stackoverflow.com/questions/3382996/how-to-unzip-files-programmatically-in-android
	 */
	public static boolean unpackZipToExternalStorage(
									String dir, String zip_filename)
	{	
		StringBuilder path = new StringBuilder();
		path.append(Environment.getExternalStorageDirectory().getAbsolutePath());
		path.append(File.separator);
		path.append(dir);
		
		return unpackZip(path.toString(), zip_filename);
	}
	
	
	/* Unzips files from the "file_path / zip_file" location.
	 * 
	 * @see http://stackoverflow.com/questions/3382996/how-to-unzip-files-programmatically-in-android
	 */
	public static boolean unpackZip(String file_path, String zip_file)
	{    
		InputStream is;
		ZipInputStream zis;

		try 
		{
			 is = new FileInputStream(file_path + File.separator + zip_file);
			zis = new ZipInputStream(new BufferedInputStream(is));          
			ZipEntry ze;

			// "if" instead of "while", since we have only one file in our zip-archive
			if ((ze = zis.getNextEntry()) != null) 
			{
				long total_size = ze.getSize();
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				byte[] buffer = new byte[1024];
				int count;

				FileOutputStream fout = new FileOutputStream(file_path + File.separator + ze.getName()); // unzipped file

				long unzipped_size = 0;
				int i = 0;
				while ((count = zis.read(buffer)) != -1) 
				{
					baos.write(buffer, 0, count);
					byte[] bytes = baos.toByteArray();
					fout.write(bytes);             
					baos.reset();
					
					unzipped_size += count;
					i ++;
					
					if (0 == i % 100) {
	                	System.out.println("total_size=" + total_size +
	        							"; unzipped_size=" + unzipped_size);
					}
				}
				fout.close();               
				zis.closeEntry();
			}
			zis.close();
		} 
		catch(IOException e)
		{
			e.printStackTrace();
			return false;
		}

		return true;
	}	
}
