Add RestoreFileHelper, BackupDataInput, and add java wrappers for the methods on BackupDataOutput.
This commit is contained in:
@@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
103
core/java/android/backup/BackupDataInput.java
Normal file
103
core/java/android/backup/BackupDataInput.java
Normal file
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
23
core/java/android/backup/RestoreHelper.java
Normal file
23
core/java/android/backup/RestoreHelper.java
Normal file
@@ -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();
|
||||
}
|
||||
|
||||
28
core/java/android/backup/RestoreHelperDistributor.java
Normal file
28
core/java/android/backup/RestoreHelperDistributor.java
Normal file
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user