ObjectInputStream.java revision ad41624e761bcf1af9c8008eb45187fc13983717
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.io; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson// BEGIN android-note 21f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson// Harmony uses ObjectAccessors to access fields through JNI. Android has not 22f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson// yet migrated that API. As a consequence, there's a lot of changes here... 23f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson// END android-note 24f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 2503c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughesimport dalvik.system.VMStack; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.EmulatedFields.ObjectSlot; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Array; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Constructor; 29b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughesimport java.lang.reflect.Field; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.InvocationTargetException; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Method; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Modifier; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.Proxy; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.PrivilegedAction; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.ArrayList; 36b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughesimport java.util.Arrays; 37f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport java.util.HashMap; 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Iterator; 3946241f2f67d7b90e20f3301861f807f330687821Elliott Hughesimport java.util.List; 40693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughesimport libcore.base.EmptyArray; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A specialized {@link InputStream} that is able to read (deserialize) Java 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * objects as well as primitive data types (int, byte, char etc.). The data has 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * typically been saved using an ObjectOutputStream. 46f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectInput 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Serializable 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Externalizable 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 5232ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughespublic class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // BEGIN android-note 55f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // this is non-static to avoid sync contention. Would static be faster? 56f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // END android-note 57693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes private InputStream emptyStream = new ByteArrayInputStream(EmptyArray.BYTE); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // To put into objectsRead when reading unsharedObject 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final Object UNSHARED_OBJ = new Object(); // $NON-LOCK-1$ 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If the receiver has already read & not consumed a TC code 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean hasPushbackTC; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Push back TC code if the variable above is true 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte pushbackTC; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // How many nested levels to readObject. When we reach 0 we have to validate 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the graph then reset it 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private int nestedLevels; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // All objects are assigned an ID (integer handle) 732543351c360bdfe0046e819dedb069f3724d703aJesse Wilson private int nextHandle; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Where we read from 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private DataInputStream input; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Where we read primitive types from 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private DataInputStream primitiveTypes; 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Where we keep primitive type data 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InputStream primitiveData = emptyStream; 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Resolve object is a mechanism for replacement 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean enableResolve; 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 876523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes /** 886523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes * All the objects we've read, indexed by their serialization handle (minus the base offset). 896523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes */ 906523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private ArrayList<Object> objectsRead; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Used by defaultReadObject 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object currentObject; 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Used by defaultReadObject 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ObjectStreamClass currentClass; 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // All validations to be executed when the complete graph is read. See inner 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // type below. 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private InputValidationDesc[] validations; 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Allows the receiver to decide if it needs to call readObjectOverride 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean subclassOverridingImplementation; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Original caller's class loader, used to perform class lookups 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ClassLoader callerClassLoader; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // false when reading missing fields 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean mustResolve = true; 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Handle for the current class descriptor 1126523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private int descriptorHandle = -1; 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 114f24bce74a497ed281de23b7e997549725557b730Elliott Hughes private static final HashMap<String, Class<?>> PRIMITIVE_CLASSES = new HashMap<String, Class<?>>(); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static { 11603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes PRIMITIVE_CLASSES.put("boolean", boolean.class); 117f24bce74a497ed281de23b7e997549725557b730Elliott Hughes PRIMITIVE_CLASSES.put("byte", byte.class); 11803c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes PRIMITIVE_CLASSES.put("char", char.class); 11903c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes PRIMITIVE_CLASSES.put("double", double.class); 120f24bce74a497ed281de23b7e997549725557b730Elliott Hughes PRIMITIVE_CLASSES.put("float", float.class); 121f24bce74a497ed281de23b7e997549725557b730Elliott Hughes PRIMITIVE_CLASSES.put("int", int.class); 122f24bce74a497ed281de23b7e997549725557b730Elliott Hughes PRIMITIVE_CLASSES.put("long", long.class); 123f24bce74a497ed281de23b7e997549725557b730Elliott Hughes PRIMITIVE_CLASSES.put("short", short.class); 124f24bce74a497ed281de23b7e997549725557b730Elliott Hughes PRIMITIVE_CLASSES.put("void", void.class); 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // BEGIN android-removed 128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // private ObjectAccessor accessor = AccessorFactory.getObjectAccessor(); 129f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // END android-removed 130f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Internal type used to keep track of validators & corresponding priority 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project static class InputValidationDesc { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectInputValidation validator; 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int priority; 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * GetField is an inner class that provides access to the persistent fields 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from the source stream. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract static class GetField { 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the ObjectStreamClass that describes a field. 145f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the descriptor class for a serialized field. 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract ObjectStreamClass getObjectStreamClass(); 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates if the field identified by {@code name} is defaulted. This 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * means that it has no value in this stream. 153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to check. 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the field is defaulted, {@code false} 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code name} does not identify a serializable field. 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean defaulted(String name) throws IOException, 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IllegalArgumentException; 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the boolean field identified by {@code name} from 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the persistent field. 170f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code boolean}. 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean get(String name, boolean defaultValue) 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the character field identified by {@code name} from 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the persistent field. 190f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code char}. 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract char get(String name, char defaultValue) 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the byte field identified by {@code name} from the 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * persistent field. 210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code byte}. 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract byte get(String name, byte defaultValue) 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the short field identified by {@code name} from the 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * persistent field. 230f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code short}. 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract short get(String name, short defaultValue) 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the integer field identified by {@code name} from 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the persistent field. 250f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code int}. 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract int get(String name, int defaultValue) 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 267f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson /** 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the long field identified by {@code name} from the 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * persistent field. 270f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code long}. 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract long get(String name, long defaultValue) 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the float field identified by {@code name} from the 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * persistent field. 290f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code float} is 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code char}. 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract float get(String name, float defaultValue) 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the double field identified by {@code name} from 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the persistent field. 310f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code double}. 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract double get(String name, double defaultValue) 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the object field identified by {@code name} from 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the persistent field. 330f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param name 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the field to get. 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param defaultValue 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the default value that is used if the field does not have 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a value when read from the source stream. 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of the field identified by {@code name}. 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source input 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the type of the field identified by {@code name} is 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not {@code Object}. 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract Object get(String name, Object defaultValue) 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, IllegalArgumentException; 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new ObjectInputStream. This default constructor can be used 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by subclasses that do not want to use the public constructor if it 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allocates unneeded data. 352f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs when creating this stream. 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected ObjectInputStream() throws IOException, SecurityException { 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // WARNING - we should throw IOException if not called from a subclass 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // according to the JavaDoc. Add the test. 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.subclassOverridingImplementation = true; 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new ObjectInputStream that reads from the InputStream 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code input}. 366f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param input 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the non-null source InputStream to filter reads on. 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the stream header. 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws StreamCorruptedException 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the source stream does not contain serialized objects that 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can be read. 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 375ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes public ObjectInputStream(InputStream input) throws StreamCorruptedException, IOException { 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Class<?> implementationClass = getClass(); 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Class<?> thisClass = ObjectInputStream.class; 378ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes this.input = (input instanceof DataInputStream) 379ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes ? (DataInputStream) input : new DataInputStream(input); 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveTypes = new DataInputStream(this); 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enableResolve = false; 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.subclassOverridingImplementation = false; 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetState(); 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project nestedLevels = 0; 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // So read...() methods can be used by 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // subclasses during readStreamHeader() 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = this.input; 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Has to be done here according to the specification 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readStreamHeader(); 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int available() throws IOException { 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // returns 0 if next data is an object, or N if reading primitive types 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkReadPrimitiveTypes(); 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveData.available(); 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Checks to if it is ok to read primitive types from this stream at 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this point. One is not supposed to read primitive types when about to 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read an object, for example, so an exception has to be thrown. 404f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If any IO problem occurred when trying to read primitive type 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * or if it is illegal to read primitive types 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void checkReadPrimitiveTypes() throws IOException { 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If we still have primitive data, it is ok to read primitive data 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (primitiveData == input || primitiveData.available() > 0) { 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If we got here either we had no Stream previously created or 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // we no longer have data in that one, so get more bytes 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int next = 0; 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (hasPushbackTC) { 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hasPushbackTC = false; 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project next = input.read(); 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pushbackTC = (byte) next; 424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (pushbackTC) { 426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_BLOCKDATA: 427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = new ByteArrayInputStream(readBlockData()); 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_BLOCKDATALONG: 430b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes primitiveData = new ByteArrayInputStream(readBlockDataLong()); 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_RESET: 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetState(); 434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project default: 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (next != -1) { 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pushbackTC(); 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Only TC_RESET falls through 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (true); 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this stream. This implementation closes the source stream. 447f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing this stream. 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() throws IOException { 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project input.close(); 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Default method to read objects from this stream. Serializable fields 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defined in the object's class and superclasses are read from the source 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 460f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the object's class cannot be found. 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an I/O error occurs while reading the object data. 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NotActiveException 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this method is not called from {@code readObject()}. 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#defaultWriteObject 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void defaultReadObject() throws IOException, ClassNotFoundException, 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NotActiveException { 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentObject != null || !mustResolve) { 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readFieldValues(currentObject, currentClass); 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NotActiveException(); 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Enables object replacement for this stream. By default this is not 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * enabled. Only trusted subclasses (loaded with system class loader) are 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allowed to change this status. 482f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param enable 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} to enable object replacement; {@code false} to 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * disable it. 486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the previous setting. 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #resolveObject 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#enableReplaceObject 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 490ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes protected boolean enableResolveObject(boolean enable) throws SecurityException { 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean originalValue = enableResolve; 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enableResolve = enable; 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return originalValue; 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return the next {@code int} handle to be used to indicate cyclic 498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * references being loaded from the stream. 499f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the next handle to represent the next cyclic reference 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 5026523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private int nextHandle() { 5032543351c360bdfe0046e819dedb069f3724d703aJesse Wilson return nextHandle++; 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return the next token code (TC) from the receiver, which indicates what 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * kind of object follows 509f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the next TC from the receiver 511f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO error occurs 514f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectStreamConstants 516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte nextTC() throws IOException { 518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (hasPushbackTC) { 519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hasPushbackTC = false; // We are consuming it 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Just in case a later call decides to really push it back, 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // we don't require the caller to pass it as parameter 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pushbackTC = input.readByte(); 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return pushbackTC; 526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Pushes back the last TC code read 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void pushbackTC() { 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hasPushbackTC = true; 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a single byte from the source stream and returns it as an integer 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the range from 0 to 255. Returns -1 if the end of the source stream 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has been reached. Blocks if no input is available. 539f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte read or -1 if the end of the source stream has been 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * reached. 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from this stream. 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read() throws IOException { 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkReadPrimitiveTypes(); 548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveData.read(); 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads at most {@code length} bytes from the source stream and stores them 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in byte array {@code buffer} starting at offset {@code count}. Blocks 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * until {@code count} bytes have been read, the end of the source stream is 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * detected or an exception is thrown. 556f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array in which to store the bytes read. 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the initial position in {@code buffer} to store the bytes 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from the source stream. 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of bytes to store in {@code buffer}. 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes read or -1 if the end of the source input 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream has been reached. 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IndexOutOfBoundsException 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code offset < 0} or {@code length < 0}, or if 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code offset + length} is greater than the length of 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code buffer}. 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from this stream. 572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code buffer} is {@code null}. 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int read(byte[] buffer, int offset, int length) throws IOException { 577b9cc455ed89df1a0cf4186c92b352c9649995d96Elliott Hughes Arrays.checkOffsetAndCount(buffer.length, offset, length); 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (length == 0) { 579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return 0; 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkReadPrimitiveTypes(); 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveData.read(buffer, offset, length); 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads and returns an array of raw bytes with primitive data. The array 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will have up to 255 bytes. The primitive data will be in the format 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * described by {@code DataOutputStream}. 589f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The primitive data read, as raw bytes 591f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the primitive data. 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] readBlockData() throws IOException { 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = new byte[input.readByte() & 0xff]; 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project input.readFully(result); 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads and returns an array of raw bytes with primitive data. The array 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will have more than 255 bytes. The primitive data will be in the format 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * described by {@code DataOutputStream}. 605f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The primitive data read, as raw bytes 607f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the primitive data. 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] readBlockDataLong() throws IOException { 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = new byte[input.readInt()]; 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project input.readFully(result); 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a boolean from the source stream. 619f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the boolean value read from the source stream. 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean readBoolean() throws IOException { 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readBoolean(); 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a byte (8 bit) from the source stream. 633f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the byte value read from the source stream. 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public byte readByte() throws IOException { 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readByte(); 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a character (16 bit) from the source stream. 647f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the char value read from the source stream. 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public char readChar() throws IOException { 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readChar(); 657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads and discards block data and objects until TC_ENDBLOCKDATA is found. 661f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the optional class 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * annotation. 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the class corresponding to the class descriptor could not 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void discardData() throws ClassNotFoundException, IOException { 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean resolve = mustResolve; 672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mustResolve = false; 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte tc = nextTC(); 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tc == TC_ENDBLOCKDATA) { 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mustResolve = resolve; 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; // End of annotation 678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readContent(tc); 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (true); 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a class descriptor (an {@code ObjectStreamClass}) from the 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * stream. 686f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the class descriptor read from the stream 688f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor. 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the class corresponding to the class descriptor could not 694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 696b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes private ObjectStreamClass readClassDesc() throws ClassNotFoundException, IOException { 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte tc = nextTC(); 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (tc) { 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_CLASSDESC: 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewClassDesc(false); 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_PROXYCLASSDESC: 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> proxyClass = readNewProxyClassDesc(); 703693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes ObjectStreamClass streamClass = ObjectStreamClass.lookup(proxyClass); 704693eacca9fa67ad79d1b35dbaad61c5ac1ac457cElliott Hughes streamClass.setLoadFields(ObjectStreamClass.NO_FIELDS); 705f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson registerObjectRead(streamClass, nextHandle(), false); 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkedSetSuperClassDesc(streamClass, readClassDesc()); 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return streamClass; 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_REFERENCE: 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (ObjectStreamClass) readCyclicReference(); 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_NULL: 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project default: 713b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw corruptStream(tc); 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 717b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes private StreamCorruptedException corruptStream(byte tc) throws StreamCorruptedException { 718b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new StreamCorruptedException("Wrong format: " + Integer.toHexString(tc & 0xff)); 719b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes } 720b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads the content of the receiver based on the previously read token 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code tc}. 724f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param tc 726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The token code for the next item in the stream 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the object read from the stream 728f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor. 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the class corresponding to the object being read could not 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readContent(byte tc) throws ClassNotFoundException, 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IOException { 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (tc) { 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_BLOCKDATA: 740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readBlockData(); 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_BLOCKDATALONG: 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readBlockDataLong(); 743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_CLASS: 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewClass(false); 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_CLASSDESC: 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewClassDesc(false); 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_ARRAY: 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewArray(false); 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_OBJECT: 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewObject(false); 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_STRING: 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewString(false); 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_LONGSTRING: 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewLongString(false); 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_REFERENCE: 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readCyclicReference(); 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_NULL: 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_EXCEPTION: 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Exception exc = readException(); 761b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new WriteAbortedException("Read an exception", exc); 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_RESET: 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetState(); 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project default: 766b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw corruptStream(tc); 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads the content of the receiver based on the previously read token 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code tc}. Primitive data content is considered an error. 773f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param unshared 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the object unshared 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the object read from the stream 777f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor. 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the class corresponding to the object being read could not 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readNonPrimitiveContent(boolean unshared) 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws ClassNotFoundException, IOException { 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkReadPrimitiveTypes(); 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (primitiveData.available() > 0) { 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project OptionalDataException e = new OptionalDataException(); 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.length = primitiveData.available(); 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project do { 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte tc = nextTC(); 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (tc) { 797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_CLASS: 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewClass(unshared); 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_CLASSDESC: 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewClassDesc(unshared); 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_ARRAY: 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewArray(unshared); 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_OBJECT: 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewObject(unshared); 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_STRING: 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewString(unshared); 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_LONGSTRING: 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readNewLongString(unshared); 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_ENUM: 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readEnum(unshared); 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_REFERENCE: 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (unshared) { 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readNewHandle(); 814b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidObjectException("Unshared read of back reference"); 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readCyclicReference(); 817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_NULL: 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_EXCEPTION: 820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Exception exc = readException(); 821b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new WriteAbortedException("Read an exception", exc); 822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_RESET: 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetState(); 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_ENDBLOCKDATA: // Can occur reading class annotation 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pushbackTC(); 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project OptionalDataException e = new OptionalDataException(); 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project e.eof = true; 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project default: 831b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw corruptStream(tc); 832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Only TC_RESET falls through 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } while (true); 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads the next item from the stream assuming it is a cyclic reference to 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an object previously read. Return the actual object previously read. 840f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the object previously read from the stream 842f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class 845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor. 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidObjectException 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the cyclic reference is not valid. 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 8496523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private Object readCyclicReference() throws InvalidObjectException, IOException { 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return registeredObjectRead(readNewHandle()); 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a double (64 bit) from the source stream. 855f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the double value read from the source stream. 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public double readDouble() throws IOException { 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readDouble(); 865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Read the next item assuming it is an exception. The exception is not a 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * regular instance in the object graph, but the exception instance that 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * happened (if any) when dumping the original object graph. The set of seen 871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * objects will be reset just before and just after loading this exception 872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object. 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * When exceptions are found normally in the object graph, they are loaded 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * as a regular object, and not by this method. In that case, the set of 876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "known objects" is not reset. 877f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the exception read 879f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the exception 882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object. 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class could not be found when reading the object graph 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for the exception 886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OptionalDataException 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If optional data could not be found when reading the 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exception graph 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws WriteAbortedException 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If another exception was caused when dumping this exception 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Exception readException() throws WriteAbortedException, 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project OptionalDataException, ClassNotFoundException, IOException { 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetSeenObjects(); 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Now we read the Throwable object that was saved 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // WARNING - the grammar says it is a Throwable, but the 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // WriteAbortedException constructor takes an Exception. So, we read an 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Exception from the stream 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Exception exc = (Exception) readObject(); 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We reset the receiver's state (the grammar has "reset" in normal 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // font) 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetSeenObjects(); 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return exc; 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a collection of field descriptors (name, type name, etc) for the 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class descriptor {@code cDesc} (an {@code ObjectStreamClass}) 912f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param cDesc 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The class descriptor (an {@code ObjectStreamClass}) 915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * for which to write field information 916f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the field 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptors. 920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class for one of the field types could not be found 922f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #readObject() 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void readFieldDescriptors(ObjectStreamClass cDesc) 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws ClassNotFoundException, IOException { 927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project short numFields = input.readShort(); 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamField[] fields = new ObjectStreamField[numFields]; 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We set it now, but each element will be inserted in the array further 931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // down 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cDesc.setLoadFields(fields); 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Check ObjectOutputStream.writeFieldDescriptors 935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (short i = 0; i < numFields; i++) { 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project char typecode = (char) input.readByte(); 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String fieldName = input.readUTF(); 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean isPrimType = ObjectStreamClass.isPrimitiveType(typecode); 939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String classSig; 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isPrimType) { 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project classSig = String.valueOf(typecode); 942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The spec says it is a UTF, but experience shows they dump 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // this String using writeObject (unlike the field name, which 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // is saved with writeUTF). 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // And if resolveObject is enabled, the classSig may be modified 947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // so that the original class descriptor cannot be read 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // properly, so it is disabled. 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean old = enableResolve; 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enableResolve = false; 952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project classSig = (String) readObject(); 953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project enableResolve = old; 955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 957f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 958f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson classSig = formatClassSig(classSig); 959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamField f = new ObjectStreamField(classSig, fieldName); 960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fields[i] = f; 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 964f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson /* 965f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Format the class signature for ObjectStreamField, for example, 966f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * "[L[Ljava.lang.String;;" is converted to "[Ljava.lang.String;" 967f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson */ 968f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson private static String formatClassSig(String classSig) { 969f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int start = 0; 970f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int end = classSig.length(); 971f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 972f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (end <= 0) { 973f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return classSig; 974f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 975f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 97603c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes while (classSig.startsWith("[L", start) 977f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson && classSig.charAt(end - 1) == ';') { 978f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start += 2; 979f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson end--; 980f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 981f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 982f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (start > 0) { 983f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson start -= 2; 984f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson end++; 985f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return classSig.substring(start, end); 986f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 987f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return classSig; 988f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 989f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads the persistent fields of the object that is currently being read 992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from the source stream. The values read are stored in a GetField object 993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * that provides access to the persistent fields. This GetField object is 994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * then returned. 995f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the GetField object from which persistent fields can be accessed 997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by name. 998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class of an object being deserialized can not be 1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * found. 1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from this stream. 1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NotActiveException 1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is currently not reading an object. 1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1006b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes public GetField readFields() throws IOException, ClassNotFoundException, NotActiveException { 1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (currentObject == null) { 1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NotActiveException(); 1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 101008d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes EmulatedFieldsForLoading result = new EmulatedFieldsForLoading(currentClass); 1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readFieldValues(result); 1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a collection of field values for the emulated fields 1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code emulatedFields} 1018f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param emulatedFields 1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an {@code EmulatedFieldsForLoading}, concrete subclass 1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of {@code GetField} 1022f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the field values. 1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidClassException 1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an incompatible type is being assigned to an emulated 1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field. 1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OptionalDataException 1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If optional data could not be found when reading the 1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exception graph 1031f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #readFields 1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #readObject() 1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void readFieldValues(EmulatedFieldsForLoading emulatedFields) 1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws OptionalDataException, InvalidClassException, IOException { 1037b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes EmulatedFields.ObjectSlot[] slots = emulatedFields.emulatedFields().slots(); 1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (ObjectSlot element : slots) { 1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element.defaulted = false; 1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> type = element.field.getType(); 1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (type == Integer.TYPE) { 10422543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readInt(); 1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Byte.TYPE) { 10442543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readByte(); 1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Character.TYPE) { 10462543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readChar(); 1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Short.TYPE) { 10482543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readShort(); 1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Boolean.TYPE) { 10502543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readBoolean(); 1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Long.TYPE) { 10522543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readLong(); 1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Float.TYPE) { 10542543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readFloat(); 1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (type == Double.TYPE) { 10562543351c360bdfe0046e819dedb069f3724d703aJesse Wilson element.fieldValue = input.readDouble(); 1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Either array or Object 1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element.fieldValue = readObject(); 1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (ClassNotFoundException cnf) { 1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // WARNING- Not sure this is the right thing to do. Write 1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // test case. 1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new InvalidClassException(cnf.toString()); 1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a collection of field values for the class descriptor 1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code classDesc} (an {@code ObjectStreamClass}). The 1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * values will be used to set instance fields in object {@code obj}. 1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is the default mechanism, when emulated fields (an 1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code GetField}) are not used. Actual values to load are stored 1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * directly into the object {@code obj}. 1077f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param obj 1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Instance in which the fields will be set. 1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param classDesc 1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A class descriptor (an {@code ObjectStreamClass}) 1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defining which fields should be loaded. 1083f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the field values. 1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidClassException 1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an incompatible type is being assigned to an emulated 1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field. 1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OptionalDataException 1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If optional data could not be found when reading the 1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * exception graph 1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class of an object being de-serialized can not be found 1094f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #readFields 1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #readObject() 1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1098b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes private void readFieldValues(Object obj, ObjectStreamClass classDesc) throws OptionalDataException, ClassNotFoundException, IOException { 1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Now we must read all fields and assign them to the receiver 1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamField[] fields = classDesc.getLoadFields(); 1101b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes fields = (fields == null) ? ObjectStreamClass.NO_FIELDS : fields; 1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> declaringClass = classDesc.forClass(); 1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (declaringClass == null && mustResolve) { 1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ClassNotFoundException(classDesc.getName()); 1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (ObjectStreamField fieldDesc : fields) { 1108b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes Field field = classDesc.getReflectionField(fieldDesc); 1109b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // We may not have been able to find the field, but we still need to read the value 1110b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // and do the other checking, so there's no null check on 'field' here. 1111b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes try { 11126c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes Class<?> type = fieldDesc.getTypeInternal(); 11136c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes if (type == Byte.TYPE) { 1114b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes byte b = input.readByte(); 1115b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1116b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setByte(obj, b); 1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 11186c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Character.TYPE) { 1119b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes char c = input.readChar(); 1120b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1121b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setChar(obj, c); 1122b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11236c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Double.TYPE) { 1124b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes double d = input.readDouble(); 1125b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1126b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setDouble(obj, d); 1127b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11286c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Float.TYPE) { 1129b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes float f = input.readFloat(); 1130b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1131b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setFloat(obj, f); 1132b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11336c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Integer.TYPE) { 1134b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes int i = input.readInt(); 1135b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1136b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setInt(obj, i); 1137b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11386c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Long.TYPE) { 1139b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes long j = input.readLong(); 1140b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1141b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setLong(obj, j); 1142b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11436c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Short.TYPE) { 1144b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes short s = input.readShort(); 1145b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1146b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setShort(obj, s); 1147b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11486c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else if (type == Boolean.TYPE) { 1149b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes boolean z = input.readBoolean(); 1150b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1151b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.setBoolean(obj, z); 1152b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 11536c9fda83af2a99ab25cf5ad0487c6d4c6f1e7cb1Elliott Hughes } else { 1154b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes String fieldName = fieldDesc.getName(); 1155b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes boolean setBack = false; 1156b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes ObjectStreamField localFieldDesc = classDesc.getField(fieldName); 1157b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (mustResolve && fieldDesc == null) { 1158b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes setBack = true; 1159b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes mustResolve = false; 1160b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 1161b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes boolean unshared = fieldDesc != null && fieldDesc.isUnshared(); 1162b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes Object toSet = unshared ? readUnshared() : readObject(); 1163b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (setBack) { 1164b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes mustResolve = true; 1165b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 1166b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (fieldDesc != null) { 1167b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (toSet != null) { 1168f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // BEGIN android-changed 1169b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // Get the field type from the local field rather than 1170b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // from the stream's supplied data. That's the field 1171b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // we'll be setting, so that's the one that needs to be 1172b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // validated. 1173b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes Class<?> fieldType = localFieldDesc.getTypeInternal(); 1174b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // END android-added 1175b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes Class<?> valueType = toSet.getClass(); 1176b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (!fieldType.isAssignableFrom(valueType)) { 1177b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes throw new ClassCastException(classDesc.getName() + "." + fieldName + " - " + fieldType + " not compatible with " + valueType); 1178b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 1179b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes if (field != null) { 1180b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes field.set(obj, toSet); 1181b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } 1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1185b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } catch (IllegalAccessException iae) { 1186b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes // ObjectStreamField should have called setAccessible(true). 1187b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes throw new AssertionError(iae); 1188b854a55df2475a4e9acc96c271cd88da7559f019Elliott Hughes } catch (NoSuchFieldError ignored) { 1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a float (32 bit) from the source stream. 1195f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the float value read from the source stream. 1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public float readFloat() throws IOException { 1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readFloat(); 1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 12080eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * Reads bytes from the source stream into the byte array {@code dst}. 12090eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * This method will block until {@code dst.length} bytes have been read. 1210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 12110eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * @param dst 1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the array in which to store the bytes read. 1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 12190eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes public void readFully(byte[] dst) throws IOException { 12200eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes primitiveTypes.readFully(dst); 1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 12240eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * Reads {@code byteCount} bytes from the source stream into the byte array {@code dst}. 1225f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 12260eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * @param dst 1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte array in which to store the bytes read. 1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 12290eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * the initial position in {@code dst} to store the bytes 1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read from the source stream. 12310eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * @param byteCount 12320eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes * the number of bytes to read. 1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 12390eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes public void readFully(byte[] dst, int offset, int byteCount) throws IOException { 12400eb70e31581a977afa5df3292d1c96e42e548821Elliott Hughes primitiveTypes.readFully(dst, offset, byteCount); 1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Walks the hierarchy of classes described by class descriptor 1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code classDesc} and reads the field values corresponding to 1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * fields declared by the corresponding class descriptor. The instance to 1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * store field values into is {@code object}. If the class 1248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (corresponding to class descriptor {@code classDesc}) defines 1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * private instance method {@code readObject} it will be used to load 1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * field values. 1251f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Instance into which stored field values loaded. 1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param classDesc 1255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A class descriptor (an {@code ObjectStreamClass}) 1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defining which fields should be loaded. 1257f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the field values in 1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the hierarchy. 1261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class for one of the field types could not be found 1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NotActiveException 1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@code defaultReadObject} is called from the wrong 1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * context. 1266f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #defaultReadObject 1268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #readObject() 1269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void readHierarchy(Object object, ObjectStreamClass classDesc) 1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, ClassNotFoundException, NotActiveException { 1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (object == null && mustResolve) { 1273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NotActiveException(); 1274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 127646241f2f67d7b90e20f3301861f807f330687821Elliott Hughes List<ObjectStreamClass> streamClassList = classDesc.getHierarchy(); 1277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (object == null) { 12782543351c360bdfe0046e819dedb069f3724d703aJesse Wilson for (ObjectStreamClass objectStreamClass : streamClassList) { 12792543351c360bdfe0046e819dedb069f3724d703aJesse Wilson readObjectForClass(null, objectStreamClass); 1280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 128208d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes List<Class<?>> superclasses = cachedSuperclasses.get(object.getClass()); 128308d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes if (superclasses == null) { 128408d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes superclasses = cacheSuperclassesFor(object.getClass()); 1285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 128608d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes 1287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int lastIndex = 0; 128808d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes for (int i = 0, end = superclasses.size(); i < end; ++i) { 128908d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes Class<?> superclass = superclasses.get(i); 12902543351c360bdfe0046e819dedb069f3724d703aJesse Wilson int index = findStreamSuperclass(superclass, streamClassList, lastIndex); 1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index == -1) { 12922543351c360bdfe0046e819dedb069f3724d703aJesse Wilson readObjectNoData(object, superclass, 12932543351c360bdfe0046e819dedb069f3724d703aJesse Wilson ObjectStreamClass.lookupStreamClass(superclass)); 1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int j = lastIndex; j <= index; j++) { 1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readObjectForClass(object, streamClassList.get(j)); 1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastIndex = index + 1; 1299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130408d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes private HashMap<Class<?>, List<Class<?>>> cachedSuperclasses = new HashMap<Class<?>, List<Class<?>>>(); 130508d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes 130608d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes private List<Class<?>> cacheSuperclassesFor(Class<?> c) { 130708d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes ArrayList<Class<?>> result = new ArrayList<Class<?>>(); 130808d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes Class<?> nextClass = c; 130908d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes while (nextClass != null) { 131008d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes Class<?> testClass = nextClass.getSuperclass(); 131108d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes if (testClass != null) { 131208d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes result.add(0, nextClass); 131308d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes } 131408d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes nextClass = testClass; 131508d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes } 131608d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes cachedSuperclasses.put(c, result); 131708d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes return result; 131808d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes } 131908d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes 132046241f2f67d7b90e20f3301861f807f330687821Elliott Hughes private int findStreamSuperclass(Class<?> cl, List<ObjectStreamClass> classList, int lastIndex) { 132108d5f1955b94e07e337c59b63a7051879fa3bbefElliott Hughes for (int i = lastIndex, end = classList.size(); i < end; i++) { 132246241f2f67d7b90e20f3301861f807f330687821Elliott Hughes ObjectStreamClass objCl = classList.get(i); 132346241f2f67d7b90e20f3301861f807f330687821Elliott Hughes String forName = objCl.forClass().getName(); 1324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (objCl.getName().equals(forName)) { 1326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cl.getName().equals(objCl.getName())) { 1327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 1328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // there was a class replacement 1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (cl.getName().equals(forName)) { 1332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return i; 1333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return -1; 1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1339f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson private void readObjectNoData(Object object, Class<?> cl, ObjectStreamClass classDesc) 1340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws ObjectStreamException { 1341f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (!classDesc.isSerializable()) { 1342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 1343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1344f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (classDesc.hasMethodReadObjectNoData()){ 1345f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson final Method readMethod = classDesc.getMethodReadObjectNoData(); 1346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 13472543351c360bdfe0046e819dedb069f3724d703aJesse Wilson readMethod.invoke(object); 1348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InvocationTargetException e) { 1349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Throwable ex = e.getTargetException(); 1350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ex instanceof RuntimeException) { 1351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (RuntimeException) ex; 1352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (ex instanceof Error) { 1353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (Error) ex; 1354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (ObjectStreamException) ex; 1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalAccessException e) { 1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException(e.toString()); 1358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1360f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 1361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void readObjectForClass(Object object, ObjectStreamClass classDesc) 1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, ClassNotFoundException, NotActiveException { 1365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Have to do this before calling defaultReadObject or anything that 1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // calls defaultReadObject 1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentObject = object; 1368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentClass = classDesc; 1369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 137032ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes boolean hadWriteMethod = (classDesc.getFlags() & SC_WRITE_METHOD) != 0; 1371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> targetClass = classDesc.forClass(); 1372f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 1373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final Method readMethod; 1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (targetClass == null || !mustResolve) { 1375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readMethod = null; 1376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1377f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson readMethod = classDesc.getMethodReadObject(); 1378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (readMethod != null) { 1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We have to be able to fetch its value, even if it is private 1382ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes readMethod.setAccessible(true); 1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 13842543351c360bdfe0046e819dedb069f3724d703aJesse Wilson readMethod.invoke(object, this); 1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (InvocationTargetException e) { 1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Throwable ex = e.getTargetException(); 1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (ex instanceof ClassNotFoundException) { 1388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (ClassNotFoundException) ex; 1389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (ex instanceof RuntimeException) { 1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (RuntimeException) ex; 1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (ex instanceof Error) { 1392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (Error) ex; 1393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw (IOException) ex; 1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalAccessException e) { 1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new RuntimeException(e.toString()); 1397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project defaultReadObject(); 1400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (hadWriteMethod) { 1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project discardData(); 1403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Cleanup, needs to run always so that we can later detect invalid 1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // calls to defaultReadObject 1407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentObject = null; // We did not set this, so we do not need to 1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // clean it 1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentClass = null; 1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads an integer (32 bit) from the source stream. 1415f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the integer value read from the source stream. 1417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 1418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 1419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 1420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int readInt() throws IOException { 1424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readInt(); 1425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1428f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Reads the next line from the source stream. Lines are terminated by 1429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code '\r'}, {@code '\n'}, {@code "\r\n"} or an {@code EOF}. 1430f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string read from the source stream. 1432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated Use {@link BufferedReader} 1435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Deprecated 1437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String readLine() throws IOException { 1438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readLine(); 1439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a long (64 bit) from the source stream. 1443f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the long value read from the source stream. 1445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 1446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 1447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 1448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public long readLong() throws IOException { 1452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readLong(); 1453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Read a new array from the receiver. It is assumed the array has not been 1457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read yet (not a cyclic reference). Return the array read. 1458f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param unshared 1460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the object unshared 1461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the array read 1462f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the array. 1465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class for one of the objects could not be found 1467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OptionalDataException 1468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If optional data could not be found when reading the array. 1469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readNewArray(boolean unshared) throws OptionalDataException, 1471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException, IOException { 1472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass classDesc = readClassDesc(); 1473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (classDesc == null) { 14752543351c360bdfe0046e819dedb069f3724d703aJesse Wilson throw missingClassDescriptor(); 1476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 14786523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes int newHandle = nextHandle(); 1479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Array size 1481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int size = input.readInt(); 1482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> arrayClass = classDesc.forClass(); 1483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> componentType = arrayClass.getComponentType(); 1484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object result = Array.newInstance(componentType, size); 1485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registerObjectRead(result, newHandle, unshared); 1487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Now we have code duplication just because Java is typed. We have to 1489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // read N elements and assign to array positions, but we must typecast 1490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the array first, and also call different methods depending on the 1491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // elements. 1492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (componentType.isPrimitive()) { 1493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (componentType == Integer.TYPE) { 1494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int[] intArray = (int[]) result; 1495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project intArray[i] = input.readInt(); 1497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Byte.TYPE) { 1499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] byteArray = (byte[]) result; 1500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project input.readFully(byteArray, 0, size); 1501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Character.TYPE) { 1502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project char[] charArray = (char[]) result; 1503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project charArray[i] = input.readChar(); 1505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Short.TYPE) { 1507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project short[] shortArray = (short[]) result; 1508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project shortArray[i] = input.readShort(); 1510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Boolean.TYPE) { 1512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean[] booleanArray = (boolean[]) result; 1513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project booleanArray[i] = input.readBoolean(); 1515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Long.TYPE) { 1517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long[] longArray = (long[]) result; 1518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project longArray[i] = input.readLong(); 1520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Float.TYPE) { 1522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project float[] floatArray = (float[]) result; 1523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project floatArray[i] = input.readFloat(); 1525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (componentType == Double.TYPE) { 1527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project double[] doubleArray = (double[]) result; 1528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project doubleArray[i] = input.readDouble(); 1530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1532b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new ClassNotFoundException("Wrong base type in " + classDesc.getName()); 1533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Array of Objects 1536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object[] objectArray = (Object[]) result; 1537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < size; i++) { 1538f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // TODO: This place is the opportunity for enhancement 1539f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // We can implement writing elements through fast-path, 1540f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // without setting up the context (see readObject()) for 1541f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // each element with public API 1542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project objectArray[i] = readObject(); 1543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (enableResolve) { 1546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = resolveObject(result); 1547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registerObjectRead(result, newHandle, false); 1548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a new class from the receiver. It is assumed the class has not been 1554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read yet (not a cyclic reference). Return the class read. 1555f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param unshared 1557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the object unshared 1558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The {@code java.lang.Class} read from the stream. 1559f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class. 1562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class for one of the objects could not be found 1564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1565b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes private Class<?> readNewClass(boolean unshared) throws ClassNotFoundException, IOException { 1566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass classDesc = readClassDesc(); 1567b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes if (classDesc == null) { 15682543351c360bdfe0046e819dedb069f3724d703aJesse Wilson throw missingClassDescriptor(); 1569b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes } 1570b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes Class<?> localClass = classDesc.forClass(); 1571b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes if (localClass != null) { 1572b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes registerObjectRead(localClass, nextHandle(), unshared); 1573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1574b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes return localClass; 1575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 1578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read class type for Enum, note there's difference between enum and normal 1579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * classes 1580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ObjectStreamClass readEnumDesc() throws IOException, 1582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException { 1583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte tc = nextTC(); 1584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (tc) { 1585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_CLASSDESC: 1586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readEnumDescInternal(); 1587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_REFERENCE: 1588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (ObjectStreamClass) readCyclicReference(); 1589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_NULL: 1590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 1591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project default: 1592b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw corruptStream(tc); 1593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 15966523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private ObjectStreamClass readEnumDescInternal() throws IOException, ClassNotFoundException { 1597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass classDesc; 1598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = input; 15996523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes int oldHandle = descriptorHandle; 1600f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson descriptorHandle = nextHandle(); 1601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project classDesc = readClassDescriptor(); 1602f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson registerObjectRead(classDesc, descriptorHandle, false); 1603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project descriptorHandle = oldHandle; 1604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 1605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project classDesc.setClass(resolveClass(classDesc)); 1606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Consume unread class annotation data and TC_ENDBLOCKDATA 1607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project discardData(); 1608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass superClass = readClassDesc(); 1609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkedSetSuperClassDesc(classDesc, superClass); 1610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Check SUIDs, note all SUID for Enum is 0L 1611b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes if (0L != classDesc.getSerialVersionUID() || 0L != superClass.getSerialVersionUID()) { 1612b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidClassException(superClass.getName(), 1613b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes "Incompatible class (SUID): " + superClass + " but expected " + superClass); 1614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte tc = nextTC(); 1616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // discard TC_ENDBLOCKDATA after classDesc if any 1617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (tc == TC_ENDBLOCKDATA) { 1618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // read next parent class. For enum, it may be null 1619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project superClass.setSuperclass(readClassDesc()); 1620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // not TC_ENDBLOCKDATA, push back for next read 1622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pushbackTC(); 1623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return classDesc; 1625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("unchecked")// For the Enum.valueOf call 1628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readEnum(boolean unshared) throws OptionalDataException, 1629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException, IOException { 1630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // read classdesc for Enum first 1631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass classDesc = readEnumDesc(); 16326523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes int newHandle = nextHandle(); 1633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // read name after class desc 1634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String name; 1635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte tc = nextTC(); 1636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project switch (tc) { 1637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_REFERENCE: 1638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (unshared) { 1639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readNewHandle(); 1640b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidObjectException("Unshared read of back reference"); 1641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name = (String) readCyclicReference(); 1643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 1644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project case TC_STRING: 1645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project name = (String) readNewString(unshared); 1646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; 1647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project default: 1648b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw corruptStream(tc); 1649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Enum<?> result = Enum.valueOf((Class) classDesc.forClass(), name); 1652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registerObjectRead(result, newHandle, unshared); 1653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a new class descriptor from the receiver. It is assumed the class 1659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor has not been read yet (not a cyclic reference). Return the 1660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * class descriptor read. 1661f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param unshared 1663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the object unshared 1664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The {@code ObjectStreamClass} read from the stream. 1665f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class 1668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor. 1669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class for one of the objects could not be found 1671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ObjectStreamClass readNewClassDesc(boolean unshared) 1673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws ClassNotFoundException, IOException { 1674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // So read...() methods can be used by 1675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // subclasses during readClassDescriptor() 1676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = input; 16776523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes int oldHandle = descriptorHandle; 1678f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson descriptorHandle = nextHandle(); 1679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass newClassDesc = readClassDescriptor(); 1680f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson registerObjectRead(newClassDesc, descriptorHandle, unshared); 1681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project descriptorHandle = oldHandle; 1682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 1683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We need to map classDesc to class. 1685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newClassDesc.setClass(resolveClass(newClassDesc)); 1687f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Check SUIDs & base name of the class 1688f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson verifyAndInit(newClassDesc); 1689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (ClassNotFoundException e) { 1690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (mustResolve) { 1691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw e; 1692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Just continue, the class may not be required 1693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Resolve the field signatures using the class loader of the 1697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // resolved class 1698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamField[] fields = newClassDesc.getLoadFields(); 1699b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes fields = (fields == null) ? ObjectStreamClass.NO_FIELDS : fields; 1700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassLoader loader = newClassDesc.forClass() == null ? callerClassLoader 1701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project : newClassDesc.forClass().getClassLoader(); 1702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (ObjectStreamField element : fields) { 1703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element.resolve(loader); 1704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Consume unread class annotation data and TC_ENDBLOCKDATA 1707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project discardData(); 1708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkedSetSuperClassDesc(newClassDesc, readClassDesc()); 1709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return newClassDesc; 1710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a new proxy class descriptor from the receiver. It is assumed the 1714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * proxy class descriptor has not been read yet (not a cyclic reference). 1715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Return the proxy class descriptor read. 1716f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return The {@code Class} read from the stream. 1718f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the class 1721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * descriptor. 1722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If a class for one of the objects could not be found 1724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Class<?> readNewProxyClassDesc() throws ClassNotFoundException, 1726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IOException { 1727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int count = input.readInt(); 1728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String[] interfaceNames = new String[count]; 1729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < count; i++) { 1730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project interfaceNames[i] = input.readUTF(); 1731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> proxy = resolveProxyClass(interfaceNames); 1733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Consume unread class annotation data and TC_ENDBLOCKDATA 1734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project discardData(); 1735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return proxy; 1736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a class descriptor from the source stream. 1740f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the class descriptor read from the source stream. 1742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a class for one of the objects cannot be found. 1744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 174703c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { 1748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass newClassDesc = new ObjectStreamClass(); 1749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String name = input.readUTF(); 1750f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (name.length() == 0) { 175103c0a8e681c776fdba0389ab8593282139afc6d6Elliott Hughes throw new IOException("The stream is corrupted"); 1752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newClassDesc.setName(name); 1754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newClassDesc.setSerialVersionUID(input.readLong()); 1755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project newClassDesc.setFlags(input.readByte()); 1756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1757f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson /* 1758f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * We must register the class descriptor before reading field 1759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * descriptors. If called outside of readObject, the descriptorHandle 17606523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes * might be unset. 1761f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson */ 17626523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes if (descriptorHandle == -1) { 17636523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes descriptorHandle = nextHandle(); 17646523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes } 1765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registerObjectRead(newClassDesc, descriptorHandle, false); 1766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readFieldDescriptors(newClassDesc); 1768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return newClassDesc; 1769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates the proxy class that implements the interfaces specified in 1773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code interfaceNames}. 1774f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param interfaceNames 1776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the interfaces used to create the proxy class. 1777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the proxy class. 1778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the proxy class or any of the specified interfaces cannot 1780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be created. 1781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#annotateProxyClass(Class) 1784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Class<?> resolveProxyClass(String[] interfaceNames) 1786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, ClassNotFoundException { 1787f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // TODO: This method is opportunity for performance enhancement 1788f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // We can cache the classloader and recently used interfaces. 1789f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // BEGIN android-changed 1790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // ClassLoader loader = VM.getNonBootstrapClassLoader(); 1791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassLoader loader = ClassLoader.getSystemClassLoader(); 1792f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // END android-changed 1793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?>[] interfaces = new Class<?>[interfaceNames.length]; 1794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < interfaceNames.length; i++) { 1795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project interfaces[i] = Class.forName(interfaceNames[i], false, loader); 1796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return Proxy.getProxyClass(loader, interfaces); 1799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 1800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new ClassNotFoundException(e.toString(), e); 1801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1804f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson private int readNewHandle() throws IOException { 1805f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return input.readInt(); 1806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1808f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson /** 1809f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Read a new object from the stream. It is assumed the object has not been 1810f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * loaded yet (not a cyclic reference). Return the object read. 1811f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1812f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * If the object implements <code>Externalizable</code> its 1813f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * <code>readExternal</code> is called. Otherwise, all fields described by 1814f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the class hierarchy are loaded. Each class can define how its declared 1815f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * instance fields are loaded by defining a private method 1816f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * <code>readObject</code> 1817f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1818f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @param unshared 1819f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * read the object unshared 1820f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @return the object read 1821f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1822f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws IOException 1823f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * If an IO exception happened when reading the object. 1824f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws OptionalDataException 1825f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * If optional data could not be found when reading the object 1826f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * graph 1827f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws ClassNotFoundException 1828f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * If a class for one of the objects could not be found 1829f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson */ 1830f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson private Object readNewObject(boolean unshared) 1831f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson throws OptionalDataException, ClassNotFoundException, IOException { 1832f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson ObjectStreamClass classDesc = readClassDesc(); 1833f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 1834f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (classDesc == null) { 1835b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw missingClassDescriptor(); 1836f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 1837f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 18386523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes int newHandle = nextHandle(); 1839f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson Class<?> objectClass = classDesc.forClass(); 184032ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes Object result = null; 184132ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes Object registeredResult = null; 1842f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (objectClass != null) { 1843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Now we know which class to instantiate and which constructor to 1844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // run. We are allowed to run the constructor. 18456523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes result = classDesc.newInstance(objectClass); 1846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registerObjectRead(result, newHandle, unshared); 1847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registeredResult = result; 1848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = null; 1850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 1853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This is how we know what to do in defaultReadObject. And it is 1854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // also used by defaultReadObject to check if it was called from an 1855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // invalid place. It also allows readExternal to call 1856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // defaultReadObject and have it work. 1857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentObject = result; 1858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentClass = classDesc; 1859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If Externalizable, just let the object read itself 186132ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes // Note that this value comes from the Stream, and in fact it could be 186232ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes // that the classes have been changed so that the info below now 186332ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes // conflicts with the newer class 186432ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes boolean wasExternalizable = (classDesc.getFlags() & SC_EXTERNALIZABLE) != 0; 1865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (wasExternalizable) { 186632ef29bcbfdce08d58ea72bd15a12a96065bdbb6Elliott Hughes boolean blockData = (classDesc.getFlags() & SC_BLOCK_DATA) != 0; 1867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!blockData) { 1868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = input; 1869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (mustResolve) { 1871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Externalizable extern = (Externalizable) result; 1872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project extern.readExternal(this); 1873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (blockData) { 1875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Similar to readHierarchy. Anything not read by 1876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // readExternal has to be consumed here 1877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project discardData(); 1878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 1880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If we got here, it is Serializable but not Externalizable. 1883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Walk the hierarchy reading each class' slots 1884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project readHierarchy(result, classDesc); 1885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 1887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Cleanup, needs to run always so that we can later detect invalid 1888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // calls to defaultReadObject 1889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentObject = null; 1890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project currentClass = null; 1891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (objectClass != null) { 1894f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 1895f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (classDesc.hasMethodReadResolve()){ 1896f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson Method methodReadResolve = classDesc.getMethodReadResolve(); 1897f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson try { 1898f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson result = methodReadResolve.invoke(result, (Object[]) null); 18992543351c360bdfe0046e819dedb069f3724d703aJesse Wilson } catch (IllegalAccessException ignored) { 1900f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } catch (InvocationTargetException ite) { 1901f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson Throwable target = ite.getTargetException(); 1902f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (target instanceof ObjectStreamException) { 1903f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson throw (ObjectStreamException) target; 1904f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } else if (target instanceof Error) { 1905f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson throw (Error) target; 1906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 1907f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson throw (RuntimeException) target; 1908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1910f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 1911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We get here either if class-based replacement was not needed or if it 1914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // was needed but produced the same object or if it could not be 1915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // computed. 1916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The object to return is the one we instantiated or a replacement for 1918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // it 1919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (result != null && enableResolve) { 1920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = resolveObject(result); 1921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (registeredResult != result) { 1923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project registerObjectRead(result, newHandle, unshared); 1924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1928b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes private InvalidClassException missingClassDescriptor() throws InvalidClassException { 1929b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidClassException("Read null attempting to read class descriptor for object"); 1930b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes } 1931b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes 1932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Read a string encoded in {@link DataInput modified UTF-8} from the 1934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * receiver. Return the string read. 1935f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param unshared 1937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the object unshared 1938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string just read. 1939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the String. 1941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readNewString(boolean unshared) throws IOException { 1943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object result = input.readUTF(); 1944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (enableResolve) { 1945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = resolveObject(result); 1946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1947d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes registerObjectRead(result, nextHandle(), unshared); 1948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Read a new String in UTF format from the receiver. Return the string 1954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read. 1955f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param unshared 1957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * read the object unshared 1958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string just read. 1959f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If an IO exception happened when reading the String. 1962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readNewLongString(boolean unshared) throws IOException { 1964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long length = input.readLong(); 1965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object result = input.decodeUTF((int) length); 1966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (enableResolve) { 1967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = resolveObject(result); 1968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1969f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson registerObjectRead(result, nextHandle(), unshared); 1970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 1972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads the next object from the source stream. 1976f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the object read from the source stream. 1978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class of one of the objects in the object graph cannot 1980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 1981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 1982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 1983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OptionalDataException 1984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if primitive data types were found instead of an object. 1985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#writeObject(Object) 1986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Object readObject() throws OptionalDataException, 1988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException, IOException { 1989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readObject(false); 1990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads the next unshared object from the source stream. 1994f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 1995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the new object read. 1996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 1997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class of one of the objects in the object graph cannot 1998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 1999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#writeUnshared 2002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Object readUnshared() throws IOException, ClassNotFoundException { 2004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readObject(true); 2005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Object readObject(boolean unshared) throws OptionalDataException, 2008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException, IOException { 2009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean restoreInput = (primitiveData == input); 2010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (restoreInput) { 2011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 2012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // This is the spec'ed behavior in JDK 1.2. Very bizarre way to allow 2015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // behavior overriding. 2016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (subclassOverridingImplementation && !unshared) { 2017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return readObjectOverride(); 2018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If we still had primitive types to read, should we discard them 2021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // (reset the primitiveTypes stream) or leave as is, so that attempts to 2022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // read primitive types won't read 'past data' ??? 2023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object result; 2024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 2025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We need this so we can tell when we are returning to the 2026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // original/outside caller 2027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (++nestedLevels == 1) { 2028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Remember the caller's class loader 2029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 2030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project callerClassLoader = getClosestUserClassLoader(); 2031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 2032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project result = readNonPrimitiveContent(unshared); 2035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (restoreInput) { 2036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = input; 2037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 2039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We need this so we can tell when we are returning to the 2040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // original/outside caller 2041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (--nestedLevels == 0) { 2042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We are going to return to the original caller, perform 2043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // cleanups. 2044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // No more need to remember the caller's class loader 2045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project callerClassLoader = null; 2046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Done reading this object. Is it time to return to the original 2050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // caller? If so we need to perform validations first. 2051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (nestedLevels == 0 && validations != null) { 2052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // We are going to return to the original caller. If validation is 2053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // enabled we need to run them now and then cleanup the validation 2054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // collection 2055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 2056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (InputValidationDesc element : validations) { 2057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project element.validator.validateObject(); 2058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } finally { 2060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Validations have to be renewed, since they are only called 2061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // from readObject 2062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project validations = null; 2063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 2066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-added 2069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final ClassLoader bootstrapLoader 2070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project = Object.class.getClassLoader(); 2071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static final ClassLoader systemLoader 2072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project = ClassLoader.getSystemClassLoader(); 2073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Searches up the call stack to find the closest user-defined class loader. 2076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 2077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a user-defined class loader or null if one isn't found 2078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static ClassLoader getClosestUserClassLoader() { 2080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?>[] stackClasses = VMStack.getClasses(-1, false); 2081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (Class<?> stackClass : stackClasses) { 2082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassLoader loader = stackClass.getClassLoader(); 2083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (loader != null && loader != bootstrapLoader 2084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && loader != systemLoader) { 2085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return loader; 2086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 2089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-added 2091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 20932543351c360bdfe0046e819dedb069f3724d703aJesse Wilson * Method to be overridden by subclasses to read the next object from the 2094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * source stream. 2095f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the object read from the source stream. 2097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 2098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class of one of the objects in the object graph cannot 2099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be found. 2100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws OptionalDataException 2103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if primitive data types were found instead of an object. 2104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#writeObjectOverride 2105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Object readObjectOverride() throws OptionalDataException, 2107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ClassNotFoundException, IOException { 2108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (input == null) { 2109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return null; 2110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Subclasses must override. 2112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(); 2113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a short (16 bit) from the source stream. 2117f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the short value read from the source stream. 2119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public short readShort() throws IOException { 2123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readShort(); 2124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads and validates the ObjectInputStream header from the source stream. 2128f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws StreamCorruptedException 2132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the source stream does not contain readable serialized 2133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * objects. 2134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void readStreamHeader() throws IOException, 2136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project StreamCorruptedException { 2137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (input.readShort() == STREAM_MAGIC 2138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && input.readShort() == STREAM_VERSION) { 2139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return; 2140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new StreamCorruptedException(); 2142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads an unsigned byte (8 bit) from the source stream. 2146f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the unsigned byte value read from the source stream packaged in 2148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an integer. 2149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 2150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 2151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 2152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int readUnsignedByte() throws IOException { 2156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readUnsignedByte(); 2157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads an unsigned short (16 bit) from the source stream. 2161f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the unsigned short value read from the source stream packaged in 2163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an integer. 2164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 2165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 2166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 2167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int readUnsignedShort() throws IOException { 2171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readUnsignedShort(); 2172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reads a string encoded in {@link DataInput modified UTF-8} from the 2176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * source stream. 2177f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the string encoded in {@link DataInput modified UTF-8} read from 2179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the source stream. 2180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws EOFException 2181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the end of the input is reached before the read 2182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * request can be satisfied. 2183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading from the source stream. 2185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String readUTF() throws IOException { 2187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return primitiveTypes.readUTF(); 2188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 21916523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes * Returns the previously-read object corresponding to the given serialization handle. 2192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidObjectException 21936523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes * If there is no previously-read object with this handle 2194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 21956523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private Object registeredObjectRead(int handle) throws InvalidObjectException { 21966523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes Object res = objectsRead.get(handle - ObjectStreamConstants.baseWireHandle); 2197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (res == UNSHARED_OBJ) { 2198b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidObjectException("Cannot read back reference to unshared object"); 2199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return res; 2201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 22046523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes * Associates a read object with the its serialization handle. 2205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 22066523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes private void registerObjectRead(Object obj, int handle, boolean unshared) throws IOException { 22076523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes if (unshared) { 22086523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes obj = UNSHARED_OBJ; 22096523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes } 22106523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes int index = handle - ObjectStreamConstants.baseWireHandle; 2211f24bce74a497ed281de23b7e997549725557b730Elliott Hughes int size = objectsRead.size(); 2212f24bce74a497ed281de23b7e997549725557b730Elliott Hughes // ObjectOutputStream sometimes wastes a handle. I've compared hex dumps of the RI 2213f24bce74a497ed281de23b7e997549725557b730Elliott Hughes // and it seems like that's a 'feature'. Look for calls to objectsWritten.put that 2214f24bce74a497ed281de23b7e997549725557b730Elliott Hughes // are guarded by !unshared tests. 2215f24bce74a497ed281de23b7e997549725557b730Elliott Hughes while (index > size) { 2216f24bce74a497ed281de23b7e997549725557b730Elliott Hughes objectsRead.add(null); 2217f24bce74a497ed281de23b7e997549725557b730Elliott Hughes ++size; 2218f24bce74a497ed281de23b7e997549725557b730Elliott Hughes } 2219f24bce74a497ed281de23b7e997549725557b730Elliott Hughes if (index == size) { 22206523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes objectsRead.add(obj); 22216523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes } else { 2222f24bce74a497ed281de23b7e997549725557b730Elliott Hughes objectsRead.set(index, obj); 22236523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes } 2224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Registers a callback for post-deserialization validation of objects. It 2228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allows to perform additional consistency checks before the {@code 2229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * readObject()} method of this class returns its result to the caller. This 2230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * method can only be called from within the {@code readObject()} method of 2231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a class that implements "special" deserialization rules. It can be called 2232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * multiple times. Validation callbacks are then done in order of decreasing 2233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * priority, defined by {@code priority}. 2234f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 2236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an object that can validate itself by receiving a callback. 2237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param priority 2238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the validator's priority. 2239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidObjectException 2240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code object} is {@code null}. 2241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NotActiveException 2242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this stream is currently not reading objects. In that 2243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * case, calling this method is not allowed. 2244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectInputValidation#validateObject() 2245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void registerValidation(ObjectInputValidation object, 2247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int priority) throws NotActiveException, InvalidObjectException { 2248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Validation can only be registered when inside readObject calls 2249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Object instanceBeingRead = this.currentObject; 2250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2251f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson if (instanceBeingRead == null && nestedLevels == 0) { 2252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NotActiveException(); 2253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (object == null) { 2255b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidObjectException("Callback object cannot be null"); 2256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // From now on it is just insertion in a SortedCollection. Since 2258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the Java class libraries don't provide that, we have to 2259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // implement it from scratch here. 2260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputValidationDesc desc = new InputValidationDesc(); 2261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project desc.validator = object; 2262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project desc.priority = priority; 2263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // No need for this, validateObject does not take a parameter 2264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // desc.toValidate = instanceBeingRead; 2265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (validations == null) { 2266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project validations = new InputValidationDesc[1]; 2267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project validations[0] = desc; 2268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 2269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int i = 0; 2270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (; i < validations.length; i++) { 2271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputValidationDesc validation = validations[i]; 2272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Sorted, higher priority first. 2273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (priority >= validation.priority) { 2274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project break; // Found the index where to insert 2275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project InputValidationDesc[] oldValidations = validations; 2278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int currentSize = oldValidations.length; 2279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project validations = new InputValidationDesc[currentSize + 1]; 2280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(oldValidations, 0, validations, 0, i); 2281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(oldValidations, i, validations, i + 1, currentSize 2282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project - i); 2283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project validations[i] = desc; 2284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reset the collection of objects already loaded by the receiver. 2289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void resetSeenObjects() { 22916523532145f06d8c208ed7a9374d3ab6d8132e66Elliott Hughes objectsRead = new ArrayList<Object>(); 22922543351c360bdfe0046e819dedb069f3724d703aJesse Wilson nextHandle = baseWireHandle; 2293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project primitiveData = emptyStream; 2294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Reset the receiver. The collection of objects already read by the 2298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * receiver is reset, and internal structures are also reset so that the 2299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * receiver knows it is in a fresh clean state. 2300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private void resetState() { 2302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project resetSeenObjects(); 2303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project hasPushbackTC = false; 2304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project pushbackTC = 0; 2305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // nestedLevels = 0; 2306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Loads the Java class corresponding to the class descriptor {@code 2310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * osClass} that has just been read from the source stream. 2311f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param osClass 2313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * an ObjectStreamClass read from the source stream. 2314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a Class corresponding to the descriptor {@code osClass}. 2315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws ClassNotFoundException 2316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the class for an object cannot be found. 2317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an I/O error occurs while creating the class. 2319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#annotateClass(Class) 2320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Class<?> resolveClass(ObjectStreamClass osClass) 2322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, ClassNotFoundException { 2323f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // fastpath: obtain cached value 2324f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson Class<?> cls = osClass.forClass(); 2325b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (cls == null) { 2326f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // slowpath: resolve the class 2327f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson String className = osClass.getName(); 2328f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 2329f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // if it is primitive class, for example, long.class 2330f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson cls = PRIMITIVE_CLASSES.get(className); 2331f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 2332b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (cls == null) { 2333f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // not primitive class 2334f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // Use the first non-null ClassLoader on the stack. If null, use 2335f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson // the system class loader 2336f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson cls = Class.forName(className, true, callerClassLoader); 2337f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson } 2338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return cls; 2340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Allows trusted subclasses to substitute the specified original {@code 2344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object} with a new object. Object substitution has to be activated first 2345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with calling {@code enableResolveObject(true)}. This implementation just 2346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * returns {@code object}. 2347f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param object 2349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the original object for which a replacement may be defined. 2350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the replacement object for {@code object}. 2351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if any I/O error occurs while creating the replacement 2353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * object. 2354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #enableResolveObject 2355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#enableReplaceObject 2356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see ObjectOutputStream#replaceObject 2357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Object resolveObject(Object object) throws IOException { 2359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // By default no object replacement. Subclasses can override 2360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return object; 2361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Skips {@code length} bytes on the source stream. This method should not 2365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be used to skip bytes at any arbitrary position, just when reading 2366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * primitive data types (int, char etc). 2367f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param length 2369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes to skip. 2370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes actually skipped. 2371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 2372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while skipping bytes on the source stream. 2373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 2374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the source stream is {@code null}. 2375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public int skipBytes(int length) throws IOException { 2377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // To be used with available. Ok to call if reading primitive buffer 2378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (input == null) { 2379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NullPointerException(); 2380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int offset = 0; 2383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project while (offset < length) { 2384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project checkReadPrimitiveTypes(); 2385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project long skipped = primitiveData.skip(length - offset); 2386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (skipped == 0) { 2387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return offset; 2388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project offset += (int) skipped; 2390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return length; 2392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2395f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * Verify if the SUID & the base name for descriptor 2396f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * <code>loadedStreamClass</code>matches 2397f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * the SUID & the base name of the corresponding loaded class and 2398f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * init private fields. 2399f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param loadedStreamClass 2401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * An ObjectStreamClass that was loaded from the stream. 2402f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 2403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidClassException 2404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the SUID of the stream class does not match the VM class 2405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 2406f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson private void verifyAndInit(ObjectStreamClass loadedStreamClass) 2407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidClassException { 2408f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 2409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<?> localClass = loadedStreamClass.forClass(); 2410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass localStreamClass = ObjectStreamClass 2411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .lookupStreamClass(localClass); 2412f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 2413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (loadedStreamClass.getSerialVersionUID() != localStreamClass 2414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getSerialVersionUID()) { 2415b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidClassException(loadedStreamClass.getName(), 2416b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes "Incompatible class (SUID): " + loadedStreamClass + 2417b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes " but expected " + localStreamClass); 2418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String loadedClassBaseName = getBaseName(loadedStreamClass.getName()); 2421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String localClassBaseName = getBaseName(localStreamClass.getName()); 2422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!loadedClassBaseName.equals(localClassBaseName)) { 2424b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes throw new InvalidClassException(loadedStreamClass.getName(), 2425b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes String.format("Incompatible class (base name): %s but expected %s", 2426b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes loadedClassBaseName, localClassBaseName)); 2427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2428f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson 2429f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson loadedStreamClass.initPrivateFields(localStreamClass); 2430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static String getBaseName(String fullName) { 2433f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson int k = fullName.lastIndexOf('.'); 2434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (k == -1 || k == (fullName.length() - 1)) { 2436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return fullName; 2437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return fullName.substring(k + 1); 2439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 2441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Avoid recursive defining. 2442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static void checkedSetSuperClassDesc(ObjectStreamClass desc, 2443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ObjectStreamClass superDesc) throws StreamCorruptedException { 2444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (desc.equals(superDesc)) { 2445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new StreamCorruptedException(); 2446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project desc.setSuperclass(superDesc); 2448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 2450