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

Commit 5f15d151 authored by Joe Onorato's avatar Joe Onorato
Browse files

checkpoint BackupDatAInput / RestoreHelper

parent aa088447
Loading
Loading
Loading
Loading
+5 −24
Original line number Diff line number Diff line
@@ -64,22 +64,14 @@ perform_list(const char* filename)
    }

    BackupDataReader reader(fd);
    bool done;
    int type;

    while (reader.ReadNextHeader(&type) == 0) {
        switch (type) {
            case BACKUP_HEADER_APP_V1:
            {
                String8 packageName;
                int cookie;
                err = reader.ReadAppHeader(&packageName, &cookie);
                if (err == 0) {
                    printf("App header: %s 0x%08x (%d)\n", packageName.string(), cookie, cookie);
                } else {
                    printf("Error reading app header\n");
                }
    while (reader.ReadNextHeader(&done, &type) == 0) {
        if (done) {
            break;
        }
        switch (type) {
            case BACKUP_HEADER_ENTITY_V1:
            {
                String8 key;
@@ -92,17 +84,6 @@ perform_list(const char* filename)
                }
                break;
            }
            case BACKUP_FOOTER_APP_V1:
            {
                int cookie;
                err = reader.ReadAppFooter(&cookie);
                if (err == 0) {
                    printf("   App footer: 0x%08x (%d)\n", cookie, cookie);
                } else {
                    printf("   Error reading entity header\n");
                }
                break;
            }
            default:
            {
                printf("Unknown chunk type: 0x%08x\n", type);
+17 −3
Original line number Diff line number Diff line
@@ -82,9 +82,9 @@ public class BackupDataInput {
        }
    }

    public int readEntityData(byte[] data, int size) throws IOException {
    public int readEntityData(byte[] data, int offset, int size) throws IOException {
        if (mHeaderReady) {
            int result = readEntityData_native(mBackupReader, data, size);
            int result = readEntityData_native(mBackupReader, data, offset, size);
            if (result >= 0) {
                return result;
            } else {
@@ -95,9 +95,23 @@ public class BackupDataInput {
        }
    }

    public void skipEntityData() throws IOException {
        if (mHeaderReady) {
            int result = skipEntityData_native(mBackupReader);
            if (result >= 0) {
                return;
            } 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);
    private native int readEntityData_native(int mBackupReader, byte[] data, int offset, int size);
    private native int skipEntityData_native(int mBackupReader);
}
+61 −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 java.io.InputStream;
import java.io.IOException;

/** @hide */
public class BackupDataInputStream extends InputStream {

    String key;
    int dataSize;

    BackupDataInput mData;
    byte[] mOneByte;

    BackupDataInputStream(BackupDataInput data) {
        mData = data;
    }

    public int read() throws IOException {
        byte[] one = mOneByte;
        if (mOneByte == null) {
            one = mOneByte = new byte[1];
        }
        mData.readEntityData(one, 0, 1);
        return one[0];
    }

    public int read(byte[] b, int offset, int size) throws IOException {
        return mData.readEntityData(b, offset, size);
    }

    public int read(byte[] b) throws IOException {
        return mData.readEntityData(b, 0, b.length);
    }

    public String getKey() {
        return this.key;
    }
    
    public int size() {
        return this.dataSize;
    }
}

+9 −1
Original line number Diff line number Diff line
@@ -16,8 +16,16 @@

package android.backup;

import java.io.InputStream;

/** @hide */
public interface RestoreHelper {
    public void performRestore();
    /**
     * Called by RestoreHelperDispatcher to dispatch one entity of data.
     * <p class=note>
     * Do not close the <code>data</code> stream.  Do not read more than
     * <code>dataSize</code> bytes from <code>data</code>.
     */
    public void performRestore(BackupDataInputStream data);
}
+20 −1
Original line number Diff line number Diff line
@@ -16,13 +16,32 @@

package android.backup;

import java.io.IOException;
import java.util.HashMap;

/** @hide */
public class RestoreHelperDistributor {
public class RestoreHelperDispatcher {
    HashMap<String,RestoreHelper> mHelpers;

    public void addHelper(String keyPrefix, RestoreHelper helper) {
        mHelpers.put(keyPrefix, helper);
    }

    public void dispatch(BackupDataInput input) throws IOException {
        BackupDataInputStream stream = new BackupDataInputStream(input);
        while (input.readNextHeader()) {
            String rawKey = input.getKey();
            int pos = rawKey.indexOf(':');
            if (pos > 0) {
                String prefix = rawKey.substring(0, pos);
                RestoreHelper helper = mHelpers.get(prefix);
                if (helper != null) {
                    stream.dataSize = input.getDataSize();
                    stream.key = rawKey.substring(pos+1);
                    helper.performRestore(stream);
                }
            }
            input.skipEntityData(); // In case they didn't consume the data.
        }
    }
}
Loading