Parcel.java revision 9c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.text.TextUtils; 20b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackbornimport android.util.ArrayMap; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseBooleanArray; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayOutputStream; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectInputStream; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectOutputStream; 325002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlockimport java.io.ObjectStreamClass; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Serializable; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Field; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 36a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughesimport java.util.Arrays; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Container for a message (data and object references) that can 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sent through an IBinder. A Parcel can contain both flattened data 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that will be unflattened on the other side of the IPC (using the various 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods here for writing specific types, or the general 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable} interface), and references to live {@link IBinder} 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects that will result in the other side receiving a proxy IBinder 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected with the original IBinder in the Parcel. 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">Parcel is <strong>not</strong> a general-purpose 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * serialization mechanism. This class (and the corresponding 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable} API for placing arbitrary objects into a Parcel) is 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * designed as a high-performance IPC transport. As such, it is not 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate to place any Parcel data in to persistent storage: changes 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the underlying implementation of any of the data in the Parcel can 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * render older data unreadable.</p> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The bulk of the Parcel API revolves around reading and writing data 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of various types. There are six major classes of such functions available.</p> 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Primitives</h3> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The most basic data functions are for writing and reading primitive 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble}, 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt}, 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readInt}, {@link #writeLong}, {@link #readLong}, 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeString}, {@link #readString}. Most other 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data operations are built on top of these. The given data is written and 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read using the endianess of the host CPU.</p> 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Primitive Arrays</h3> 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are a variety of methods for reading and writing raw arrays 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of primitive objects, which generally result in writing a 4-byte length 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * followed by the primitive data items. The methods for reading can either 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read the data into an existing array, or create and return a new array. 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These available types are:</p> 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeBooleanArray(boolean[])}, 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeByteArray(byte[])}, 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeByteArray(byte[], int, int)}, {@link #readByteArray(byte[])}, 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createByteArray()} 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeCharArray(char[])}, {@link #readCharArray(char[])}, 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createCharArray()} 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeDoubleArray(double[])}, {@link #readDoubleArray(double[])}, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createDoubleArray()} 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeFloatArray(float[])}, {@link #readFloatArray(float[])}, 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createFloatArray()} 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeIntArray(int[])}, {@link #readIntArray(int[])}, 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createIntArray()} 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeLongArray(long[])}, {@link #readLongArray(long[])}, 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createLongArray()} 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeStringArray(String[])}, {@link #readStringArray(String[])}, 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createStringArray()}. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeSparseBooleanArray(SparseBooleanArray)}, 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readSparseBooleanArray()}. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Parcelables</h3> 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link Parcelable} protocol provides an extremely efficient (but 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * low-level) protocol for objects to write and read themselves from Parcels. 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can use the direct methods {@link #writeParcelable(Parcelable, int)} 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link #readParcelable(ClassLoader)} or 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeParcelableArray} and 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readParcelableArray(ClassLoader)} to write or read. These 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods write both the class type and its data to the Parcel, allowing 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that class to be reconstructed from the appropriate class loader when 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * later reading.</p> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are also some methods that provide a more efficient way to work 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with Parcelables: {@link #writeTypedArray}, 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeTypedList(List)}, 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readTypedArray} and {@link #readTypedList}. These methods 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * do not write the class information of the original object: instead, the 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller of the read function must know what type to expect and pass in the 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate {@link Parcelable.Creator Parcelable.Creator} instead to 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * properly construct the new object and read its data. (To more efficient 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * write and read a single Parceable object, you can directly call 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel Parcelable.writeToParcel} and 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel} 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * yourself.)</p> 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Bundles</h3> 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A special type-safe container, called {@link Bundle}, is available 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for key/value maps of heterogeneous values. This has many optimizations 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for improved performance when reading and writing data, and its type-safe 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * API avoids difficult to debug type errors when finally marshalling the 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data contents into a Parcel. The methods to use are 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBundle(Bundle)}, {@link #readBundle()}, and 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBundle(ClassLoader)}. 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Active Objects</h3> 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An unusual feature of Parcel is the ability to read and write active 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects. For these objects the actual contents of the object is not 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written, rather a special token referencing the object is written. When 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reading the object back from the Parcel, you do not get a new instance of 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object, but rather a handle that operates on the exact same object that 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was originally written. There are two forms of active objects available.</p> 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>{@link Binder} objects are a core facility of Android's general cross-process 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * communication system. The {@link IBinder} interface describes an abstract 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol with a Binder object. Any such interface can be written in to 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Parcel, and upon reading you will receive either the original object 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementing that interface or a special proxy implementation 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that communicates calls back to the original object. The methods to use are 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStrongBinder(IBinder)}, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStrongInterface(IInterface)}, {@link #readStrongBinder()}, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderArray(IBinder[])}, {@link #readBinderArray(IBinder[])}, 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createBinderArray()}, 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderList(List)}, {@link #readBinderList(List)}, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createBinderArrayList()}.</p> 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>FileDescriptor objects, representing raw Linux file descriptor identifiers, 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be written and {@link ParcelFileDescriptor} objects returned to operate 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the original file descriptor. The returned file descriptor is a dup 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the original file descriptor: the object and fd is different, but 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operating on the same underlying file stream, with the same position, etc. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The methods to use are {@link #writeFileDescriptor(FileDescriptor)}, 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readFileDescriptor()}. 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Untyped Containers</h3> 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A final class of methods are for writing and reading standard Java 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containers of arbitrary types. These all revolve around the 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which define the types of objects allowed. The container methods are 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeArray(Object[])}, {@link #readArray(ClassLoader)}, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeList(List)}, {@link #readList(List, ClassLoader)}, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readArrayList(ClassLoader)}, 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeMap(Map)}, {@link #readMap(Map, ClassLoader)}, 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeSparseArray(SparseArray)}, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readSparseArray(ClassLoader)}. 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Parcel { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG_RECYCLE = false; 182e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn private static final boolean DEBUG_ARRAY_MAP = false; 1835b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick private static final String TAG = "Parcel"; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({"UnusedDeclaration"}) 1868ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private long mNativePtr; // used by native code 187047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 188047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey /** 189047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey * Flag indicating if {@link #mNativePtr} was allocated by this object, 190047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey * indicating that we're responsible for its lifecycle. 191047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey */ 192047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private boolean mOwnsNativeParcelObject; 193047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RuntimeException mStack; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int POOL_SIZE = 6; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Parcel[] sOwnedPool = new Parcel[POOL_SIZE]; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Parcel[] sHolderPool = new Parcel[POOL_SIZE]; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_NULL = -1; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_STRING = 0; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_INTEGER = 1; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_MAP = 2; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BUNDLE = 3; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_PARCELABLE = 4; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SHORT = 5; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LONG = 6; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_FLOAT = 7; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_DOUBLE = 8; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BOOLEAN = 9; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_CHARSEQUENCE = 10; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LIST = 11; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SPARSEARRAY = 12; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BYTEARRAY = 13; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_STRINGARRAY = 14; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_IBINDER = 15; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_PARCELABLEARRAY = 16; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_OBJECTARRAY = 17; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_INTARRAY = 18; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LONGARRAY = 19; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BYTE = 20; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SERIALIZABLE = 21; 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SPARSEBOOLEANARRAY = 22; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BOOLEANARRAY = 23; 22508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert private static final int VAL_CHARSEQUENCEARRAY = 24; 226719e6b167041ffaffc2245f692714c8de191863fCraig Mautner private static final int VAL_PERSISTABLEBUNDLE = 25; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2285b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // The initial int32 in a Binder call's reply Parcel header: 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_SECURITY = -1; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_BAD_PARCELABLE = -2; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_ILLEGAL_ARGUMENT = -3; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_NULL_POINTER = -4; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_ILLEGAL_STATE = -5; 2347e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn private static final int EX_NETWORK_MAIN_THREAD = -6; 2355b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick private static final int EX_HAS_REPLY_HEADER = -128; // special; see below 2365b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 2378ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataSize(long nativePtr); 2388ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataAvail(long nativePtr); 2398ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataPosition(long nativePtr); 2408ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeDataCapacity(long nativePtr); 2418ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeSetDataSize(long nativePtr, int size); 2428ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeSetDataPosition(long nativePtr, int pos); 2438ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeSetDataCapacity(long nativePtr, int size); 2448ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2458ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native boolean nativePushAllowFds(long nativePtr, boolean allowFds); 2468ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue); 2478ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2488ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len); 24990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha private static native void nativeWriteBlob(long nativePtr, byte[] b, int offset, int len); 2508ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteInt(long nativePtr, int val); 2518ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteLong(long nativePtr, long val); 2528ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteFloat(long nativePtr, float val); 2538ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteDouble(long nativePtr, double val); 2548ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteString(long nativePtr, String val); 2558ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteStrongBinder(long nativePtr, IBinder val); 2568ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteFileDescriptor(long nativePtr, FileDescriptor val); 2578ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2588ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native byte[] nativeCreateByteArray(long nativePtr); 25990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha private static native byte[] nativeReadBlob(long nativePtr); 2608ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native int nativeReadInt(long nativePtr); 2618ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native long nativeReadLong(long nativePtr); 2628ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native float nativeReadFloat(long nativePtr); 2638ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native double nativeReadDouble(long nativePtr); 2648ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native String nativeReadString(long nativePtr); 2658ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native IBinder nativeReadStrongBinder(long nativePtr); 2668ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native FileDescriptor nativeReadFileDescriptor(long nativePtr); 2678ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2688ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native long nativeCreate(); 2698ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeFreeBuffer(long nativePtr); 2708ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeDestroy(long nativePtr); 2718ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 2728ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native byte[] nativeMarshall(long nativePtr); 273047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private static native void nativeUnmarshall( 2748ab665dda40ab10e60fc69392022171f454af530Ashok Bhat long nativePtr, byte[] data, int offest, int length); 275047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private static native void nativeAppendFrom( 2768ab665dda40ab10e60fc69392022171f454af530Ashok Bhat long thisNativePtr, long otherNativePtr, int offset, int length); 2778ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native boolean nativeHasFileDescriptors(long nativePtr); 2788ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeWriteInterfaceToken(long nativePtr, String interfaceName); 2798ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private static native void nativeEnforceInterface(long nativePtr, String interfaceName); 280047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static Parcelable.Creator<String> STRING_CREATOR 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<String>() { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String createFromParcel(Parcel source) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source.readString(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] newArray(int size) { 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new String[size]; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a new Parcel object from the pool. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Parcel obtain() { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = sOwnedPool; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pool[i]; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = null; 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStack = new RuntimeException(); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Parcel(0); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Put a Parcel object back into the pool. You must not touch 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object after this call. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void recycle() { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) mStack = null; 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project freeBuffer(); 319047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 320047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey final Parcel[] pool; 321047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mOwnsNativeParcelObject) { 322047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey pool = sOwnedPool; 323047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } else { 324047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = 0; 325047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey pool = sHolderPool; 326047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 327047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool[i] == null) { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = this; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total amount of data contained in the parcel. 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 341047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataSize() { 342047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataSize(mNativePtr); 343047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the amount of data remaining to be read from the 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parcel. That is, {@link #dataSize}-{@link #dataPosition}. 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataAvail() { 350047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataAvail(mNativePtr); 351047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current position in the parcel data. Never 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more than {@link #dataSize}. 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 357047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataPosition() { 358047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataPosition(mNativePtr); 359047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total amount of space in the parcel. This is always 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * >= {@link #dataSize}. The difference between it and dataSize() is the 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * amount of room left until the parcel needs to re-allocate its 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data buffer. 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 367047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int dataCapacity() { 368047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeDataCapacity(mNativePtr); 369047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the amount of data in the parcel. Can be either smaller or 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * larger than the current size. If larger than the current capacity, 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more memory will be allocated. 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new number of bytes in the Parcel. 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 378047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void setDataSize(int size) { 379047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeSetDataSize(mNativePtr, size); 380047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Move the current read/write position in the parcel. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos New offset in the parcel; must be between 0 and 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dataSize}. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 387047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void setDataPosition(int pos) { 388047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeSetDataPosition(mNativePtr, pos); 389047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the capacity (current available space) of the parcel. 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new capacity of the parcel, in bytes. Can not be 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * less than {@link #dataSize} -- that is, you can not drop existing data 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with this method. 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 398047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void setDataCapacity(int size) { 399047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeSetDataCapacity(mNativePtr, size); 400047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn /** @hide */ 403047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final boolean pushAllowFds(boolean allowFds) { 404047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativePushAllowFds(mNativePtr, allowFds); 405047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 406c04db7e06737c5b9bae276ac462858d44002672eDianne Hackborn 407c04db7e06737c5b9bae276ac462858d44002672eDianne Hackborn /** @hide */ 408047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void restoreAllowFds(boolean lastValue) { 409047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeRestoreAllowFds(mNativePtr, lastValue); 410047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4119ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the raw bytes of the parcel. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">The data you retrieve here <strong>must not</strong> 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be placed in any kind of persistent storage (on local disk, across 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a network, etc). For that, you should use standard serialization 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or another kind of general serialization mechanism. The Parcel 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * marshalled representation is highly optimized for local IPC, and as 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such does not attempt to maintain compatibility with data created 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in different versions of the platform. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 423047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final byte[] marshall() { 424047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeMarshall(mNativePtr); 425047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the bytes in data to be the raw bytes of this Parcel. 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 430047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void unmarshall(byte[] data, int offest, int length) { 431047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeUnmarshall(mNativePtr, data, offest, length); 432047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 434047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void appendFrom(Parcel parcel, int offset, int length) { 435047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeAppendFrom(mNativePtr, parcel.mNativePtr, offset, length); 436047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report whether the parcel contains any marshalled file descriptors. 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 441047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final boolean hasFileDescriptors() { 442047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeHasFileDescriptors(mNativePtr); 443047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Store or read an IBinder interface token in the parcel at the current 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dataPosition}. This is used to validate that the marshalled 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transaction is intended for the target interface. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 450047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeInterfaceToken(String interfaceName) { 451047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteInterfaceToken(mNativePtr, interfaceName); 452047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 453047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 454047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void enforceInterface(String interfaceName) { 455047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeEnforceInterface(mNativePtr, interfaceName); 456047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 459a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes * Write a byte array into the parcel at the current {@link #dataPosition}, 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing {@link #dataCapacity} if needed. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b Bytes to place into the parcel. 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByteArray(byte[] b) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray(b, 0, (b != null) ? b.length : 0); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 468f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Write a byte array into the parcel at the current {@link #dataPosition}, 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing {@link #dataCapacity} if needed. 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b Bytes to place into the parcel. 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset Index of first byte to be written. 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param len Number of bytes to write. 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByteArray(byte[] b, int offset, int len) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == null) { 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479a28b83ee04ca25100781f37a50665d6e1b05e3a2Elliott Hughes Arrays.checkOffsetAndCount(b.length, offset, len); 480047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteByteArray(mNativePtr, b, offset, len); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 48490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * Write a blob of data into the parcel at the current {@link #dataPosition}, 48590d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * growing {@link #dataCapacity} if needed. 48690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * @param b Bytes to place into the parcel. 48790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * {@hide} 48839c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha * {@SystemApi} 48990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha */ 49090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha public final void writeBlob(byte[] b) { 49190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha nativeWriteBlob(mNativePtr, b, 0, (b != null) ? b.length : 0); 49290d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 49390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 49490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha /** 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an integer value into the parcel at the current dataPosition(), 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 498047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeInt(int val) { 499047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteInt(mNativePtr, val); 500047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a long integer value into the parcel at the current dataPosition(), 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 506047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeLong(long val) { 507047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteLong(mNativePtr, val); 508047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a floating point value into the parcel at the current 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), growing dataCapacity() if needed. 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 514047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeFloat(float val) { 515047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteFloat(mNativePtr, val); 516047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a double precision floating point value into the parcel at the 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(), growing dataCapacity() if needed. 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 522047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeDouble(double val) { 523047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteDouble(mNativePtr, val); 524047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a string value into the parcel at the current dataPosition(), 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 530047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeString(String val) { 531047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteString(mNativePtr, val); 532047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 53508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * Write a CharSequence value into the parcel at the current dataPosition(), 53608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * growing dataCapacity() if needed. 53708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * @hide 53808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 53908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final void writeCharSequence(CharSequence val) { 54008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert TextUtils.writeToParcel(val, this, 0); 54108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 54208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 54308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an object into the parcel at the current dataPosition(), 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 547047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeStrongBinder(IBinder val) { 548047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteStrongBinder(mNativePtr, val); 549047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an object into the parcel at the current dataPosition(), 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStrongInterface(IInterface val) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val == null ? null : val.asBinder()); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a FileDescriptor into the parcel at the current dataPosition(), 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 562b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 563b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * <p class="caution">The file descriptor will not be closed, which may 564b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * result in file descriptor leaks when objects are returned from Binder 565b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * calls. Use {@link ParcelFileDescriptor#writeToParcel} instead, which 566b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * accepts contextual flags and will close the original file descriptor 567b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * if {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} is set.</p> 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final void writeFileDescriptor(FileDescriptor val) { 570047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeWriteFileDescriptor(mNativePtr, val); 571047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 574f76a50ce8fdc6aea22cabc77b2977a1a15a79630Ken Wakasa * Write a byte value into the parcel at the current dataPosition(), 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByte(byte val) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #writeBundle} instead. Flattens a Map into the parcel 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at the current dataPosition(), 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The Map keys must be String objects. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Map values are written using {@link #writeValue} and must follow 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specification there. 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It is strongly recommended to use {@link #writeBundle} instead of 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this method, since the Bundle class provides a type-safe API that 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allows you to avoid mysterious type errors at the point of marshalling. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeMap(Map val) { 593b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeMapInternal((Map<String, Object>) val); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a Map into the parcel at the current dataPosition(), 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The Map keys must be String objects. 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6006aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn /* package */ void writeMapInternal(Map<String,Object> val) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Map.Entry<String,Object>> entries = val.entrySet(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(entries.size()); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String,Object> e : entries) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(e.getKey()); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(e.getValue()); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 614b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn * Flatten an ArrayMap into the parcel at the current dataPosition(), 615b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn * growing dataCapacity() if needed. The Map keys must be String objects. 616b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn */ 6179c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn /* package */ void writeArrayMapInternal(ArrayMap<String, Object> val) { 618b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn if (val == null) { 619b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeInt(-1); 620b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn return; 621b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 622b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn final int N = val.size(); 623b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeInt(N); 624e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) { 625e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn RuntimeException here = new RuntimeException("here"); 626e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn here.fillInStackTrace(); 627e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Log.d(TAG, "Writing " + N + " ArrayMap entries", here); 628e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 6298aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn int startPos; 630b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn for (int i=0; i<N; i++) { 6318aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) startPos = dataPosition(); 6329c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn writeString(val.keyAt(i)); 633b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn writeValue(val.valueAt(i)); 6348aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) Log.d(TAG, " Write #" + i + " " 6358aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + (dataPosition()-startPos) + " bytes: key=0x" 6368aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + Integer.toHexString(val.keyAt(i) != null ? val.keyAt(i).hashCode() : 0) 6378aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + " " + val.keyAt(i)); 638b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 639b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 640b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn 641b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn /** 6429c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn * @hide For testing only. 6439c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn */ 6449c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn public void writeArrayMap(ArrayMap<String, Object> val) { 6459c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn writeArrayMapInternal(val); 6469c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn } 6479c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn 6489c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn /** 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a Bundle into the parcel at the current dataPosition(), 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBundle(Bundle val) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6586aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn val.writeToParcel(this, 0); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 662719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Flatten a PersistableBundle into the parcel at the current dataPosition(), 663719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * growing dataCapacity() if needed. 664719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 665719e6b167041ffaffc2245f692714c8de191863fCraig Mautner public final void writePersistableBundle(PersistableBundle val) { 666719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (val == null) { 667719e6b167041ffaffc2245f692714c8de191863fCraig Mautner writeInt(-1); 668719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return; 669719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 670719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 671719e6b167041ffaffc2245f692714c8de191863fCraig Mautner val.writeToParcel(this, 0); 672719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 673719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 674719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List into the parcel at the current dataPosition(), growing 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataCapacity() if needed. The List values are written using 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue} and must follow the specification there. 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeList(List val) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val.get(i)); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten an Object array into the parcel at the current dataPosition(), 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The array values are written using 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue} and must follow the specification there. 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeArray(Object[] val) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val[i]); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a generic SparseArray into the parcel at the current 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), growing dataCapacity() if needed. The SparseArray 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values are written using {@link #writeValue} and must follow the 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specification there. 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSparseArray(SparseArray<Object> val) { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val.keyAt(i)); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val.valueAt(i)); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSparseBooleanArray(SparseBooleanArray val) { 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val.keyAt(i)); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByte((byte)(val.valueAt(i) ? 1 : 0)); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBooleanArray(boolean[] val) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val[i] ? 1 : 0); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean[] createBooleanArray() { 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>2 as a fast divide-by-4 works in the create*Array() functions 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because dataAvail() will never return a negative number. 4 is 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the size of a stored boolean in the stream. 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean[] val = new boolean[N]; 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt() != 0; 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBooleanArray(boolean[] val) { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt() != 0; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeCharArray(char[] val) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((int)val[i]); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final char[] createCharArray() { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] val = new char[N]; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = (char)readInt(); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readCharArray(char[] val) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = (char)readInt(); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeIntArray(int[] val) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val[i]); 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int[] createIntArray() { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] val = new int[N]; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt(); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readIntArray(int[] val) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt(); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeLongArray(long[] val) { 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLong(val[i]); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final long[] createLongArray() { 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>3 because stored longs are 64 bits 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 3)) { 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long[] val = new long[N]; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readLong(); 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readLongArray(long[] val) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readLong(); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeFloatArray(float[] val) { 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeFloat(val[i]); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float[] createFloatArray() { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>2 because stored floats are 4 bytes 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] val = new float[N]; 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readFloat(); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readFloatArray(float[] val) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readFloat(); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeDoubleArray(double[] val) { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeDouble(val[i]); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final double[] createDoubleArray() { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>3 because stored doubles are 8 bytes 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 3)) { 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double[] val = new double[N]; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readDouble(); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readDoubleArray(double[] val) { 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readDouble(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStringArray(String[] val) { 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(val[i]); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String[] createStringArray() { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0) { 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] val = new String[N]; 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readString(); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readStringArray(String[] val) { 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readString(); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBinderArray(IBinder[] val) { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val[i]); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 101808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 101908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * @hide 102008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 102108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final void writeCharSequenceArray(CharSequence[] val) { 102208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert if (val != null) { 102308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert int N = val.length; 102408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeInt(N); 102508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert for (int i=0; i<N; i++) { 102608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeCharSequence(val[i]); 102708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 102808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } else { 102908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeInt(-1); 103008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 103108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 103208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IBinder[] createBinderArray() { 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0) { 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder[] val = new IBinder[N]; 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readStrongBinder(); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBinderArray(IBinder[] val) { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readStrongBinder(); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing a particular object type into the parcel, at 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. The 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type of the objects in the list must be one that implements Parcelable. 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike the generic writeList() method, however, only the raw data of the 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects is written and not their type, so you must use the corresponding 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * readTypedList() to unmarshall them. 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of objects to be written. 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createTypedArrayList 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readTypedList 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Parcelable 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeTypedList(List<T> val) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T item = val.get(i); 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(1); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.writeToParcel(this, 0); 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing String objects into the parcel, at 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. They 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can later be retrieved with {@link #createStringArrayList} or 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readStringList}. 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of strings to be written. 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createStringArrayList 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readStringList 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStringList(List<String> val) { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(val.get(i)); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing IBinder objects into the parcel, at 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. They 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can later be retrieved with {@link #createBinderArrayList} or 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBinderList}. 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of strings to be written. 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createBinderArrayList 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readBinderList 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBinderList(List<IBinder> val) { 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val.get(i)); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a heterogeneous array containing a particular object type into 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel, at 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. The 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type of the objects in the array must be one that implements Parcelable. 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike the {@link #writeParcelableArray} method, however, only the 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * raw data of the objects is written and not their type, so you must use 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readTypedArray} with the correct corresponding 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable.Creator} implementation to unmarshall them. 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The array of objects to be written. 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readTypedArray 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeParcelableArray 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Parcelable.Creator 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeTypedArray(T[] val, 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parcelableFlags) { 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T item = val[i]; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(1); 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.writeToParcel(this, parcelableFlags); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a generic object in to a parcel. The given Object value may 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently be one of the following types: 1181b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> null 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> String 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Byte 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Short 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Integer 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Long 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Float 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Double 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Boolean 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> String[] 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> boolean[] 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> byte[] 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> int[] 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> long[] 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Object[] (supporting objects of the same type defined here). 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link Bundle} 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Map (as supported by {@link #writeMap}). 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any object that implements the {@link Parcelable} protocol. 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Parcelable[] 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> CharSequence (as supported by {@link TextUtils#writeToParcel}). 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> List (as supported by {@link #writeList}). 1204b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * <li> {@link SparseArray} (as supported by {@link #writeSparseArray(SparseArray)}). 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link IBinder} 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any object that implements Serializable (but see 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeSerializable} for caveats). Note that all of the 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous types have relatively efficient implementations for 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * writing to a Parcel; having to rely on the generic serialization 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * approach is much less efficient and should be avoided whenever 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible. 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 1213b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 1214b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * <p class="caution">{@link Parcelable} objects are written with 1215b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * {@link Parcelable#writeToParcel} using contextual flags of 0. When 1216b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * serializing objects containing {@link ParcelFileDescriptor}s, 1217b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * this may result in file descriptor leaks when they are returned from 1218b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * Binder calls (where {@link Parcelable#PARCELABLE_WRITE_RETURN_VALUE} 1219b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * should be used).</p> 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeValue(Object v) { 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == null) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_NULL); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof String) { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_STRING); 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString((String) v); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Integer) { 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_INTEGER); 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Integer) v); 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Map) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_MAP); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeMap((Map) v); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Bundle) { 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be before Parcelable 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BUNDLE); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBundle((Bundle) v); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Parcelable) { 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_PARCELABLE); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelable((Parcelable) v, 0); 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Short) { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SHORT); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(((Short) v).intValue()); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Long) { 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LONG); 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLong((Long) v); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Float) { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_FLOAT); 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeFloat((Float) v); 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Double) { 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_DOUBLE); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeDouble((Double) v); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Boolean) { 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BOOLEAN); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Boolean) v ? 1 : 0); 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof CharSequence) { 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be after String 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_CHARSEQUENCE); 125808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeCharSequence((CharSequence) v); 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof List) { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LIST); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeList((List) v); 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof SparseArray) { 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SPARSEARRAY); 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSparseArray((SparseArray) v); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof boolean[]) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BOOLEANARRAY); 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBooleanArray((boolean[]) v); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof byte[]) { 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BYTEARRAY); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray((byte[]) v); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof String[]) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_STRINGARRAY); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStringArray((String[]) v); 127408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } else if (v instanceof CharSequence[]) { 127508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert // Must be after String[] and before Object[] 127608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeInt(VAL_CHARSEQUENCEARRAY); 127708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert writeCharSequenceArray((CharSequence[]) v); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof IBinder) { 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_IBINDER); 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder((IBinder) v); 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Parcelable[]) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_PARCELABLEARRAY); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelableArray((Parcelable[]) v, 0); 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof int[]) { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_INTARRAY); 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeIntArray((int[]) v); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof long[]) { 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LONGARRAY); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLongArray((long[]) v); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Byte) { 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BYTE); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Byte) v); 1293719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } else if (v instanceof PersistableBundle) { 1294719e6b167041ffaffc2245f692714c8de191863fCraig Mautner writeInt(VAL_PERSISTABLEBUNDLE); 1295719e6b167041ffaffc2245f692714c8de191863fCraig Mautner writePersistableBundle((PersistableBundle) v); 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1297ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin Class<?> clazz = v.getClass(); 1298ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin if (clazz.isArray() && clazz.getComponentType() == Object.class) { 1299ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin // Only pure Object[] are written here, Other arrays of non-primitive types are 1300ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin // handled by serialization as this does not record the component type. 1301ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeInt(VAL_OBJECTARRAY); 1302ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeArray((Object[]) v); 1303ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin } else if (v instanceof Serializable) { 1304ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin // Must be last 1305ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeInt(VAL_SERIALIZABLE); 1306ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin writeSerializable((Serializable) v); 1307ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin } else { 1308ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin throw new RuntimeException("Parcel: unable to marshal value " + v); 1309ac5a0828c14eea59f2ffda85432ad1977d3e1ce0Paul Duffin } 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten the name of the class of the Parcelable and its contents 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into the parcel. 1316b3e4ef37021a9e5518fdbc7d0cbb0a1709d5301bDan Egnor * 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p The Parcelable object to be written. 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeParcelable(Parcelable p, int parcelableFlags) { 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(null); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = p.getClass().getName(); 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(name); 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.writeToParcel(this, parcelableFlags); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1331d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 1332d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn public final void writeParcelableCreator(Parcelable p) { 1333d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn String name = p.getClass().getName(); 1334d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn writeString(name); 1335d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 1336d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a generic serializable object in to a Parcel. It is strongly 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recommended that this method be avoided, since the serialization 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overhead is extremely large, and this approach will be much slower than 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the other approaches to writing data in to a Parcel. 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSerializable(Serializable s) { 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(null); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = s.getClass().getName(); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(name); 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(); 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ObjectOutputStream oos = new ObjectOutputStream(baos); 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oos.writeObject(s); 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oos.close(); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray(baos.toByteArray()); 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ioe) { 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered " + 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IOException writing serializable object (name = " + name + 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ")", ioe); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for writing an exception result at the header of 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, to be used when returning an exception from a transaction. 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that this currently only supports a few exception types; any other 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exception will be re-thrown by this function as a RuntimeException 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (to be caught by the system's last-resort exception handling when 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatching a transaction). 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The supported exception types are: 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link BadParcelableException} 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link IllegalArgumentException} 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link IllegalStateException} 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link NullPointerException} 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link SecurityException} 13807e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn * <li>{@link NetworkOnMainThreadException} 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param e The Exception to be written. 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeNoException 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readException 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeException(Exception e) { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = 0; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e instanceof SecurityException) { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_SECURITY; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof BadParcelableException) { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_BAD_PARCELABLE; 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof IllegalArgumentException) { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_ILLEGAL_ARGUMENT; 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof NullPointerException) { 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_NULL_POINTER; 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof IllegalStateException) { 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_ILLEGAL_STATE; 14007e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn } else if (e instanceof NetworkOnMainThreadException) { 14017e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn code = EX_NETWORK_MAIN_THREAD; 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(code); 1404703e5d3c7fbeb8ca0978045db01d40318f838612Brad Fitzpatrick StrictMode.clearGatheredViolations(); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == 0) { 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e instanceof RuntimeException) { 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw (RuntimeException) e; 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(e.getMessage()); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for writing information at the front of the Parcel 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicating that no exception occurred. 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeException 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readException 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeNoException() { 14225b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Despite the name of this function ("write no exception"), 14235b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // it should instead be thought of as "write the RPC response 14245b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // header", but because this function name is written out by 14255b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // the AIDL compiler, we're not going to rename it. 14265b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // 14275b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // The response header, in the non-exception case (see also 14285b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // writeException above, also called by the AIDL compiler), is 14295b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // either a 0 (the default case), or EX_HAS_REPLY_HEADER if 14305b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // StrictMode has gathered up violations that have occurred 14315b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // during a Binder call, in which case we write out the number 14325b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // of violations and their details, serialized, before the 14335b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // actual RPC respons data. The receiving end of this is 14345b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // readException(), below. 14355b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (StrictMode.hasGatheredViolations()) { 14365b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(EX_HAS_REPLY_HEADER); 14375b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick final int sizePosition = dataPosition(); 14385b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(0); // total size of fat header, to be filled in later 14395b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick StrictMode.writeGatheredViolationsToParcel(this); 14405b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick final int payloadPosition = dataPosition(); 14415b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick setDataPosition(sizePosition); 14425b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(payloadPosition - sizePosition); // header size 14435b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick setDataPosition(payloadPosition); 14445b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } else { 14455b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick writeInt(0); 14465b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for reading an exception result from the header of 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, to be used after receiving the result of a transaction. This 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will throw the exception for you if it had been written to the Parcel, 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return and let you read the normal result data from the Parcel. 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeException 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeNoException 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readException() { 14595b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick int code = readExceptionCode(); 14605b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (code != 0) { 14615b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick String msg = readString(); 14625b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick readException(code, msg); 14635b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 14645b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 14655b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick 14665b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick /** 14675b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * Parses the header of a Binder call's response Parcel and 14685b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * returns the exception code. Deals with lite or fat headers. 14695b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * In the common successful case, this header is generally zero. 14705b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * In less common cases, it's a small negative number and will be 14715b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * followed by an error string. 14725b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * 14735b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * This exists purely for android.database.DatabaseUtils and 14745b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * insulating it from having to handle fat headers as returned by 14755b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * e.g. StrictMode-induced RPC responses. 14765b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * 14775b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick * @hide 14785b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick */ 14795b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick public final int readExceptionCode() { 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = readInt(); 14815b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (code == EX_HAS_REPLY_HEADER) { 14825b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick int headerSize = readInt(); 14835b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick if (headerSize == 0) { 14845b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick Log.e(TAG, "Unexpected zero-sized Parcel reply header."); 14855b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } else { 14865b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // Currently the only thing in the header is StrictMode stacks, 14875b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // but discussions around event/RPC tracing suggest we might 14885b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // put that here too. If so, switch on sub-header tags here. 14895b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // But for now, just parse out the StrictMode stuff. 14905b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick StrictMode.readAndHandleBinderCallViolations(this); 14915b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 14925b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // And fat response headers are currently only used when 14935b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick // there are no exceptions, so return no error: 14945b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick return 0; 14955b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick } 14965b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick return code; 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1500879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * Throw an exception with the given message. Not intended for use 1501879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * outside the Parcel class. 1502879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * 1503879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * @param code Used to determine which exception class to throw. 1504879ea451cefa535803d9742506cf51e2e0df75a7Mark Doliner * @param msg The exception message. 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readException(int code, String msg) { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (code) { 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_SECURITY: 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException(msg); 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_BAD_PARCELABLE: 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException(msg); 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_ILLEGAL_ARGUMENT: 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(msg); 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_NULL_POINTER: 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(msg); 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_ILLEGAL_STATE: 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException(msg); 15187e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn case EX_NETWORK_MAIN_THREAD: 15197e7144218e8681fff2065a891de517bad6fe1b38Dianne Hackborn throw new NetworkOnMainThreadException(); 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown exception code: " + code 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " msg " + msg); 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read an integer value from the parcel at the current dataPosition(). 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1528047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final int readInt() { 1529047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadInt(mNativePtr); 1530047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a long integer value from the parcel at the current dataPosition(). 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1535047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final long readLong() { 1536047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadLong(mNativePtr); 1537047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a floating point value from the parcel at the current 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1543047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final float readFloat() { 1544047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadFloat(mNativePtr); 1545047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a double precision floating point value from the parcel at the 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1551047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final double readDouble() { 1552047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadDouble(mNativePtr); 1553047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a string value from the parcel at the current dataPosition(). 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1558047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final String readString() { 1559047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadString(mNativePtr); 1560047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 156308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * Read a CharSequence value from the parcel at the current dataPosition(). 156408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * @hide 156508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 156608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final CharSequence readCharSequence() { 156708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this); 156808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 156908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 157008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read an object from the parcel at the current dataPosition(). 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1573047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final IBinder readStrongBinder() { 1574047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeReadStrongBinder(mNativePtr); 1575047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a FileDescriptor from the parcel at the current dataPosition(). 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ParcelFileDescriptor readFileDescriptor() { 1581047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey FileDescriptor fd = nativeReadFileDescriptor(mNativePtr); 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd != null ? new ParcelFileDescriptor(fd) : null; 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1585da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey /** {@hide} */ 1586da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey public final FileDescriptor readRawFileDescriptor() { 1587da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey return nativeReadFileDescriptor(mNativePtr); 1588da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey } 1589da5a3e12f4f8f965c57d6f93c74190f43ea233f3Jeff Sharkey 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ static native FileDescriptor openFileDescriptor(String file, 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mode) throws FileNotFoundException; 15929a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn /*package*/ static native FileDescriptor dupFileDescriptor(FileDescriptor orig) 15939a84983a9fd9959671e102045eaf185b83291269Dianne Hackborn throws IOException; 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ static native void closeFileDescriptor(FileDescriptor desc) 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 1596c9119f5034d36f548bbddd8f60291e24ab4e270bDianne Hackborn /*package*/ static native void clearFileDescriptor(FileDescriptor desc); 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a byte value from the parcel at the current dataPosition(). 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final byte readByte() { 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (byte)(readInt() & 0xff); 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #readBundle(ClassLoader)} instead (whose data must have 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been written with {@link #writeBundle}. Read into an existing Map object 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the parcel at the current dataPosition(). 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readMap(Map outVal, ClassLoader loader) { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(outVal, N, loader); 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into an existing List object from the parcel at the current 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), using the given class loader to load any enclosed 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. If it is null, the default class loader is used. 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readList(List outVal, ClassLoader loader) { 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readListInternal(outVal, N, loader); 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #readBundle(ClassLoader)} instead (whose data must have 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been written with {@link #writeBundle}. Read and return a new HashMap 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object from the parcel at the current dataPosition(), using the given 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class loader to load any enclosed Parcelables. Returns null if 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the previously written map object was null. 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final HashMap readHashMap(ClassLoader loader) 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashMap m = new HashMap(N); 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(m, N, loader); 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written Bundle object was 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle readBundle() { 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readBundle(null); 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), using the given class loader to initialize the class 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader of the Bundle for later retrieval of Parcelable objects. 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns null if the previously written Bundle object was null. 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle readBundle(ClassLoader loader) { 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length < 0) { 16614a7d824c3b41eafc4ff91d3253ff8a9ebd60a454Dianne Hackborn if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length); 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16646aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn 16656aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn final Bundle bundle = new Bundle(this, length); 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loader != null) { 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setClassLoader(loader); 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bundle; 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1673719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Read and return a new Bundle object from the parcel at the current 1674719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * dataPosition(). Returns null if the previously written Bundle object was 1675719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * null. 1676719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1677719e6b167041ffaffc2245f692714c8de191863fCraig Mautner public final PersistableBundle readPersistableBundle() { 1678719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return readPersistableBundle(null); 1679719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1680719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1681719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 1682719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Read and return a new Bundle object from the parcel at the current 1683719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * dataPosition(), using the given class loader to initialize the class 1684719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * loader of the Bundle for later retrieval of Parcelable objects. 1685719e6b167041ffaffc2245f692714c8de191863fCraig Mautner * Returns null if the previously written Bundle object was null. 1686719e6b167041ffaffc2245f692714c8de191863fCraig Mautner */ 1687719e6b167041ffaffc2245f692714c8de191863fCraig Mautner public final PersistableBundle readPersistableBundle(ClassLoader loader) { 1688719e6b167041ffaffc2245f692714c8de191863fCraig Mautner int length = readInt(); 1689719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (length < 0) { 1690719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (Bundle.DEBUG) Log.d(TAG, "null bundle: length=" + length); 1691719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return null; 1692719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1693719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1694719e6b167041ffaffc2245f692714c8de191863fCraig Mautner final PersistableBundle bundle = new PersistableBundle(this, length); 1695719e6b167041ffaffc2245f692714c8de191863fCraig Mautner if (loader != null) { 1696719e6b167041ffaffc2245f692714c8de191863fCraig Mautner bundle.setClassLoader(loader); 1697719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1698719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return bundle; 1699719e6b167041ffaffc2245f692714c8de191863fCraig Mautner } 1700719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 1701719e6b167041ffaffc2245f692714c8de191863fCraig Mautner /** 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a byte[] object from the parcel. 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1704047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey public final byte[] createByteArray() { 1705047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey return nativeCreateByteArray(mNativePtr); 1706047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a byte[] object from the parcel and copy it into the 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given byte array. 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readByteArray(byte[] val) { 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: make this a native method to avoid the extra copy. 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] ba = createByteArray(); 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ba.length == val.length) { 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(ba, 0, val, 0, ba.length); 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 172390d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * Read a blob of data from the parcel and return it as a byte array. 172490d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha * {@hide} 172539c12fab49075b715c253c68c84b5c10c3150197Sandeep Siddhartha * {@SystemApi} 172690d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha */ 172790d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha public final byte[] readBlob() { 172890d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha return nativeReadBlob(mNativePtr); 172990d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha } 173090d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha 173190d7a3e996ee3a6e33e655341c5d301fbe30cd58Sandeep Siddhartha /** 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a String[] object from the parcel. 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String[] readStringArray() { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] array = null; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length >= 0) 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array = new String[length]; 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0 ; i < length ; i++) 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[i] = readString(); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 175308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * Read and return a CharSequence[] object from the parcel. 175408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert * {@hide} 175508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert */ 175608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert public final CharSequence[] readCharSequenceArray() { 175708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert CharSequence[] array = null; 175808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 175908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert int length = readInt(); 176008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert if (length >= 0) 176108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert { 176208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert array = new CharSequence[length]; 176308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 176408bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert for (int i = 0 ; i < length ; i++) 176508bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert { 176608bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert array[i] = readCharSequence(); 176708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 176808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 176908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 177008bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return array; 177108bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert } 177208bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 177308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert /** 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList object from the parcel at the current 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList readArrayList(ClassLoader loader) { 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList l = new ArrayList(N); 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readListInternal(l, N, loader); 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Object array from the parcel at the current 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written array was 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Object[] readArray(ClassLoader loader) { 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] l = new Object[N]; 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readArrayInternal(l, N, loader); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new SparseArray object from the parcel at the current 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SparseArray readSparseArray(ClassLoader loader) { 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray sa = new SparseArray(N); 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSparseArrayInternal(sa, N, loader); 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new SparseBooleanArray object from the parcel at the current 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SparseBooleanArray readSparseBooleanArray() { 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseBooleanArray sa = new SparseBooleanArray(N); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSparseBooleanArrayInternal(sa, N); 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing a particular object type from 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeTypedList} at the 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. The list <em>must</em> have 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedList} with the same object 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing objects with the same data 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedList 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> c) { 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<T> l = new ArrayList<T>(N); 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(c.createFromParcel(this)); 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(null); 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items containing a particular object type 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that were written with {@link #writeTypedList} at the 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). The list <em>must</em> have 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedList} with the same object 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing objects with the same data 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedList 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) { 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, c.createFromParcel(this)); 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, null); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(c.createFromParcel(this)); 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(null); 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing String objects from 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeStringList} at the 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeStringList 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> createStringArrayList() { 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> l = new ArrayList<String>(N); 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(readString()); 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing IBinder objects from 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeBinderList} at the 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeBinderList 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<IBinder> createBinderArrayList() { 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<IBinder> l = new ArrayList<IBinder>(N); 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(readStrongBinder()); 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items String objects that were written with 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStringList} at the current dataPosition(). 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeStringList 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readStringList(List<String> list) { 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, readString()); 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(readString()); 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items IBinder objects that were written with 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderList} at the current dataPosition(). 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeBinderList 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBinderList(List<IBinder> list) { 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, readStrongBinder()); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(readStrongBinder()); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new array containing a particular object type from 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel at the current dataPosition(). Returns null if the 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written array was null. The array <em>must</em> have 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedArray} with the same 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object type. 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created array containing objects with the same data 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedArray 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> T[] createTypedArray(Parcelable.Creator<T> c) { 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T[] l = c.newArray(N); 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l[i] = c.createFromParcel(this); 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> void readTypedArray(T[] val, Parcelable.Creator<T> c) { 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = c.createFromParcel(this); 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = null; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> T[] readTypedArray(Parcelable.Creator<T> c) { 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createTypedArray(c); 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a heterogeneous array of Parcelable objects into the Parcel. 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each object in the array is written along with its class name, so 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the correct class can later be instantiated. As a result, this 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has significantly more overhead than {@link #writeTypedArray}, but will 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * correctly handle an array containing more than one type of object. 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value The array of objects to be written. 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedArray 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeParcelableArray(T[] value, 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parcelableFlags) { 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value != null) { 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = value.length; 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelable(value[i], parcelableFlags); 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a typed object from a parcel. The given class loader will be 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to load any enclosed Parcelables. If it is null, the default class 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader will be used. 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Object readValue(ClassLoader loader) { 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type = readInt(); 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_NULL: 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_STRING: 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readString(); 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_INTEGER: 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readInt(); 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_MAP: 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readHashMap(loader); 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_PARCELABLE: 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readParcelable(loader); 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SHORT: 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (short) readInt(); 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LONG: 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readLong(); 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_FLOAT: 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readFloat(); 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_DOUBLE: 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readDouble(); 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BOOLEAN: 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readInt() == 1; 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_CHARSEQUENCE: 211308bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return readCharSequence(); 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LIST: 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readArrayList(loader); 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BOOLEANARRAY: 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createBooleanArray(); 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BYTEARRAY: 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createByteArray(); 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_STRINGARRAY: 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readStringArray(); 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 212708bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert case VAL_CHARSEQUENCEARRAY: 212808bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert return readCharSequenceArray(); 212908bbffb049c135c5dfd40d261118c90d1a6dc111Bjorn Bringert 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_IBINDER: 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readStrongBinder(); 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_OBJECTARRAY: 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readArray(loader); 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_INTARRAY: 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createIntArray(); 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LONGARRAY: 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createLongArray(); 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BYTE: 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readByte(); 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SERIALIZABLE: 21465002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return readSerializable(loader); 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_PARCELABLEARRAY: 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readParcelableArray(loader); 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SPARSEARRAY: 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSparseArray(loader); 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SPARSEBOOLEANARRAY: 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSparseBooleanArray(); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BUNDLE: 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readBundle(loader); // loading will be deferred 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2160719e6b167041ffaffc2245f692714c8de191863fCraig Mautner case VAL_PERSISTABLEBUNDLE: 2161719e6b167041ffaffc2245f692714c8de191863fCraig Mautner return readPersistableBundle(loader); 2162719e6b167041ffaffc2245f692714c8de191863fCraig Mautner 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int off = dataPosition() - 4; 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Parcel " + this + ": Unmarshalling unknown type code " + type + " at offset " + off); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Parcelable from the parcel. The given class loader 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be used to load any enclosed Parcelables. If it is null, the default 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class loader will be used. 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loader A ClassLoader from which to instantiate the Parcelable 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object, or null for the default class loader. 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the newly created Parcelable, or null if a null 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object has been written. 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws BadParcelableException Throws BadParcelableException if there 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was an error trying to instantiate the Parcelable. 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> T readParcelable(ClassLoader loader) { 2182d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn Parcelable.Creator<T> creator = readParcelableCreator(loader); 2183d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn if (creator == null) { 2184d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return null; 2185d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2186d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn if (creator instanceof Parcelable.ClassLoaderCreator<?>) { 2187d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader); 2188d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2189d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return creator.createFromParcel(this); 2190d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2191d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 2192d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 2193d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn public final <T extends Parcelable> T readCreator(Parcelable.Creator<T> creator, 2194d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn ClassLoader loader) { 2195d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn if (creator instanceof Parcelable.ClassLoaderCreator<?>) { 2196d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader); 2197d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2198d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return creator.createFromParcel(this); 2199d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn } 2200d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn 2201d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn /** @hide */ 2202d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator( 2203d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn ClassLoader loader) { 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = readString(); 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable.Creator<T> creator; 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCreators) { 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashMap<String,Parcelable.Creator> map = mCreators.get(loader); 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (map == null) { 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map = new HashMap<String,Parcelable.Creator>(); 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreators.put(loader, map); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project creator = map.get(name); 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creator == null) { 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class c = loader == null ? 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class.forName(name) : Class.forName(name, true, loader); 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Field f = c.getField("CREATOR"); 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project creator = (Parcelable.Creator)f.get(null); 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (IllegalAccessException e) { 2224dcbaf661bfa931f481022c27987798a03ce7a932Daniel Sandler Log.e(TAG, "Illegal access when unmarshalling: " 2225dcbaf661bfa931f481022c27987798a03ce7a932Daniel Sandler + name, e); 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException( 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IllegalAccessException when unmarshalling: " + name); 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (ClassNotFoundException e) { 22305b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick Log.e(TAG, "Class not found when unmarshalling: " 2231dcbaf661bfa931f481022c27987798a03ce7a932Daniel Sandler + name, e); 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException( 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ClassNotFoundException when unmarshalling: " + name); 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (ClassCastException e) { 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Parcelable.Creator object called " 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " CREATOR on class " + name); 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchFieldException e) { 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Parcelable.Creator object called " 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " CREATOR on class " + name); 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 224597a72f6693a7bee3255b2307c6bb18f66669a36cIrfan Sheriff catch (NullPointerException e) { 224697a72f6693a7bee3255b2307c6bb18f66669a36cIrfan Sheriff throw new BadParcelableException("Parcelable protocol requires " 224797a72f6693a7bee3255b2307c6bb18f66669a36cIrfan Sheriff + "the CREATOR object to be static on class " + name); 224897a72f6693a7bee3255b2307c6bb18f66669a36cIrfan Sheriff } 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creator == null) { 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Parcelable.Creator object called " 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " CREATOR on class " + name); 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(name, creator); 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2259d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return creator; 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Parcelable array from the parcel. 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The given class loader will be used to load any enclosed 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Parcelable array, or null if the array is null 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Parcelable[] readParcelableArray(ClassLoader loader) { 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable[] p = new Parcelable[N]; 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p[i] = (Parcelable) readParcelable(loader); 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Serializable object from the parcel. 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Serializable object, or null if the Serializable name 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wasn't found in the parcel. 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Serializable readSerializable() { 22865002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return readSerializable(null); 22875002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 22885002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock 22895002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock private final Serializable readSerializable(final ClassLoader loader) { 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = readString(); 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For some reason we were unable to read the name of the Serializable (either there 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is nothing left in the Parcel to read, or the next value wasn't a String), so 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return null, which indicates that the name wasn't found in the parcel. 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] serializedData = createByteArray(); 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayInputStream bais = new ByteArrayInputStream(serializedData); 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 23015002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock ObjectInputStream ois = new ObjectInputStream(bais) { 23025002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock @Override 23035002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock protected Class<?> resolveClass(ObjectStreamClass osClass) 23045002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock throws IOException, ClassNotFoundException { 23055002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock // try the custom classloader if provided 23065002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock if (loader != null) { 23075002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock Class<?> c = Class.forName(osClass.getName(), false, loader); 23085002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock if (c != null) { 23095002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return c; 23105002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 23115002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 23125002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock return super.resolveClass(osClass); 23135002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock } 23145002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock }; 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (Serializable) ois.readObject(); 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ioe) { 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered " + 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IOException reading a Serializable object (name = " + name + 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ")", ioe); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassNotFoundException cnfe) { 23215002b8c972967b9f0f58dcefe6e37ea79fa9a179John Spurlock throw new RuntimeException("Parcelable encountered " + 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ClassNotFoundException reading a Serializable object (name = " 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ")", cnfe); 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cache of previously looked up CREATOR.createFromParcel() methods for 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // particular classes. Keys are the names of the classes, values are 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Method objects. 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final HashMap<ClassLoader,HashMap<String,Parcelable.Creator>> 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreators = new HashMap<ClassLoader,HashMap<String,Parcelable.Creator>>(); 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2333b34a4615f82a4ad8ce2c0687f47e2113e057e893Narayan Kamath /** @hide for internal use only. */ 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static protected final Parcel obtain(int obj) { 23358ab665dda40ab10e60fc69392022171f454af530Ashok Bhat throw new UnsupportedOperationException(); 23368ab665dda40ab10e60fc69392022171f454af530Ashok Bhat } 23378ab665dda40ab10e60fc69392022171f454af530Ashok Bhat 23388ab665dda40ab10e60fc69392022171f454af530Ashok Bhat /** @hide */ 23398ab665dda40ab10e60fc69392022171f454af530Ashok Bhat static protected final Parcel obtain(long obj) { 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = sHolderPool; 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p; 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pool[i]; 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = null; 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStack = new RuntimeException(); 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.init(obj); 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Parcel(obj); 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23588ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private Parcel(long nativePtr) { 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStack = new RuntimeException(); 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23625b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.i(TAG, "Initializing obj=0x" + Integer.toHexString(obj), mStack); 2363047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey init(nativePtr); 2364047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2365047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 23668ab665dda40ab10e60fc69392022171f454af530Ashok Bhat private void init(long nativePtr) { 2367047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (nativePtr != 0) { 2368047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = nativePtr; 2369047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mOwnsNativeParcelObject = false; 2370047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } else { 2371047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = nativeCreate(); 2372047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mOwnsNativeParcelObject = true; 2373047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2374047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2375047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 2376047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private void freeBuffer() { 2377047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mOwnsNativeParcelObject) { 2378047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeFreeBuffer(mNativePtr); 2379047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2380047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2381047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey 2382047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey private void destroy() { 2383047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mNativePtr != 0) { 2384047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey if (mOwnsNativeParcelObject) { 2385047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey nativeDestroy(mNativePtr); 2386047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 2387047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey mNativePtr = 0; 2388047238ced42eea812de9d39a9f32e94d002bfa5cJeff Sharkey } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStack != null) { 23955b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick Log.w(TAG, "Client did not call Parcel.recycle()", mStack); 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24016aff905048ba3b03724f17e2aba9089872e14cd2Dianne Hackborn /* package */ void readMapInternal(Map outVal, int N, 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object key = readValue(loader); 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.put(key, value); 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2411b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn /* package */ void readArrayMapInternal(ArrayMap outVal, int N, 2412b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn ClassLoader loader) { 2413e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) { 2414e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2415e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn here.fillInStackTrace(); 2416e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Log.d(TAG, "Reading " + N + " ArrayMap entries", here); 2417e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 24188aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn int startPos; 2419b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn while (N > 0) { 24208aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) startPos = dataPosition(); 24219c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn String key = readString(); 2422b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn Object value = readValue(loader); 24238aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read #" + (N-1) + " " 24248aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + (dataPosition()-startPos) + " bytes: key=0x" 24258aee64d18b6b90e46e886a80d8de0467d682ddc4Dianne Hackborn + Integer.toHexString((key != null ? key.hashCode() : 0)) + " " + key); 2426b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn outVal.append(key, value); 2427b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn N--; 2428b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 24299c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn outVal.validate(); 2430b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn } 2431b87655b3e551c6a32f34084c8533800bbd1aff7dDianne Hackborn 2432e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn /* package */ void readArrayMapSafelyInternal(ArrayMap outVal, int N, 2433e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn ClassLoader loader) { 2434e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) { 2435e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn RuntimeException here = new RuntimeException("here"); 2436e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn here.fillInStackTrace(); 2437e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here); 2438e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 2439e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn while (N > 0) { 24409c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn String key = readString(); 2441e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read safe #" + (N-1) + ": key=0x" 2442e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn + (key != null ? key.hashCode() : 0) + " " + key); 2443e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn Object value = readValue(loader); 2444e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn outVal.put(key, value); 2445e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn N--; 2446e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 2447e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn } 2448e784d1e4cfeaf3a9accd7caa33c087abd8f39040Dianne Hackborn 24499c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn /** 24509c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn * @hide For testing only. 24519c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn */ 24529c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn public void readArrayMap(ArrayMap outVal, ClassLoader loader) { 24539c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn final int N = readInt(); 24549c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn if (N < 0) { 24559c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn return; 24569c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn } 24579c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn readArrayMapInternal(outVal, N, loader); 24589c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn } 24599c3e74f1f77d3b29ad47d2c74b0a0061e67c76f1Dianne Hackborn 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readListInternal(List outVal, int N, 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 24645b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.d(TAG, "Unmarshalling value=" + value); 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.add(value); 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readArrayInternal(Object[] outVal, int N, 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 24745b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.d(TAG, "Unmarshalling value=" + value); 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal[i] = value; 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSparseArrayInternal(SparseArray outVal, int N, 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int key = readInt(); 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 24845b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value); 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.append(key, value); 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) { 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int key = readInt(); 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean value = this.readByte() == 1; 24955b747191ff8ad43a54d41faf50436271d1d7fcc8Brad Fitzpatrick //Log.i(TAG, "Unmarshalling key=" + key + " value=" + value); 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.append(key, value); 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2501