﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Class
Version=7.95
@EndOfDesignText@
#Event: Finish (Success as Boolean)

Sub Class_Globals
	Private mCallBack As Object
	Private mEvent As String
	
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize(CallBack As Object, Event As String)
	mCallBack	= CallBack
	mEvent		= Event
End Sub


public Sub Zip(FilesTxt() As String, FileZip As String)
	Dim J As JavaObject = Me
	J.RunMethod("ZipCompress", Array(FilesTxt,FileZip))
End Sub

public Sub unZip(FileZip As String, OutPutFolder As String, SelName As String)
	Dim J As JavaObject = Me
	J.RunMethod("unZipDecompress", Array(FileZip,OutPutFolder,SelName))
End Sub

public Sub unZipList(FileZip As String) As List
	Dim J As JavaObject = Me
	Dim L As List		= J.RunMethod("unZipList", Array(FileZip))
	Return L
End Sub

Private Sub zip_complete
	If SubExists(mCallBack,mEvent & "_Finish") Then CallSubDelayed2(mCallBack,mEvent & "_Finish",True)
End Sub

Private Sub zip_error
	If SubExists(mCallBack,mEvent & "_Finish") Then CallSubDelayed2(mCallBack,mEvent & "_Finish",False)
End Sub

#if java
import java.io.*;
import java.util.zip.*;
import java.util.List;
import java.util.ArrayList;

//import anywheresoftware.b4a.BA.Permissions;
//@Permissions(values={"android.permission.WRITE_EXTERNAL_STORAGE"})

public void ZipCompress(String[] txtFile, String zipFile) throws IOException {
	try {
		ZipOutputStream out = new ZipOutputStream (new BufferedOutputStream(new FileOutputStream(zipFile)));
		for (int i = 0; i<txtFile.length; i++) {
			byte[] data				= new byte[4096]; 
			BufferedInputStream in	= new BufferedInputStream (new FileInputStream(txtFile[i]));
			int count;
			out.putNextEntry(new ZipEntry(txtFile[i].substring(txtFile[i].lastIndexOf("\\") + 1)));
			while ((count = in.read(data,0,4096)) != -1) { 
				out.write(data, 0, count);
			}
			in.close();
			out.flush();
			out.closeEntry();
			ba.Log("File: "+txtFile[i]);
		}
		out.close();
		ba.raiseEvent(null, "zip_complete");
	} catch(Exception e) {
		ba.Log(e.toString());
		ba.raiseEvent(null, "zip_error");
	}
}

public void unZipDecompress(String zipFile, String outputFolder, String fileSel) {
     byte[] buffer = new byte[1024];
     try{
		File folder = new File(outputFolder);
		if(!folder.exists()) folder.mkdir();
		ZipInputStream zis	= new ZipInputStream(new FileInputStream(zipFile));
		ZipEntry ze			= zis.getNextEntry();
		while (ze!=null) {
			String fileEntry	= ze.getName();
			String fileName 	= fileEntry;
			// Don't create sub folder(s) when file(s) selection
			if (fileSel!="" && fileName.contains("/")) fileName = fileName.substring(fileName.lastIndexOf("/")+1);
			File newFile 		= new File(outputFolder + File.separator + fileName);
			new File(newFile.getParent()).mkdirs();

			if (!fileEntry.endsWith("/") && fileEntry.contains(fileSel)) {
				ba.Log("Extract: "+fileName);
				int len;
           		FileOutputStream fos = new FileOutputStream(newFile);
				while ((len = zis.read(buffer)) > 0) {
					fos.write(buffer, 0, len);
				}
				fos.close();
			}
			ze = zis.getNextEntry();
		}
		zis.closeEntry();
		zis.close();
		ba.raiseEvent(null, "zip_complete");
	} catch(IOException e) {
		ba.Log(e.toString());
		ba.raiseEvent(null, "zip_error");
	}
}

public List unZipList(String zipFile) {
	List<String> l = new ArrayList<String>();
	try {
		ZipInputStream zis	= new ZipInputStream(new FileInputStream(zipFile));
    	ZipEntry ze			= zis.getNextEntry();
     	while (ze!=null) {
			String fileName = ze.getName();
			l.add(fileName);
			ba.Log("List: "+fileName);
			ze = zis.getNextEntry();
    	}
		zis.closeEntry();
		zis.close();
		ba.raiseEvent(null, "zip_complete");
	} catch(IOException e) {
		ba.Log(e.toString());
		ba.raiseEvent(null, "zip_error");
    }
	return l;
}
#End If
