Home | History | Annotate | Download | only in os
      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 
     17 package android.os;
     18 
     19 import android.text.TextUtils;
     20 import android.util.ArrayMap;
     21 import android.util.Log;
     22 import android.util.SparseArray;
     23 import android.util.SparseBooleanArray;
     24 
     25 import java.io.ByteArrayInputStream;
     26 import java.io.ByteArrayOutputStream;
     27 import java.io.FileDescriptor;
     28 import java.io.FileNotFoundException;
     29 import java.io.IOException;
     30 import java.io.ObjectInputStream;
     31 import java.io.ObjectOutputStream;
     32 import java.io.Serializable;
     33 import java.lang.reflect.Field;
     34 import java.util.ArrayList;
     35 import java.util.Arrays;
     36 import java.util.HashMap;
     37 import java.util.List;
     38 import java.util.Map;
     39 import 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  */
    179 public 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 int 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(int nativePtr);
    236     private static native int nativeDataAvail(int nativePtr);
    237     private static native int nativeDataPosition(int nativePtr);
    238     private static native int nativeDataCapacity(int nativePtr);
    239     private static native void nativeSetDataSize(int nativePtr, int size);
    240     private static native void nativeSetDataPosition(int nativePtr, int pos);
    241     private static native void nativeSetDataCapacity(int nativePtr, int size);
    242 
    243     private static native boolean nativePushAllowFds(int nativePtr, boolean allowFds);
    244     private static native void nativeRestoreAllowFds(int nativePtr, boolean lastValue);
    245 
    246     private static native void nativeWriteByteArray(int nativePtr, byte[] b, int offset, int len);
    247     private static native void nativeWriteInt(int nativePtr, int val);
    248     private static native void nativeWriteLong(int nativePtr, long val);
    249     private static native void nativeWriteFloat(int nativePtr, float val);
    250     private static native void nativeWriteDouble(int nativePtr, double val);
    251     private static native void nativeWriteString(int nativePtr, String val);
    252     private static native void nativeWriteStrongBinder(int nativePtr, IBinder val);
    253     private static native void nativeWriteFileDescriptor(int nativePtr, FileDescriptor val);
    254 
    255     private static native byte[] nativeCreateByteArray(int nativePtr);
    256     private static native int nativeReadInt(int nativePtr);
    257     private static native long nativeReadLong(int nativePtr);
    258     private static native float nativeReadFloat(int nativePtr);
    259     private static native double nativeReadDouble(int nativePtr);
    260     private static native String nativeReadString(int nativePtr);
    261     private static native IBinder nativeReadStrongBinder(int nativePtr);
    262     private static native FileDescriptor nativeReadFileDescriptor(int nativePtr);
    263 
    264     private static native int nativeCreate();
    265     private static native void nativeFreeBuffer(int nativePtr);
    266     private static native void nativeDestroy(int nativePtr);
    267 
    268     private static native byte[] nativeMarshall(int nativePtr);
    269     private static native void nativeUnmarshall(
    270             int nativePtr, byte[] data, int offest, int length);
    271     private static native void nativeAppendFrom(
    272             int thisNativePtr, int otherNativePtr, int offset, int length);
    273     private static native boolean nativeHasFileDescriptors(int nativePtr);
    274     private static native void nativeWriteInterfaceToken(int nativePtr, String interfaceName);
    275     private static native void nativeEnforceInterface(int 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         final Parcel[] pool = sHolderPool;
   2233         synchronized (pool) {
   2234             Parcel p;
   2235             for (int i=0; i<POOL_SIZE; i++) {
   2236                 p = pool[i];
   2237                 if (p != null) {
   2238                     pool[i] = null;
   2239                     if (DEBUG_RECYCLE) {
   2240                         p.mStack = new RuntimeException();
   2241                     }
   2242                     p.init(obj);
   2243                     return p;
   2244                 }
   2245             }
   2246         }
   2247         return new Parcel(obj);
   2248     }
   2249 
   2250     private Parcel(int nativePtr) {
   2251         if (DEBUG_RECYCLE) {
   2252             mStack = new RuntimeException();
   2253         }
   2254         //Log.i(TAG, "Initializing obj=0x" + Integer.toHexString(obj), mStack);
   2255         init(nativePtr);
   2256     }
   2257 
   2258     private void init(int nativePtr) {
   2259         if (nativePtr != 0) {
   2260             mNativePtr = nativePtr;
   2261             mOwnsNativeParcelObject = false;
   2262         } else {
   2263             mNativePtr = nativeCreate();
   2264             mOwnsNativeParcelObject = true;
   2265         }
   2266     }
   2267 
   2268     private void freeBuffer() {
   2269         if (mOwnsNativeParcelObject) {
   2270             nativeFreeBuffer(mNativePtr);
   2271         }
   2272     }
   2273 
   2274     private void destroy() {
   2275         if (mNativePtr != 0) {
   2276             if (mOwnsNativeParcelObject) {
   2277                 nativeDestroy(mNativePtr);
   2278             }
   2279             mNativePtr = 0;
   2280         }
   2281     }
   2282 
   2283     @Override
   2284     protected void finalize() throws Throwable {
   2285         if (DEBUG_RECYCLE) {
   2286             if (mStack != null) {
   2287                 Log.w(TAG, "Client did not call Parcel.recycle()", mStack);
   2288             }
   2289         }
   2290         destroy();
   2291     }
   2292 
   2293     /* package */ void readMapInternal(Map outVal, int N,
   2294         ClassLoader loader) {
   2295         while (N > 0) {
   2296             Object key = readValue(loader);
   2297             Object value = readValue(loader);
   2298             outVal.put(key, value);
   2299             N--;
   2300         }
   2301     }
   2302 
   2303     /* package */ void readArrayMapInternal(ArrayMap outVal, int N,
   2304         ClassLoader loader) {
   2305         if (DEBUG_ARRAY_MAP) {
   2306             RuntimeException here =  new RuntimeException("here");
   2307             here.fillInStackTrace();
   2308             Log.d(TAG, "Reading " + N + " ArrayMap entries", here);
   2309         }
   2310         int startPos;
   2311         while (N > 0) {
   2312             if (DEBUG_ARRAY_MAP) startPos = dataPosition();
   2313             Object key = readValue(loader);
   2314             Object value = readValue(loader);
   2315             if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Read #" + (N-1) + " "
   2316                     + (dataPosition()-startPos) + " bytes: key=0x"
   2317                     + Integer.toHexString((key != null ? key.hashCode() : 0)) + " " + key);
   2318             outVal.append(key, value);
   2319             N--;
   2320         }
   2321     }
   2322 
   2323     /* package */ void readArrayMapSafelyInternal(ArrayMap outVal, int N,
   2324         ClassLoader loader) {
   2325         if (DEBUG_ARRAY_MAP) {
   2326             RuntimeException here =  new RuntimeException("here");
   2327             here.fillInStackTrace();
   2328             Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here);
   2329         }
   2330         while (N > 0) {
   2331             Object key = readValue(loader);
   2332             if (DEBUG_ARRAY_MAP) Log.d(TAG, "  Read safe #" + (N-1) + ": key=0x"
   2333                     + (key != null ? key.hashCode() : 0) + " " + key);
   2334             Object value = readValue(loader);
   2335             outVal.put(key, value);
   2336             N--;
   2337         }
   2338     }
   2339 
   2340     private void readListInternal(List outVal, int N,
   2341         ClassLoader loader) {
   2342         while (N > 0) {
   2343             Object value = readValue(loader);
   2344             //Log.d(TAG, "Unmarshalling value=" + value);
   2345             outVal.add(value);
   2346             N--;
   2347         }
   2348     }
   2349 
   2350     private void readArrayInternal(Object[] outVal, int N,
   2351         ClassLoader loader) {
   2352         for (int i = 0; i < N; i++) {
   2353             Object value = readValue(loader);
   2354             //Log.d(TAG, "Unmarshalling value=" + value);
   2355             outVal[i] = value;
   2356         }
   2357     }
   2358 
   2359     private void readSparseArrayInternal(SparseArray outVal, int N,
   2360         ClassLoader loader) {
   2361         while (N > 0) {
   2362             int key = readInt();
   2363             Object value = readValue(loader);
   2364             //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value);
   2365             outVal.append(key, value);
   2366             N--;
   2367         }
   2368     }
   2369 
   2370 
   2371     private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) {
   2372         while (N > 0) {
   2373             int key = readInt();
   2374             boolean value = this.readByte() == 1;
   2375             //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value);
   2376             outVal.append(key, value);
   2377             N--;
   2378         }
   2379     }
   2380 }
   2381