diff options
| author | Joe Onorato <joeo@android.com> | 2009-06-16 16:31:35 -0400 |
|---|---|---|
| committer | Joe Onorato <joeo@android.com> | 2009-06-16 18:46:50 -0700 |
| commit | 5f15d151b5101fadfe6cba1e8f4aa6367e8c603e (patch) | |
| tree | 3a94295ffc2935c7ca1550c01a6e793766bf415f /core/java/android | |
| parent | aa088447baadd2e0bbcfd18cc529645610c13ddc (diff) | |
| download | frameworks_base-5f15d151b5101fadfe6cba1e8f4aa6367e8c603e.zip frameworks_base-5f15d151b5101fadfe6cba1e8f4aa6367e8c603e.tar.gz frameworks_base-5f15d151b5101fadfe6cba1e8f4aa6367e8c603e.tar.bz2 | |
checkpoint BackupDatAInput / RestoreHelper
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/backup/BackupDataInput.java | 20 | ||||
| -rw-r--r-- | core/java/android/backup/BackupDataInputStream.java | 61 | ||||
| -rw-r--r-- | core/java/android/backup/RestoreHelper.java | 10 | ||||
| -rw-r--r-- | core/java/android/backup/RestoreHelperDispatcher.java (renamed from core/java/android/backup/RestoreHelperDistributor.java) | 21 |
4 files changed, 107 insertions, 5 deletions
diff --git a/core/java/android/backup/BackupDataInput.java b/core/java/android/backup/BackupDataInput.java index 609dd90..69c206c 100644 --- a/core/java/android/backup/BackupDataInput.java +++ b/core/java/android/backup/BackupDataInput.java @@ -82,9 +82,9 @@ public class BackupDataInput { } } - public int readEntityData(byte[] data, int size) throws IOException { + public int readEntityData(byte[] data, int offset, int size) throws IOException { if (mHeaderReady) { - int result = readEntityData_native(mBackupReader, data, size); + int result = readEntityData_native(mBackupReader, data, offset, size); if (result >= 0) { return result; } else { @@ -95,9 +95,23 @@ public class BackupDataInput { } } + public void skipEntityData() throws IOException { + if (mHeaderReady) { + int result = skipEntityData_native(mBackupReader); + if (result >= 0) { + return; + } else { + throw new IOException("result=0x" + Integer.toHexString(result)); + } + } else { + throw new IllegalStateException("mHeaderReady=false"); + } + } + private native static int ctor(FileDescriptor fd); private native static void dtor(int mBackupReader); private native int readNextHeader_native(int mBackupReader, EntityHeader entity); - private native int readEntityData_native(int mBackupReader, byte[] data, int size); + private native int readEntityData_native(int mBackupReader, byte[] data, int offset, int size); + private native int skipEntityData_native(int mBackupReader); } diff --git a/core/java/android/backup/BackupDataInputStream.java b/core/java/android/backup/BackupDataInputStream.java new file mode 100644 index 0000000..52b1675 --- /dev/null +++ b/core/java/android/backup/BackupDataInputStream.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.backup; + +import java.io.InputStream; +import java.io.IOException; + +/** @hide */ +public class BackupDataInputStream extends InputStream { + + String key; + int dataSize; + + BackupDataInput mData; + byte[] mOneByte; + + BackupDataInputStream(BackupDataInput data) { + mData = data; + } + + public int read() throws IOException { + byte[] one = mOneByte; + if (mOneByte == null) { + one = mOneByte = new byte[1]; + } + mData.readEntityData(one, 0, 1); + return one[0]; + } + + public int read(byte[] b, int offset, int size) throws IOException { + return mData.readEntityData(b, offset, size); + } + + public int read(byte[] b) throws IOException { + return mData.readEntityData(b, 0, b.length); + } + + public String getKey() { + return this.key; + } + + public int size() { + return this.dataSize; + } +} + + diff --git a/core/java/android/backup/RestoreHelper.java b/core/java/android/backup/RestoreHelper.java index ebd9906..ee8bedd 100644 --- a/core/java/android/backup/RestoreHelper.java +++ b/core/java/android/backup/RestoreHelper.java @@ -16,8 +16,16 @@ package android.backup; +import java.io.InputStream; + /** @hide */ public interface RestoreHelper { - public void performRestore(); + /** + * Called by RestoreHelperDispatcher to dispatch one entity of data. + * <p class=note> + * Do not close the <code>data</code> stream. Do not read more than + * <code>dataSize</code> bytes from <code>data</code>. + */ + public void performRestore(BackupDataInputStream data); } diff --git a/core/java/android/backup/RestoreHelperDistributor.java b/core/java/android/backup/RestoreHelperDispatcher.java index 555ca79..cbfefdc 100644 --- a/core/java/android/backup/RestoreHelperDistributor.java +++ b/core/java/android/backup/RestoreHelperDispatcher.java @@ -16,13 +16,32 @@ package android.backup; +import java.io.IOException; import java.util.HashMap; /** @hide */ -public class RestoreHelperDistributor { +public class RestoreHelperDispatcher { HashMap<String,RestoreHelper> mHelpers; public void addHelper(String keyPrefix, RestoreHelper helper) { mHelpers.put(keyPrefix, helper); } + + public void dispatch(BackupDataInput input) throws IOException { + BackupDataInputStream stream = new BackupDataInputStream(input); + while (input.readNextHeader()) { + String rawKey = input.getKey(); + int pos = rawKey.indexOf(':'); + if (pos > 0) { + String prefix = rawKey.substring(0, pos); + RestoreHelper helper = mHelpers.get(prefix); + if (helper != null) { + stream.dataSize = input.getDataSize(); + stream.key = rawKey.substring(pos+1); + helper.performRestore(stream); + } + } + input.skipEntityData(); // In case they didn't consume the data. + } + } } |
