Parcel.java revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
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; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseBooleanArray; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayInputStream; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ByteArrayOutputStream; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileNotFoundException; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectInputStream; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.ObjectOutputStream; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.Serializable; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Field; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Container for a message (data and object references) that can 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be sent through an IBinder. A Parcel can contain both flattened data 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that will be unflattened on the other side of the IPC (using the various 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods here for writing specific types, or the general 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable} interface), and references to live {@link IBinder} 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects that will result in the other side receiving a proxy IBinder 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * connected with the original IBinder in the Parcel. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">Parcel is <strong>not</strong> a general-purpose 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * serialization mechanism. This class (and the corresponding 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable} API for placing arbitrary objects into a Parcel) is 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * designed as a high-performance IPC transport. As such, it is not 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate to place any Parcel data in to persistent storage: changes 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the underlying implementation of any of the data in the Parcel can 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * render older data unreadable.</p> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The bulk of the Parcel API revolves around reading and writing data 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of various types. There are six major classes of such functions available.</p> 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Primitives</h3> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The most basic data functions are for writing and reading primitive 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data types: {@link #writeByte}, {@link #readByte}, {@link #writeDouble}, 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readDouble}, {@link #writeFloat}, {@link #readFloat}, {@link #writeInt}, 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readInt}, {@link #writeLong}, {@link #readLong}, 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeString}, {@link #readString}. Most other 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data operations are built on top of these. The given data is written and 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read using the endianess of the host CPU.</p> 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Primitive Arrays</h3> 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are a variety of methods for reading and writing raw arrays 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of primitive objects, which generally result in writing a 4-byte length 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * followed by the primitive data items. The methods for reading can either 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * read the data into an existing array, or create and return a new array. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These available types are:</p> 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeBooleanArray(boolean[])}, 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBooleanArray(boolean[])}, {@link #createBooleanArray()} 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeByteArray(byte[])}, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeByteArray(byte[], int, int)}, {@link #readByteArray(byte[])}, 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createByteArray()} 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeCharArray(char[])}, {@link #readCharArray(char[])}, 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createCharArray()} 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeDoubleArray(double[])}, {@link #readDoubleArray(double[])}, 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createDoubleArray()} 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeFloatArray(float[])}, {@link #readFloatArray(float[])}, 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createFloatArray()} 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeIntArray(int[])}, {@link #readIntArray(int[])}, 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createIntArray()} 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeLongArray(long[])}, {@link #readLongArray(long[])}, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createLongArray()} 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeStringArray(String[])}, {@link #readStringArray(String[])}, 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createStringArray()}. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link #writeSparseBooleanArray(SparseBooleanArray)}, 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readSparseBooleanArray()}. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Parcelables</h3> 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The {@link Parcelable} protocol provides an extremely efficient (but 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * low-level) protocol for objects to write and read themselves from Parcels. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You can use the direct methods {@link #writeParcelable(Parcelable, int)} 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * and {@link #readParcelable(ClassLoader)} or 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeParcelableArray} and 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readParcelableArray(ClassLoader)} to write or read. These 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * methods write both the class type and its data to the Parcel, allowing 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that class to be reconstructed from the appropriate class loader when 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * later reading.</p> 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are also some methods that provide a more efficient way to work 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with Parcelables: {@link #writeTypedArray}, 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeTypedList(List)}, 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readTypedArray} and {@link #readTypedList}. These methods 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * do not write the class information of the original object: instead, the 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * caller of the read function must know what type to expect and pass in the 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * appropriate {@link Parcelable.Creator Parcelable.Creator} instead to 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * properly construct the new object and read its data. (To more efficient 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * write and read a single Parceable object, you can directly call 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel Parcelable.writeToParcel} and 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable.Creator#createFromParcel Parcelable.Creator.createFromParcel} 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * yourself.)</p> 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Bundles</h3> 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A special type-safe container, called {@link Bundle}, is available 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for key/value maps of heterogeneous values. This has many optimizations 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for improved performance when reading and writing data, and its type-safe 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * API avoids difficult to debug type errors when finally marshalling the 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data contents into a Parcel. The methods to use are 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBundle(Bundle)}, {@link #readBundle()}, and 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBundle(ClassLoader)}. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Active Objects</h3> 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>An unusual feature of Parcel is the ability to read and write active 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects. For these objects the actual contents of the object is not 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * written, rather a special token referencing the object is written. When 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * reading the object back from the Parcel, you do not get a new instance of 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object, but rather a handle that operates on the exact same object that 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was originally written. There are two forms of active objects available.</p> 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>{@link Binder} objects are a core facility of Android's general cross-process 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * communication system. The {@link IBinder} interface describes an abstract 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * protocol with a Binder object. Any such interface can be written in to 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a Parcel, and upon reading you will receive either the original object 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * implementing that interface or a special proxy implementation 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that communicates calls back to the original object. The methods to use are 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStrongBinder(IBinder)}, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStrongInterface(IInterface)}, {@link #readStrongBinder()}, 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderArray(IBinder[])}, {@link #readBinderArray(IBinder[])}, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createBinderArray()}, 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderList(List)}, {@link #readBinderList(List)}, 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #createBinderArrayList()}.</p> 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>FileDescriptor objects, representing raw Linux file descriptor identifiers, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can be written and {@link ParcelFileDescriptor} objects returned to operate 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * on the original file descriptor. The returned file descriptor is a dup 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the original file descriptor: the object and fd is different, but 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * operating on the same underlying file stream, with the same position, etc. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The methods to use are {@link #writeFileDescriptor(FileDescriptor)}, 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readFileDescriptor()}. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <h3>Untyped Containers</h3> 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>A final class of methods are for writing and reading standard Java 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * containers of arbitrary types. These all revolve around the 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue(Object)} and {@link #readValue(ClassLoader)} methods 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which define the types of objects allowed. The container methods are 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeArray(Object[])}, {@link #readArray(ClassLoader)}, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeList(List)}, {@link #readList(List, ClassLoader)}, 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readArrayList(ClassLoader)}, 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeMap(Map)}, {@link #readMap(Map, ClassLoader)}, 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeSparseArray(SparseArray)}, 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readSparseArray(ClassLoader)}. 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Parcel { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG_RECYCLE = false; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({"UnusedDeclaration"}) 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mObject; // used by native code 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings({"UnusedDeclaration"}) 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mOwnObject; // used by native code 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RuntimeException mStack; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int POOL_SIZE = 6; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Parcel[] sOwnedPool = new Parcel[POOL_SIZE]; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Parcel[] sHolderPool = new Parcel[POOL_SIZE]; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_NULL = -1; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_STRING = 0; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_INTEGER = 1; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_MAP = 2; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BUNDLE = 3; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_PARCELABLE = 4; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SHORT = 5; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LONG = 6; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_FLOAT = 7; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_DOUBLE = 8; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BOOLEAN = 9; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_CHARSEQUENCE = 10; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LIST = 11; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SPARSEARRAY = 12; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BYTEARRAY = 13; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_STRINGARRAY = 14; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_IBINDER = 15; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_PARCELABLEARRAY = 16; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_OBJECTARRAY = 17; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_INTARRAY = 18; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_LONGARRAY = 19; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BYTE = 20; 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SERIALIZABLE = 21; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_SPARSEBOOLEANARRAY = 22; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int VAL_BOOLEANARRAY = 23; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_SECURITY = -1; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_BAD_PARCELABLE = -2; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_ILLEGAL_ARGUMENT = -3; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_NULL_POINTER = -4; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int EX_ILLEGAL_STATE = -5; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static Parcelable.Creator<String> STRING_CREATOR 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = new Parcelable.Creator<String>() { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String createFromParcel(Parcel source) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return source.readString(); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] newArray(int size) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new String[size]; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve a new Parcel object from the pool. 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static Parcel obtain() { 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = sOwnedPool; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p; 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pool[i]; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = null; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStack = new RuntimeException(); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Parcel(0); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Put a Parcel object back into the pool. You must not touch 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the object after this call. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void recycle() { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) mStack = null; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project freeBuffer(); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = mOwnObject != 0 ? sOwnedPool : sHolderPool; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool[i] == null) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = this; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total amount of data contained in the parcel. 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native int dataSize(); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the amount of data remaining to be read from the 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parcel. That is, {@link #dataSize}-{@link #dataPosition}. 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native int dataAvail(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current position in the parcel data. Never 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more than {@link #dataSize}. 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native int dataPosition(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total amount of space in the parcel. This is always 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * >= {@link #dataSize}. The difference between it and dataSize() is the 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * amount of room left until the parcel needs to re-allocate its 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * data buffer. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native int dataCapacity(); 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the amount of data in the parcel. Can be either smaller or 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * larger than the current size. If larger than the current capacity, 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * more memory will be allocated. 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new number of bytes in the Parcel. 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void setDataSize(int size); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Move the current read/write position in the parcel. 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pos New offset in the parcel; must be between 0 and 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dataSize}. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void setDataPosition(int pos); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Change the capacity (current available space) of the parcel. 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param size The new capacity of the parcel, in bytes. Can not be 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * less than {@link #dataSize} -- that is, you can not drop existing data 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with this method. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void setDataCapacity(int size); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the raw bytes of the parcel. 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p class="note">The data you retrieve here <strong>must not</strong> 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be placed in any kind of persistent storage (on local disk, across 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a network, etc). For that, you should use standard serialization 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * or another kind of general serialization mechanism. The Parcel 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * marshalled representation is highly optimized for local IPC, and as 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * such does not attempt to maintain compatibility with data created 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in different versions of the platform. 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native byte[] marshall(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the bytes in data to be the raw bytes of this Parcel. 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void unmarshall(byte[] data, int offest, int length); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void appendFrom(Parcel parcel, int offset, int length); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Report whether the parcel contains any marshalled file descriptors. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native boolean hasFileDescriptors(); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Store or read an IBinder interface token in the parcel at the current 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #dataPosition}. This is used to validate that the marshalled 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * transaction is intended for the target interface. 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeInterfaceToken(String interfaceName); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void enforceInterface(String interfaceName); 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a byte array into the parcel at the current {#link #dataPosition}, 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing {@link #dataCapacity} if needed. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b Bytes to place into the parcel. 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByteArray(byte[] b) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray(b, 0, (b != null) ? b.length : 0); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an byte array into the parcel at the current {#link #dataPosition}, 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing {@link #dataCapacity} if needed. 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param b Bytes to place into the parcel. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset Index of first byte to be written. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param len Number of bytes to write. 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByteArray(byte[] b, int offset, int len) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == null) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b.length < offset + len || len < 0 || offset < 0) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ArrayIndexOutOfBoundsException(); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeNative(b, offset, len); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void writeNative(byte[] b, int offset, int len); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an integer value into the parcel at the current dataPosition(), 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeInt(int val); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a long integer value into the parcel at the current dataPosition(), 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeLong(long val); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a floating point value into the parcel at the current 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), growing dataCapacity() if needed. 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeFloat(float val); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a double precision floating point value into the parcel at the 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(), growing dataCapacity() if needed. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeDouble(double val); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a string value into the parcel at the current dataPosition(), 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeString(String val); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an object into the parcel at the current dataPosition(), 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeStrongBinder(IBinder val); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an object into the parcel at the current dataPosition(), 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStrongInterface(IInterface val) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val == null ? null : val.asBinder()); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a FileDescriptor into the parcel at the current dataPosition(), 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native void writeFileDescriptor(FileDescriptor val); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write an byte value into the parcel at the current dataPosition(), 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeByte(byte val) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #writeBundle} instead. Flattens a Map into the parcel 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at the current dataPosition(), 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The Map keys must be String objects. 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Map values are written using {@link #writeValue} and must follow 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the specification there. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>It is strongly recommended to use {@link #writeBundle} instead of 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this method, since the Bundle class provides a type-safe API that 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allows you to avoid mysterious type errors at the point of marshalling. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeMap(Map val) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeMapInternal((Map<String,Object>) val); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a Map into the parcel at the current dataPosition(), 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The Map keys must be String objects. 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void writeMapInternal(Map<String,Object> val) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<Map.Entry<String,Object>> entries = val.entrySet(); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(entries.size()); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String,Object> e : entries) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(e.getKey()); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(e.getValue()); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a Bundle into the parcel at the current dataPosition(), 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBundle(Bundle val) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val.mParcelledData != null) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = val.mParcelledData.dataSize(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project appendFrom(val.mParcelledData, 0, length); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); // dummy, will hold length 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int oldPos = dataPosition(); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0x4C444E42); // 'B' 'N' 'D' 'L' 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeMapInternal(val.mMap); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int newPos = dataPosition(); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Backpatch length 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDataPosition(oldPos - 4); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = newPos - oldPos; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(length); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDataPosition(newPos); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List into the parcel at the current dataPosition(), growing 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataCapacity() if needed. The List values are written using 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue} and must follow the specification there. 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeList(List val) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val.get(i)); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten an Object array into the parcel at the current dataPosition(), 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * growing dataCapacity() if needed. The array values are written using 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeValue} and must follow the specification there. 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeArray(Object[] val) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val[i]); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a generic SparseArray into the parcel at the current 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), growing dataCapacity() if needed. The SparseArray 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * values are written using {@link #writeValue} and must follow the 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * specification there. 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSparseArray(SparseArray<Object> val) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val.keyAt(i)); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeValue(val.valueAt(i)); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSparseBooleanArray(SparseBooleanArray val) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val.keyAt(i)); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByte((byte)(val.valueAt(i) ? 1 : 0)); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBooleanArray(boolean[] val) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val[i] ? 1 : 0); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean[] createBooleanArray() { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>2 as a fast divide-by-4 works in the create*Array() functions 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // because dataAvail() will never return a negative number. 4 is 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the size of a stored boolean in the stream. 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean[] val = new boolean[N]; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt() != 0; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBooleanArray(boolean[] val) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt() != 0; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeCharArray(char[] val) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((int)val[i]); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final char[] createCharArray() { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char[] val = new char[N]; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = (char)readInt(); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readCharArray(char[] val) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = (char)readInt(); 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeIntArray(int[] val) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(val[i]); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int[] createIntArray() { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] val = new int[N]; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt(); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readIntArray(int[] val) { 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readInt(); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeLongArray(long[] val) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLong(val[i]); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final long[] createLongArray() { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>3 because stored longs are 64 bits 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 3)) { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long[] val = new long[N]; 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readLong(); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readLongArray(long[] val) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readLong(); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeFloatArray(float[] val) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeFloat(val[i]); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float[] createFloatArray() { 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>2 because stored floats are 4 bytes 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 2)) { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] val = new float[N]; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readFloat(); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readFloatArray(float[] val) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readFloat(); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeDoubleArray(double[] val) { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeDouble(val[i]); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final double[] createDoubleArray() { 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // >>3 because stored doubles are 8 bytes 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0 && N <= (dataAvail() >> 3)) { 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double[] val = new double[N]; 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readDouble(); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readDoubleArray(double[] val) { 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readDouble(); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStringArray(String[] val) { 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(val[i]); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String[] createStringArray() { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] val = new String[N]; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readString(); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readStringArray(String[] val) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readString(); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBinderArray(IBinder[] val) { 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val[i]); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final IBinder[] createBinderArray() { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N >= 0) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder[] val = new IBinder[N]; 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readStrongBinder(); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBinderArray(IBinder[] val) { 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = readStrongBinder(); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing a particular object type into the parcel, at 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. The 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type of the objects in the list must be one that implements Parcelable. 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike the generic writeList() method, however, only the raw data of the 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects is written and not their type, so you must use the corresponding 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * readTypedList() to unmarshall them. 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of objects to be written. 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createTypedArrayList 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readTypedList 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Parcelable 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeTypedList(List<T> val) { 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T item = val.get(i); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(1); 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.writeToParcel(this, 0); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing String objects into the parcel, at 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. They 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can later be retrieved with {@link #createStringArrayList} or 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readStringList}. 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of strings to be written. 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createStringArrayList 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readStringList 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeStringList(List<String> val) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(val.get(i)); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a List containing IBinder objects into the parcel, at 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. They 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can later be retrieved with {@link #createBinderArrayList} or 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readBinderList}. 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The list of strings to be written. 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #createBinderArrayList 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readBinderList 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeBinderList(List<IBinder> val) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == null) { 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.size(); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i=0; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder(val.get(i)); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a heterogeneous array containing a particular object type into 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel, at 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current dataPosition() and growing dataCapacity() if needed. The 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type of the objects in the array must be one that implements Parcelable. 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unlike the {@link #writeParcelableArray} method, however, only the 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * raw data of the objects is written and not their type, so you must use 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #readTypedArray} with the correct corresponding 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable.Creator} implementation to unmarshall them. 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param val The array of objects to be written. 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readTypedArray 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeParcelableArray 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Parcelable.Creator 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeTypedArray(T[] val, 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parcelableFlags) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val != null) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = val.length; 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T item = val[i]; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (item != null) { 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(1); 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project item.writeToParcel(this, parcelableFlags); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten a generic object in to a parcel. The given Object value may 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * currently be one of the following types: 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> null 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> String 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Byte 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Short 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Integer 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Long 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Float 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Double 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Boolean 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> String[] 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> boolean[] 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> byte[] 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> int[] 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> long[] 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Object[] (supporting objects of the same type defined here). 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link Bundle} 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Map (as supported by {@link #writeMap}). 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any object that implements the {@link Parcelable} protocol. 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Parcelable[] 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> CharSequence (as supported by {@link TextUtils#writeToParcel}). 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> List (as supported by {@link #writeList}). 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link SparseArray} (as supported by {@link #writeSparseArray}). 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> {@link IBinder} 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li> Any object that implements Serializable (but see 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeSerializable} for caveats). Note that all of the 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous types have relatively efficient implementations for 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * writing to a Parcel; having to rely on the generic serialization 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * approach is much less efficient and should be avoided whenever 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * possible. 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeValue(Object v) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v == null) { 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_NULL); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof String) { 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_STRING); 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString((String) v); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Integer) { 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_INTEGER); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Integer) v); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Map) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_MAP); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeMap((Map) v); 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Bundle) { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be before Parcelable 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BUNDLE); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBundle((Bundle) v); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Parcelable) { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_PARCELABLE); 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelable((Parcelable) v, 0); 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Short) { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SHORT); 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(((Short) v).intValue()); 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Long) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LONG); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLong((Long) v); 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Float) { 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_FLOAT); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeFloat((Float) v); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Double) { 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_DOUBLE); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeDouble((Double) v); 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Boolean) { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BOOLEAN); 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Boolean) v ? 1 : 0); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof CharSequence) { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be after String 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_CHARSEQUENCE); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextUtils.writeToParcel((CharSequence) v, this, 0); 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof List) { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LIST); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeList((List) v); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof SparseArray) { 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SPARSEARRAY); 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSparseArray((SparseArray) v); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof boolean[]) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BOOLEANARRAY); 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeBooleanArray((boolean[]) v); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof byte[]) { 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BYTEARRAY); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray((byte[]) v); 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof String[]) { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_STRINGARRAY); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStringArray((String[]) v); 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof IBinder) { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_IBINDER); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeStrongBinder((IBinder) v); 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Parcelable[]) { 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_PARCELABLEARRAY); 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelableArray((Parcelable[]) v, 0); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Object[]) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_OBJECTARRAY); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeArray((Object[]) v); 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof int[]) { 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_INTARRAY); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeIntArray((int[]) v); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof long[]) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_LONGARRAY); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLongArray((long[]) v); 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Byte) { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_BYTE); 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt((Byte) v); 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v instanceof Serializable) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Must be last 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(VAL_SERIALIZABLE); 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSerializable((Serializable) v); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcel: unable to marshal value " + v); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Flatten the name of the class of the Parcelable and its contents 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * into the parcel. 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p The Parcelable object to be written. 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeParcelable(Parcelable p, int parcelableFlags) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(null); 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = p.getClass().getName(); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(name); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.writeToParcel(this, parcelableFlags); 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a generic serializable object in to a Parcel. It is strongly 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * recommended that this method be avoided, since the serialization 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * overhead is extremely large, and this approach will be much slower than 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the other approaches to writing data in to a Parcel. 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeSerializable(Serializable s) { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(null); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = s.getClass().getName(); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(name); 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(); 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ObjectOutputStream oos = new ObjectOutputStream(baos); 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oos.writeObject(s); 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project oos.close(); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeByteArray(baos.toByteArray()); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ioe) { 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered " + 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IOException writing serializable object (name = " + name + 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ")", ioe); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for writing an exception result at the header of 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, to be used when returning an exception from a transaction. 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that this currently only supports a few exception types; any other 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * exception will be re-thrown by this function as a RuntimeException 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (to be caught by the system's last-resort exception handling when 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dispatching a transaction). 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>The supported exception types are: 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ul> 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link BadParcelableException} 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link IllegalArgumentException} 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link IllegalStateException} 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link NullPointerException} 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <li>{@link SecurityException} 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </ul> 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param e The Exception to be written. 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeNoException 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readException 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeException(Exception e) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = 0; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e instanceof SecurityException) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_SECURITY; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof BadParcelableException) { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_BAD_PARCELABLE; 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof IllegalArgumentException) { 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_ILLEGAL_ARGUMENT; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof NullPointerException) { 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_NULL_POINTER; 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (e instanceof IllegalStateException) { 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project code = EX_ILLEGAL_STATE; 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(code); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == 0) { 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (e instanceof RuntimeException) { 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw (RuntimeException) e; 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException(e); 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeString(e.getMessage()); 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for writing information at the front of the Parcel 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * indicating that no exception occurred. 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeException 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #readException 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void writeNoException() { 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(0); 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Special function for reading an exception result from the header of 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a parcel, to be used after receiving the result of a transaction. This 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will throw the exception for you if it had been written to the Parcel, 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise return and let you read the normal result data from the Parcel. 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeException 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeNoException 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readException() { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int code = readInt(); 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (code == 0) return; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String msg = readString(); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readException(code, msg); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Use this function for customized exception handling. 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * customized method call this method for all unknown case 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param code exception code 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param msg exception message 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readException(int code, String msg) { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (code) { 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_SECURITY: 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new SecurityException(msg); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_BAD_PARCELABLE: 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException(msg); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_ILLEGAL_ARGUMENT: 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(msg); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_NULL_POINTER: 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new NullPointerException(msg); 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case EX_ILLEGAL_STATE: 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalStateException(msg); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Unknown exception code: " + code 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " msg " + msg); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read an integer value from the parcel at the current dataPosition(). 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native int readInt(); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a long integer value from the parcel at the current dataPosition(). 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native long readLong(); 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a floating point value from the parcel at the current 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native float readFloat(); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a double precision floating point value from the parcel at the 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native double readDouble(); 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a string value from the parcel at the current dataPosition(). 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native String readString(); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read an object from the parcel at the current dataPosition(). 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native IBinder readStrongBinder(); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a FileDescriptor from the parcel at the current dataPosition(). 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ParcelFileDescriptor readFileDescriptor() { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileDescriptor fd = internalReadFileDescriptor(); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fd != null ? new ParcelFileDescriptor(fd) : null; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native FileDescriptor internalReadFileDescriptor(); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ static native FileDescriptor openFileDescriptor(String file, 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mode) throws FileNotFoundException; 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /*package*/ static native void closeFileDescriptor(FileDescriptor desc) 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a byte value from the parcel at the current dataPosition(). 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final byte readByte() { 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (byte)(readInt() & 0xff); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #readBundle(ClassLoader)} instead (whose data must have 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been written with {@link #writeBundle}. Read into an existing Map object 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from the parcel at the current dataPosition(). 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readMap(Map outVal, ClassLoader loader) { 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(outVal, N, loader); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into an existing List object from the parcel at the current 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), using the given class loader to load any enclosed 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. If it is null, the default class loader is used. 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readList(List outVal, ClassLoader loader) { 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readListInternal(outVal, N, loader); 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Please use {@link #readBundle(ClassLoader)} instead (whose data must have 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * been written with {@link #writeBundle}. Read and return a new HashMap 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object from the parcel at the current dataPosition(), using the given 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class loader to load any enclosed Parcelables. Returns null if 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the previously written map object was null. 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final HashMap readHashMap(ClassLoader loader) 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashMap m = new HashMap(N); 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(m, N, loader); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written Bundle object was 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle readBundle() { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readBundle(null); 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(), using the given class loader to initialize the class 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader of the Bundle for later retrieval of Parcelable objects. 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns null if the previously written Bundle object was null. 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Bundle readBundle(ClassLoader loader) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offset = dataPosition(); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length < 0) { 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = readInt(); 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != 0x4C444E42) { 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection ThrowableInstanceNeverThrown 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String st = Log.getStackTraceString(new RuntimeException()); 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("Bundle", "readBundle: bad magic number"); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("Bundle", "readBundle: trace = " + st); 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Advance within this Parcel 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setDataPosition(offset + length + 4); 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p = new Parcel(0); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.setDataPosition(0); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.appendFrom(this, offset, length + 4); 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.setDataPosition(0); 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Bundle bundle = new Bundle(p); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (loader != null) { 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bundle.setClassLoader(loader); 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bundle; 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Bundle object from the parcel at the current 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written Bundle object was 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The returned bundle will have its contents fully unpacked using 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the given ClassLoader. 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* package */ Bundle readBundleUnpacked(ClassLoader loader) { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length == -1) { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = readInt(); 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != 0x4C444E42) { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //noinspection ThrowableInstanceNeverThrown 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String st = Log.getStackTraceString(new RuntimeException()); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("Bundle", "readBundleUnpacked: bad magic number"); 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("Bundle", "readBundleUnpacked: trace = " + st); 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle m = new Bundle(loader); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readMapInternal(m.mMap, N, loader); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a byte[] object from the parcel. 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final native byte[] createByteArray(); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a byte[] object from the parcel and copy it into the 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * given byte array. 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readByteArray(byte[] val) { 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: make this a native method to avoid the extra copy. 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] ba = createByteArray(); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ba.length == val.length) { 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(ba, 0, val, 0, ba.length); 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a String[] object from the parcel. 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String[] readStringArray() { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] array = null; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int length = readInt(); 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (length >= 0) 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array = new String[length]; 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0 ; i < length ; i++) 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project array[i] = readString(); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList object from the parcel at the current 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList readArrayList(ClassLoader loader) { 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList l = new ArrayList(N); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readListInternal(l, N, loader); 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Object array from the parcel at the current 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written array was 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Object[] readArray(ClassLoader loader) { 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object[] l = new Object[N]; 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readArrayInternal(l, N, loader); 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new SparseArray object from the parcel at the current 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. The given class loader will be used to load any enclosed 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SparseArray readSparseArray(ClassLoader loader) { 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray sa = new SparseArray(N); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSparseArrayInternal(sa, N, loader); 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new SparseBooleanArray object from the parcel at the current 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * dataPosition(). Returns null if the previously written list object was 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * null. 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final SparseBooleanArray readSparseBooleanArray() { 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseBooleanArray sa = new SparseBooleanArray(N); 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSparseBooleanArrayInternal(sa, N); 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing a particular object type from 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeTypedList} at the 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. The list <em>must</em> have 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedList} with the same object 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing objects with the same data 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedList 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> ArrayList<T> createTypedArrayList(Parcelable.Creator<T> c) { 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<T> l = new ArrayList<T>(N); 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(c.createFromParcel(this)); 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(null); 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items containing a particular object type 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that were written with {@link #writeTypedList} at the 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). The list <em>must</em> have 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedList} with the same object 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * type. 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing objects with the same data 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedList 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) { 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, c.createFromParcel(this)); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, null); 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(c.createFromParcel(this)); 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(null); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing String objects from 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeStringList} at the 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeStringList 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> createStringArrayList() { 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<String> l = new ArrayList<String>(N); 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(readString()); 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new ArrayList containing IBinder objects from 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel that was written with {@link #writeBinderList} at the 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current dataPosition(). Returns null if the 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written list object was null. 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeBinderList 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<IBinder> createBinderArrayList() { 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<IBinder> l = new ArrayList<IBinder>(N); 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l.add(readStrongBinder()); 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items String objects that were written with 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeStringList} at the current dataPosition(). 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeStringList 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readStringList(List<String> list) { 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, readString()); 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(readString()); 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read into the given List items IBinder objects that were written with 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #writeBinderList} at the current dataPosition(). 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created ArrayList containing strings with the same data 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeBinderList 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void readBinderList(List<IBinder> list) { 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int M = list.size(); 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i < M && i < N; i++) { 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.set(i, readStrongBinder()); 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<N; i++) { 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.add(readStrongBinder()); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (; i<M; i++) { 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project list.remove(N); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new array containing a particular object type from 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the parcel at the current dataPosition(). Returns null if the 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously written array was null. The array <em>must</em> have 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previously been written via {@link #writeTypedArray} with the same 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object type. 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A newly created array containing objects with the same data 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * as those that were previously written. 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedArray 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> T[] createTypedArray(Parcelable.Creator<T> c) { 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project T[] l = c.newArray(N); 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project l[i] = c.createFromParcel(this); 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return l; 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> void readTypedArray(T[] val, Parcelable.Creator<T> c) { 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = readInt(); 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N == val.length) { 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readInt() != 0) { 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = c.createFromParcel(this); 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val[i] = null; 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("bad array lengths"); 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @deprecated 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Deprecated 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T> T[] readTypedArray(Parcelable.Creator<T> c) { 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createTypedArray(c); 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Write a heterogeneous array of Parcelable objects into the Parcel. 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each object in the array is written along with its class name, so 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that the correct class can later be instantiated. As a result, this 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * has significantly more overhead than {@link #writeTypedArray}, but will 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * correctly handle an array containing more than one type of object. 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param value The array of objects to be written. 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param parcelableFlags Contextual flags as per 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Parcelable#writeToParcel(Parcel, int) Parcelable.writeToParcel()}. 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #writeTypedArray 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> void writeParcelableArray(T[] value, 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int parcelableFlags) { 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value != null) { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = value.length; 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(N); 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeParcelable(value[i], parcelableFlags); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeInt(-1); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read a typed object from a parcel. The given class loader will be 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * used to load any enclosed Parcelables. If it is null, the default class 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * loader will be used. 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Object readValue(ClassLoader loader) { 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type = readInt(); 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_NULL: 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_STRING: 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readString(); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_INTEGER: 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readInt(); 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_MAP: 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readHashMap(loader); 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_PARCELABLE: 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readParcelable(loader); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SHORT: 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (short) readInt(); 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LONG: 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readLong(); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_FLOAT: 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readFloat(); 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_DOUBLE: 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readDouble(); 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BOOLEAN: 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readInt() == 1; 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_CHARSEQUENCE: 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(this); 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LIST: 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readArrayList(loader); 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BOOLEANARRAY: 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createBooleanArray(); 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BYTEARRAY: 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createByteArray(); 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_STRINGARRAY: 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readStringArray(); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_IBINDER: 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readStrongBinder(); 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_OBJECTARRAY: 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readArray(loader); 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_INTARRAY: 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createIntArray(); 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_LONGARRAY: 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return createLongArray(); 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BYTE: 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readByte(); 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SERIALIZABLE: 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSerializable(); 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_PARCELABLEARRAY: 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readParcelableArray(loader); 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SPARSEARRAY: 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSparseArray(loader); 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_SPARSEBOOLEANARRAY: 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readSparseBooleanArray(); 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case VAL_BUNDLE: 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return readBundle(loader); // loading will be deferred 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int off = dataPosition() - 4; 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Parcel " + this + ": Unmarshalling unknown type code " + type + " at offset " + off); 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Parcelable from the parcel. The given class loader 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be used to load any enclosed Parcelables. If it is null, the default 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * class loader will be used. 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param loader A ClassLoader from which to instantiate the Parcelable 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object, or null for the default class loader. 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns the newly created Parcelable, or null if a null 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * object has been written. 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @throws BadParcelableException Throws BadParcelableException if there 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * was an error trying to instantiate the Parcelable. 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final <T extends Parcelable> T readParcelable(ClassLoader loader) { 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = readString(); 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcelable.Creator<T> creator; 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mCreators) { 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashMap<String,Parcelable.Creator> map = mCreators.get(loader); 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (map == null) { 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map = new HashMap<String,Parcelable.Creator>(); 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreators.put(loader, map); 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project creator = map.get(name); 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creator == null) { 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class c = loader == null ? 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Class.forName(name) : Class.forName(name, true, loader); 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Field f = c.getField("CREATOR"); 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project creator = (Parcelable.Creator)f.get(null); 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (IllegalAccessException e) { 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("Parcel", "Class not found when unmarshalling: " 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ", e: " + e); 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException( 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IllegalAccessException when unmarshalling: " + name); 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (ClassNotFoundException e) { 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("Parcel", "Class not found when unmarshalling: " 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ", e: " + e); 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException( 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ClassNotFoundException when unmarshalling: " + name); 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (ClassCastException e) { 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Parcelable.Creator object called " 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " CREATOR on class " + name); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project catch (NoSuchFieldException e) { 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Parcelable.Creator object called " 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " CREATOR on class " + name); 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (creator == null) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new BadParcelableException("Parcelable protocol requires a " 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "Parcelable.Creator object called " 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " CREATOR on class " + name); 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project map.put(name, creator); 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return creator.createFromParcel(this); 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Parcelable array from the parcel. 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The given class loader will be used to load any enclosed 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Parcelables. 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Parcelable array, or null if the array is null 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Parcelable[] readParcelableArray(ClassLoader loader) { 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 Parcelable[] p = new Parcelable[N]; 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p[i] = (Parcelable) readParcelable(loader); 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Read and return a new Serializable object from the parcel. 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the Serializable object, or null if the Serializable name 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wasn't found in the parcel. 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Serializable readSerializable() { 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = readString(); 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For some reason we were unable to read the name of the Serializable (either there 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is nothing left in the Parcel to read, or the next value wasn't a String), so 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // return null, which indicates that the name wasn't found in the parcel. 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] serializedData = createByteArray(); 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ByteArrayInputStream bais = new ByteArrayInputStream(serializedData); 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ObjectInputStream ois = new ObjectInputStream(bais); 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (Serializable) ois.readObject(); 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException ioe) { 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered " + 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "IOException reading a Serializable object (name = " + name + 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ")", ioe); 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (ClassNotFoundException cnfe) { 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException("Parcelable encountered" + 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ClassNotFoundException reading a Serializable object (name = " 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + name + ")", cnfe); 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cache of previously looked up CREATOR.createFromParcel() methods for 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // particular classes. Keys are the names of the classes, values are 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Method objects. 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final HashMap<ClassLoader,HashMap<String,Parcelable.Creator>> 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCreators = new HashMap<ClassLoader,HashMap<String,Parcelable.Creator>>(); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static protected final Parcel obtain(int obj) { 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Parcel[] pool = sHolderPool; 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (pool) { 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel p; 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<POOL_SIZE; i++) { 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p = pool[i]; 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p != null) { 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pool[i] = null; 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStack = new RuntimeException(); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.init(obj); 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Parcel(obj); 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Parcel(int obj) { 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStack = new RuntimeException(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("Parcel", "Initializing obj=0x" + Integer.toHexString(obj), mStack); 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project init(obj); 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void finalize() throws Throwable { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG_RECYCLE) { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mStack != null) { 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("Parcel", "Client did not call Parcel.recycle()", mStack); 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project destroy(); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void freeBuffer(); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void init(int obj); 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private native void destroy(); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readMapInternal(Map outVal, int N, 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object key = readValue(loader); 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.put(key, value); 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readListInternal(List outVal, int N, 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d("Parcel", "Unmarshalling value=" + value); 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.add(value); 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readArrayInternal(Object[] outVal, int N, 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < N; i++) { 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.d("Parcel", "Unmarshalling value=" + value); 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal[i] = value; 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSparseArrayInternal(SparseArray outVal, int N, 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ClassLoader loader) { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int key = readInt(); 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object value = readValue(loader); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("Parcel", "Unmarshalling key=" + key + " value=" + value); 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.append(key, value); 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSparseBooleanArrayInternal(SparseBooleanArray outVal, int N) { 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (N > 0) { 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int key = readInt(); 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean value = this.readByte() == 1; 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("Parcel", "Unmarshalling key=" + key + " value=" + value); 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outVal.append(key, value); 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2052