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