Loading cmds/backup/backup.cpp +5 −24 Original line number Diff line number Diff line Loading @@ -64,22 +64,14 @@ perform_list(const char* filename) } BackupDataReader reader(fd); bool done; int type; while (reader.ReadNextHeader(&type) == 0) { switch (type) { case BACKUP_HEADER_APP_V1: { String8 packageName; int cookie; err = reader.ReadAppHeader(&packageName, &cookie); if (err == 0) { printf("App header: %s 0x%08x (%d)\n", packageName.string(), cookie, cookie); } else { printf("Error reading app header\n"); } while (reader.ReadNextHeader(&done, &type) == 0) { if (done) { break; } switch (type) { case BACKUP_HEADER_ENTITY_V1: { String8 key; Loading @@ -92,17 +84,6 @@ perform_list(const char* filename) } break; } case BACKUP_FOOTER_APP_V1: { int cookie; err = reader.ReadAppFooter(&cookie); if (err == 0) { printf(" App footer: 0x%08x (%d)\n", cookie, cookie); } else { printf(" Error reading entity header\n"); } break; } default: { printf("Unknown chunk type: 0x%08x\n", type); Loading core/java/android/backup/BackupDataInput.java +17 −3 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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); } core/java/android/backup/BackupDataInputStream.java 0 → 100644 +61 −0 Original line number Diff line number Diff line /* * 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; } } core/java/android/backup/RestoreHelper.java +9 −1 Original line number Diff line number Diff line Loading @@ -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); } core/java/android/backup/RestoreHelperDistributor.java→core/java/android/backup/RestoreHelperDispatcher.java +20 −1 Original line number Diff line number Diff line Loading @@ -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. } } } Loading
cmds/backup/backup.cpp +5 −24 Original line number Diff line number Diff line Loading @@ -64,22 +64,14 @@ perform_list(const char* filename) } BackupDataReader reader(fd); bool done; int type; while (reader.ReadNextHeader(&type) == 0) { switch (type) { case BACKUP_HEADER_APP_V1: { String8 packageName; int cookie; err = reader.ReadAppHeader(&packageName, &cookie); if (err == 0) { printf("App header: %s 0x%08x (%d)\n", packageName.string(), cookie, cookie); } else { printf("Error reading app header\n"); } while (reader.ReadNextHeader(&done, &type) == 0) { if (done) { break; } switch (type) { case BACKUP_HEADER_ENTITY_V1: { String8 key; Loading @@ -92,17 +84,6 @@ perform_list(const char* filename) } break; } case BACKUP_FOOTER_APP_V1: { int cookie; err = reader.ReadAppFooter(&cookie); if (err == 0) { printf(" App footer: 0x%08x (%d)\n", cookie, cookie); } else { printf(" Error reading entity header\n"); } break; } default: { printf("Unknown chunk type: 0x%08x\n", type); Loading
core/java/android/backup/BackupDataInput.java +17 −3 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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); }
core/java/android/backup/BackupDataInputStream.java 0 → 100644 +61 −0 Original line number Diff line number Diff line /* * 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; } }
core/java/android/backup/RestoreHelper.java +9 −1 Original line number Diff line number Diff line Loading @@ -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); }
core/java/android/backup/RestoreHelperDistributor.java→core/java/android/backup/RestoreHelperDispatcher.java +20 −1 Original line number Diff line number Diff line Loading @@ -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. } } }