package com.lody.virtual.helper;
import android.os.Parcel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author Lody
*/
public abstract class PersistenceLayer {
private File mPersistenceFile;
public PersistenceLayer(File persistenceFile) {
this.mPersistenceFile = persistenceFile;
}
public final File getPersistenceFile() {
return mPersistenceFile;
}
public abstract int getCurrentVersion();
public abstract void writeMagic(Parcel p);
public abstract boolean verifyMagic(Parcel p);
public abstract void writePersistenceData(Parcel p);
public abstract void readPersistenceData(Parcel p);
public abstract boolean onVersionConflict(int fileVersion, int currentVersion);
public abstract void onPersistenceFileDamage();
public void save() {
Parcel p = Parcel.obtain();
try {
writeMagic(p);
p.writeInt(getCurrentVersion());
writePersistenceData(p);
FileOutputStream fos = new FileOutputStream(mPersistenceFile);
fos.write(p.marshall());
fos.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
p.recycle();
}
}
public void read() {
File file = mPersistenceFile;
Parcel p = Parcel.obtain();
try {
FileInputStream fis = new FileInputStream(file);
byte[] bytes = new byte[(int) file.length()];
int len = fis.read(bytes);
fis.close();
if (len != bytes.length) {
throw new IOException("Unable to read Persistence file.");
}
p.unmarshall(bytes, 0, bytes.length);
p.setDataPosition(0);
if (!verifyMagic(p)) {
onPersistenceFileDamage();
throw new IOException("Invalid persistence file.");
}
int fileVersion = p.readInt();
int currentVersion = getCurrentVersion();
if (fileVersion != getCurrentVersion()) {
if (!onVersionConflict(fileVersion, currentVersion)) {
throw new IOException("Unable to process the bad version persistence file.");
}
}
readPersistenceData(p);
} catch (Exception e) {
if (!(e instanceof FileNotFoundException)) {
e.printStackTrace();
}
} finally {
p.recycle();
}
}
}