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

Commit bf0010b5 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 4085 into donut

* changes:
  Add RestoreFileHelper, BackupDataInput, and add java wrappers for the methods on BackupDataOutput.
parents 6c98c13b 1cf58749
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