package app.create.rpg.task; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import android.os.Parcel; import android.util.Log; import app.create.rpg.R; public class TaskDecompressZip extends Task { protected String mFolder, mFile; protected int mResId; public TaskDecompressZip() { super(); } public TaskDecompressZip(String folder, int resId) { super (); mFolder = folder; mFile = null; mResId = resId; } public TaskDecompressZip(File folder, int resId) { super (); mFolder = folder.getAbsolutePath(); mFile = null; mResId = resId; } public TaskDecompressZip(String folder, String file) { super (); mFolder = folder; mFile = file; mResId = 0; } public TaskDecompressZip(File folder, String file) { super (); mFolder = folder.getAbsolutePath(); mFile = file; mResId = 0; } public TaskDecompressZip(String folder, File file) { super (); mFolder = folder; mFile = file.getAbsolutePath(); mResId = 0; } public TaskDecompressZip(File folder, File file) { super (); mFolder = folder.getAbsolutePath(); mFile = file.getAbsolutePath(); mResId = 0; } public TaskDecompressZip(Parcel source) { super(source); mFolder = source.readString(); mFile = source.readString(); mResId = source.readInt(); } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeString(mFolder); dest.writeString(mFile); dest.writeInt(mResId); } @Override public void run() { try { Log.d("CreateRPG", "TaskDecompressZip start"); File folder = new File(mFolder), file; folder.mkdirs(); if (!folder.isDirectory()) throw new IOException ("Directory creation failure : " + folder.getAbsolutePath()); Log.d("CreateRPG", "TaskDecompressZip open zis"); ZipInputStream zis = new ZipInputStream(mFile != null ? new FileInputStream(mFile) : mService.getResources().openRawResource(mResId)); OutputStream os = null; ZipEntry ze; int len, counter; long total, read; String strMsgPrefix = mService.getString(R.string.task_decompressing); try { byte[] buffer = new byte[8192]; Log.d("CreateRPG", "TaskDecompressZip start reading zip entries"); int cnt = 0; while ((ze = zis.getNextEntry()) != null) { if (Thread.interrupted()) return; mMessage = new StringBuilder(strMsgPrefix).append(ze.getName()).toString(); mProgress = 0.0f; file = new File(folder, ze.getName()); if (ze.isDirectory()) { file.mkdirs(); continue; } else file.getParentFile().mkdirs(); os = new FileOutputStream(file); total = ze.getSize(); read = 0; counter = 0; while ((len = zis.read(buffer)) > 0) { read += len; os.write(buffer, 0, len); if (++counter > 10) { mService.onTaskUpdate(this); counter = 0; } if (total == -1) continue; mProgress = (float) (((double) read) / total); } os.close(); zis.closeEntry(); ++cnt; } Log.d("CreateRPG", "TaskDecompressZip end reading zip entries : " + cnt); } finally { try { os.close(); } catch (Exception e) { } // This should catch every exception including NullPointerException :P zis.close(); } } catch (Exception e) { Log.d("CreateRPG", "TaskDecompressZip error - " + (mFolder == null ? "null" : mFolder) + " / " + mResId, e); printException (e); } finally { Log.d("CreateRPG", "TaskDecompressZip finish"); } } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } public static final TaskDecompressZip EMPTY = new TaskDecompressZip(); public static final Creator<TaskDecompressZip> CREATOR = new Creator<TaskDecompressZip>() { public TaskDecompressZip createFromParcel(Parcel source) { return new TaskDecompressZip(source); } public TaskDecompressZip[] newArray(int size) { return new TaskDecompressZip[size]; } }; }