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