1cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowhampackage com.xtremelabs.robolectric.shadows;
2cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowham
3064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
4064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
5064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport android.os.Bundle;
6cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowhamimport android.os.Parcel;
76ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkelimport android.os.Parcelable;
8064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport android.text.TextUtils;
9064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport android.util.Log;
10064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport android.util.Pair;
11064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
12cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowhamimport com.xtremelabs.robolectric.Robolectric;
13064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport com.xtremelabs.robolectric.bytecode.ShadowWrangler;
14cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowhamimport com.xtremelabs.robolectric.internal.Implementation;
15cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowhamimport com.xtremelabs.robolectric.internal.Implements;
16053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawalaimport com.xtremelabs.robolectric.internal.RealObject;
17cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowham
18064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport java.lang.reflect.Field;
19e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plissonimport java.util.ArrayList;
20064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport java.util.HashMap;
21e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plissonimport java.util.List;
22064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport java.util.Map;
23064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogenimport java.util.Set;
24e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson
25cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowham@Implements(Parcel.class)
266ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel@SuppressWarnings("unchecked")
27cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowhampublic class ShadowParcel {
28064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
29064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_NULL = -1;
30064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_STRING = 0;
31064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_INTEGER = 1;
32064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_MAP = 2;
33064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_BUNDLE = 3;
34064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_PARCELABLE = 4;
35064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_SHORT = 5;
36064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_LONG = 6;
37064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_FLOAT = 7;
38064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_DOUBLE = 8;
39064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_BOOLEAN = 9;
40064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_CHARSEQUENCE = 10;
41c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    private static final int VAL_LIST = 11;
42064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_BYTEARRAY = 13;
43064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_STRINGARRAY = 14;
44c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    private static final int VAL_PARCELABLEARRAY = 16;
45064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_OBJECTARRAY = 17;
46064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_INTARRAY = 18;
47064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_LONGARRAY = 19;
48064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_BYTE = 20;
49064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private static final int VAL_BOOLEANARRAY = 23;
50c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    private static final int VAL_CHARSEQUENCEARRAY = 24;
51064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
52064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private final ArrayList<Pair<Integer, ?>> parcelData = new ArrayList<Pair<Integer, ?>>();
537598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    private int index = 0;
547598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
55053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala    @RealObject
56053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala    private Parcel realParcel;
57053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala
587598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    @Implementation
597598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    public static Parcel obtain() {
607598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        return Robolectric.newInstanceOf(Parcel.class);
617598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
627598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
637598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    @Implementation
64064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public int dataAvail() {
65064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return dataSize() - dataPosition();
667598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
677598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
687598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    @Implementation
69064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public int dataPosition() {
70064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return calculateSizeToIndex(index);
717598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
727598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
737598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    @Implementation
74064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public int dataSize() {
75064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return calculateSizeToIndex(parcelData.size());
76e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson    }
774851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel
780fbe55be997150aa5c41faa8276e8b7ab8d826ecadriancowham    @Implementation
79064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public int dataCapacity() {
80064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return dataSize();
81dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
82dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
83dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
84064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void setDataPosition(int pos) {
85064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        index = calculateIndexFromSizePosition(pos);
86dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
87dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
88064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private int calculateSizeToIndex(int index) {
89064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int size = 0;
90064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (int i = 0; i < index; i++) {
91064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            size += parcelData.get(i).first;
92064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
93064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return size;
94ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
95ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
96064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private int calculateIndexFromSizePosition(int pos) {
97064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int size = 0;
98064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (int i = 0; i < parcelData.size(); i++) {
99064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            if (size >= pos) {
100064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return i;
101064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            }
102064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            size += parcelData.get(i).first;
103064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
104064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return parcelData.size();
105ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
106ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
107dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
108064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeString(String str) {
109064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (str == null) {
110064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(-1);
111064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else {
112064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(str.length());
113064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            addValueToList(Pair.create(str.length(), str));
114064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
1150fbe55be997150aa5c41faa8276e8b7ab8d826ecadriancowham    }
116e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson
117e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson    @Implementation
1187598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    public String readString() {
119064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
120064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
121064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return null;
122064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else {
123064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return readValueFromList(null);
124064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
1257598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
1267598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
1277598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    @Implementation
128c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public CharSequence readCharSequence() {
129c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(realParcel);
130c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
131c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
132c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
133c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public void writeCharSequence(CharSequence val) {
134c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        TextUtils.writeToParcel(val, realParcel, 0);
135c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
136c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
137c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
138064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeInt(int i) {
139064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(Integer.SIZE / 8, i));
1407598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
1417598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
142e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson    @Implementation
143064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public int readInt() {
144064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList(0);
145dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
146dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
147dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
148064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeLong(long i) {
149064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(Long.SIZE / 8, i));
150dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
151dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
152dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
153064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public long readLong() {
154064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList((long) 0);
1550fbe55be997150aa5c41faa8276e8b7ab8d826ecadriancowham    }
1564851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel
157064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
158064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeFloat(float f) {
159064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(Float.SIZE / 8, f));
160ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
161ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
162064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
163064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public float readFloat() {
164064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList((float) 0);
165ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
166ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
1670fbe55be997150aa5c41faa8276e8b7ab8d826ecadriancowham    @Implementation
168064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeDouble(double f) {
169064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(Double.SIZE / 8, f));
170e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson    }
171e1deb33276ab52fe01c4d6a4f0a3d02c29ebdc6aSebastien Plisson
1726ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel    @Implementation
173064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public double readDouble() {
174064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList((double) 0);
1754851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel    }
1764851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel
177064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeBoolean(boolean b) {
178064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(1, b));
1794851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel    }
1804851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel
181064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public boolean readBoolean() {
182064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList(false);
183064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
184064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
185064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeChar(char c) {
186064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(Character.SIZE / 8, c));
187064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
188064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
189064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public char readChar() {
190064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList((char) 0);
1914851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel    }
1924851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel
1934851b76e6ef185e8588c351cb303eb90f7e765e9Jan Berkel    @Implementation
194064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @SuppressWarnings("unchecked")
195064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeByte(byte b) {
196064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        addValueToList(Pair.create(Byte.SIZE / 8, b));
1976ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel    }
1986ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel
1996ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel    @Implementation
200064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public byte readByte() {
201064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readValueFromList((byte) 0);
2026ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel    }
2036ca1c54a32a83fcc3e347c141a0fc3ba653193b3Jan Berkel
204dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
205ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public void readBooleanArray(boolean[] val) {
206064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
207064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
208064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
209ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
210ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readBoolean();
211ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
212ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
213ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
214ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
215ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public void writeBooleanArray(boolean[] val) {
2168f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
2178f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
2188f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
2198f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
220ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        writeInt(val.length);
221064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (boolean b : val)
222064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeBoolean(b);
223ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
224ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
225ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
226ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public boolean[] createBooleanArray() {
227064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
228064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
2298f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
2308f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
231064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        boolean[] val = new boolean[N];
232ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
233ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readBoolean();
234ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
235ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
236ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
237ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
238ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
239ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public void readCharArray(char[] val) {
240064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
241064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
242064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
243ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
244ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readChar();
245ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
246ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
247ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
248ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
249ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public void writeCharArray(char[] val) {
2508f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
2518f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
2528f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
2538f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
254ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        writeInt(val.length);
255064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (char b : val)
256064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeChar(b);
257ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
258ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
259ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
260ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public char[] createCharArray() {
261064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
262064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
2638f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
2648f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
265064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        char[] val = new char[N];
266ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
267ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readChar();
268ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
269ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
270ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
271ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
272ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
273dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void readFloatArray(float[] val) {
274064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
275064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
276064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
277ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
278dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel            val[i] = readFloat();
279dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        }
280dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
281dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
282dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
283dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void writeFloatArray(float[] val) {
2848f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
2858f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
2868f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
2878f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
288dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        writeInt(val.length);
289064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (float f : val)
290064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeFloat(f);
291dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
292dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
293dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
294ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public float[] createFloatArray() {
295064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
296064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
2978f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
2988f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
299064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        float[] val = new float[N];
300ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
301ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readFloat();
302ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
303ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
304ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
305ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
306ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
307dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void writeDoubleArray(double[] val) {
3088f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
3098f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
3108f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
3118f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
312dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        writeInt(val.length);
313064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (double f : val)
314064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeDouble(f);
315dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
316dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
317dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
318dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void readDoubleArray(double[] val) {
319064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
320064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
321064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
322ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
323ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readDouble();
324ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
325ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
326ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
327ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
328ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public double[] createDoubleArray() {
329064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
330064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
3318f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
3328f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
333064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        double[] val = new double[N];
334ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
335dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel            val[i] = readDouble();
336dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        }
337ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
338dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
339dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
340dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
341dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void writeIntArray(int[] val) {
3428f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
3438f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
3448f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
3458f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
346dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        writeInt(val.length);
347064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (int f : val)
348064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(f);
349dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
350dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
351dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
352dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void readIntArray(int[] val) {
353064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
354064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
355064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
356ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
357ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readInt();
358ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
359ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
360ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
361ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
362ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public int[] createIntArray() {
363064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
364064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
3658f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
3668f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
367064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int[] val = new int[N];
368ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
369dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel            val[i] = readInt();
370dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        }
371ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
372dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
373dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
374dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
3757124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy    public void writeByteArray(byte[] val) {
3768f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
3778f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
3788f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
3798f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
3807124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy        writeInt(val.length);
381064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (byte f : val)
382064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeByte(f);
3837124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy    }
3847124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy
3857124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy    @Implementation
3867124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy    public void readByteArray(byte[] val) {
387064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
388064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
389064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
390ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
3917124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy            val[i] = readByte();
3927124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy        }
3937124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy    }
3947124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy
3957124c809f1a3a49cc0c6e2fb36972155fd00e796John Stuppy    @Implementation
396ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public byte[] createByteArray() {
397064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
398064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
3998f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
4008f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
401064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        byte[] val = new byte[N];
402ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
403ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readByte();
404ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
405ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
406ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
407ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
408ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
409dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void writeLongArray(long[] val) {
4108f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
4118f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
4128f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
4138f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
414dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        writeInt(val.length);
415064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (long f : val)
416064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeLong(f);
417dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
418dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
419dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
420dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void readLongArray(long[] val) {
421064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
422064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val.length != N)
423064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
424ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
425ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen            val[i] = readLong();
426ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        }
427ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    }
428ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen
429ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    @Implementation
430ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen    public long[] createLongArray() {
431064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
432064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
4338f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return null;
4348f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
435064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        long[] val = new long[N];
436ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        for (int i = 0; i < val.length; i++) {
437dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel            val[i] = readLong();
438dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        }
439ffc5bd1761833d4f89ef3c7a3849cf3e19c9c830Jon Boekenoogen        return val;
440dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
441dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
442dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
443dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    public void writeStringArray(String[] val) {
4448f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        if (val == null) {
4458f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            writeInt(-1);
4468f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen            return;
4478f9c1466f3d1d10bc50a57f13f19aded7c63c388Jon Boekenoogen        }
448dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        writeInt(val.length);
449064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (String f : val)
450064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeString(f);
451dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
452dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
453dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    @Implementation
4540373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    public String[] createStringArray() {
4550373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        String[] array = null;
4560373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen
457064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
458064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N >= 0) {
459064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            array = new String[N];
460064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            for (int i = 0; i < N; i++) {
4610373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen                array[i] = readString();
4620373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen            }
4630373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
4640373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        return array;
4650373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    }
4660373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen
4670373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    @Implementation
4680bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala    public void readStringArray(String[] dest) {
469064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
470064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (dest.length != N)
471064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("bad array lengths");
4720bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        for (int i = 0; i < dest.length; i++) {
4730bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            dest[i] = readString();
4740bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        }
4750bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala    }
4760bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala
4770bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala    @Implementation
4780bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala    public void writeStringList(List<String> strings) {
4790bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        if (strings == null) {
4800bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            writeInt(-1);
4810bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            return;
4820bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        }
4830bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        int count = strings.size();
484064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int i = 0;
4850bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        writeInt(count);
4860bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        while (i < count) {
4870bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            writeString(strings.get(i));
4880bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            i++;
489dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel        }
490dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel    }
491dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
4920373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    @Implementation
4930bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala    public void readStringList(List<String> list) {
4940bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        int listSizeBeforeChange = list.size();
4950bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        int addCount = readInt();
4960bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        int i = 0;
4970bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        for (; i < listSizeBeforeChange && i < addCount; i++) {
4980bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            list.set(i, readString());
4990bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        }
500064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (; i < addCount; i++) {
5010bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            list.add(readString());
5020bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala        }
503064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (; i < listSizeBeforeChange; i++) {
5040bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala            list.remove(addCount);
5050373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
5060373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    }
507dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
5080373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    @Implementation
5090373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    public ArrayList<String> createStringArrayList() {
510064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
511064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
5120373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen            return null;
5130373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
514053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala
515064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        ArrayList<String> l = new ArrayList<String>(N);
516064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        while (N > 0) {
5170373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen            l.add(readString());
518064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            N--;
519064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
520064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return l;
521064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
522064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
523064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
524c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public void writeCharSequenceArray(CharSequence[] val) {
525c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        if (val != null) {
526c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            int N = val.length;
527c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(N);
528c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            for (int i=0; i<N; i++) {
529c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                writeCharSequence(val[i]);
530c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            }
531c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        } else {
532c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(-1);
533c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
534c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
535c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
536c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
537c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public CharSequence[] readCharSequenceArray() {
538c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        CharSequence[] array = null;
539c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
540c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        int length = readInt();
541c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        if (length >= 0)
542c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        {
543c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            array = new CharSequence[length];
544c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
545c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            for (int i = 0 ; i < length ; i++)
546c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            {
547c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                array[i] = readCharSequence();
548c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            }
549c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
550c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
551c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        return array;
552c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
553c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
554c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
555c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public void writeList(List val) {
556c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        if (val == null) {
557c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(-1);
558c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            return;
559c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
560c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        int N = val.size();
561c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        int i = 0;
562c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        writeInt(N);
563c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        while (i < N) {
564c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeValue(val.get(i));
565c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            i++;
566c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
567c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
568c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
569c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
570c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public void readList(List outVal, ClassLoader loader) {
571c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        int N = readInt();
572c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        readListInternal(outVal, N, loader);
573c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
574c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
575c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
576c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public ArrayList readArrayList(ClassLoader loader) {
577c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        int N = readInt();
578c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        if (N < 0) {
579c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            return null;
580c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
581c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        ArrayList l = new ArrayList(N);
582c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        readListInternal(l, N, loader);
583c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        return l;
584c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
585c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
586c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
587064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeArray(Object[] values) {
588064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (values == null) {
589064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(-1);
590064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return;
591064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
592064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = values.length;
593064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeInt(N);
594064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (Object value : values) {
595064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeValue(value);
596064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
597064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
598064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
599064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
600064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public Object[] readArray(ClassLoader loader) {
601064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
602064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
603064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return null;
6040373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
605064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        Object[] l = new Object[N];
606064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        readArrayInternal(l, N, loader);
6070373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        return l;
6080373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    }
609dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
6100373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    @Implementation
611064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeValue(Object v) {
612064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (v == null) {
613064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_NULL);
614064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof String) {
615064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_STRING);
616064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeString((String) v);
617064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Integer) {
618064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_INTEGER);
619064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt((Integer) v);
620064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Map) {
621064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_MAP);
622064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeMap((Map) v);
623064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Bundle) {
624064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            // Must be before Parcelable
625064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_BUNDLE);
626064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeBundle((Bundle) v);
627064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Parcelable) {
628064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_PARCELABLE);
629064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeParcelable((Parcelable) v, 0);
630064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Short) {
631064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_SHORT);
632064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(((Short) v).intValue());
633064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Long) {
634064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_LONG);
635064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeLong((Long) v);
636064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Float) {
637064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_FLOAT);
638064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeFloat((Float) v);
639064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Double) {
640064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_DOUBLE);
641064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeDouble((Double) v);
642064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Boolean) {
643064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_BOOLEAN);
644064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt((Boolean) v ? 1 : 0);
645064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof CharSequence) {
646064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            // Must be after String
647064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_CHARSEQUENCE);
648c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeCharSequence((CharSequence) v);
649c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        } else if (v instanceof List) {
650c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(VAL_LIST);
651c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeList((List) v);
652064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof boolean[]) {
653064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_BOOLEANARRAY);
654064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeBooleanArray((boolean[]) v);
655064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof byte[]) {
656064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_BYTEARRAY);
657064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeByteArray((byte[]) v);
658064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof String[]) {
659064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_STRINGARRAY);
660064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeStringArray((String[]) v);
661c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        } else if (v instanceof CharSequence[]) {
662c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            // Must be after String[] and before Object[]
663c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(VAL_CHARSEQUENCEARRAY);
664c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeCharSequenceArray((CharSequence[]) v);
665c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        } else if (v instanceof Parcelable[]) {
666c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(VAL_PARCELABLEARRAY);
667c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeParcelableArray((Parcelable[]) v, 0);
668064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Object[]) {
669064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_OBJECTARRAY);
670064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeArray((Object[]) v);
671064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof int[]) {
672064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_INTARRAY);
673064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeIntArray((int[]) v);
674064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof long[]) {
675064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_LONGARRAY);
676064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeLongArray((long[]) v);
677064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else if (v instanceof Byte) {
678064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(VAL_BYTE);
679064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeByte((Byte) v);
680064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else {
681064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException(
682064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                    "Parcel: unable to marshal value with type" + v.getClass().getName());
683064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
684064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
685064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
686064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
687064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public Object readValue(ClassLoader loader) {
688064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int type = readInt();
689064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
690064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        switch (type) {
691064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_NULL:
692064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return null;
693064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
694064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_STRING:
695064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readString();
696064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
697064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_INTEGER:
698064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readInt();
699064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
700064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_MAP:
701064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readHashMap(loader);
702064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
703064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_PARCELABLE:
704064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readParcelable(loader);
705064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
706064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_SHORT:
707064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return (short) readInt();
708064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
709064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_LONG:
710064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readLong();
711064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
712064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_FLOAT:
713064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readFloat();
714064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
715064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_DOUBLE:
716064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readDouble();
717064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
718064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_BOOLEAN:
719064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readInt() == 1;
720064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
721064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_CHARSEQUENCE:
722c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                return readCharSequence();
723c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
724c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            case VAL_LIST:
725c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                return readArrayList(loader);
726064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
727064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_BOOLEANARRAY:
728064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return createBooleanArray();
729064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
730064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_BYTEARRAY:
731064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return createByteArray();
732064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
733064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_STRINGARRAY:
734064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return createStringArray();
735064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
736c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            case VAL_CHARSEQUENCEARRAY:
737c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                return readCharSequenceArray();
738c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
739064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_OBJECTARRAY:
740064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readArray(loader);
741064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
742064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_INTARRAY:
743064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return createIntArray();
744064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
745064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_LONGARRAY:
746064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return createLongArray();
747064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
748064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_BYTE:
749064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readByte();
750064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
751c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            case VAL_PARCELABLEARRAY:
752c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                return readParcelableArray(loader);
753c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
754064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            case VAL_BUNDLE:
755064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                return readBundle(loader); // loading will be deferred
756064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
757064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            default:
758064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                int off = dataPosition() - 4;
759064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                throw new RuntimeException(
760064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                        "Parcel " + this + ": Unmarshalling unknown type code " + type
761064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                        + " at offset " + off);
762064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
763064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
764064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
765064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
766064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public Bundle readBundle() {
767064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return readBundle(null);
768064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
769064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
770064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
771064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public Bundle readBundle(ClassLoader loader) {
772064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int offset = dataPosition();
773064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
774064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
775064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return null;
776064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
777064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int magic = readInt();
778064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (magic != 0x4C444E42) {
779064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("Magic number missing from bundle stream");
780064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
781064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
782064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        Bundle bundle = new Bundle();
783064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
784064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        // Read map
785064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        HashMap m = new HashMap();
786064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        readMap(m, null);
787064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
788064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        shadowOf(bundle).map.putAll(m);
789064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
790064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return bundle;
791064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
792064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
793064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
794064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeBundle(Bundle val) {
795064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val == null) {
796064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(-1);
797064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return;
798064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
799064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
800064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeInt(-1); // dummy, will hold length
801064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int oldPos = dataPosition();
802064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeInt(0x4C444E42); // 'B' 'N' 'D' 'L'
803064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
804064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeMapInternal(shadowOf(val).map);
805064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int newPos = dataPosition();
806064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
807064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        // Backpatch length
808064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        setDataPosition(oldPos - 4);
809064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = newPos - oldPos;
810064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeInt(N);
811064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        setDataPosition(newPos);
812064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
813064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
814064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
815064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeParcelable(Parcelable p, int flags) {
816064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (p == null) {
817064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeString(null);
818064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return;
819064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
820064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        String name = p.getClass().getName();
821064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeString(name);
822064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        p.writeToParcel(realParcel, flags);
823064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
824064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
825064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
826064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public <T extends Parcelable> T readParcelable(ClassLoader loader) {
827064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        String name = readString();
828064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (name == null) {
829064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return null;
830064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
831064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        Parcelable.Creator<T> creator;
832064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        try {
833064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Class c = loader == null ? Class.forName(name) : Class.forName(name, true, loader);
834064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Field f = c.getField("CREATOR");
835064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            creator = (Parcelable.Creator) f.get(null);
836064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } catch (IllegalAccessException e) {
837064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Log.e("Parcel", "Class not found when unmarshalling: " + name + ", e: " + e);
838064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("IllegalAccessException when unmarshalling: " + name);
839064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } catch (ClassNotFoundException e) {
840064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Log.e("Parcel", "Class not found when unmarshalling: " + name + ", e: " + e);
841064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("ClassNotFoundException when unmarshalling: " + name);
842064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } catch (ClassCastException e) {
843064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("Parcelable protocol requires a "
844064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                    + "Parcelable.Creator object called " + " CREATOR on class " + name);
845064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } catch (NoSuchFieldException e) {
846064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("Parcelable protocol requires a "
847064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                    + "Parcelable.Creator object called " + " CREATOR on class " + name);
848064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
849064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (creator == null) {
850064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            throw new RuntimeException("Parcelable protocol requires a "
851064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen                    + "Parcelable.Creator object called " + " CREATOR on class " + name);
852064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
853064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
854064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return creator.createFromParcel(realParcel);
855064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
856064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
857064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
858053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala    public ArrayList createTypedArrayList(Parcelable.Creator c) {
859064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
860064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
861053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            return null;
8620373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
863dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
864064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        ArrayList l = new ArrayList(N);
865dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
866064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        while (N > 0) {
867053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            if (readInt() != 0) {
868053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala                l.add(c.createFromParcel(realParcel));
869053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            } else {
870053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala                l.add(null);
871053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            }
872064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            N--;
8730373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
874053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala        return l;
875053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala    }
876053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala
877053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala    @Implementation
8780bf1d6a0ed6c10719f9390cbed31c64142c41ccfPhil Goodwin & Rick Kawala    public void writeTypedList(List val) {
879053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala        if (val == null) {
880053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            writeInt(-1);
881053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            return;
882053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala        }
883053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala
884064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = val.size();
885053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala        int i = 0;
886064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeInt(N);
887064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        while (i < N) {
888053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            Object item = val.get(i);
889053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            if (item != null) {
890053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala                writeInt(1);
891053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala                ((Parcelable) item).writeToParcel(realParcel, 0);
892053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            } else {
893053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala                writeInt(0);
894053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            }
895053f4fe6cc16a60b7c96ad79472274b3c8604ad2Phil Goodwin & Rick Kawala            i++;
8960373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen        }
8970373fcde8d3df449d4db2d4cfd671fef219d85ddJon Boekenoogen    }
898dab3a74f4697f04455668863c2c62cd14745c230Jan Berkel
899064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
900c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public <T extends Parcelable> void writeParcelableArray(T[] value,
901c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            int parcelableFlags) {
902c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        if (value != null) {
903c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            int N = value.length;
904c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(N);
905c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            for (int i=0; i<N; i++) {
906c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen                writeParcelable(value[i], parcelableFlags);
907c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            }
908c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        } else {
909c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            writeInt(-1);
910c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
911c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
912c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
913c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
914c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    public Parcelable[] readParcelableArray(ClassLoader loader) {
915c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        int N = readInt();
916c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        if (N < 0) {
917c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            return null;
918c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
919c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        Parcelable[] p = new Parcelable[N];
920c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        for (int i = 0; i < N; i++) {
9213d6057c072c4b828d93cc739116c5f966d52e49bJon Boekenoogen            p[i] = readParcelable(loader);
922c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
923c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        return p;
924c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
925c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
926c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    @Implementation
927064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void writeMap(Map val) {
928064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeMapInternal(val);
929064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
930064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
931064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
932064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public void readMap(Map outVal, ClassLoader loader) {
933064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
934064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        readMapInternal(outVal, N, loader);
935064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
936064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
937064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    @Implementation
938064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    public HashMap readHashMap(ClassLoader loader) {
939064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        int N = readInt();
940064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (N < 0) {
941064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return null;
942064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
943064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        HashMap m = new HashMap(N);
944064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        readMapInternal(m, N, loader);
945064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        return m;
946064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
947064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
948064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private void writeMapInternal(Map<String, Object> val) {
949064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (val == null) {
950064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeInt(-1);
951064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return;
952064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
953064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
954064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        Set<Map.Entry<String, Object>> entries = val.entrySet();
955064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        writeInt(entries.size());
956064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (Map.Entry<String, Object> e : entries) {
957064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeValue(e.getKey());
958064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            writeValue(e.getValue());
959064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
960064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
961064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
962064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private void readMapInternal(Map outVal, int N, ClassLoader loader) {
963064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (int i = 0; i < N; i++) {
964064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Object key = readValue(loader);
965064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Object value = readValue(loader);
966064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            outVal.put(key, value);
967064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
968064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
969064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
970c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    private void readListInternal(List outVal, int N, ClassLoader loader) {
971c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        while (N > 0) {
972c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            Object value = readValue(loader);
973c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            outVal.add(value);
974c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen            N--;
975c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen        }
976c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen    }
977c442dd3f1599c6e4fc11f4d942ab3d4cd3fbb9f7Jon Boekenoogen
978064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private void readArrayInternal(Object[] outVal, int N, ClassLoader loader) {
979064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        for (int i = 0; i < N; i++) {
980064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            Object value = readValue(loader);
981064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            outVal[i] = value;
982064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
983064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
984064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
985064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private void addValueToList(Pair<Integer, ?> value) {
986064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (index < parcelData.size()) {
987064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            parcelData.set(index, value);
988064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else {
989064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            parcelData.add(value);
990064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
991064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        index++;
992064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
993064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
994064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    private <T extends Object> T readValueFromList(T defaultValue) {
995064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        if (index < parcelData.size()) {
996064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return (T) parcelData.get(index++).second;
997064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        } else {
998064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen            return defaultValue;
999064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen        }
1000064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen    }
1001064f86b8dad1300e99457c9672a9ebbb6694ae4eJon Boekenoogen
10027598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    public int getIndex() {
10037598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        return index;
10047598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
10057598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz
10067598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    public List getParcelData() {
10077598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz        return parcelData;
10087598f0c0b1cce3bf1902772ea09139ef98083864Ryan Richard & Tyler Schultz    }
1009cb6dcc93e483e0537f8c93595bb6687b392a0d2eadriancowham}
1010