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 321cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic int 331cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratoctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor) 341cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{ 35a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 361cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato if (fd == -1) { 371cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return NULL; 381cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato } 391cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 401cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return (int)new BackupDataReader(fd); 411cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato} 421cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 431cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic void 441cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratodtor_native(JNIEnv* env, jobject clazz, int r) 451cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{ 461cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato delete (BackupDataReader*)r; 471cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato} 481cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 491cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jint 501cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe OnoratoreadNextHeader_native(JNIEnv* env, jobject clazz, int 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 925f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe OnoratoreadEntityData_native(JNIEnv* env, jobject clazz, int r, jbyteArray data, int offset, int 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 1155f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe OnoratoskipEntityData_native(JNIEnv* env, jobject clazz, int 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[] = { 1261cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native }, 1271cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato { "dtor", "(I)V", (void*)dtor_native }, 1284528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate { "readNextHeader_native", "(ILandroid/app/backup/BackupDataInput$EntityHeader;)I", 1291cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato (void*)readNextHeader_native }, 1305f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato { "readEntityData_native", "(I[BII)I", (void*)readEntityData_native }, 1315f15d151b5101fadfe6cba1e8f4aa6367e8c603eJoe Onorato { "skipEntityData_native", "(I)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