11cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato/*
21cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * Copyright (C) 2009 The Android Open Source Project
31cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato *
41cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * you may not use this file except in compliance with the License.
61cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * You may obtain a copy of the License at
71cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato *
81cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato *
101cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * Unless required by applicable law or agreed to in writing, software
111cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * See the License for the specific language governing permissions and
141cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato * limitations under the License.
151cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato */
161cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
171cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato#define LOG_TAG "FileBackupHelper_native"
181cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato#include <utils/Log.h>
191cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
201cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato#include "JNIHelp.h"
211cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato#include <android_runtime/AndroidRuntime.h>
221cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
23b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/BackupHelpers.h>
241cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
251cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratonamespace android
261cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{
271cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
284528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate// android.app.backup.BackupDataInput$EntityHeader
291cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jfieldID s_keyField = 0;
301cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jfieldID s_dataSizeField = 0;
311cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
3258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatstatic jlong
331cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratoctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor)
341cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{
35a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    int fd = jniGetFDFromFileDescriptor(env, fileDescriptor);
361cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    if (fd == -1) {
3758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat        return (jlong)NULL;
381cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    }
391cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
4058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    return (jlong)new BackupDataReader(fd);
411cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato}
421cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
431cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic void
4458b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhatdtor_native(JNIEnv* env, jobject clazz, jlong r)
451cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{
461cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    delete (BackupDataReader*)r;
471cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato}
481cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
491cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jint
5058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatreadNextHeader_native(JNIEnv* env, jobject clazz, jlong r, jobject entity)
511cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{
521cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    int err;
535f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    bool done;
541cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    BackupDataReader* reader = (BackupDataReader*)r;
551cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
562fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    int type = 0;
571cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
585f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    err = reader->ReadNextHeader(&done, &type);
595f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    if (done) {
602fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        return 1;
612fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    }
622fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate
632fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    if (err != 0) {
642fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        return err < 0 ? err : -1;
652fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    }
662fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate
672fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    switch (type) {
682fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    case BACKUP_HEADER_ENTITY_V1:
692fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    {
702fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        String8 key;
712fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        size_t dataSize;
722fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        err = reader->ReadEntityHeader(&key, &dataSize);
732fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        if (err != 0) {
742fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate            return err < 0 ? err : -1;
751cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato        }
762fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        // TODO: Set the fields in the entity object
772fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        jstring keyStr = env->NewStringUTF(key.string());
782fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        env->SetObjectField(entity, s_keyField, keyStr);
792fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        env->SetIntField(entity, s_dataSizeField, dataSize);
802fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        return 0;
812fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    }
822fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    default:
835baa3a62a97544669fba6d65a11c07f252e654ddSteve Block        ALOGD("Unknown header type: 0x%08x\n", type);
842fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        return -1;
852fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate    }
862fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate
871cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    // done
881cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    return 1;
891cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato}
901cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
911cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jint
9258b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatreadEntityData_native(JNIEnv* env, jobject clazz, jlong r, jbyteArray data, jint offset, jint size)
931cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{
941cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    int err;
951cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    BackupDataReader* reader = (BackupDataReader*)r;
961cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
975f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    if (env->GetArrayLength(data) < (size+offset)) {
981cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato        // size mismatch
991cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato        return -1;
1001cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    }
1011cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1021cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    jbyte* dataBytes = env->GetByteArrayElements(data, NULL);
1031cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    if (dataBytes == NULL) {
1042fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate        return -2;
1051cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    }
1061cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1075f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    err = reader->ReadEntityData(dataBytes+offset, size);
1081cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1091cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    env->ReleaseByteArrayElements(data, dataBytes, 0);
1101cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1111cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    return err;
1121cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato}
1131cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1145f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onoratostatic jint
11558b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok BhatskipEntityData_native(JNIEnv* env, jobject clazz, jlong r)
1165f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato{
1175f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    int err;
1185f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    BackupDataReader* reader = (BackupDataReader*)r;
1195f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
1205f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    err = reader->SkipEntityData();
1215f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
1225f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato    return err;
1235f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato}
1245f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato
1251cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic const JNINativeMethod g_methods[] = {
12658b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "ctor", "(Ljava/io/FileDescriptor;)J", (void*)ctor_native },
12758b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "dtor", "(J)V", (void*)dtor_native },
12858b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "readNextHeader_native", "(JLandroid/app/backup/BackupDataInput$EntityHeader;)I",
1291cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato            (void*)readNextHeader_native },
13058b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "readEntityData_native", "(J[BII)I", (void*)readEntityData_native },
13158b8b24256bdc2b613b7fda9151845ed9898a4c7Ashok Bhat    { "skipEntityData_native", "(J)I", (void*)skipEntityData_native },
1321cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato};
1331cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1341cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratoint register_android_backup_BackupDataInput(JNIEnv* env)
1351cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{
1365baa3a62a97544669fba6d65a11c07f252e654ddSteve Block    //ALOGD("register_android_backup_BackupDataInput");
1371cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
138a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    jclass clazz = env->FindClass("android/app/backup/BackupDataInput$EntityHeader");
1394528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate    LOG_FATAL_IF(clazz == NULL, "Unable to find class android.app.backup.BackupDataInput.EntityHeader");
1401cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    s_keyField = env->GetFieldID(clazz, "key", "Ljava/lang/String;");
1411cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    LOG_FATAL_IF(s_keyField == NULL,
1424528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate            "Unable to find key field in android.app.backup.BackupDataInput.EntityHeader");
14303f4df4b3bf8b8828e795a0bf1f913e6e08f12f1Joe Onorato    s_dataSizeField = env->GetFieldID(clazz, "dataSize", "I");
1441cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato    LOG_FATAL_IF(s_dataSizeField == NULL,
1454528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate            "Unable to find dataSize field in android.app.backup.BackupDataInput.EntityHeader");
1461cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1474528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate    return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupDataInput",
1481cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato            g_methods, NELEM(g_methods));
1491cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato}
1501cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato
1511cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato}
152