BackupHelperDispatcher.java revision 5cbbf5652a78902ac3382dc4a3583bc5b0351027
15f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato/*
25f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * Copyright (C) 2009 The Android Open Source Project
35f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato *
45f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
55f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * you may not use this file except in compliance with the License.
65f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * You may obtain a copy of the License at
75f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato *
85f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
95f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato *
105f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * Unless required by applicable law or agreed to in writing, software
115f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
125f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * See the License for the specific language governing permissions and
145f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato * limitations under the License.
155f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato */
165f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
175f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onoratopackage android.backup;
185f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
19d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratoimport android.os.ParcelFileDescriptor;
2083248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onoratoimport android.util.Log;
2183248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato
225f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onoratoimport java.io.IOException;
2306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onoratoimport java.util.TreeMap;
24d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onoratoimport java.util.Map;
255f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
265f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato/** @hide */
2706290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onoratopublic class BackupHelperDispatcher {
2806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    private static final String TAG = "BackupHelperDispatcher";
2983248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato
3006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    TreeMap<String,BackupHelper> mHelpers = new TreeMap<String,BackupHelper>();
3106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato
3206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    public BackupHelperDispatcher() {
3306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    }
345f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
3506290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    public void addHelper(String keyPrefix, BackupHelper helper) {
365f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        mHelpers.put(keyPrefix, helper);
375f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    }
385f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
3906290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    /** TODO: Make this save and restore the key prefix. */
4006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
4106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato             ParcelFileDescriptor newState) {
4206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        // Write out the state files -- mHelpers is a TreeMap, so the order is well defined.
4306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        for (Map.Entry<String,BackupHelper> entry: mHelpers.entrySet()) {
4406290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato            data.setKeyPrefix(entry.getKey());
4506290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato            entry.getValue().performBackup(oldState, data, newState);
4606290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        }
4706290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato    }
4806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato
495cbbf5652a78902ac3382dc4a3583bc5b0351027Christopher Tate    public void performRestore(BackupDataInput input, int appVersionCode,
505cbbf5652a78902ac3382dc4a3583bc5b0351027Christopher Tate            ParcelFileDescriptor newState)
5106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato            throws IOException {
5283248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato        boolean alreadyComplained = false;
5383248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato
545f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        BackupDataInputStream stream = new BackupDataInputStream(input);
555f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        while (input.readNextHeader()) {
5683248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato
575f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato            String rawKey = input.getKey();
585f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato            int pos = rawKey.indexOf(':');
595f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato            if (pos > 0) {
605f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato                String prefix = rawKey.substring(0, pos);
6106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato                BackupHelper helper = mHelpers.get(prefix);
625f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato                if (helper != null) {
635f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato                    stream.dataSize = input.getDataSize();
645f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato                    stream.key = rawKey.substring(pos+1);
65efd0fab04b96d7ab0c1d8bf3b79397c8621e31c5Joe Onorato                    helper.restoreEntity(stream);
6683248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                } else {
6783248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                    if (!alreadyComplained) {
6883248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                        Log.w(TAG, "Couldn't find helper for: '" + rawKey + "'");
6983248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                        alreadyComplained = true;
7083248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                    }
7183248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                }
7283248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato            } else {
7383248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                if (!alreadyComplained) {
7483248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                    Log.w(TAG, "Entity with no prefix: '" + rawKey + "'");
7583248c432ffe2e2a17abbc8e4960c26574b46bcaJoe Onorato                    alreadyComplained = true;
765f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato                }
775f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato            }
785f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato            input.skipEntityData(); // In case they didn't consume the data.
795f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato        }
80d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
8106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        // Write out the state files -- mHelpers is a TreeMap, so the order is well defined.
8206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato        for (BackupHelper helper: mHelpers.values()) {
8306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato            helper.writeRestoreSnapshot(newState);
84d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato        }
855f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    }
865f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato}
87d2d9ceb7305d593c1b767bbb05de0082a9af4109Joe Onorato
88