1b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey/* 2b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * Copyright (C) 2013 The Android Open Source Project 3b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * 4b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 5b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * you may not use this file except in compliance with the License. 6b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * You may obtain a copy of the License at 7b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * 8b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 9b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * 10b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 11b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 12b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * See the License for the specific language governing permissions and 14b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey * limitations under the License. 15b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey */ 16b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 17b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeypackage com.android.documentsui.model; 18b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 1958efce36cd1b26006e08ddd696292bf06fc34c81Steve McKayimport static com.android.documentsui.Shared.TAG; 20b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 21b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport android.os.BadParcelableException; 22b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport android.os.Parcel; 23b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport android.util.Log; 24b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 25b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport java.io.ByteArrayInputStream; 26b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport java.io.ByteArrayOutputStream; 27b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport java.io.DataInputStream; 28b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport java.io.DataOutputStream; 29b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeyimport java.io.IOException; 30b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 31b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkeypublic class DurableUtils { 32b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static <D extends Durable> byte[] writeToArray(D d) throws IOException { 33b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final ByteArrayOutputStream out = new ByteArrayOutputStream(); 34b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey d.write(new DataOutputStream(out)); 35b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return out.toByteArray(); 36b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 37b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 38b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static <D extends Durable> D readFromArray(byte[] data, D d) throws IOException { 396a20e574116af1072782c1e87cb03eb33f05ec50Jeff Sharkey if (data == null) throw new IOException("Missing data"); 40b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey final ByteArrayInputStream in = new ByteArrayInputStream(data); 41b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey d.reset(); 42b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey try { 43b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey d.read(new DataInputStream(in)); 44b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } catch (IOException e) { 45b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey d.reset(); 46b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey throw e; 47b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 48b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return d; 49b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 50b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 51b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static <D extends Durable> byte[] writeToArrayOrNull(D d) { 52b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey try { 53b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return writeToArray(d); 54b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } catch (IOException e) { 55b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey Log.w(TAG, "Failed to write", e); 56b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return null; 57b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 58b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 59b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 60b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static <D extends Durable> D readFromArrayOrNull(byte[] data, D d) { 61b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey try { 62b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return readFromArray(data, d); 63b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } catch (IOException e) { 64b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey Log.w(TAG, "Failed to read", e); 65b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return null; 66b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 67b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 68b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 69b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static <D extends Durable> void writeToParcel(Parcel parcel, D d) { 70b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey try { 71b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey parcel.writeByteArray(writeToArray(d)); 72b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } catch (IOException e) { 73b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey throw new BadParcelableException(e); 74b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 75b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 76b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 77b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static <D extends Durable> D readFromParcel(Parcel parcel, D d) { 78b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey try { 79b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return readFromArray(parcel.createByteArray(), d); 80b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } catch (IOException e) { 81b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey throw new BadParcelableException(e); 82b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 83b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 84b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 85b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static void writeNullableString(DataOutputStream out, String value) throws IOException { 86b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (value != null) { 87b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.write(1); 88b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.writeUTF(value); 89b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else { 90b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey out.write(0); 91b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 92b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 93b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey 94b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey public static String readNullableString(DataInputStream in) throws IOException { 95b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey if (in.read() != 0) { 96b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return in.readUTF(); 97b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } else { 98b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey return null; 99b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 100b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey } 101b51331116eb2ebbc41aaf69142916f9af6dffdd5Jeff Sharkey} 102