summaryrefslogtreecommitdiffstats
path: root/core/java/android
diff options
context:
space:
mode:
authorJoe Onorato <joeo@android.com>2009-06-16 16:31:35 -0400
committerJoe Onorato <joeo@android.com>2009-06-16 18:46:50 -0700
commit5f15d151b5101fadfe6cba1e8f4aa6367e8c603e (patch)
tree3a94295ffc2935c7ca1550c01a6e793766bf415f /core/java/android
parentaa088447baadd2e0bbcfd18cc529645610c13ddc (diff)
downloadframeworks_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.java20
-rw-r--r--core/java/android/backup/BackupDataInputStream.java61
-rw-r--r--core/java/android/backup/RestoreHelper.java10
-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.
+ }
+ }
}