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