diff --git a/src/org/microg/safeparcel/AutoSafeParcelable.java b/src/org/microg/safeparcel/AutoSafeParcelable.java new file mode 100644 index 0000000..fcbed32 --- /dev/null +++ b/src/org/microg/safeparcel/AutoSafeParcelable.java @@ -0,0 +1,36 @@ +package org.microg.safeparcel; + +import android.os.Parcel; + +import java.lang.reflect.Array; + +public abstract class AutoSafeParcelable implements SafeParcelable { + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + SafeParcelUtil.writeObject(this, out, flags); + } + + public static class AutoCreator implements Creator { + + private Class tClass; + + public AutoCreator(Class tClass) { + this.tClass = tClass; + } + + @Override + public T createFromParcel(Parcel parcel) { + return SafeParcelUtil.createObject(tClass, parcel); + } + + @Override + public T[] newArray(int i) { + return (T[]) Array.newInstance(tClass, i); + } + } +} diff --git a/src/org/microg/safeparcel/SafeParcelUtil.java b/src/org/microg/safeparcel/SafeParcelUtil.java index 05706f7..18ed3aa 100644 --- a/src/org/microg/safeparcel/SafeParcelUtil.java +++ b/src/org/microg/safeparcel/SafeParcelUtil.java @@ -5,13 +5,31 @@ import android.os.Parcel; import android.os.Parcelable; import android.util.Log; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; public class SafeParcelUtil { private static final String TAG = "SafeParcel"; + public static T createObject(Class tClass, Parcel in) { + try { + Constructor constructor = tClass.getDeclaredConstructor(); + boolean acc = constructor.isAccessible(); + constructor.setAccessible(true); + T t = constructor.newInstance(); + readObject(t, in); + constructor.setAccessible(acc); + return t; + } catch (NoSuchMethodException e) { + throw new RuntimeException("createObject() requires a default constructor"); + } catch (InvocationTargetException | InstantiationException | IllegalAccessException e) { + throw new RuntimeException("Can't construct object", e); + } + } + public static void writeObject(SafeParcelable object, Parcel parcel, int flags) { if (object == null) throw new NullPointerException();