• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
25 namespace android
26 {
27 
28 static jfieldID s_descriptorField = 0;
29 
30 static int
ctor_native(JNIEnv * env,jobject clazz,jobject fileDescriptor)31 ctor_native(JNIEnv* env, jobject clazz, jobject fileDescriptor)
32 {
33     int err;
34 
35     int fd = env->GetIntField(fileDescriptor, s_descriptorField);
36     if (fd == -1) {
37         return NULL;
38     }
39 
40     return (int)new BackupDataWriter(fd);
41 }
42 
43 static void
dtor_native(JNIEnv * env,jobject clazz,int w)44 dtor_native(JNIEnv* env, jobject clazz, int w)
45 {
46     delete (BackupDataWriter*)w;
47 }
48 
49 static jint
writeEntityHeader_native(JNIEnv * env,jobject clazz,int w,jstring key,int dataSize)50 writeEntityHeader_native(JNIEnv* env, jobject clazz, int w, jstring key, int dataSize)
51 {
52     int err;
53     BackupDataWriter* writer = (BackupDataWriter*)w;
54 
55     const char* keyUTF = env->GetStringUTFChars(key, NULL);
56     if (keyUTF == NULL) {
57         return -1;
58     }
59 
60     err = writer->WriteEntityHeader(String8(keyUTF), dataSize);
61 
62     env->ReleaseStringUTFChars(key, keyUTF);
63 
64     return err;
65 }
66 
67 static jint
writeEntityData_native(JNIEnv * env,jobject clazz,int w,jbyteArray data,int size)68 writeEntityData_native(JNIEnv* env, jobject clazz, int w, jbyteArray data, int size)
69 {
70     int err;
71     BackupDataWriter* writer = (BackupDataWriter*)w;
72 
73     if (env->GetArrayLength(data) < size) {
74         // size mismatch
75         return -1;
76     }
77 
78     jbyte* dataBytes = env->GetByteArrayElements(data, NULL);
79     if (dataBytes == NULL) {
80         return -1;
81     }
82 
83     err = writer->WriteEntityData(dataBytes, size);
84 
85     env->ReleaseByteArrayElements(data, dataBytes, JNI_ABORT);
86 
87     return err;
88 }
89 
90 static void
setKeyPrefix_native(JNIEnv * env,jobject clazz,int w,jstring keyPrefixObj)91 setKeyPrefix_native(JNIEnv* env, jobject clazz, int w, jstring keyPrefixObj)
92 {
93     int err;
94     BackupDataWriter* writer = (BackupDataWriter*)w;
95 
96     const char* keyPrefixUTF = env->GetStringUTFChars(keyPrefixObj, NULL);
97     String8 keyPrefix(keyPrefixUTF ? keyPrefixUTF : "");
98 
99     writer->SetKeyPrefix(keyPrefix);
100 
101     env->ReleaseStringUTFChars(keyPrefixObj, keyPrefixUTF);
102 }
103 
104 static const JNINativeMethod g_methods[] = {
105     { "ctor", "(Ljava/io/FileDescriptor;)I", (void*)ctor_native },
106     { "dtor", "(I)V", (void*)dtor_native },
107     { "writeEntityHeader_native", "(ILjava/lang/String;I)I", (void*)writeEntityHeader_native },
108     { "writeEntityData_native", "(I[BI)I", (void*)writeEntityData_native },
109     { "setKeyPrefix_native", "(ILjava/lang/String;)V", (void*)setKeyPrefix_native },
110 };
111 
register_android_backup_BackupDataOutput(JNIEnv * env)112 int register_android_backup_BackupDataOutput(JNIEnv* env)
113 {
114     //LOGD("register_android_backup_BackupDataOutput");
115 
116     jclass clazz;
117 
118     clazz = env->FindClass("java/io/FileDescriptor");
119     LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor");
120     s_descriptorField = env->GetFieldID(clazz, "descriptor", "I");
121     LOG_FATAL_IF(s_descriptorField == NULL,
122             "Unable to find descriptor field in java.io.FileDescriptor");
123 
124     return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupDataOutput",
125             g_methods, NELEM(g_methods));
126 }
127 
128 }
129