package app.create.rpg.task; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.StringWriter; import android.os.Parcel; import app.create.rpg.R; import app.create.rpg.ServiceFileTask; import app.create.rpg.rgssad.RgssEntry; import app.create.rpg.rgssad.RgssInputStream; public class TaskExtractRgssad extends Task { private String mPath; public TaskExtractRgssad(String path) { super (); mPath = path; } public TaskExtractRgssad(Parcel source) { super (source); mPath = source.readString(); } @Override public int describeContents () { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeString(mPath); } @Override public void setService(ServiceFileTask service, int id, int queue) { super.setService(service, id, queue); mMessage = service.getString(R.string.task_decompressing); } @Override public void run() { try { File file = new File(mPath); File folder = file.getParentFile(); RgssInputStream zis = new RgssInputStream(new FileInputStream(file), 0xDEADCAFE); OutputStream os = null; RgssEntry ze; int len, counter; long total, read; String strMsgPrefix = mService.getString(R.string.task_decompressing); try { byte[] buffer = new byte[1024]; 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().replace('\\', '/')); if (ze.isDirectory()) { file.mkdirs(); continue; } else file.getParentFile().mkdirs(); os = new FileOutputStream(file); total = ze.getSize(); read = 0; counter = 0; mService.onTaskUpdate(this); while ((len = zis.read(buffer)) > 0) { read += len; os.write(buffer, 0, len); if (++counter > 10) { mService.onTaskUpdate(this); counter = 0; } mProgress = (float) (((double) read) / total); } os.close(); } } finally { try { os.close(); } catch (Exception e) { } // This should catch every exception including NullPointerException :P zis.close(); } // end extract } catch (Exception e) { StringWriter sw = new StringWriter (); e.printStackTrace(new PrintWriter(sw)); mMessage = sw.toString(); try { Thread.sleep(999999); } catch (Throwable e1) { } } } public static final TaskExtractRgssad EMPTY = new TaskExtractRgssad(""); public static final Creator<TaskExtractRgssad> CREATOR = new Creator<TaskExtractRgssad>() { @Override public TaskExtractRgssad[] newArray(int size) { return new TaskExtractRgssad[size]; } @Override public TaskExtractRgssad createFromParcel(Parcel source) { return new TaskExtractRgssad(source); } }; }