diff options
| author | Joe Onorato <joeo@android.com> | 2009-06-12 11:06:24 -0700 | 
|---|---|---|
| committer | Joe Onorato <joeo@android.com> | 2009-06-12 16:21:24 -0700 | 
| commit | 1cf587496fcb1d652bab9fc6792fb106b6fefaa4 (patch) | |
| tree | 96e989c088b0e2fb8560d5b2e24562188a128e19 /core/java/android/backup | |
| parent | 6599426f74371c823fcfe570f61577262eb0df44 (diff) | |
| download | frameworks_base-1cf587496fcb1d652bab9fc6792fb106b6fefaa4.zip frameworks_base-1cf587496fcb1d652bab9fc6792fb106b6fefaa4.tar.gz frameworks_base-1cf587496fcb1d652bab9fc6792fb106b6fefaa4.tar.bz2 | |
Add RestoreFileHelper, BackupDataInput, and add java wrappers for the methods on BackupDataOutput.
Diffstat (limited to 'core/java/android/backup')
| -rw-r--r-- | core/java/android/backup/BackupDataInput.java | 103 | ||||
| -rw-r--r-- | core/java/android/backup/BackupDataOutput.java | 22 | ||||
| -rw-r--r-- | core/java/android/backup/FileBackupHelper.java | 43 | ||||
| -rw-r--r-- | core/java/android/backup/RestoreHelper.java | 23 | ||||
| -rw-r--r-- | core/java/android/backup/RestoreHelperDistributor.java | 28 | ||||
| -rw-r--r-- | core/java/android/backup/SharedPreferencesBackupHelper.java | 23 | 
6 files changed, 235 insertions, 7 deletions
| diff --git a/core/java/android/backup/BackupDataInput.java b/core/java/android/backup/BackupDataInput.java new file mode 100644 index 0000000..609dd90 --- /dev/null +++ b/core/java/android/backup/BackupDataInput.java @@ -0,0 +1,103 @@ +/* + * 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); +} diff --git a/core/java/android/backup/BackupDataOutput.java b/core/java/android/backup/BackupDataOutput.java index 25ae15b..1348d81 100644 --- a/core/java/android/backup/BackupDataOutput.java +++ b/core/java/android/backup/BackupDataOutput.java @@ -19,6 +19,7 @@ package android.backup;  import android.content.Context;  import java.io.FileDescriptor; +import java.io.IOException;  /** @hide */  public class BackupDataOutput { @@ -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); @@ -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);  } diff --git a/core/java/android/backup/FileBackupHelper.java b/core/java/android/backup/FileBackupHelper.java index 99051bf..ed840bb 100644 --- a/core/java/android/backup/FileBackupHelper.java +++ b/core/java/android/backup/FileBackupHelper.java @@ -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; +        }      }      /** diff --git a/core/java/android/backup/RestoreHelper.java b/core/java/android/backup/RestoreHelper.java new file mode 100644 index 0000000..ebd9906 --- /dev/null +++ b/core/java/android/backup/RestoreHelper.java @@ -0,0 +1,23 @@ +/* + * 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(); +} + diff --git a/core/java/android/backup/RestoreHelperDistributor.java b/core/java/android/backup/RestoreHelperDistributor.java new file mode 100644 index 0000000..555ca79 --- /dev/null +++ b/core/java/android/backup/RestoreHelperDistributor.java @@ -0,0 +1,28 @@ +/* + * 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.util.HashMap; + +/** @hide */ +public class RestoreHelperDistributor { +    HashMap<String,RestoreHelper> mHelpers; + +    public void addHelper(String keyPrefix, RestoreHelper helper) { +        mHelpers.put(keyPrefix, helper); +    } +} diff --git a/core/java/android/backup/SharedPreferencesBackupHelper.java b/core/java/android/backup/SharedPreferencesBackupHelper.java index 923dc1b..cad79df 100644 --- a/core/java/android/backup/SharedPreferencesBackupHelper.java +++ b/core/java/android/backup/SharedPreferencesBackupHelper.java @@ -23,16 +23,33 @@ import java.io.FileDescriptor;  /** @hide */  public class SharedPreferencesBackupHelper { -    public static void performBackup(Context context, -            ParcelFileDescriptor oldSnapshot, ParcelFileDescriptor newSnapshot, +    private Context mContext; +    private String mKeyPrefix; + +    public SharedPreferencesBackupHelper(Context context) { +        mContext = context; +    } + +    public SharedPreferencesBackupHelper(Context context, String keyPrefix) { +        mContext = context; +        mKeyPrefix = keyPrefix; +    } +     +    public void performBackup(ParcelFileDescriptor oldSnapshot, ParcelFileDescriptor newSnapshot,              BackupDataOutput data, String[] prefGroups) { +        Context context = mContext; +                  // make filenames for the prefGroups          final int N = prefGroups.length;          String[] files = new String[N];          for (int i=0; i<N; i++) { -            files[i] = context.getSharedPrefsFile(prefGroups[i]).toString(); +            files[i] = context.getSharedPrefsFile(prefGroups[i]).getAbsolutePath();          } +        // make keys if necessary +        String[] keys = FileBackupHelper.makeKeys(mKeyPrefix, prefGroups); + +        // go          FileBackupHelper.performBackup_checked(oldSnapshot, data, newSnapshot, files, prefGroups);      }  } | 
