Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1cf58749 authored by Joe Onorato's avatar Joe Onorato
Browse files

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

parent 6599426f
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -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 −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);
}
+22 −0
Original line number Diff line number Diff line
@@ -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);
}
+39 −4
Original line number Diff line number Diff line
@@ -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 −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