Add RestoreFileHelper, BackupDataInput, and add java wrappers for the methods on BackupDataOutput.

This commit is contained in:
Joe Onorato
2009-06-12 11:06:24 -07:00
parent 6599426f74
commit 1cf587496f
14 changed files with 452 additions and 18 deletions

View File

@@ -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) {
}
}

View 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);
}

View File

@@ -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);
}

View File

@@ -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;
}
}
/**

View 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();
}

View 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);
}
}

View File

@@ -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);
}
}