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