/* * This code is in the public domain. */ package org.geometerplus.android.fbreader.api; import java.util.ArrayList; import java.util.List; import android.os.Parcel; import android.os.Parcelable; public abstract class ApiObject implements Parcelable { protected static interface Type { int ERROR = -1; int VOID = 0; int INT = 1; int STRING = 2; int BOOLEAN = 3; int DATE = 4; int LONG = 5; int TEXT_POSITION = 10; } static class Void extends ApiObject { static Void Instance = new Void(); private Void() { } @Override protected int type() { return Type.VOID; } } static class Integer extends ApiObject { final int Value; Integer(int value) { Value = value; } @Override protected int type() { return Type.INT; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeInt(Value); } } static class Long extends ApiObject { final long Value; Long(long value) { Value = value; } @Override protected int type() { return Type.LONG; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeLong(Value); } } static class Boolean extends ApiObject { final boolean Value; Boolean(boolean value) { Value = value; } @Override protected int type() { return Type.BOOLEAN; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeByte((byte)(Value ? 1 : 0)); } } static class Date extends ApiObject { final java.util.Date Value; Date(java.util.Date value) { Value = value; } @Override protected int type() { return Type.DATE; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeLong(Value.getTime()); } } static class String extends ApiObject { final java.lang.String Value; String(java.lang.String value) { Value = value; } @Override protected int type() { return Type.STRING; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeString(Value); } } static class Error extends ApiObject { final java.lang.String Message; Error(java.lang.String message) { Message = message; } @Override protected int type() { return Type.ERROR; } @Override public void writeToParcel(Parcel parcel, int flags) { super.writeToParcel(parcel, flags); parcel.writeString(Message); } } static ApiObject envelope(int value) { return new Integer(value); } static ApiObject envelope(long value) { return new Long(value); } static ApiObject envelope(boolean value) { return new Boolean(value); } static ApiObject envelope(java.lang.String value) { return new String(value); } static ApiObject envelope(java.util.Date value) { return new Date(value); } static List<ApiObject> envelopeStringList(List<java.lang.String> values) { final ArrayList<ApiObject> objects = new ArrayList<ApiObject>(values.size()); for (java.lang.String v : values) { objects.add(new String(v)); } return objects; } static List<ApiObject> envelopeIntegerList(List<java.lang.Integer> values) { final ArrayList<ApiObject> objects = new ArrayList<ApiObject>(values.size()); for (java.lang.Integer v : values) { objects.add(new Integer(v)); } return objects; } abstract protected int type(); public int describeContents() { return 0; } public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(type()); } public static final Parcelable.Creator<ApiObject> CREATOR = new Parcelable.Creator<ApiObject>() { public ApiObject createFromParcel(Parcel parcel) { final int code = parcel.readInt(); switch (code) { default: return new Error("Unknown object code: " + code); case Type.ERROR: return new Error(parcel.readString()); case Type.VOID: return Void.Instance; case Type.INT: return new Integer(parcel.readInt()); case Type.LONG: return new Long(parcel.readLong()); case Type.BOOLEAN: return new Boolean(parcel.readByte() == 1); case Type.DATE: return new Date(new java.util.Date(parcel.readLong())); case Type.STRING: return new String(parcel.readString()); case Type.TEXT_POSITION: return new TextPosition(parcel.readInt(), parcel.readInt(), parcel.readInt()); } } public ApiObject[] newArray(int size) { return new ApiObject[size]; } }; }