Parcel.java revision 8ab665dda40ab10e60fc69392022171f454af530
1/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os;
18
19import android.text.TextUtils;
20import android.util.ArrayMap;
21import android.util.Log;
22import android.util.SparseArray;
23import android.util.SparseBooleanArray;
24
25import java.io.ByteArrayInputStream;
26import java.io.ByteArrayOutputStream;
27import java.io.FileDescriptor;
28import java.io.FileNotFoundException;
29import java.io.IOException;
30import java.io.ObjectInputStream;
31import java.io.ObjectOutputStream;
32import java.io.Serializable;
33import java.lang.reflect.Field;
34import java.util.ArrayList;
35import java.util.Arrays;
36import java.util.HashMap;
37import java.util.List;
38import java.util.Map;
39import java.util.Set;
40
41/**
42 * Container for a message (data and object references) that can
43 * be sent through an IBinder.  A Parcel can contain both flattened data
44 * that will be unflattened on the other side of the IPC (using the various
45 * methods here for writing specific types, or the general
46 * {@link Parcelable} interface), and references to live {@link IBinder}
47 * objects that will result in the other side receiving a proxy IBinder
48 * connected with the original IBinder in the Parcel.
49 *
50 * <p class="note">Parcel is <strong>not</strong> a general-purpose
51 * serialization mechanism.  This class (and the corresponding
52 * {@link Parcelable} API for placing arbitrary objects into a Parcel) is
53 * designed as a high-performance IPC transport.  As such, it is not
54 * appropriate to place any Parcel data in to persistent storage: changes
55 * in the underlying implementation of any of the data in the Parcel can
56 * render older data unreadable.</p>
57 *
58 * <p>The bulk of the Parcel API revolves around reading and writing data
59 * of various types.  There are six major classes of such functions available.</p>
60 *
61 * <h3>Primitives</h3>
62 *
63 * <p>The most basic data functions are for writing and reading primitive
64 * data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble},
65 * {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt},
66 * {@link #readInt}, {@link #writeLong}, {@link #readLong},
67 * {@link #writeString}, {@link #readString}.  Most other
68 * data operations are built on top of these.  The given data is written and
69 * read using the endianess of the host CPU.</p>
70 *
71 * <h3>Primitive Arrays</h3>
72 *
73 * <p>There are a variety of methods for reading and writing raw arrays
74 * of primitive objects, which generally result in writing a 4-byte length
75 * followed by the primitive data items.  The methods for reading can either
76 * read the data into an existing array, or create and return a new array.
77 * These available types are:</p>
78 *
79 * <ul>
80 * <li> {@link #writeBooleanArray(boolean[])},
81 * {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()}
82 * <li> {@link #writeByteArray(byte[])},
83 * {@link #writeByteArray(byte[], int, int)}, {@link #readByteArray(byte[])},
84 * {@link #createByteArray()}
85 * <li> {@link #writeCharArray(char[])}, {@link #readCharArray(char[])},
86 * {@link #createCharArray()}
87 * <li> {@link #writeDoubleArray(double[])}, {@link #readDoubleArray(double[])},
88 * {@link #createDoubleArray()}
89 * <li> {@link #writeFloatArray(float[])}, {@link #readFloatArray(float[])},
90 * {@link #createFloatArray()}
91 * <li> {@link #writeIntArray(int[])}, {@link #readIntArray(int[])},
92 * {@link #createIntArray()}
93 * <li> {@link #writeLongArray(long[])}, {@link #readLongArray(long[])},
94 * {@link #createLongArray()}
95 * <li> {@link #writeStringArray(String[])}, {@link #readStringArray(String[])},
96 * {@link #createStringArray()}.
97 * <li> {@link #writeSparseBooleanArray(SparseBooleanArray)},
98 * {@link #readSparseBooleanArray()}.
99 * </ul>
100 *
101 * <h3>Parcelables</h3>
102 *
103 * <p>The {@link Parcelable} protocol provides an extremely efficient (but
104 * low-level) protocol for objects to write and read themselves from Parcels.
105 * You can use the direct methods {@link #writeParcelable(Parcelable, int)}
106 * and {@link #readParcelable(ClassLoader)} or
107 * {@link #writeParcelableArray} and
108 * {@link #readParcelableArray(ClassLoader)} to write or read.  These
109 * methods write both the class type and its data to the Parcel, allowing
110 * that class to be reconstructed from the appropriate class loader when
111 * later reading.</p>
112 *
113 * <p>There are also some methods that provide a more efficient way to work
114 * with Parcelables: {@link #writeTypedArray},
115 * {@link #writeTypedList(List)},
116 * {@link #readTypedArray} and {@link #readTypedList}.  These methods
117 * do not write the class information of the original object: instead, the
118 * caller of the read function must know what type to expect and pass in the
119 * appropriate {@link Parcelable.Creator Parcelable.Creator} instead to
120 * properly construct the new object and read its data.  (To more efficient
121 * write and read a single Parceable object, you can directly call
122 * {@link Parcelable#writeToParcel Parcelable.writeToParcel} and
123 * {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel}
124 * yourself.)</p>
125 *
126 * <h3>Bundles</h3>
127 *
128 * <p>A special type-safe container, called {@link Bundle}, is available
129 * for key/value maps of heterogeneous values.  This has many optimizations
130 * for improved performance when reading and writing data, and its type-safe
131 * API avoids difficult to debug type errors when finally marshalling the
132 * data contents into a Parcel.  The methods to use are
133 * {@link #writeBundle(Bundle)}, {@link #readBundle()}, and
134 * {@link #readBundle(ClassLoader)}.
135 *
136 * <h3>Active Objects</h3>
137 *
138 * <p>An unusual feature of Parcel is the ability to read and write active
139 * objects.  For these objects the actual contents of the object is not
140 * written, rather a special token referencing the object is written.  When
141 * reading the object back from the Parcel, you do not get a new instance of
142 * the object, but rather a handle that operates on the exact same object that
143 * was originally written.  There are two forms of active objects available.</p>
144 *
145 * <p>{@link Binder} objects are a core facility of Android's general cross-process
146 * communication system.  The {@link IBinder} interface describes an abstract
147 * protocol with a Binder object.  Any such interface can be written in to
148 * a Parcel, and upon reading you will receive either the original object
149 * implementing that interface or a special proxy implementation
150 * that communicates calls back to the original object.  The methods to use are
151 * {@link #writeStrongBinder(IBinder)},
152 * {@link #writeStrongInterface(IInterface)}, {@link #readStrongBinder()},
153 * {@link #writeBinderArray(IBinder[])}, {@link #readBinderArray(IBinder[])},
154 * {@link #createBinderArray()},
155 * {@link #writeBinderList(List)}, {@link #readBinderList(List)},
156 * {@link #createBinderArrayList()}.</p>
157 *
158 * <p>FileDescriptor objects, representing raw Linux file descriptor identifiers,
159 * can be written and {@link ParcelFileDescriptor} objects returned to operate
160 * on the original file descriptor.  The returned file descriptor is a dup
161 * of the original file descriptor: the object and fd is different, but
162 * operating on the same underlying file stream, with the same position, etc.
163 * The methods to use are {@link #writeFileDescriptor(FileDescriptor)},
164 * {@link #readFileDescriptor()}.
165 *
166 * <h3>Untyped Containers</h3>
167 *
168 * <p>A final class of methods are for writing and reading standard Java
169 * containers of arbitrary types.  These all revolve around the
170 * {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods
171 * which define the types of objects allowed.  The container methods are
172 * {@link #writeArray(Object[])}, {@link #readArray(ClassLoader)},
173 * {@link #writeList(List)}, {@link #readList(List, ClassLoader)},
174 * {@link #readArrayList(ClassLoader)},
175 * {@link #writeMap(Map)}, {@link #readMap(Map, ClassLoader)},
176 * {@link #writeSparseArray(SparseArray)},
177 * {@link #readSparseArray(ClassLoader)}.
178 */
179public final class Parcel {
180    private static final boolean DEBUG_RECYCLE = false;
181    private static final boolean DEBUG_ARRAY_MAP = false;
182    private static final String TAG = "Parcel";
183
184    @SuppressWarnings({"UnusedDeclaration"})
185    private long mNativePtr; // used by native code
186
187    /**
188     * Flag indicating if {@link #mNativePtr} was allocated by this object,
189     * indicating that we're responsible for its lifecycle.
190     */
191    private boolean mOwnsNativeParcelObject;
192
193    private RuntimeException mStack;
194
195    private static final int POOL_SIZE = 6;
196    private static final Parcel[] sOwnedPool = new Parcel[POOL_SIZE];
197    private static final Parcel[] sHolderPool = new Parcel[POOL_SIZE];
198
199    private static final int VAL_NULL = -1;
200    private static final int VAL_STRING = 0;
201    private static final int VAL_INTEGER = 1;
202    private static final int VAL_MAP = 2;
203    private static final int VAL_BUNDLE = 3;
204    private static final int VAL_PARCELABLE = 4;
205    private static final int VAL_SHORT = 5;
206    private static final int VAL_LONG = 6;
207    private static final int VAL_FLOAT = 7;
208    private static final int VAL_DOUBLE = 8;
209    private static final int VAL_BOOLEAN = 9;
210    private static final int VAL_CHARSEQUENCE = 10;
211    private static final int VAL_LIST  = 11;
212    private static final int VAL_SPARSEARRAY = 12;
213    private static final int VAL_BYTEARRAY = 13;
214    private static final int VAL_STRINGARRAY = 14;
215    private static final int VAL_IBINDER = 15;
216    private static final int VAL_PARCELABLEARRAY = 16;
217    private static final int VAL_OBJECTARRAY = 17;
218    private static final int VAL_INTARRAY = 18;
219    private static final int VAL_LONGARRAY = 19;
220    private static final int VAL_BYTE = 20;
221    private static final int VAL_SERIALIZABLE = 21;
222    private static final int VAL_SPARSEBOOLEANARRAY = 22;
223    private static final int VAL_BOOLEANARRAY = 23;
224    private static final int VAL_CHARSEQUENCEARRAY = 24;
225
226    // The initial int32 in a Binder call's reply Parcel header:
227    private static final int EX_SECURITY = -1;
228    private static final int EX_BAD_PARCELABLE = -2;
229    private static final int EX_ILLEGAL_ARGUMENT = -3;
230    private static final int EX_NULL_POINTER = -4;
231    private static final int EX_ILLEGAL_STATE = -5;
232    private static final int EX_NETWORK_MAIN_THREAD = -6;
233    private static final int EX_HAS_REPLY_HEADER = -128;  // special; see below
234
235    private static native int nativeDataSize(long nativePtr);
236    private static native int nativeDataAvail(long nativePtr);
237    private static native int nativeDataPosition(long nativePtr);
238    private static native int nativeDataCapacity(long nativePtr);
239    private static native void nativeSetDataSize(long nativePtr, int size);
240    private static native void nativeSetDataPosition(long nativePtr, int pos);
241    private static native void nativeSetDataCapacity(long nativePtr, int size);
242
243    private static native boolean nativePushAllowFds(long nativePtr, boolean allowFds);
244    private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue);
245
246    private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len);
247    private static native void nativeWriteInt(long nativePtr, int val);
248    private static native void nativeWriteLong(long nativePtr, long val);
249    private static native void nativeWriteFloat(long nativePtr, float val);
250    private static native void nativeWriteDouble(long nativePtr, double val);
251    private static native void nativeWriteString(long nativePtr, String val);
252    private static native void nativeWriteStrongBinder(long nativePtr, IBinder val);
253    private static native void nativeWriteFileDescriptor(long nativePtr, FileDescriptor val);
254
255    private static native byte[] nativeCreateByteArray(long nativePtr);
256    private static native int nativeReadInt(long nativePtr);
257    private static native long nativeReadLong(long nativePtr);
258    private static native float nativeReadFloat(long nativePtr);
259    private static native double nativeReadDouble(long nativePtr);
260    private static native String nativeReadString(long nativePtr);
261    private static native IBinder nativeReadStrongBinder(long nativePtr);
262    private static native FileDescriptor nativeReadFileDescriptor(long nativePtr);
263
264    private static native long nativeCreate();
265    private static native void nativeFreeBuffer(long nativePtr);
266    private static native void nativeDestroy(long nativePtr);
267
268    private static native byte[] nativeMarshall(long nativePtr);
269    private static native void nativeUnmarshall(
270            long nativePtr, byte[] data, int offest, int length);
271    private static native void nativeAppendFrom(
272            long thisNativePtr, long otherNativePtr, int offset, int length);
273    private static native boolean nativeHasFileDescriptors(long nativePtr);
274    private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName);
275    private static native void nativeEnforceInterface(long nativePtr, String interfaceName);
276
277    public final static Parcelable.Creator<String> STRING_CREATOR
278             = new Parcelable.Creator<String>() {
279        public String createFromParcel(Parcel source) {
280            return source.readString();
281        }
282        public String[] newArray(int size) {
283            return new String[size];
284        }
285    };
286
287    /**
288     * Retrieve a new Parcel object from the pool.
289     */
290    public static Parcel obtain() {
291        final Parcel[] pool = sOwnedPool;
292        synchronized (pool) {
293            Parcel p;
294            for (int i=0; i<POOL_SIZE; i++) {
295                p = pool[i];
296                if (p != null) {
297                    pool[i] = null;
298                    if (DEBUG_RECYCLE) {
299                        p.mStack = new RuntimeException();
300                    }
301                    return p;
302                }
303            }
304        }
305        return new Parcel(0);
306    }
307
308    /**
309     * Put a Parcel object back into the pool.  You must not touch
310     * the object after this call.
311     */
312    public final void recycle() {
313        if (DEBUG_RECYCLE) mStack = null;
314        freeBuffer();
315
316        final Parcel[] pool;
317        if (mOwnsNativeParcelObject) {
318            pool = sOwnedPool;
319        } else {
320            mNativePtr = 0;
321            pool = sHolderPool;
322        }
323
324        synchronized (pool) {
325            for (int i=0; i<POOL_SIZE; i++) {
326                if (pool[i] == null) {
327                    pool[i] = this;
328                    return;
329                }
330            }
331        }
332    }
333
334    /**
335     * Returns the total amount of data contained in the parcel.
336     */
337    public final int dataSize() {
338        return nativeDataSize(mNativePtr);
339    }
340
341    /**
342     * Returns the amount of data remaining to be read from the
343     * parcel.  That is, {@link #dataSize}-{@link #dataPosition}.
344     */
345    public final int dataAvail() {
346        return nativeDataAvail(mNativePtr);
347    }
348
349    /**
350     * Returns the current position in the parcel data.  Never
351     * more than {@link #dataSize}.
352     */
353    public final int dataPosition() {
354        return nativeDataPosition(mNativePtr);
355    }
356
357    /**
358     * Returns the total amount of space in the parcel.  This is always
359     * >= {@link #dataSize}.  The difference between it and dataSize() is the
360     * amount of room left until the parcel needs to re-allocate its
361     * data buffer.
362     */
363    public final int dataCapacity() {
364        return nativeDataCapacity(mNativePtr);
365    }
366
367    /**
368     * Change the amount of data in the parcel.  Can be either smaller or
369     * larger than the current size.  If larger than the current capacity,
370     * more memory will be allocated.
371     *
372     * @param size The new number of bytes in the Parcel.
373     */
374    public final void setDataSize(int size) {
375        nativeSetDataSize(mNativePtr, size);
376    }
377
378    /**
379     * Move the current read/write position in the parcel.
380     * @param pos New offset in the parcel; must be between 0 and
381     * {@link #dataSize}.
382     */
383    public final void setDataPosition(int pos) {
384        nativeSetDataPosition(mNativePtr, pos);
385    }
386
387    /**
388     * Change the capacity (current available space) of the parcel.
389     *
390     * @param size The new capacity of the parcel, in bytes.  Can not be
391     * less than {@link #dataSize} -- that is, you can not drop existing data
392     * with this method.
393     */
394    public final void setDataCapacity(int size) {
395        nativeSetDataCapacity(mNativePtr, size);
396    }
397
398    /** @hide */
399    public final boolean pushAllowFds(boolean allowFds) {
400        return nativePushAllowFds(mNativePtr, allowFds);
401    }
402
403    /** @hide */
404    public final void restoreAllowFds(boolean lastValue) {
405        nativeRestoreAllowFds(mNativePtr, lastValue);
406    }
407
408    /**
409     * Returns the raw bytes of the parcel.
410     *
411     * <p class="note">The data you retrieve here <strong>must not</strong>
412     * be placed in any kind of persistent storage (on local disk, across
413     * a network, etc).  For that, you should use standard serialization
414     * or another kind of general serialization mechanism.  The Parcel
415     * marshalled representation is highly optimized for local IPC, and as
416     * such does not attempt to maintain compatibility with data created
417     * in different versions of the platform.
418     */
419    public final byte[] marshall() {
420        return nativeMarshall(mNativePtr);
421    }
422
423    /**
424     * Set the bytes in data to be the raw bytes of this Parcel.
425     */
426    public final void unmarshall(byte[] data, int offest, int length) {
427        nativeUnmarshall(mNativePtr, data, offest, length);
428    }
429
430    public final void appendFrom(Parcel parcel, int offset, int length) {
431        nativeAppendFrom(mNativePtr, parcel.mNativePtr, offset, length);
432    }
433
434    /**
435     * Report whether the parcel contains any marshalled file descriptors.
436     */
437    public final boolean hasFileDescriptors() {
438        return nativeHasFileDescriptors(mNativePtr);
439    }
440
441    /**
442     * Store or read an IBinder interface token in the parcel at the current
443     * {@link #dataPosition}.  This is used to validate that the marshalled
444     * transaction is intended for the target interface.
445     */
446    public final void writeInterfaceToken(String interfaceName) {
447        nativeWriteInterfaceToken(mNativePtr, interfaceName);
448    }
449
450    public final void enforceInterface(String interfaceName) {
451        nativeEnforceInterface(mNativePtr, interfaceName);
452    }
453
454    /**
455     * Write a byte array into the parcel at the current {@link #dataPosition},
456     * growing {@link #dataCapacity} if needed.
457     * @param b Bytes to place into the parcel.
458     */
459    public final void writeByteArray(byte[] b) {
460        writeByteArray(b, 0, (b != null) ? b.length : 0);
461    }
462
463    /**
464     * Write a byte array into the parcel at the current {@link #dataPosition},
465     * growing {@link #dataCapacity} if needed.
466     * @param b Bytes to place into the parcel.
467     * @param offset Index of first byte to be written.
468     * @param len Number of bytes to write.
469     */
470    public final void writeByteArray(byte[] b, int offset, int len) {
471        if (b == null) {
472            writeInt(-1);
473            return;
474        }
475        Arrays.checkOffsetAndCount(b.length, offset, len);
476        nativeWriteByteArray(mNativePtr, b, offset, len);
477    }
478
479    /**
480     * Write an integer value into the parcel at the current dataPosition(),
481     * growing dataCapacity() if needed.
482     */
483    public final void writeInt(int val) {
484        nativeWriteInt(mNativePtr, val);
485    }
486
487    /**
488     * Write a long integer value into the parcel at the current dataPosition(),
489     * growing dataCapacity() if needed.
490     */
491    public final void writeLong(long val) {
492        nativeWriteLong(mNativePtr, val);
493    }
494
495    /**
496     * Write a floating point value into the parcel at the current
497     * dataPosition(), growing dataCapacity() if needed.
498     */
499    public final void writeFloat(float val) {
500        nativeWriteFloat(mNativePtr, val);
501    }
502
503    /**
504     * Write a double precision floating point value into the parcel at the
505     * current dataPosition(), growing dataCapacity() if needed.
506     */
507    public final void writeDouble(double val) {
508        nativeWriteDouble(mNativePtr, val);
509    }
510
511    /**
512     * Write a string value into the parcel at the current dataPosition(),
513     * growing dataCapacity() if needed.
514     */
515    public final void writeString(String val) {
516        nativeWriteString(mNativePtr, val);
517    }
518
519    /**
520     * Write a CharSequence value into the parcel at the current dataPosition(),
521     * growing dataCapacity() if needed.
522     * @hide
523     */
524    public final void writeCharSequence(CharSequence val) {
525        TextUtils.writeToParcel(val, this, 0);
526    }
527
528    /**
529     * Write an object into the parcel at the current dataPosition(),
530     * growing dataCapacity() if needed.
531     */
532    public final void writeStrongBinder(IBinder val) {
533        nativeWriteStrongBinder(mNativePtr, val);
534    }
535
536    /**
537     * Write an object into the parcel at the current dataPosition(),
538     * growing dataCapacity() if needed.
539     */
540    public final void writeStrongInterface(IInterface val) {
541        writeStrongBinder(val == null ? null : val.asBinder());
542    }
543
544    /**
545     * Write a FileDescriptor into the parcel at the current dataPosition(),
546     * growing dataCapacity() if needed.
547     *
548     * <p class="caution">The file descriptor will not be closed, which may
549     * result in file descriptor leaks when objects are returned from Binder
550     * calls.  Use {@link ParcelFileDescriptor#writeToParcel} instead, which
551     * accepts contextual flags and will close the original file descriptor
552     * if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.</p>
553     */
554    public final void writeFileDescriptor(FileDescriptor val) {
555        nativeWriteFileDescriptor(mNativePtr, val);
556    }
557
558    /**
559     * Write a byte value into the parcel at the current dataPosition(),
560     * growing dataCapacity() if needed.
561     */
562    public final void writeByte(byte val) {
563        writeInt(val);
564    }
565
566    /**
567     * Please use {@link #writeBundle} instead.  Flattens a Map into the parcel
568     * at the current dataPosition(),
569     * growing dataCapacity() if needed.  The Map keys must be String objects.
570     * The Map values are written using {@link #writeValue} and must follow
571     * the specification there.
572     *
573     * <p>It is strongly recommended to use {@link #writeBundle} instead of
574     * this method, since the Bundle class provides a type-safe API that
575     * allows you to avoid mysterious type errors at the point of marshalling.
576     */
577    public final void writeMap(Map val) {
578        writeMapInternal((Map<String, Object>) val);
579    }
580
581    /**
582     * Flatten a Map into the parcel at the current dataPosition(),
583     * growing dataCapacity() if needed.  The Map keys must be String objects.
584     */
585    /* package */ void writeMapInternal(Map<String,Object> val) {
586        if (val == null) {
587            writeInt(-1);
588            return;
589        }
590        Set<Map.Entry<String,Object>> entries = val.entrySet();
591        writeInt(entries.size());
592        for (Map.Entry<String,Object> e : entries) {
593            writeValue(e.getKey());
594            writeValue(e.getValue());
595        }
596    }
597
598    /**
599     * Flatten an ArrayMap into the parcel at the current dataPosition(),
600     * growing dataCapacity() if needed.  The Map keys must be String objects.
601     */
602    /* package */ void writeArrayMapInternal(ArrayMap<String,Object> val) {
603        if (val == null) {
604            writeInt(-1);
605            return;
606        }
607        final int N = val.size();
608        writeInt(N);
609        if (DEBUG_ARRAY_MAP) {
610            RuntimeException here =  new RuntimeException("here");
611            here.fillInStackTrace();
612            Log.d(TAG, "Writing " + N + " ArrayMap entries", here);
613        }
614        int startPos;
615        for (int i=0; i<N; i++) {
616            if (DEBUG_ARRAY_MAP) startPos = dataPosition();
617            writeValue(val.keyAt(i));
618            writeValue(val.valueAt(i));
619            if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Write #" + i + " "
620                    + (dataPosition()-startPos) + " bytes: key=0x"
621                    + Integer.toHexString(val.keyAt(i) != null ? val.keyAt(i).hashCode() : 0)
622                    + " " + val.keyAt(i));
623        }
624    }
625
626    /**
627     * Flatten a Bundle into the parcel at the current dataPosition(),
628     * growing dataCapacity() if needed.
629     */
630    public final void writeBundle(Bundle val) {
631        if (val == null) {
632            writeInt(-1);
633            return;
634        }
635
636        val.writeToParcel(this, 0);
637    }
638
639    /**
640     * Flatten a List into the parcel at the current dataPosition(), growing
641     * dataCapacity() if needed.  The List values are written using
642     * {@link #writeValue} and must follow the specification there.
643     */
644    public final void writeList(List val) {
645        if (val == null) {
646            writeInt(-1);
647            return;
648        }
649        int N = val.size();
650        int i=0;
651        writeInt(N);
652        while (i < N) {
653            writeValue(val.get(i));
654            i++;
655        }
656    }
657
658    /**
659     * Flatten an Object array into the parcel at the current dataPosition(),
660     * growing dataCapacity() if needed.  The array values are written using
661     * {@link #writeValue} and must follow the specification there.
662     */
663    public final void writeArray(Object[] val) {
664        if (val == null) {
665            writeInt(-1);
666            return;
667        }
668        int N = val.length;
669        int i=0;
670        writeInt(N);
671        while (i < N) {
672            writeValue(val[i]);
673            i++;
674        }
675    }
676
677    /**
678     * Flatten a generic SparseArray into the parcel at the current
679     * dataPosition(), growing dataCapacity() if needed.  The SparseArray
680     * values are written using {@link #writeValue} and must follow the
681     * specification there.
682     */
683    public final void writeSparseArray(SparseArray<Object> val) {
684        if (val == null) {
685            writeInt(-1);
686            return;
687        }
688        int N = val.size();
689        writeInt(N);
690        int i=0;
691        while (i < N) {
692            writeInt(val.keyAt(i));
693            writeValue(val.valueAt(i));
694            i++;
695        }
696    }
697
698    public final void writeSparseBooleanArray(SparseBooleanArray val) {
699        if (val == null) {
700            writeInt(-1);
701            return;
702        }
703        int N = val.size();
704        writeInt(N);
705        int i=0;
706        while (i < N) {
707            writeInt(val.keyAt(i));
708            writeByte((byte)(val.valueAt(i) ? 1 : 0));
709            i++;
710        }
711    }
712
713    public final void writeBooleanArray(boolean[] val) {
714        if (val != null) {
715            int N = val.length;
716            writeInt(N);
717            for (int i=0; i<N; i++) {
718                writeInt(val[i] ? 1 : 0);
719            }
720        } else {
721            writeInt(-1);
722        }
723    }
724
725    public final boolean[] createBooleanArray() {
726        int N = readInt();
727        // >>2 as a fast divide-by-4 works in the create*Array() functions
728        // because dataAvail() will never return a negative number.  4 is
729        // the size of a stored boolean in the stream.
730        if (N >= 0 && N <= (dataAvail() >> 2)) {
731            boolean[] val = new boolean[N];
732            for (int i=0; i<N; i++) {
733                val[i] = readInt() != 0;
734            }
735            return val;
736        } else {
737            return null;
738        }
739    }
740
741    public final void readBooleanArray(boolean[] val) {
742        int N = readInt();
743        if (N == val.length) {
744            for (int i=0; i<N; i++) {
745                val[i] = readInt() != 0;
746            }
747        } else {
748            throw new RuntimeException("bad array lengths");
749        }
750    }
751
752    public final void writeCharArray(char[] val) {
753        if (val != null) {
754            int N = val.length;
755            writeInt(N);
756            for (int i=0; i<N; i++) {
757                writeInt((int)val[i]);
758            }
759        } else {
760            writeInt(-1);
761        }
762    }
763
764    public final char[] createCharArray() {
765        int N = readInt();
766        if (N >= 0 && N <= (dataAvail() >> 2)) {
767            char[] val = new char[N];
768            for (int i=0; i<N; i++) {
769                val[i] = (char)readInt();
770            }
771            return val;
772        } else {
773            return null;
774        }
775    }
776
777    public final void readCharArray(char[] val) {
778        int N = readInt();
779        if (N == val.length) {
780            for (int i=0; i<N; i++) {
781                val[i] = (char)readInt();
782            }
783        } else {
784            throw new RuntimeException("bad array lengths");
785        }
786    }
787
788    public final void writeIntArray(int[] val) {
789        if (val != null) {
790            int N = val.length;
791            writeInt(N);
792            for (int i=0; i<N; i++) {
793                writeInt(val[i]);
794            }
795        } else {
796            writeInt(-1);
797        }
798    }
799
800    public final int[] createIntArray() {
801        int N = readInt();
802        if (N >= 0 && N <= (dataAvail() >> 2)) {
803            int[] val = new int[N];
804            for (int i=0; i<N; i++) {
805                val[i] = readInt();
806            }
807            return val;
808        } else {
809            return null;
810        }
811    }
812
813    public final void readIntArray(int[] val) {
814        int N = readInt();
815        if (N == val.length) {
816            for (int i=0; i<N; i++) {
817                val[i] = readInt();
818            }
819        } else {
820            throw new RuntimeException("bad array lengths");
821        }
822    }
823
824    public final void writeLongArray(long[] val) {
825        if (val != null) {
826            int N = val.length;
827            writeInt(N);
828            for (int i=0; i<N; i++) {
829                writeLong(val[i]);
830            }
831        } else {
832            writeInt(-1);
833        }
834    }
835
836    public final long[] createLongArray() {
837        int N = readInt();
838        // >>3 because stored longs are 64 bits
839        if (N >= 0 && N <= (dataAvail() >> 3)) {
840            long[] val = new long[N];
841            for (int i=0; i<N; i++) {
842                val[i] = readLong();
843            }
844            return val;
845        } else {
846            return null;
847        }
848    }
849
850    public final void readLongArray(long[] val) {
851        int N = readInt();
852        if (N == val.length) {
853            for (int i=0; i<N; i++) {
854                val[i] = readLong();
855            }
856        } else {
857            throw new RuntimeException("bad array lengths");
858        }
859    }
860
861    public final void writeFloatArray(float[] val) {
862        if (val != null) {
863            int N = val.length;
864            writeInt(N);
865            for (int i=0; i<N; i++) {
866                writeFloat(val[i]);
867            }
868        } else {
869            writeInt(-1);
870        }
871    }
872
873    public final float[] createFloatArray() {
874        int N = readInt();
875        // >>2 because stored floats are 4 bytes
876        if (N >= 0 && N <= (dataAvail() >> 2)) {
877            float[] val = new float[N];
878            for (int i=0; i<N; i++) {
879                val[i] = readFloat();
880            }
881            return val;
882        } else {
883            return null;
884        }
885    }
886
887    public final void readFloatArray(float[] val) {
888        int N = readInt();
889        if (N == val.length) {
890            for (int i=0; i<N; i++) {
891                val[i] = readFloat();
892            }
893        } else {
894            throw new RuntimeException("bad array lengths");
895        }
896    }
897
898    public final void writeDoubleArray(double[] val) {
899        if (val != null) {
900            int N = val.length;
901            writeInt(N);
902            for (int i=0; i<N; i++) {
903                writeDouble(val[i]);
904            }
905        } else {
906            writeInt(-1);
907        }
908    }
909
910    public final double[] createDoubleArray() {
911        int N = readInt();
912        // >>3 because stored doubles are 8 bytes
913        if (N >= 0 && N <= (dataAvail() >> 3)) {
914            double[] val = new double[N];
915            for (int i=0; i<N; i++) {
916                val[i] = readDouble();
917            }
918            return val;
919        } else {
920            return null;
921        }
922    }
923
924    public final void readDoubleArray(double[] val) {
925        int N = readInt();
926        if (N == val.length) {
927            for (int i=0; i<N; i++) {
928                val[i] = readDouble();
929            }
930        } else {
931            throw new RuntimeException("bad array lengths");
932        }
933    }
934
935    public final void writeStringArray(String[] val) {
936        if (val != null) {
937            int N = val.length;
938            writeInt(N);
939            for (int i=0; i<N; i++) {
940                writeString(val[i]);
941            }
942        } else {
943            writeInt(-1);
944        }
945    }
946
947    public final String[] createStringArray() {
948        int N = readInt();
949        if (N >= 0) {
950            String[] val = new String[N];
951            for (int i=0; i<N; i++) {
952                val[i] = readString();
953            }
954            return val;
955        } else {
956            return null;
957        }
958    }
959
960    public final void readStringArray(String[] val) {
961        int N = readInt();
962        if (N == val.length) {
963            for (int i=0; i<N; i++) {
964                val[i] = readString();
965            }
966        } else {
967            throw new RuntimeException("bad array lengths");
968        }
969    }
970
971    public final void writeBinderArray(IBinder[] val) {
972        if (val != null) {
973            int N = val.length;
974            writeInt(N);
975            for (int i=0; i<N; i++) {
976                writeStrongBinder(val[i]);
977            }
978        } else {
979            writeInt(-1);
980        }
981    }
982
983    /**
984     * @hide
985     */
986    public final void writeCharSequenceArray(CharSequence[] val) {
987        if (val != null) {
988            int N = val.length;
989            writeInt(N);
990            for (int i=0; i<N; i++) {
991                writeCharSequence(val[i]);
992            }
993        } else {
994            writeInt(-1);
995        }
996    }
997
998    public final IBinder[] createBinderArray() {
999        int N = readInt();
1000        if (N >= 0) {
1001            IBinder[] val = new IBinder[N];
1002            for (int i=0; i<N; i++) {
1003                val[i] = readStrongBinder();
1004            }
1005            return val;
1006        } else {
1007            return null;
1008        }
1009    }
1010
1011    public final void readBinderArray(IBinder[] val) {
1012        int N = readInt();
1013        if (N == val.length) {
1014            for (int i=0; i<N; i++) {
1015                val[i] = readStrongBinder();
1016            }
1017        } else {
1018            throw new RuntimeException("bad array lengths");
1019        }
1020    }
1021
1022    /**
1023     * Flatten a List containing a particular object type into the parcel, at
1024     * the current dataPosition() and growing dataCapacity() if needed.  The
1025     * type of the objects in the list must be one that implements Parcelable.
1026     * Unlike the generic writeList() method, however, only the raw data of the
1027     * objects is written and not their type, so you must use the corresponding
1028     * readTypedList() to unmarshall them.
1029     *
1030     * @param val The list of objects to be written.
1031     *
1032     * @see #createTypedArrayList
1033     * @see #readTypedList
1034     * @see Parcelable
1035     */
1036    public final <T extends Parcelable> void writeTypedList(List<T> val) {
1037        if (val == null) {
1038            writeInt(-1);
1039            return;
1040        }
1041        int N = val.size();
1042        int i=0;
1043        writeInt(N);
1044        while (i < N) {
1045            T item = val.get(i);
1046            if (item != null) {
1047                writeInt(1);
1048                item.writeToParcel(this, 0);
1049            } else {
1050                writeInt(0);
1051            }
1052            i++;
1053        }
1054    }
1055
1056    /**
1057     * Flatten a List containing String objects into the parcel, at
1058     * the current dataPosition() and growing dataCapacity() if needed.  They
1059     * can later be retrieved with {@link #createStringArrayList} or
1060     * {@link #readStringList}.
1061     *
1062     * @param val The list of strings to be written.
1063     *
1064     * @see #createStringArrayList
1065     * @see #readStringList
1066     */
1067    public final void writeStringList(List<String> val) {
1068        if (val == null) {
1069            writeInt(-1);
1070            return;
1071        }
1072        int N = val.size();
1073        int i=0;
1074        writeInt(N);
1075        while (i < N) {
1076            writeString(val.get(i));
1077            i++;
1078        }
1079    }
1080
1081    /**
1082     * Flatten a List containing IBinder objects into the parcel, at
1083     * the current dataPosition() and growing dataCapacity() if needed.  They
1084     * can later be retrieved with {@link #createBinderArrayList} or
1085     * {@link #readBinderList}.
1086     *
1087     * @param val The list of strings to be written.
1088     *
1089     * @see #createBinderArrayList
1090     * @see #readBinderList
1091     */
1092    public final void writeBinderList(List<IBinder> val) {
1093        if (val == null) {
1094            writeInt(-1);
1095            return;
1096        }
1097        int N = val.size();
1098        int i=0;
1099        writeInt(N);
1100        while (i < N) {
1101            writeStrongBinder(val.get(i));
1102            i++;
1103        }
1104    }
1105
1106    /**
1107     * Flatten a heterogeneous array containing a particular object type into
1108     * the parcel, at
1109     * the current dataPosition() and growing dataCapacity() if needed.  The
1110     * type of the objects in the array must be one that implements Parcelable.
1111     * Unlike the {@link #writeParcelableArray} method, however, only the
1112     * raw data of the objects is written and not their type, so you must use
1113     * {@link #readTypedArray} with the correct corresponding
1114     * {@link Parcelable.Creator} implementation to unmarshall them.
1115     *
1116     * @param val The array of objects to be written.
1117     * @param parcelableFlags Contextual flags as per
1118     * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
1119     *
1120     * @see #readTypedArray
1121     * @see #writeParcelableArray
1122     * @see Parcelable.Creator
1123     */
1124    public final <T extends Parcelable> void writeTypedArray(T[] val,
1125            int parcelableFlags) {
1126        if (val != null) {
1127            int N = val.length;
1128            writeInt(N);
1129            for (int i=0; i<N; i++) {
1130                T item = val[i];
1131                if (item != null) {
1132                    writeInt(1);
1133                    item.writeToParcel(this, parcelableFlags);
1134                } else {
1135                    writeInt(0);
1136                }
1137            }
1138        } else {
1139            writeInt(-1);
1140        }
1141    }
1142
1143    /**
1144     * Flatten a generic object in to a parcel.  The given Object value may
1145     * currently be one of the following types:
1146     *
1147     * <ul>
1148     * <li> null
1149     * <li> String
1150     * <li> Byte
1151     * <li> Short
1152     * <li> Integer
1153     * <li> Long
1154     * <li> Float
1155     * <li> Double
1156     * <li> Boolean
1157     * <li> String[]
1158     * <li> boolean[]
1159     * <li> byte[]
1160     * <li> int[]
1161     * <li> long[]
1162     * <li> Object[] (supporting objects of the same type defined here).
1163     * <li> {@link Bundle}
1164     * <li> Map (as supported by {@link #writeMap}).
1165     * <li> Any object that implements the {@link Parcelable} protocol.
1166     * <li> Parcelable[]
1167     * <li> CharSequence (as supported by {@link TextUtils#writeToParcel}).
1168     * <li> List (as supported by {@link #writeList}).
1169     * <li> {@link SparseArray} (as supported by {@link #writeSparseArray(SparseArray)}).
1170     * <li> {@link IBinder}
1171     * <li> Any object that implements Serializable (but see
1172     *      {@link #writeSerializable} for caveats).  Note that all of the
1173     *      previous types have relatively efficient implementations for
1174     *      writing to a Parcel; having to rely on the generic serialization
1175     *      approach is much less efficient and should be avoided whenever
1176     *      possible.
1177     * </ul>
1178     *
1179     * <p class="caution">{@link Parcelable} objects are written with
1180     * {@link Parcelable#writeToParcel} using contextual flags of 0.  When
1181     * serializing objects containing {@link ParcelFileDescriptor}s,
1182     * this may result in file descriptor leaks when they are returned from
1183     * Binder calls (where {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE}
1184     * should be used).</p>
1185     */
1186    public final void writeValue(Object v) {
1187        if (v == null) {
1188            writeInt(VAL_NULL);
1189        } else if (v instanceof String) {
1190            writeInt(VAL_STRING);
1191            writeString((String) v);
1192        } else if (v instanceof Integer) {
1193            writeInt(VAL_INTEGER);
1194            writeInt((Integer) v);
1195        } else if (v instanceof Map) {
1196            writeInt(VAL_MAP);
1197            writeMap((Map) v);
1198        } else if (v instanceof Bundle) {
1199            // Must be before Parcelable
1200            writeInt(VAL_BUNDLE);
1201            writeBundle((Bundle) v);
1202        } else if (v instanceof Parcelable) {
1203            writeInt(VAL_PARCELABLE);
1204            writeParcelable((Parcelable) v, 0);
1205        } else if (v instanceof Short) {
1206            writeInt(VAL_SHORT);
1207            writeInt(((Short) v).intValue());
1208        } else if (v instanceof Long) {
1209            writeInt(VAL_LONG);
1210            writeLong((Long) v);
1211        } else if (v instanceof Float) {
1212            writeInt(VAL_FLOAT);
1213            writeFloat((Float) v);
1214        } else if (v instanceof Double) {
1215            writeInt(VAL_DOUBLE);
1216            writeDouble((Double) v);
1217        } else if (v instanceof Boolean) {
1218            writeInt(VAL_BOOLEAN);
1219            writeInt((Boolean) v ? 1 : 0);
1220        } else if (v instanceof CharSequence) {
1221            // Must be after String
1222            writeInt(VAL_CHARSEQUENCE);
1223            writeCharSequence((CharSequence) v);
1224        } else if (v instanceof List) {
1225            writeInt(VAL_LIST);
1226            writeList((List) v);
1227        } else if (v instanceof SparseArray) {
1228            writeInt(VAL_SPARSEARRAY);
1229            writeSparseArray((SparseArray) v);
1230        } else if (v instanceof boolean[]) {
1231            writeInt(VAL_BOOLEANARRAY);
1232            writeBooleanArray((boolean[]) v);
1233        } else if (v instanceof byte[]) {
1234            writeInt(VAL_BYTEARRAY);
1235            writeByteArray((byte[]) v);
1236        } else if (v instanceof String[]) {
1237            writeInt(VAL_STRINGARRAY);
1238            writeStringArray((String[]) v);
1239        } else if (v instanceof CharSequence[]) {
1240            // Must be after String[] and before Object[]
1241            writeInt(VAL_CHARSEQUENCEARRAY);
1242            writeCharSequenceArray((CharSequence[]) v);
1243        } else if (v instanceof IBinder) {
1244            writeInt(VAL_IBINDER);
1245            writeStrongBinder((IBinder) v);
1246        } else if (v instanceof Parcelable[]) {
1247            writeInt(VAL_PARCELABLEARRAY);
1248            writeParcelableArray((Parcelable[]) v, 0);
1249        } else if (v instanceof Object[]) {
1250            writeInt(VAL_OBJECTARRAY);
1251            writeArray((Object[]) v);
1252        } else if (v instanceof int[]) {
1253            writeInt(VAL_INTARRAY);
1254            writeIntArray((int[]) v);
1255        } else if (v instanceof long[]) {
1256            writeInt(VAL_LONGARRAY);
1257            writeLongArray((long[]) v);
1258        } else if (v instanceof Byte) {
1259            writeInt(VAL_BYTE);
1260            writeInt((Byte) v);
1261        } else if (v instanceof Serializable) {
1262            // Must be last
1263            writeInt(VAL_SERIALIZABLE);
1264            writeSerializable((Serializable) v);
1265        } else {
1266            throw new RuntimeException("Parcel: unable to marshal value " + v);
1267        }
1268    }
1269
1270    /**
1271     * Flatten the name of the class of the Parcelable and its contents
1272     * into the parcel.
1273     *
1274     * @param p The Parcelable object to be written.
1275     * @param parcelableFlags Contextual flags as per
1276     * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
1277     */
1278    public final void writeParcelable(Parcelable p, int parcelableFlags) {
1279        if (p == null) {
1280            writeString(null);
1281            return;
1282        }
1283        String name = p.getClass().getName();
1284        writeString(name);
1285        p.writeToParcel(this, parcelableFlags);
1286    }
1287
1288    /** @hide */
1289    public final void writeParcelableCreator(Parcelable p) {
1290        String name = p.getClass().getName();
1291        writeString(name);
1292    }
1293
1294    /**
1295     * Write a generic serializable object in to a Parcel.  It is strongly
1296     * recommended that this method be avoided, since the serialization
1297     * overhead is extremely large, and this approach will be much slower than
1298     * using the other approaches to writing data in to a Parcel.
1299     */
1300    public final void writeSerializable(Serializable s) {
1301        if (s == null) {
1302            writeString(null);
1303            return;
1304        }
1305        String name = s.getClass().getName();
1306        writeString(name);
1307
1308        ByteArrayOutputStream baos = new ByteArrayOutputStream();
1309        try {
1310            ObjectOutputStream oos = new ObjectOutputStream(baos);
1311            oos.writeObject(s);
1312            oos.close();
1313
1314            writeByteArray(baos.toByteArray());
1315        } catch (IOException ioe) {
1316            throw new RuntimeException("Parcelable encountered " +
1317                "IOException writing serializable object (name = " + name +
1318                ")", ioe);
1319        }
1320    }
1321
1322    /**
1323     * Special function for writing an exception result at the header of
1324     * a parcel, to be used when returning an exception from a transaction.
1325     * Note that this currently only supports a few exception types; any other
1326     * exception will be re-thrown by this function as a RuntimeException
1327     * (to be caught by the system's last-resort exception handling when
1328     * dispatching a transaction).
1329     *
1330     * <p>The supported exception types are:
1331     * <ul>
1332     * <li>{@link BadParcelableException}
1333     * <li>{@link IllegalArgumentException}
1334     * <li>{@link IllegalStateException}
1335     * <li>{@link NullPointerException}
1336     * <li>{@link SecurityException}
1337     * <li>{@link NetworkOnMainThreadException}
1338     * </ul>
1339     *
1340     * @param e The Exception to be written.
1341     *
1342     * @see #writeNoException
1343     * @see #readException
1344     */
1345    public final void writeException(Exception e) {
1346        int code = 0;
1347        if (e instanceof SecurityException) {
1348            code = EX_SECURITY;
1349        } else if (e instanceof BadParcelableException) {
1350            code = EX_BAD_PARCELABLE;
1351        } else if (e instanceof IllegalArgumentException) {
1352            code = EX_ILLEGAL_ARGUMENT;
1353        } else if (e instanceof NullPointerException) {
1354            code = EX_NULL_POINTER;
1355        } else if (e instanceof IllegalStateException) {
1356            code = EX_ILLEGAL_STATE;
1357        } else if (e instanceof NetworkOnMainThreadException) {
1358            code = EX_NETWORK_MAIN_THREAD;
1359        }
1360        writeInt(code);
1361        StrictMode.clearGatheredViolations();
1362        if (code == 0) {
1363            if (e instanceof RuntimeException) {
1364                throw (RuntimeException) e;
1365            }
1366            throw new RuntimeException(e);
1367        }
1368        writeString(e.getMessage());
1369    }
1370
1371    /**
1372     * Special function for writing information at the front of the Parcel
1373     * indicating that no exception occurred.
1374     *
1375     * @see #writeException
1376     * @see #readException
1377     */
1378    public final void writeNoException() {
1379        // Despite the name of this function ("write no exception"),
1380        // it should instead be thought of as "write the RPC response
1381        // header", but because this function name is written out by
1382        // the AIDL compiler, we're not going to rename it.
1383        //
1384        // The response header, in the non-exception case (see also
1385        // writeException above, also called by the AIDL compiler), is
1386        // either a 0 (the default case), or EX_HAS_REPLY_HEADER if
1387        // StrictMode has gathered up violations that have occurred
1388        // during a Binder call, in which case we write out the number
1389        // of violations and their details, serialized, before the
1390        // actual RPC respons data.  The receiving end of this is
1391        // readException(), below.
1392        if (StrictMode.hasGatheredViolations()) {
1393            writeInt(EX_HAS_REPLY_HEADER);
1394            final int sizePosition = dataPosition();
1395            writeInt(0);  // total size of fat header, to be filled in later
1396            StrictMode.writeGatheredViolationsToParcel(this);
1397            final int payloadPosition = dataPosition();
1398            setDataPosition(sizePosition);
1399            writeInt(payloadPosition - sizePosition);  // header size
1400            setDataPosition(payloadPosition);
1401        } else {
1402            writeInt(0);
1403        }
1404    }
1405
1406    /**
1407     * Special function for reading an exception result from the header of
1408     * a parcel, to be used after receiving the result of a transaction.  This
1409     * will throw the exception for you if it had been written to the Parcel,
1410     * otherwise return and let you read the normal result data from the Parcel.
1411     *
1412     * @see #writeException
1413     * @see #writeNoException
1414     */
1415    public final void readException() {
1416        int code = readExceptionCode();
1417        if (code != 0) {
1418            String msg = readString();
1419            readException(code, msg);
1420        }
1421    }
1422
1423    /**
1424     * Parses the header of a Binder call's response Parcel and
1425     * returns the exception code.  Deals with lite or fat headers.
1426     * In the common successful case, this header is generally zero.
1427     * In less common cases, it's a small negative number and will be
1428     * followed by an error string.
1429     *
1430     * This exists purely for android.database.DatabaseUtils and
1431     * insulating it from having to handle fat headers as returned by
1432     * e.g. StrictMode-induced RPC responses.
1433     *
1434     * @hide
1435     */
1436    public final int readExceptionCode() {
1437        int code = readInt();
1438        if (code == EX_HAS_REPLY_HEADER) {
1439            int headerSize = readInt();
1440            if (headerSize == 0) {
1441                Log.e(TAG, "Unexpected zero-sized Parcel reply header.");
1442            } else {
1443                // Currently the only thing in the header is StrictMode stacks,
1444                // but discussions around event/RPC tracing suggest we might
1445                // put that here too.  If so, switch on sub-header tags here.
1446                // But for now, just parse out the StrictMode stuff.
1447                StrictMode.readAndHandleBinderCallViolations(this);
1448            }
1449            // And fat response headers are currently only used when
1450            // there are no exceptions, so return no error:
1451            return 0;
1452        }
1453        return code;
1454    }
1455
1456    /**
1457     * Use this function for customized exception handling.
1458     * customized method call this method for all unknown case
1459     * @param code exception code
1460     * @param msg exception message
1461     */
1462    public final void readException(int code, String msg) {
1463        switch (code) {
1464            case EX_SECURITY:
1465                throw new SecurityException(msg);
1466            case EX_BAD_PARCELABLE:
1467                throw new BadParcelableException(msg);
1468            case EX_ILLEGAL_ARGUMENT:
1469                throw new IllegalArgumentException(msg);
1470            case EX_NULL_POINTER:
1471                throw new NullPointerException(msg);
1472            case EX_ILLEGAL_STATE:
1473                throw new IllegalStateException(msg);
1474            case EX_NETWORK_MAIN_THREAD:
1475                throw new NetworkOnMainThreadException();
1476        }
1477        throw new RuntimeException("Unknown exception code: " + code
1478                + " msg " + msg);
1479    }
1480
1481    /**
1482     * Read an integer value from the parcel at the current dataPosition().
1483     */
1484    public final int readInt() {
1485        return nativeReadInt(mNativePtr);
1486    }
1487
1488    /**
1489     * Read a long integer value from the parcel at the current dataPosition().
1490     */
1491    public final long readLong() {
1492        return nativeReadLong(mNativePtr);
1493    }
1494
1495    /**
1496     * Read a floating point value from the parcel at the current
1497     * dataPosition().
1498     */
1499    public final float readFloat() {
1500        return nativeReadFloat(mNativePtr);
1501    }
1502
1503    /**
1504     * Read a double precision floating point value from the parcel at the
1505     * current dataPosition().
1506     */
1507    public final double readDouble() {
1508        return nativeReadDouble(mNativePtr);
1509    }
1510
1511    /**
1512     * Read a string value from the parcel at the current dataPosition().
1513     */
1514    public final String readString() {
1515        return nativeReadString(mNativePtr);
1516    }
1517
1518    /**
1519     * Read a CharSequence value from the parcel at the current dataPosition().
1520     * @hide
1521     */
1522    public final CharSequence readCharSequence() {
1523        return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this);
1524    }
1525
1526    /**
1527     * Read an object from the parcel at the current dataPosition().
1528     */
1529    public final IBinder readStrongBinder() {
1530        return nativeReadStrongBinder(mNativePtr);
1531    }
1532
1533    /**
1534     * Read a FileDescriptor from the parcel at the current dataPosition().
1535     */
1536    public final ParcelFileDescriptor readFileDescriptor() {
1537        FileDescriptor fd = nativeReadFileDescriptor(mNativePtr);
1538        return fd != null ? new ParcelFileDescriptor(fd) : null;
1539    }
1540
1541    /** {@hide} */
1542    public final FileDescriptor readRawFileDescriptor() {
1543        return nativeReadFileDescriptor(mNativePtr);
1544    }
1545
1546    /*package*/ static native FileDescriptor openFileDescriptor(String file,
1547            int mode) throws FileNotFoundException;
1548    /*package*/ static native FileDescriptor dupFileDescriptor(FileDescriptor orig)
1549            throws IOException;
1550    /*package*/ static native void closeFileDescriptor(FileDescriptor desc)
1551            throws IOException;
1552    /*package*/ static native void clearFileDescriptor(FileDescriptor desc);
1553
1554    /**
1555     * Read a byte value from the parcel at the current dataPosition().
1556     */
1557    public final byte readByte() {
1558        return (byte)(readInt() & 0xff);
1559    }
1560
1561    /**
1562     * Please use {@link #readBundle(ClassLoader)} instead (whose data must have
1563     * been written with {@link #writeBundle}.  Read into an existing Map object
1564     * from the parcel at the current dataPosition().
1565     */
1566    public final void readMap(Map outVal, ClassLoader loader) {
1567        int N = readInt();
1568        readMapInternal(outVal, N, loader);
1569    }
1570
1571    /**
1572     * Read into an existing List object from the parcel at the current
1573     * dataPosition(), using the given class loader to load any enclosed
1574     * Parcelables.  If it is null, the default class loader is used.
1575     */
1576    public final void readList(List outVal, ClassLoader loader) {
1577        int N = readInt();
1578        readListInternal(outVal, N, loader);
1579    }
1580
1581    /**
1582     * Please use {@link #readBundle(ClassLoader)} instead (whose data must have
1583     * been written with {@link #writeBundle}.  Read and return a new HashMap
1584     * object from the parcel at the current dataPosition(), using the given
1585     * class loader to load any enclosed Parcelables.  Returns null if
1586     * the previously written map object was null.
1587     */
1588    public final HashMap readHashMap(ClassLoader loader)
1589    {
1590        int N = readInt();
1591        if (N < 0) {
1592            return null;
1593        }
1594        HashMap m = new HashMap(N);
1595        readMapInternal(m, N, loader);
1596        return m;
1597    }
1598
1599    /**
1600     * Read and return a new Bundle object from the parcel at the current
1601     * dataPosition().  Returns null if the previously written Bundle object was
1602     * null.
1603     */
1604    public final Bundle readBundle() {
1605        return readBundle(null);
1606    }
1607
1608    /**
1609     * Read and return a new Bundle object from the parcel at the current
1610     * dataPosition(), using the given class loader to initialize the class
1611     * loader of the Bundle for later retrieval of Parcelable objects.
1612     * Returns null if the previously written Bundle object was null.
1613     */
1614    public final Bundle readBundle(ClassLoader loader) {
1615        int length = readInt();
1616        if (length < 0) {
1617            if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length);
1618            return null;
1619        }
1620
1621        final Bundle bundle = new Bundle(this, length);
1622        if (loader != null) {
1623            bundle.setClassLoader(loader);
1624        }
1625        return bundle;
1626    }
1627
1628    /**
1629     * Read and return a byte[] object from the parcel.
1630     */
1631    public final byte[] createByteArray() {
1632        return nativeCreateByteArray(mNativePtr);
1633    }
1634
1635    /**
1636     * Read a byte[] object from the parcel and copy it into the
1637     * given byte array.
1638     */
1639    public final void readByteArray(byte[] val) {
1640        // TODO: make this a native method to avoid the extra copy.
1641        byte[] ba = createByteArray();
1642        if (ba.length == val.length) {
1643           System.arraycopy(ba, 0, val, 0, ba.length);
1644        } else {
1645            throw new RuntimeException("bad array lengths");
1646        }
1647    }
1648
1649    /**
1650     * Read and return a String[] object from the parcel.
1651     * {@hide}
1652     */
1653    public final String[] readStringArray() {
1654        String[] array = null;
1655
1656        int length = readInt();
1657        if (length >= 0)
1658        {
1659            array = new String[length];
1660
1661            for (int i = 0 ; i < length ; i++)
1662            {
1663                array[i] = readString();
1664            }
1665        }
1666
1667        return array;
1668    }
1669
1670    /**
1671     * Read and return a CharSequence[] object from the parcel.
1672     * {@hide}
1673     */
1674    public final CharSequence[] readCharSequenceArray() {
1675        CharSequence[] array = null;
1676
1677        int length = readInt();
1678        if (length >= 0)
1679        {
1680            array = new CharSequence[length];
1681
1682            for (int i = 0 ; i < length ; i++)
1683            {
1684                array[i] = readCharSequence();
1685            }
1686        }
1687
1688        return array;
1689    }
1690
1691    /**
1692     * Read and return a new ArrayList object from the parcel at the current
1693     * dataPosition().  Returns null if the previously written list object was
1694     * null.  The given class loader will be used to load any enclosed
1695     * Parcelables.
1696     */
1697    public final ArrayList readArrayList(ClassLoader loader) {
1698        int N = readInt();
1699        if (N < 0) {
1700            return null;
1701        }
1702        ArrayList l = new ArrayList(N);
1703        readListInternal(l, N, loader);
1704        return l;
1705    }
1706
1707    /**
1708     * Read and return a new Object array from the parcel at the current
1709     * dataPosition().  Returns null if the previously written array was
1710     * null.  The given class loader will be used to load any enclosed
1711     * Parcelables.
1712     */
1713    public final Object[] readArray(ClassLoader loader) {
1714        int N = readInt();
1715        if (N < 0) {
1716            return null;
1717        }
1718        Object[] l = new Object[N];
1719        readArrayInternal(l, N, loader);
1720        return l;
1721    }
1722
1723    /**
1724     * Read and return a new SparseArray object from the parcel at the current
1725     * dataPosition().  Returns null if the previously written list object was
1726     * null.  The given class loader will be used to load any enclosed
1727     * Parcelables.
1728     */
1729    public final SparseArray readSparseArray(ClassLoader loader) {
1730        int N = readInt();
1731        if (N < 0) {
1732            return null;
1733        }
1734        SparseArray sa = new SparseArray(N);
1735        readSparseArrayInternal(sa, N, loader);
1736        return sa;
1737    }
1738
1739    /**
1740     * Read and return a new SparseBooleanArray object from the parcel at the current
1741     * dataPosition().  Returns null if the previously written list object was
1742     * null.
1743     */
1744    public final SparseBooleanArray readSparseBooleanArray() {
1745        int N = readInt();
1746        if (N < 0) {
1747            return null;
1748        }
1749        SparseBooleanArray sa = new SparseBooleanArray(N);
1750        readSparseBooleanArrayInternal(sa, N);
1751        return sa;
1752    }
1753
1754    /**
1755     * Read and return a new ArrayList containing a particular object type from
1756     * the parcel that was written with {@link #writeTypedList} at the
1757     * current dataPosition().  Returns null if the
1758     * previously written list object was null.  The list <em>must</em> have
1759     * previously been written via {@link #writeTypedList} with the same object
1760     * type.
1761     *
1762     * @return A newly created ArrayList containing objects with the same data
1763     *         as those that were previously written.
1764     *
1765     * @see #writeTypedList
1766     */
1767    public final <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> c) {
1768        int N = readInt();
1769        if (N < 0) {
1770            return null;
1771        }
1772        ArrayList<T> l = new ArrayList<T>(N);
1773        while (N > 0) {
1774            if (readInt() != 0) {
1775                l.add(c.createFromParcel(this));
1776            } else {
1777                l.add(null);
1778            }
1779            N--;
1780        }
1781        return l;
1782    }
1783
1784    /**
1785     * Read into the given List items containing a particular object type
1786     * that were written with {@link #writeTypedList} at the
1787     * current dataPosition().  The list <em>must</em> have
1788     * previously been written via {@link #writeTypedList} with the same object
1789     * type.
1790     *
1791     * @return A newly created ArrayList containing objects with the same data
1792     *         as those that were previously written.
1793     *
1794     * @see #writeTypedList
1795     */
1796    public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) {
1797        int M = list.size();
1798        int N = readInt();
1799        int i = 0;
1800        for (; i < M && i < N; i++) {
1801            if (readInt() != 0) {
1802                list.set(i, c.createFromParcel(this));
1803            } else {
1804                list.set(i, null);
1805            }
1806        }
1807        for (; i<N; i++) {
1808            if (readInt() != 0) {
1809                list.add(c.createFromParcel(this));
1810            } else {
1811                list.add(null);
1812            }
1813        }
1814        for (; i<M; i++) {
1815            list.remove(N);
1816        }
1817    }
1818
1819    /**
1820     * Read and return a new ArrayList containing String objects from
1821     * the parcel that was written with {@link #writeStringList} at the
1822     * current dataPosition().  Returns null if the
1823     * previously written list object was null.
1824     *
1825     * @return A newly created ArrayList containing strings with the same data
1826     *         as those that were previously written.
1827     *
1828     * @see #writeStringList
1829     */
1830    public final ArrayList<String> createStringArrayList() {
1831        int N = readInt();
1832        if (N < 0) {
1833            return null;
1834        }
1835        ArrayList<String> l = new ArrayList<String>(N);
1836        while (N > 0) {
1837            l.add(readString());
1838            N--;
1839        }
1840        return l;
1841    }
1842
1843    /**
1844     * Read and return a new ArrayList containing IBinder objects from
1845     * the parcel that was written with {@link #writeBinderList} at the
1846     * current dataPosition().  Returns null if the
1847     * previously written list object was null.
1848     *
1849     * @return A newly created ArrayList containing strings with the same data
1850     *         as those that were previously written.
1851     *
1852     * @see #writeBinderList
1853     */
1854    public final ArrayList<IBinder> createBinderArrayList() {
1855        int N = readInt();
1856        if (N < 0) {
1857            return null;
1858        }
1859        ArrayList<IBinder> l = new ArrayList<IBinder>(N);
1860        while (N > 0) {
1861            l.add(readStrongBinder());
1862            N--;
1863        }
1864        return l;
1865    }
1866
1867    /**
1868     * Read into the given List items String objects that were written with
1869     * {@link #writeStringList} at the current dataPosition().
1870     *
1871     * @return A newly created ArrayList containing strings with the same data
1872     *         as those that were previously written.
1873     *
1874     * @see #writeStringList
1875     */
1876    public final void readStringList(List<String> list) {
1877        int M = list.size();
1878        int N = readInt();
1879        int i = 0;
1880        for (; i < M && i < N; i++) {
1881            list.set(i, readString());
1882        }
1883        for (; i<N; i++) {
1884            list.add(readString());
1885        }
1886        for (; i<M; i++) {
1887            list.remove(N);
1888        }
1889    }
1890
1891    /**
1892     * Read into the given List items IBinder objects that were written with
1893     * {@link #writeBinderList} at the current dataPosition().
1894     *
1895     * @return A newly created ArrayList containing strings with the same data
1896     *         as those that were previously written.
1897     *
1898     * @see #writeBinderList
1899     */
1900    public final void readBinderList(List<IBinder> list) {
1901        int M = list.size();
1902        int N = readInt();
1903        int i = 0;
1904        for (; i < M && i < N; i++) {
1905            list.set(i, readStrongBinder());
1906        }
1907        for (; i<N; i++) {
1908            list.add(readStrongBinder());
1909        }
1910        for (; i<M; i++) {
1911            list.remove(N);
1912        }
1913    }
1914
1915    /**
1916     * Read and return a new array containing a particular object type from
1917     * the parcel at the current dataPosition().  Returns null if the
1918     * previously written array was null.  The array <em>must</em> have
1919     * previously been written via {@link #writeTypedArray} with the same
1920     * object type.
1921     *
1922     * @return A newly created array containing objects with the same data
1923     *         as those that were previously written.
1924     *
1925     * @see #writeTypedArray
1926     */
1927    public final <T> T[] createTypedArray(Parcelable.Creator<T> c) {
1928        int N = readInt();
1929        if (N < 0) {
1930            return null;
1931        }
1932        T[] l = c.newArray(N);
1933        for (int i=0; i<N; i++) {
1934            if (readInt() != 0) {
1935                l[i] = c.createFromParcel(this);
1936            }
1937        }
1938        return l;
1939    }
1940
1941    public final <T> void readTypedArray(T[] val, Parcelable.Creator<T> c) {
1942        int N = readInt();
1943        if (N == val.length) {
1944            for (int i=0; i<N; i++) {
1945                if (readInt() != 0) {
1946                    val[i] = c.createFromParcel(this);
1947                } else {
1948                    val[i] = null;
1949                }
1950            }
1951        } else {
1952            throw new RuntimeException("bad array lengths");
1953        }
1954    }
1955
1956    /**
1957     * @deprecated
1958     * @hide
1959     */
1960    @Deprecated
1961    public final <T> T[] readTypedArray(Parcelable.Creator<T> c) {
1962        return createTypedArray(c);
1963    }
1964
1965    /**
1966     * Write a heterogeneous array of Parcelable objects into the Parcel.
1967     * Each object in the array is written along with its class name, so
1968     * that the correct class can later be instantiated.  As a result, this
1969     * has significantly more overhead than {@link #writeTypedArray}, but will
1970     * correctly handle an array containing more than one type of object.
1971     *
1972     * @param value The array of objects to be written.
1973     * @param parcelableFlags Contextual flags as per
1974     * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}.
1975     *
1976     * @see #writeTypedArray
1977     */
1978    public final <T extends Parcelable> void writeParcelableArray(T[] value,
1979            int parcelableFlags) {
1980        if (value != null) {
1981            int N = value.length;
1982            writeInt(N);
1983            for (int i=0; i<N; i++) {
1984                writeParcelable(value[i], parcelableFlags);
1985            }
1986        } else {
1987            writeInt(-1);
1988        }
1989    }
1990
1991    /**
1992     * Read a typed object from a parcel.  The given class loader will be
1993     * used to load any enclosed Parcelables.  If it is null, the default class
1994     * loader will be used.
1995     */
1996    public final Object readValue(ClassLoader loader) {
1997        int type = readInt();
1998
1999        switch (type) {
2000        case VAL_NULL:
2001            return null;
2002
2003        case VAL_STRING:
2004            return readString();
2005
2006        case VAL_INTEGER:
2007            return readInt();
2008
2009        case VAL_MAP:
2010            return readHashMap(loader);
2011
2012        case VAL_PARCELABLE:
2013            return readParcelable(loader);
2014
2015        case VAL_SHORT:
2016            return (short) readInt();
2017
2018        case VAL_LONG:
2019            return readLong();
2020
2021        case VAL_FLOAT:
2022            return readFloat();
2023
2024        case VAL_DOUBLE:
2025            return readDouble();
2026
2027        case VAL_BOOLEAN:
2028            return readInt() == 1;
2029
2030        case VAL_CHARSEQUENCE:
2031            return readCharSequence();
2032
2033        case VAL_LIST:
2034            return readArrayList(loader);
2035
2036        case VAL_BOOLEANARRAY:
2037            return createBooleanArray();
2038
2039        case VAL_BYTEARRAY:
2040            return createByteArray();
2041
2042        case VAL_STRINGARRAY:
2043            return readStringArray();
2044
2045        case VAL_CHARSEQUENCEARRAY:
2046            return readCharSequenceArray();
2047
2048        case VAL_IBINDER:
2049            return readStrongBinder();
2050
2051        case VAL_OBJECTARRAY:
2052            return readArray(loader);
2053
2054        case VAL_INTARRAY:
2055            return createIntArray();
2056
2057        case VAL_LONGARRAY:
2058            return createLongArray();
2059
2060        case VAL_BYTE:
2061            return readByte();
2062
2063        case VAL_SERIALIZABLE:
2064            return readSerializable();
2065
2066        case VAL_PARCELABLEARRAY:
2067            return readParcelableArray(loader);
2068
2069        case VAL_SPARSEARRAY:
2070            return readSparseArray(loader);
2071
2072        case VAL_SPARSEBOOLEANARRAY:
2073            return readSparseBooleanArray();
2074
2075        case VAL_BUNDLE:
2076            return readBundle(loader); // loading will be deferred
2077
2078        default:
2079            int off = dataPosition() - 4;
2080            throw new RuntimeException(
2081                "Parcel " + this + ": Unmarshalling unknown type code " + type + " at offset " + off);
2082        }
2083    }
2084
2085    /**
2086     * Read and return a new Parcelable from the parcel.  The given class loader
2087     * will be used to load any enclosed Parcelables.  If it is null, the default
2088     * class loader will be used.
2089     * @param loader A ClassLoader from which to instantiate the Parcelable
2090     * object, or null for the default class loader.
2091     * @return Returns the newly created Parcelable, or null if a null
2092     * object has been written.
2093     * @throws BadParcelableException Throws BadParcelableException if there
2094     * was an error trying to instantiate the Parcelable.
2095     */
2096    public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
2097        Parcelable.Creator<T> creator = readParcelableCreator(loader);
2098        if (creator == null) {
2099            return null;
2100        }
2101        if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
2102            return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader);
2103        }
2104        return creator.createFromParcel(this);
2105    }
2106
2107    /** @hide */
2108    public final <T extends Parcelable> T readCreator(Parcelable.Creator<T> creator,
2109            ClassLoader loader) {
2110        if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
2111            return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader);
2112        }
2113        return creator.createFromParcel(this);
2114    }
2115
2116    /** @hide */
2117    public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator(
2118            ClassLoader loader) {
2119        String name = readString();
2120        if (name == null) {
2121            return null;
2122        }
2123        Parcelable.Creator<T> creator;
2124        synchronized (mCreators) {
2125            HashMap<String,Parcelable.Creator> map = mCreators.get(loader);
2126            if (map == null) {
2127                map = new HashMap<String,Parcelable.Creator>();
2128                mCreators.put(loader, map);
2129            }
2130            creator = map.get(name);
2131            if (creator == null) {
2132                try {
2133                    Class c = loader == null ?
2134                        Class.forName(name) : Class.forName(name, true, loader);
2135                    Field f = c.getField("CREATOR");
2136                    creator = (Parcelable.Creator)f.get(null);
2137                }
2138                catch (IllegalAccessException e) {
2139                    Log.e(TAG, "Illegal access when unmarshalling: "
2140                                        + name, e);
2141                    throw new BadParcelableException(
2142                            "IllegalAccessException when unmarshalling: " + name);
2143                }
2144                catch (ClassNotFoundException e) {
2145                    Log.e(TAG, "Class not found when unmarshalling: "
2146                                        + name, e);
2147                    throw new BadParcelableException(
2148                            "ClassNotFoundException when unmarshalling: " + name);
2149                }
2150                catch (ClassCastException e) {
2151                    throw new BadParcelableException("Parcelable protocol requires a "
2152                                        + "Parcelable.Creator object called "
2153                                        + " CREATOR on class " + name);
2154                }
2155                catch (NoSuchFieldException e) {
2156                    throw new BadParcelableException("Parcelable protocol requires a "
2157                                        + "Parcelable.Creator object called "
2158                                        + " CREATOR on class " + name);
2159                }
2160                catch (NullPointerException e) {
2161                    throw new BadParcelableException("Parcelable protocol requires "
2162                            + "the CREATOR object to be static on class " + name);
2163                }
2164                if (creator == null) {
2165                    throw new BadParcelableException("Parcelable protocol requires a "
2166                                        + "Parcelable.Creator object called "
2167                                        + " CREATOR on class " + name);
2168                }
2169
2170                map.put(name, creator);
2171            }
2172        }
2173
2174        return creator;
2175    }
2176
2177    /**
2178     * Read and return a new Parcelable array from the parcel.
2179     * The given class loader will be used to load any enclosed
2180     * Parcelables.
2181     * @return the Parcelable array, or null if the array is null
2182     */
2183    public final Parcelable[] readParcelableArray(ClassLoader loader) {
2184        int N = readInt();
2185        if (N < 0) {
2186            return null;
2187        }
2188        Parcelable[] p = new Parcelable[N];
2189        for (int i = 0; i < N; i++) {
2190            p[i] = (Parcelable) readParcelable(loader);
2191        }
2192        return p;
2193    }
2194
2195    /**
2196     * Read and return a new Serializable object from the parcel.
2197     * @return the Serializable object, or null if the Serializable name
2198     * wasn't found in the parcel.
2199     */
2200    public final Serializable readSerializable() {
2201        String name = readString();
2202        if (name == null) {
2203            // For some reason we were unable to read the name of the Serializable (either there
2204            // is nothing left in the Parcel to read, or the next value wasn't a String), so
2205            // return null, which indicates that the name wasn't found in the parcel.
2206            return null;
2207        }
2208
2209        byte[] serializedData = createByteArray();
2210        ByteArrayInputStream bais = new ByteArrayInputStream(serializedData);
2211        try {
2212            ObjectInputStream ois = new ObjectInputStream(bais);
2213            return (Serializable) ois.readObject();
2214        } catch (IOException ioe) {
2215            throw new RuntimeException("Parcelable encountered " +
2216                "IOException reading a Serializable object (name = " + name +
2217                ")", ioe);
2218        } catch (ClassNotFoundException cnfe) {
2219            throw new RuntimeException("Parcelable encountered" +
2220                "ClassNotFoundException reading a Serializable object (name = "
2221                + name + ")", cnfe);
2222        }
2223    }
2224
2225    // Cache of previously looked up CREATOR.createFromParcel() methods for
2226    // particular classes.  Keys are the names of the classes, values are
2227    // Method objects.
2228    private static final HashMap<ClassLoader,HashMap<String,Parcelable.Creator>>
2229        mCreators = new HashMap<ClassLoader,HashMap<String,Parcelable.Creator>>();
2230
2231    static protected final Parcel obtain(int obj) {
2232        throw new UnsupportedOperationException();
2233    }
2234
2235    /** @hide */
2236    static protected final Parcel obtain(long obj) {
2237        final Parcel[] pool = sHolderPool;
2238        synchronized (pool) {
2239            Parcel p;
2240            for (int i=0; i<POOL_SIZE; i++) {
2241                p = pool[i];
2242                if (p != null) {
2243                    pool[i] = null;
2244                    if (DEBUG_RECYCLE) {
2245                        p.mStack = new RuntimeException();
2246                    }
2247                    p.init(obj);
2248                    return p;
2249                }
2250            }
2251        }
2252        return new Parcel(obj);
2253    }
2254
2255    private Parcel(long nativePtr) {
2256        if (DEBUG_RECYCLE) {
2257            mStack = new RuntimeException();
2258        }
2259        //Log.i(TAG, "Initializing obj=0x" + Integer.toHexString(obj), mStack);
2260        init(nativePtr);
2261    }
2262
2263    private void init(long nativePtr) {
2264        if (nativePtr != 0) {
2265            mNativePtr = nativePtr;
2266            mOwnsNativeParcelObject = false;
2267        } else {
2268            mNativePtr = nativeCreate();
2269            mOwnsNativeParcelObject = true;
2270        }
2271    }
2272
2273    private void freeBuffer() {
2274        if (mOwnsNativeParcelObject) {
2275            nativeFreeBuffer(mNativePtr);
2276        }
2277    }
2278
2279    private void destroy() {
2280        if (mNativePtr != 0) {
2281            if (mOwnsNativeParcelObject) {
2282                nativeDestroy(mNativePtr);
2283            }
2284            mNativePtr = 0;
2285        }
2286    }
2287
2288    @Override
2289    protected void finalize() throws Throwable {
2290        if (DEBUG_RECYCLE) {
2291            if (mStack != null) {
2292                Log.w(TAG, "Client did not call Parcel.recycle()", mStack);
2293            }
2294        }
2295        destroy();
2296    }
2297
2298    /* package */ void readMapInternal(Map outVal, int N,
2299        ClassLoader loader) {
2300        while (N > 0) {
2301            Object key = readValue(loader);
2302            Object value = readValue(loader);
2303            outVal.put(key, value);
2304            N--;
2305        }
2306    }
2307
2308    /* package */ void readArrayMapInternal(ArrayMap outVal, int N,
2309        ClassLoader loader) {
2310        if (DEBUG_ARRAY_MAP) {
2311            RuntimeException here =  new RuntimeException("here");
2312            here.fillInStackTrace();
2313            Log.d(TAG, "Reading " + N + " ArrayMap entries", here);
2314        }
2315        int startPos;
2316        while (N > 0) {
2317            if (DEBUG_ARRAY_MAP) startPos = dataPosition();
2318            Object key = readValue(loader);
2319            Object value = readValue(loader);
2320            if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Read #" + (N-1) + " "
2321                    + (dataPosition()-startPos) + " bytes: key=0x"
2322                    + Integer.toHexString((key != null ? key.hashCode() : 0)) + " " + key);
2323            outVal.append(key, value);
2324            N--;
2325        }
2326    }
2327
2328    /* package */ void readArrayMapSafelyInternal(ArrayMap outVal, int N,
2329        ClassLoader loader) {
2330        if (DEBUG_ARRAY_MAP) {
2331            RuntimeException here =  new RuntimeException("here");
2332            here.fillInStackTrace();
2333            Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here);
2334        }
2335        while (N > 0) {
2336            Object key = readValue(loader);
2337            if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Read safe #" + (N-1) + ": key=0x"
2338                    + (key != null ? key.hashCode() : 0) + " " + key);
2339            Object value = readValue(loader);
2340            outVal.put(key, value);
2341            N--;
2342        }
2343    }
2344
2345    private void readListInternal(List outVal, int N,
2346        ClassLoader loader) {
2347        while (N > 0) {
2348            Object value = readValue(loader);
2349            //Log.d(TAG, "Unmarshalling value=" + value);
2350            outVal.add(value);
2351            N--;
2352        }
2353    }
2354
2355    private void readArrayInternal(Object[] outVal, int N,
2356        ClassLoader loader) {
2357        for (int i = 0; i < N; i++) {
2358            Object value = readValue(loader);
2359            //Log.d(TAG, "Unmarshalling value=" + value);
2360            outVal[i] = value;
2361        }
2362    }
2363
2364    private void readSparseArrayInternal(SparseArray outVal, int N,
2365        ClassLoader loader) {
2366        while (N > 0) {
2367            int key = readInt();
2368            Object value = readValue(loader);
2369            //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value);
2370            outVal.append(key, value);
2371            N--;
2372        }
2373    }
2374
2375
2376    private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) {
2377        while (N > 0) {
2378            int key = readInt();
2379            boolean value = this.readByte() == 1;
2380            //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value);
2381            outVal.append(key, value);
2382            N--;
2383        }
2384    }
2385}
2386