Loading core/java/android/app/FullBackupAgent.java +2 −3 Original line number Diff line number Diff line Loading @@ -47,12 +47,11 @@ public class FullBackupAgent extends BackupAgent { } // That's the file set; now back it all up FileBackupHelper.performBackup(this, oldState, data, newState, (String[]) allFiles.toArray()); FileBackupHelper helper = new FileBackupHelper(this); helper.performBackup(oldState, data, newState, (String[])allFiles.toArray()); } @Override public void onRestore(ParcelFileDescriptor data, ParcelFileDescriptor newState) { } } core/java/android/backup/BackupDataInput.java 0 → 100644 +103 −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 android.content.Context; import java.io.FileDescriptor; import java.io.IOException; /** @hide */ public class BackupDataInput { int mBackupReader; private EntityHeader mHeader = new EntityHeader(); private boolean mHeaderReady; private static class EntityHeader { String key; int dataSize; } public BackupDataInput(FileDescriptor fd) { if (fd == null) throw new NullPointerException(); mBackupReader = ctor(fd); if (mBackupReader == 0) { throw new RuntimeException("Native initialization failed with fd=" + fd); } } protected void finalize() throws Throwable { try { dtor(mBackupReader); } finally { super.finalize(); } } public boolean readNextHeader() throws IOException { int result = readNextHeader_native(mBackupReader, mHeader); if (result == 0) { // read successfully mHeaderReady = true; return true; } else if (result > 0) { // done mHeaderReady = false; return false; } else { // error mHeaderReady = false; throw new IOException("result=0x" + Integer.toHexString(result)); } } public String getKey() { if (mHeaderReady) { return mHeader.key; } else { throw new IllegalStateException("mHeaderReady=false"); } } public int getDataSize() { if (mHeaderReady) { return mHeader.dataSize; } else { throw new IllegalStateException("mHeaderReady=false"); } } public int readEntityData(byte[] data, int size) throws IOException { if (mHeaderReady) { int result = readEntityData_native(mBackupReader, data, size); if (result >= 0) { return result; } 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); } core/java/android/backup/BackupDataOutput.java +22 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.backup; import android.content.Context; import java.io.FileDescriptor; import java.io.IOException; /** @hide */ public class BackupDataOutput { Loading @@ -37,6 +38,24 @@ public class BackupDataOutput { } } public int writeEntityHeader(String key, int dataSize) throws IOException { int result = writeEntityHeader_native(mBackupWriter, key, dataSize); if (result >= 0) { return result; } else { throw new IOException("result=0x" + Integer.toHexString(result)); } } public int writeEntityData(byte[] data, int size) throws IOException { int result = writeEntityData_native(mBackupWriter, data, size); if (result >= 0) { return result; } else { throw new IOException("result=0x" + Integer.toHexString(result)); } } protected void finalize() throws Throwable { try { dtor(mBackupWriter); Loading @@ -47,5 +66,8 @@ public class BackupDataOutput { private native static int ctor(FileDescriptor fd); private native static void dtor(int mBackupWriter); private native static int writeEntityHeader_native(int mBackupWriter, String key, int dataSize); private native static int writeEntityData_native(int mBackupWriter, byte[] data, int size); } core/java/android/backup/FileBackupHelper.java +39 −4 Original line number Diff line number Diff line Loading @@ -27,21 +27,56 @@ import java.io.FileDescriptor; public class FileBackupHelper { private static final String TAG = "FileBackupHelper"; Context mContext; String mKeyPrefix; public FileBackupHelper(Context context) { mContext = context; } public FileBackupHelper(Context context, String keyPrefix) { mContext = context; mKeyPrefix = keyPrefix; } /** * Based on oldState, determine which of the files from the application's data directory * need to be backed up, write them to the data stream, and fill in newState with the * state as it exists now. */ public static void performBackup(Context context, ParcelFileDescriptor oldState, BackupDataOutput data, public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState, String[] files) { File base = context.getFilesDir(); // file names File base = mContext.getFilesDir(); final int N = files.length; String[] fullPaths = new String[N]; for (int i=0; i<N; i++) { fullPaths[i] = (new File(base, files[i])).getAbsolutePath(); } performBackup_checked(oldState, data, newState, fullPaths, files); // keys String[] keys = makeKeys(mKeyPrefix, files); // go performBackup_checked(oldState, data, newState, fullPaths, keys); } /** * If keyPrefix is not null, prepend it to each of the strings in <code>original</code>; * otherwise, return original. */ static String[] makeKeys(String keyPrefix, String[] original) { if (keyPrefix != null) { String[] keys; final int N = original.length; keys = new String[N]; for (int i=0; i<N; i++) { keys[i] = keyPrefix + ':' + original[i]; } return keys; } else { return original; } } /** Loading core/java/android/backup/RestoreHelper.java 0 → 100644 +23 −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; /** @hide */ public interface RestoreHelper { public void performRestore(); } Loading
core/java/android/app/FullBackupAgent.java +2 −3 Original line number Diff line number Diff line Loading @@ -47,12 +47,11 @@ public class FullBackupAgent extends BackupAgent { } // That's the file set; now back it all up FileBackupHelper.performBackup(this, oldState, data, newState, (String[]) allFiles.toArray()); FileBackupHelper helper = new FileBackupHelper(this); helper.performBackup(oldState, data, newState, (String[])allFiles.toArray()); } @Override public void onRestore(ParcelFileDescriptor data, ParcelFileDescriptor newState) { } }
core/java/android/backup/BackupDataInput.java 0 → 100644 +103 −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 android.content.Context; import java.io.FileDescriptor; import java.io.IOException; /** @hide */ public class BackupDataInput { int mBackupReader; private EntityHeader mHeader = new EntityHeader(); private boolean mHeaderReady; private static class EntityHeader { String key; int dataSize; } public BackupDataInput(FileDescriptor fd) { if (fd == null) throw new NullPointerException(); mBackupReader = ctor(fd); if (mBackupReader == 0) { throw new RuntimeException("Native initialization failed with fd=" + fd); } } protected void finalize() throws Throwable { try { dtor(mBackupReader); } finally { super.finalize(); } } public boolean readNextHeader() throws IOException { int result = readNextHeader_native(mBackupReader, mHeader); if (result == 0) { // read successfully mHeaderReady = true; return true; } else if (result > 0) { // done mHeaderReady = false; return false; } else { // error mHeaderReady = false; throw new IOException("result=0x" + Integer.toHexString(result)); } } public String getKey() { if (mHeaderReady) { return mHeader.key; } else { throw new IllegalStateException("mHeaderReady=false"); } } public int getDataSize() { if (mHeaderReady) { return mHeader.dataSize; } else { throw new IllegalStateException("mHeaderReady=false"); } } public int readEntityData(byte[] data, int size) throws IOException { if (mHeaderReady) { int result = readEntityData_native(mBackupReader, data, size); if (result >= 0) { return result; } 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); }
core/java/android/backup/BackupDataOutput.java +22 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package android.backup; import android.content.Context; import java.io.FileDescriptor; import java.io.IOException; /** @hide */ public class BackupDataOutput { Loading @@ -37,6 +38,24 @@ public class BackupDataOutput { } } public int writeEntityHeader(String key, int dataSize) throws IOException { int result = writeEntityHeader_native(mBackupWriter, key, dataSize); if (result >= 0) { return result; } else { throw new IOException("result=0x" + Integer.toHexString(result)); } } public int writeEntityData(byte[] data, int size) throws IOException { int result = writeEntityData_native(mBackupWriter, data, size); if (result >= 0) { return result; } else { throw new IOException("result=0x" + Integer.toHexString(result)); } } protected void finalize() throws Throwable { try { dtor(mBackupWriter); Loading @@ -47,5 +66,8 @@ public class BackupDataOutput { private native static int ctor(FileDescriptor fd); private native static void dtor(int mBackupWriter); private native static int writeEntityHeader_native(int mBackupWriter, String key, int dataSize); private native static int writeEntityData_native(int mBackupWriter, byte[] data, int size); }
core/java/android/backup/FileBackupHelper.java +39 −4 Original line number Diff line number Diff line Loading @@ -27,21 +27,56 @@ import java.io.FileDescriptor; public class FileBackupHelper { private static final String TAG = "FileBackupHelper"; Context mContext; String mKeyPrefix; public FileBackupHelper(Context context) { mContext = context; } public FileBackupHelper(Context context, String keyPrefix) { mContext = context; mKeyPrefix = keyPrefix; } /** * Based on oldState, determine which of the files from the application's data directory * need to be backed up, write them to the data stream, and fill in newState with the * state as it exists now. */ public static void performBackup(Context context, ParcelFileDescriptor oldState, BackupDataOutput data, public void performBackup(ParcelFileDescriptor oldState, BackupDataOutput data, ParcelFileDescriptor newState, String[] files) { File base = context.getFilesDir(); // file names File base = mContext.getFilesDir(); final int N = files.length; String[] fullPaths = new String[N]; for (int i=0; i<N; i++) { fullPaths[i] = (new File(base, files[i])).getAbsolutePath(); } performBackup_checked(oldState, data, newState, fullPaths, files); // keys String[] keys = makeKeys(mKeyPrefix, files); // go performBackup_checked(oldState, data, newState, fullPaths, keys); } /** * If keyPrefix is not null, prepend it to each of the strings in <code>original</code>; * otherwise, return original. */ static String[] makeKeys(String keyPrefix, String[] original) { if (keyPrefix != null) { String[] keys; final int N = original.length; keys = new String[N]; for (int i=0; i<N; i++) { keys[i] = keyPrefix + ':' + original[i]; } return keys; } else { return original; } } /** Loading
core/java/android/backup/RestoreHelper.java 0 → 100644 +23 −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; /** @hide */ public interface RestoreHelper { public void performRestore(); }