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 | |
| 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')
| -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 | ||||
| -rw-r--r-- | core/java/com/android/internal/backup/LocalTransport.java | 2 | ||||
| -rw-r--r-- | core/jni/android_backup_BackupDataInput.cpp | 47 |
6 files changed, 127 insertions, 34 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. + } + } } diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java index 5da0883..123c072 100644 --- a/core/java/com/android/internal/backup/LocalTransport.java +++ b/core/java/com/android/internal/backup/LocalTransport.java @@ -84,7 +84,7 @@ public class LocalTransport extends IBackupTransport.Stub { bufSize = dataSize; buf = new byte[bufSize]; } - changeSet.readEntityData(buf, dataSize); + changeSet.readEntityData(buf, 0, dataSize); if (DEBUG) Log.v(TAG, " + data size " + dataSize); File entityFile = new File(packageDir, key); diff --git a/core/jni/android_backup_BackupDataInput.cpp b/core/jni/android_backup_BackupDataInput.cpp index 5b2fb73..cf8a8e8 100644 --- a/core/jni/android_backup_BackupDataInput.cpp +++ b/core/jni/android_backup_BackupDataInput.cpp @@ -55,18 +55,13 @@ static jint readNextHeader_native(JNIEnv* env, jobject clazz, int r, jobject entity) { int err; + bool done; BackupDataReader* reader = (BackupDataReader*)r; - err = reader->Status(); - if (err != 0) { - return err < 0 ? err : -1; - } - int type = 0; - err = reader->ReadNextHeader(&type); - if (err == EIO) { - // Clean EOF with no footer block; just claim we're done + err = reader->ReadNextHeader(&done, &type); + if (done) { return 1; } @@ -75,24 +70,12 @@ readNextHeader_native(JNIEnv* env, jobject clazz, int r, jobject entity) } switch (type) { - case BACKUP_HEADER_APP_V1: - { - String8 packageName; - int cookie; - err = reader->ReadAppHeader(&packageName, &cookie); - if (err != 0) { - LOGD("ReadAppHeader() returned %d; aborting", err); - return err < 0 ? err : -1; - } - break; - } case BACKUP_HEADER_ENTITY_V1: { String8 key; size_t dataSize; err = reader->ReadEntityHeader(&key, &dataSize); if (err != 0) { - LOGD("ReadEntityHeader(); aborting", err); return err < 0 ? err : -1; } // TODO: Set the fields in the entity object @@ -101,10 +84,6 @@ readNextHeader_native(JNIEnv* env, jobject clazz, int r, jobject entity) env->SetIntField(entity, s_dataSizeField, dataSize); return 0; } - case BACKUP_FOOTER_APP_V1: - { - break; - } default: LOGD("Unknown header type: 0x%08x\n", type); return -1; @@ -115,12 +94,12 @@ readNextHeader_native(JNIEnv* env, jobject clazz, int r, jobject entity) } static jint -readEntityData_native(JNIEnv* env, jobject clazz, int r, jbyteArray data, int size) +readEntityData_native(JNIEnv* env, jobject clazz, int r, jbyteArray data, int offset, int size) { int err; BackupDataReader* reader = (BackupDataReader*)r; - if (env->GetArrayLength(data) < size) { + if (env->GetArrayLength(data) < (size+offset)) { // size mismatch return -1; } @@ -130,19 +109,31 @@ readEntityData_native(JNIEnv* env, jobject clazz, int r, jbyteArray data, int si return -2; } - err = reader->ReadEntityData(dataBytes, size); + err = reader->ReadEntityData(dataBytes+offset, size); env->ReleaseByteArrayElements(data, dataBytes, 0); return err; } +static jint +skipEntityData_native(JNIEnv* env, jobject clazz, int r) +{ + int err; + BackupDataReader* reader = (BackupDataReader*)r; + + err = reader->SkipEntityData(); + + return err; +} + static const JNINativeMethod g_methods[] = { { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native }, { "dtor", "(I)V", (void*)dtor_native }, { "readNextHeader_native", "(ILandroid/backup/BackupDataInput$EntityHeader;)I", (void*)readNextHeader_native }, - { "readEntityData_native", "(I[BI)I", (void*)readEntityData_native }, + { "readEntityData_native", "(I[BII)I", (void*)readEntityData_native }, + { "skipEntityData_native", "(I)I", (void*)skipEntityData_native }, }; int register_android_backup_BackupDataInput(JNIEnv* env) |
