android_backup_BackupDataOutput.cpp revision 6d877383bc2e2952cad48780c410ed452870a5a4
1d2110dbce071a236b6176de344ca797b737542ebJoe Onorato/* 2d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * Copyright (C) 2009 The Android Open Source Project 3d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * 4d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License"); 5d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * you may not use this file except in compliance with the License. 6d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * You may obtain a copy of the License at 7d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * 8d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * http://www.apache.org/licenses/LICENSE-2.0 9d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * 10d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * Unless required by applicable law or agreed to in writing, software 11d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS, 12d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * See the License for the specific language governing permissions and 14d2110dbce071a236b6176de344ca797b737542ebJoe Onorato * limitations under the License. 15d2110dbce071a236b6176de344ca797b737542ebJoe Onorato */ 16d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 17d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#define LOG_TAG "FileBackupHelper_native" 18d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <utils/Log.h> 19d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 20d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include "JNIHelp.h" 21d2110dbce071a236b6176de344ca797b737542ebJoe Onorato#include <android_runtime/AndroidRuntime.h> 22d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 238ae2335a3c93d0c00e998fdec18f64dfe43b94cbMathias Agopian#include <utils/BackupHelpers.h> 24d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 25d2110dbce071a236b6176de344ca797b737542ebJoe Onoratonamespace android 26d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{ 27d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 28d2110dbce071a236b6176de344ca797b737542ebJoe Onoratostatic jfieldID s_descriptorField = 0; 29d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 30d2110dbce071a236b6176de344ca797b737542ebJoe Onoratostatic int 311cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratoctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor) 32d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{ 33d2110dbce071a236b6176de344ca797b737542ebJoe Onorato int err; 34d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 35d2110dbce071a236b6176de344ca797b737542ebJoe Onorato int fd = env->GetIntField(fileDescriptor, s_descriptorField); 36d2110dbce071a236b6176de344ca797b737542ebJoe Onorato if (fd == -1) { 37d2110dbce071a236b6176de344ca797b737542ebJoe Onorato return NULL; 38d2110dbce071a236b6176de344ca797b737542ebJoe Onorato } 39d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 40d2110dbce071a236b6176de344ca797b737542ebJoe Onorato return (int)new BackupDataWriter(fd); 41d2110dbce071a236b6176de344ca797b737542ebJoe Onorato} 42d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 43d2110dbce071a236b6176de344ca797b737542ebJoe Onoratostatic void 441cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratodtor_native(JNIEnv* env, jobject clazz, int w) 45d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{ 461cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato delete (BackupDataWriter*)w; 471cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato} 481cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 491cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jint 501cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe OnoratowriteEntityHeader_native(JNIEnv* env, jobject clazz, int w, jstring key, int dataSize) 511cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{ 521cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato int err; 531cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato BackupDataWriter* writer = (BackupDataWriter*)w; 541cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 551cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato const char* keyUTF = env->GetStringUTFChars(key, NULL); 561cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato if (keyUTF == NULL) { 571cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return -1; 581cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato } 591cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 601cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato err = writer->WriteEntityHeader(String8(keyUTF), dataSize); 611cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 621cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato env->ReleaseStringUTFChars(key, keyUTF); 631cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 641cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return err; 651cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato} 661cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 671cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onoratostatic jint 681cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe OnoratowriteEntityData_native(JNIEnv* env, jobject clazz, int w, jbyteArray data, int size) 691cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato{ 701cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato int err; 711cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato BackupDataWriter* writer = (BackupDataWriter*)w; 721cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 736d877383bc2e2952cad48780c410ed452870a5a4Dan Egnor if (env->GetArrayLength(data) < size) { 741cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato // size mismatch 751cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return -1; 761cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato } 771cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 781cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato jbyte* dataBytes = env->GetByteArrayElements(data, NULL); 791cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato if (dataBytes == NULL) { 801cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return -1; 811cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato } 821cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 831cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato err = writer->WriteEntityData(dataBytes, size); 841cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 851cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato env->ReleaseByteArrayElements(data, dataBytes, JNI_ABORT); 861cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato 871cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato return err; 88d2110dbce071a236b6176de344ca797b737542ebJoe Onorato} 89d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 9006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onoratostatic void 9106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe OnoratosetKeyPrefix_native(JNIEnv* env, jobject clazz, int w, jstring keyPrefixObj) 9206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato{ 9306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato int err; 9406290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato BackupDataWriter* writer = (BackupDataWriter*)w; 9506290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato 9606290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato const char* keyPrefixUTF = env->GetStringUTFChars(keyPrefixObj, NULL); 9706290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato String8 keyPrefix(keyPrefixUTF ? keyPrefixUTF : ""); 9806290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato 9906290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato writer->SetKeyPrefix(keyPrefix); 10006290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato 10106290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato env->ReleaseStringUTFChars(keyPrefixObj, keyPrefixUTF); 10206290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato} 10306290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato 104d2110dbce071a236b6176de344ca797b737542ebJoe Onoratostatic const JNINativeMethod g_methods[] = { 105d2110dbce071a236b6176de344ca797b737542ebJoe Onorato { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native }, 106d2110dbce071a236b6176de344ca797b737542ebJoe Onorato { "dtor", "(I)V", (void*)dtor_native }, 1071cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato { "writeEntityHeader_native", "(ILjava/lang/String;I)I", (void*)writeEntityHeader_native }, 1081cf587496fcb1d652bab9fc6792fb106b6fefaa4Joe Onorato { "writeEntityData_native", "(I[BI)I", (void*)writeEntityData_native }, 10906290a4bb9b280fa14a2bbeb2d3ceb09396a78c3Joe Onorato { "setKeyPrefix_native", "(ILjava/lang/String;)V", (void*)setKeyPrefix_native }, 110d2110dbce071a236b6176de344ca797b737542ebJoe Onorato}; 111d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 112d2110dbce071a236b6176de344ca797b737542ebJoe Onoratoint register_android_backup_BackupDataOutput(JNIEnv* env) 113d2110dbce071a236b6176de344ca797b737542ebJoe Onorato{ 1142fdd428e0f18384160f7c38ce3a2cd9ba7e7b2c2Christopher Tate //LOGD("register_android_backup_BackupDataOutput"); 115d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 116d2110dbce071a236b6176de344ca797b737542ebJoe Onorato jclass clazz; 117d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 118d2110dbce071a236b6176de344ca797b737542ebJoe Onorato clazz = env->FindClass("java/io/FileDescriptor"); 119d2110dbce071a236b6176de344ca797b737542ebJoe Onorato LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor"); 120d2110dbce071a236b6176de344ca797b737542ebJoe Onorato s_descriptorField = env->GetFieldID(clazz, "descriptor", "I"); 121d2110dbce071a236b6176de344ca797b737542ebJoe Onorato LOG_FATAL_IF(s_descriptorField == NULL, 122d2110dbce071a236b6176de344ca797b737542ebJoe Onorato "Unable to find descriptor field in java.io.FileDescriptor"); 123d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 124d2110dbce071a236b6176de344ca797b737542ebJoe Onorato return AndroidRuntime::registerNativeMethods(env, "android/backup/BackupDataOutput", 125d2110dbce071a236b6176de344ca797b737542ebJoe Onorato g_methods, NELEM(g_methods)); 126d2110dbce071a236b6176de344ca797b737542ebJoe Onorato} 127d2110dbce071a236b6176de344ca797b737542ebJoe Onorato 128d2110dbce071a236b6176de344ca797b737542ebJoe Onorato} 129