android_backup_BackupDataOutput.cpp revision 5baa3a62a97544669fba6d65a11c07f252e654dd
1/* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#define LOG_TAG "FileBackupHelper_native" 18#include <utils/Log.h> 19 20#include "JNIHelp.h" 21#include <android_runtime/AndroidRuntime.h> 22 23#include <utils/BackupHelpers.h> 24 25namespace android 26{ 27 28static int 29ctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor) 30{ 31 int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); 32 if (fd == -1) { 33 return NULL; 34 } 35 36 return (int)new BackupDataWriter(fd); 37} 38 39static void 40dtor_native(JNIEnv* env, jobject clazz, int w) 41{ 42 delete (BackupDataWriter*)w; 43} 44 45static jint 46writeEntityHeader_native(JNIEnv* env, jobject clazz, int w, jstring key, int dataSize) 47{ 48 int err; 49 BackupDataWriter* writer = (BackupDataWriter*)w; 50 51 const char* keyUTF = env->GetStringUTFChars(key, NULL); 52 if (keyUTF == NULL) { 53 return -1; 54 } 55 56 err = writer->WriteEntityHeader(String8(keyUTF), dataSize); 57 58 env->ReleaseStringUTFChars(key, keyUTF); 59 60 return err; 61} 62 63static jint 64writeEntityData_native(JNIEnv* env, jobject clazz, int w, jbyteArray data, int size) 65{ 66 int err; 67 BackupDataWriter* writer = (BackupDataWriter*)w; 68 69 if (env->GetArrayLength(data) < size) { 70 // size mismatch 71 return -1; 72 } 73 74 jbyte* dataBytes = env->GetByteArrayElements(data, NULL); 75 if (dataBytes == NULL) { 76 return -1; 77 } 78 79 err = writer->WriteEntityData(dataBytes, size); 80 81 env->ReleaseByteArrayElements(data, dataBytes, JNI_ABORT); 82 83 return err; 84} 85 86static void 87setKeyPrefix_native(JNIEnv* env, jobject clazz, int w, jstring keyPrefixObj) 88{ 89 int err; 90 BackupDataWriter* writer = (BackupDataWriter*)w; 91 92 const char* keyPrefixUTF = env->GetStringUTFChars(keyPrefixObj, NULL); 93 String8 keyPrefix(keyPrefixUTF ? keyPrefixUTF : ""); 94 95 writer->SetKeyPrefix(keyPrefix); 96 97 env->ReleaseStringUTFChars(keyPrefixObj, keyPrefixUTF); 98} 99 100static const JNINativeMethod g_methods[] = { 101 { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native }, 102 { "dtor", "(I)V", (void*)dtor_native }, 103 { "writeEntityHeader_native", "(ILjava/lang/String;I)I", (void*)writeEntityHeader_native }, 104 { "writeEntityData_native", "(I[BI)I", (void*)writeEntityData_native }, 105 { "setKeyPrefix_native", "(ILjava/lang/String;)V", (void*)setKeyPrefix_native }, 106}; 107 108int register_android_backup_BackupDataOutput(JNIEnv* env) 109{ 110 //ALOGD("register_android_backup_BackupDataOutput"); 111 return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupDataOutput", 112 g_methods, NELEM(g_methods)); 113} 114 115} 116