package app.create.rpg.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import android.os.FileObserver; import android.os.Parcel; import app.create.rpg.ActivityProject; import com.jinoh.ruby.marshal.Marshal; public class CachedRMData extends CachedFile { public CachedRMData(File file, ActivityProject main, String name) { super(file, main, name); } public CachedRMData(Parcel source) { super(source); // TODO: Could this be the best way to store and load state? try { mData = Marshal.loadAs (source.createByteArray(), List.class); } catch (IOException e) { try { load(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } @SuppressWarnings("unchecked") public List<Object> getData() { return (List<Object>) mData; } @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); // TODO: Could this be the best way to store and load state? try { dest.writeByteArray(Marshal.dump(mData)); } catch (IOException e) { e.printStackTrace(); } } @Override public void load() throws IOException { InputStream is = new FileInputStream(mFile); try { Object loadData = Marshal.load(is); is.close(); is = null; if (loadData.getClass().isArray()) { Object[] arr = (Object[]) loadData; List<Object> list = new ArrayList<Object>(arr.length); for (int i = 1; i < arr.length; ++i) { if (arr[i] != null) list.add(arr[i]); } mData = list; } else throw new IOException ("Broken file"); } catch (FileNotFoundException e) { onEvent(FileObserver.DELETE_SELF, mFile.getAbsolutePath()); } finally { System.gc(); if (is != null) is.close(); } } @SuppressWarnings("unchecked") @Override public void save() throws IOException { if (mData != null) { List<Object> list = (List<Object>) mData; Object[] data = new Object[list.size()+1]; int i = 0; data[0] = null; for (Object o : list) { data[++i] = o; } OutputStream os = new FileOutputStream(mFile); Marshal.dump(os, data); os.close(); } } public static Creator<CachedRMData> CREATOR = new Creator<CachedRMData>() { public CachedRMData[] newArray(int size) { return new CachedRMData[size]; } public CachedRMData createFromParcel(Parcel source) { return new CachedRMData(source); } }; }