android_backup_BackupHelperDispatcher.cpp revision 4528186e0d65fc68ef0dd1941aa2ac8aefcd55a3
14ababd922eac5931e0222862ff082dc29e012816Joe Onorato/*
24ababd922eac5931e0222862ff082dc29e012816Joe Onorato * Copyright (C) 2009 The Android Open Source Project
34ababd922eac5931e0222862ff082dc29e012816Joe Onorato *
44ababd922eac5931e0222862ff082dc29e012816Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
54ababd922eac5931e0222862ff082dc29e012816Joe Onorato * you may not use this file except in compliance with the License.
64ababd922eac5931e0222862ff082dc29e012816Joe Onorato * You may obtain a copy of the License at
74ababd922eac5931e0222862ff082dc29e012816Joe Onorato *
84ababd922eac5931e0222862ff082dc29e012816Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
94ababd922eac5931e0222862ff082dc29e012816Joe Onorato *
104ababd922eac5931e0222862ff082dc29e012816Joe Onorato * Unless required by applicable law or agreed to in writing, software
114ababd922eac5931e0222862ff082dc29e012816Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
124ababd922eac5931e0222862ff082dc29e012816Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134ababd922eac5931e0222862ff082dc29e012816Joe Onorato * See the License for the specific language governing permissions and
144ababd922eac5931e0222862ff082dc29e012816Joe Onorato * limitations under the License.
154ababd922eac5931e0222862ff082dc29e012816Joe Onorato */
164ababd922eac5931e0222862ff082dc29e012816Joe Onorato
174ababd922eac5931e0222862ff082dc29e012816Joe Onorato#define LOG_TAG "BackupHelperDispatcher_native"
184ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <utils/Log.h>
194ababd922eac5931e0222862ff082dc29e012816Joe Onorato
204ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include "JNIHelp.h"
214ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <android_runtime/AndroidRuntime.h>
224ababd922eac5931e0222862ff082dc29e012816Joe Onorato
234ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <sys/types.h>
244ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <sys/uio.h>
254ababd922eac5931e0222862ff082dc29e012816Joe Onorato#include <unistd.h>
264ababd922eac5931e0222862ff082dc29e012816Joe Onorato
274ababd922eac5931e0222862ff082dc29e012816Joe Onorato
284ababd922eac5931e0222862ff082dc29e012816Joe Onorato#define VERSION_1_HEADER 0x01706c48  // 'Hlp'1 little endian
294ababd922eac5931e0222862ff082dc29e012816Joe Onorato
304ababd922eac5931e0222862ff082dc29e012816Joe Onoratonamespace android
314ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
324ababd922eac5931e0222862ff082dc29e012816Joe Onorato
334ababd922eac5931e0222862ff082dc29e012816Joe Onoratostruct chunk_header_v1 {
344ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int headerSize;
354ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int version;
364ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int dataSize; // corresponds to Header.chunkSize
374ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int nameLength; // not including the NULL terminator, which is not written to the file
384ababd922eac5931e0222862ff082dc29e012816Joe Onorato};
394ababd922eac5931e0222862ff082dc29e012816Joe Onorato
404ababd922eac5931e0222862ff082dc29e012816Joe Onorato// java.io.FileDescriptor
414ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_descriptorField = 0;
424ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_chunkSizeField = 0;
434ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic jfieldID s_keyPrefixField = 0;
444ababd922eac5931e0222862ff082dc29e012816Joe Onorato
454ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int
464ababd922eac5931e0222862ff082dc29e012816Joe OnoratoreadHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
474ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
484ababd922eac5931e0222862ff082dc29e012816Joe Onorato    chunk_header_v1 flattenedHeader;
494ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int fd;
504ababd922eac5931e0222862ff082dc29e012816Joe Onorato    ssize_t amt;
514ababd922eac5931e0222862ff082dc29e012816Joe Onorato    String8 keyPrefix;
524ababd922eac5931e0222862ff082dc29e012816Joe Onorato    char* buf;
534ababd922eac5931e0222862ff082dc29e012816Joe Onorato
544ababd922eac5931e0222862ff082dc29e012816Joe Onorato    fd = env->GetIntField(fdObj, s_descriptorField);
554ababd922eac5931e0222862ff082dc29e012816Joe Onorato
564ababd922eac5931e0222862ff082dc29e012816Joe Onorato    amt = read(fd, &flattenedHeader.headerSize, sizeof(flattenedHeader.headerSize));
574ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (amt != sizeof(flattenedHeader.headerSize)) {
584ababd922eac5931e0222862ff082dc29e012816Joe Onorato        return -1;
594ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
604ababd922eac5931e0222862ff082dc29e012816Joe Onorato
614ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int remainingHeader = flattenedHeader.headerSize - sizeof(flattenedHeader.headerSize);
624ababd922eac5931e0222862ff082dc29e012816Joe Onorato
634ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (flattenedHeader.headerSize < (int)sizeof(chunk_header_v1)) {
644ababd922eac5931e0222862ff082dc29e012816Joe Onorato        LOGW("Skipping unknown header: %d bytes", flattenedHeader.headerSize);
654ababd922eac5931e0222862ff082dc29e012816Joe Onorato        if (remainingHeader > 0) {
664ababd922eac5931e0222862ff082dc29e012816Joe Onorato            lseek(fd, remainingHeader, SEEK_CUR);
674ababd922eac5931e0222862ff082dc29e012816Joe Onorato            // >0 means skip this chunk
684ababd922eac5931e0222862ff082dc29e012816Joe Onorato            return 1;
694ababd922eac5931e0222862ff082dc29e012816Joe Onorato        }
704ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
714ababd922eac5931e0222862ff082dc29e012816Joe Onorato
724ababd922eac5931e0222862ff082dc29e012816Joe Onorato    amt = read(fd, &flattenedHeader.version,
734ababd922eac5931e0222862ff082dc29e012816Joe Onorato            sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize));
744ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (amt <= 0) {
754ababd922eac5931e0222862ff082dc29e012816Joe Onorato        LOGW("Failed reading chunk header");
764ababd922eac5931e0222862ff082dc29e012816Joe Onorato        return -1;
774ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
784ababd922eac5931e0222862ff082dc29e012816Joe Onorato    remainingHeader -= sizeof(chunk_header_v1)-sizeof(flattenedHeader.headerSize);
794ababd922eac5931e0222862ff082dc29e012816Joe Onorato
804ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (flattenedHeader.version != VERSION_1_HEADER) {
814ababd922eac5931e0222862ff082dc29e012816Joe Onorato        LOGW("Skipping unknown header version: 0x%08x, %d bytes", flattenedHeader.version,
824ababd922eac5931e0222862ff082dc29e012816Joe Onorato                flattenedHeader.headerSize);
834ababd922eac5931e0222862ff082dc29e012816Joe Onorato        if (remainingHeader > 0) {
844ababd922eac5931e0222862ff082dc29e012816Joe Onorato            lseek(fd, remainingHeader, SEEK_CUR);
854ababd922eac5931e0222862ff082dc29e012816Joe Onorato            // >0 means skip this chunk
864ababd922eac5931e0222862ff082dc29e012816Joe Onorato            return 1;
874ababd922eac5931e0222862ff082dc29e012816Joe Onorato        }
884ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
894ababd922eac5931e0222862ff082dc29e012816Joe Onorato
9012a4da328a234b171b78cc341544817e9a074057Joe Onorato#if 0
9112a4da328a234b171b78cc341544817e9a074057Joe Onorato    LOGD("chunk header:");
9212a4da328a234b171b78cc341544817e9a074057Joe Onorato    LOGD("  headerSize=%d", flattenedHeader.headerSize);
9312a4da328a234b171b78cc341544817e9a074057Joe Onorato    LOGD("  version=0x%08x", flattenedHeader.version);
9412a4da328a234b171b78cc341544817e9a074057Joe Onorato    LOGD("  dataSize=%d", flattenedHeader.dataSize);
9512a4da328a234b171b78cc341544817e9a074057Joe Onorato    LOGD("  nameLength=%d", flattenedHeader.nameLength);
9612a4da328a234b171b78cc341544817e9a074057Joe Onorato#endif
9712a4da328a234b171b78cc341544817e9a074057Joe Onorato
984ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (flattenedHeader.dataSize < 0 || flattenedHeader.nameLength < 0 ||
994ababd922eac5931e0222862ff082dc29e012816Joe Onorato            remainingHeader < flattenedHeader.nameLength) {
1004ababd922eac5931e0222862ff082dc29e012816Joe Onorato        LOGW("Malformed V1 header remainingHeader=%d dataSize=%d nameLength=%d", remainingHeader,
1014ababd922eac5931e0222862ff082dc29e012816Joe Onorato                flattenedHeader.dataSize, flattenedHeader.nameLength);
1024ababd922eac5931e0222862ff082dc29e012816Joe Onorato        return -1;
1034ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1044ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1054ababd922eac5931e0222862ff082dc29e012816Joe Onorato    buf = keyPrefix.lockBuffer(flattenedHeader.nameLength);
1064ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (buf == NULL) {
1074ababd922eac5931e0222862ff082dc29e012816Joe Onorato        LOGW("unable to allocate %d bytes", flattenedHeader.nameLength);
1084ababd922eac5931e0222862ff082dc29e012816Joe Onorato        return -1;
1094ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1104ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1114ababd922eac5931e0222862ff082dc29e012816Joe Onorato    amt = read(fd, buf, flattenedHeader.nameLength);
11212a4da328a234b171b78cc341544817e9a074057Joe Onorato    buf[flattenedHeader.nameLength] = 0;
1134ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1144ababd922eac5931e0222862ff082dc29e012816Joe Onorato    keyPrefix.unlockBuffer(flattenedHeader.nameLength);
1154ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1164ababd922eac5931e0222862ff082dc29e012816Joe Onorato    remainingHeader -= flattenedHeader.nameLength;
1174ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1184ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (remainingHeader > 0) {
1194ababd922eac5931e0222862ff082dc29e012816Joe Onorato        lseek(fd, remainingHeader, SEEK_CUR);
1204ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
1214ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1224ababd922eac5931e0222862ff082dc29e012816Joe Onorato    env->SetIntField(headerObj, s_chunkSizeField, flattenedHeader.dataSize);
1234ababd922eac5931e0222862ff082dc29e012816Joe Onorato    env->SetObjectField(headerObj, s_keyPrefixField, env->NewStringUTF(keyPrefix.string()));
1244ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1254ababd922eac5931e0222862ff082dc29e012816Joe Onorato    return 0;
1264ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1274ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1284ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int
1294ababd922eac5931e0222862ff082dc29e012816Joe OnoratoskipChunk_native(JNIEnv* env, jobject clazz, jobject fdObj, jint bytesToSkip)
1304ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1314ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int fd;
1324ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1334ababd922eac5931e0222862ff082dc29e012816Joe Onorato    fd = env->GetIntField(fdObj, s_descriptorField);
1344ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1354ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, bytesToSkip, SEEK_CUR);
1364ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1374ababd922eac5931e0222862ff082dc29e012816Joe Onorato    return 0;
1384ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1394ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1404ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int
1414ababd922eac5931e0222862ff082dc29e012816Joe Onoratopadding_len(int len)
1424ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1434ababd922eac5931e0222862ff082dc29e012816Joe Onorato    len = len % 4;
1444ababd922eac5931e0222862ff082dc29e012816Joe Onorato    return len == 0 ? len : 4 - len;
1454ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1464ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1474ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int
1484ababd922eac5931e0222862ff082dc29e012816Joe OnoratoallocateHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj)
1494ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1504ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int pos;
1514ababd922eac5931e0222862ff082dc29e012816Joe Onorato    jstring nameObj;
1524ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int nameLength;
1534ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int namePadding;
1544ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int headerSize;
1554ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int fd;
1564ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1574ababd922eac5931e0222862ff082dc29e012816Joe Onorato    fd = env->GetIntField(fdObj, s_descriptorField);
1584ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1594ababd922eac5931e0222862ff082dc29e012816Joe Onorato    nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField);
1604ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1614ababd922eac5931e0222862ff082dc29e012816Joe Onorato    nameLength = env->GetStringUTFLength(nameObj);
1624ababd922eac5931e0222862ff082dc29e012816Joe Onorato    namePadding = padding_len(nameLength);
1634ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1644ababd922eac5931e0222862ff082dc29e012816Joe Onorato    headerSize = sizeof(chunk_header_v1) + nameLength + namePadding;
1654ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1664ababd922eac5931e0222862ff082dc29e012816Joe Onorato    pos = lseek(fd, 0, SEEK_CUR);
1674ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1684ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, headerSize, SEEK_CUR);
1694ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1704ababd922eac5931e0222862ff082dc29e012816Joe Onorato    return pos;
1714ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
1724ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1734ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic int
1744ababd922eac5931e0222862ff082dc29e012816Joe OnoratowriteHeader_native(JNIEnv* env, jobject clazz, jobject headerObj, jobject fdObj, jint pos)
1754ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
1764ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int err;
1774ababd922eac5931e0222862ff082dc29e012816Joe Onorato    chunk_header_v1 header;
1784ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int fd;
1794ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int namePadding;
1804ababd922eac5931e0222862ff082dc29e012816Joe Onorato    int prevPos;
1814ababd922eac5931e0222862ff082dc29e012816Joe Onorato    jstring nameObj;
1824ababd922eac5931e0222862ff082dc29e012816Joe Onorato    const char* buf;
1834ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1844ababd922eac5931e0222862ff082dc29e012816Joe Onorato    fd = env->GetIntField(fdObj, s_descriptorField);
1854ababd922eac5931e0222862ff082dc29e012816Joe Onorato    prevPos = lseek(fd, 0, SEEK_CUR);
1864ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1874ababd922eac5931e0222862ff082dc29e012816Joe Onorato    nameObj = (jstring)env->GetObjectField(headerObj, s_keyPrefixField);
1884ababd922eac5931e0222862ff082dc29e012816Joe Onorato    header.nameLength = env->GetStringUTFLength(nameObj);
1894ababd922eac5931e0222862ff082dc29e012816Joe Onorato    namePadding = padding_len(header.nameLength);
1904ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1914ababd922eac5931e0222862ff082dc29e012816Joe Onorato    header.headerSize = sizeof(chunk_header_v1) + header.nameLength + namePadding;
1924ababd922eac5931e0222862ff082dc29e012816Joe Onorato    header.version = VERSION_1_HEADER;
19312a4da328a234b171b78cc341544817e9a074057Joe Onorato    header.dataSize = prevPos - (pos + header.headerSize);
1944ababd922eac5931e0222862ff082dc29e012816Joe Onorato
1954ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, pos, SEEK_SET);
1964ababd922eac5931e0222862ff082dc29e012816Joe Onorato    err = write(fd, &header, sizeof(chunk_header_v1));
1974ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (err != sizeof(chunk_header_v1)) {
1984ababd922eac5931e0222862ff082dc29e012816Joe Onorato        return errno;
1994ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
2004ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2014ababd922eac5931e0222862ff082dc29e012816Joe Onorato    buf = env->GetStringUTFChars(nameObj, NULL);
2024ababd922eac5931e0222862ff082dc29e012816Joe Onorato    err = write(fd, buf, header.nameLength);
2034ababd922eac5931e0222862ff082dc29e012816Joe Onorato    env->ReleaseStringUTFChars(nameObj, buf);
2044ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (err != header.nameLength) {
2054ababd922eac5931e0222862ff082dc29e012816Joe Onorato        return errno;
2064ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
2074ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2084ababd922eac5931e0222862ff082dc29e012816Joe Onorato    if (namePadding != 0) {
2094ababd922eac5931e0222862ff082dc29e012816Joe Onorato        int zero = 0;
2104ababd922eac5931e0222862ff082dc29e012816Joe Onorato        err = write(fd, &zero, namePadding);
2114ababd922eac5931e0222862ff082dc29e012816Joe Onorato        if (err != namePadding) {
2124ababd922eac5931e0222862ff082dc29e012816Joe Onorato            return errno;
2134ababd922eac5931e0222862ff082dc29e012816Joe Onorato        }
2144ababd922eac5931e0222862ff082dc29e012816Joe Onorato    }
2154ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2164ababd922eac5931e0222862ff082dc29e012816Joe Onorato    lseek(fd, prevPos, SEEK_SET);
2174ababd922eac5931e0222862ff082dc29e012816Joe Onorato    return 0;
2184ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
2194ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2204ababd922eac5931e0222862ff082dc29e012816Joe Onoratostatic const JNINativeMethod g_methods[] = {
2214ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "readHeader_native",
2224528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate       "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I",
2234ababd922eac5931e0222862ff082dc29e012816Joe Onorato       (void*)readHeader_native },
2244ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "skipChunk_native",
2254ababd922eac5931e0222862ff082dc29e012816Joe Onorato        "(Ljava/io/FileDescriptor;I)I",
2264ababd922eac5931e0222862ff082dc29e012816Joe Onorato        (void*)skipChunk_native },
2274ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "allocateHeader_native",
2284528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate        "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;)I",
2294ababd922eac5931e0222862ff082dc29e012816Joe Onorato        (void*)allocateHeader_native },
2304ababd922eac5931e0222862ff082dc29e012816Joe Onorato    { "writeHeader_native",
2314528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate       "(Landroid/app/backup/BackupHelperDispatcher$Header;Ljava/io/FileDescriptor;I)I",
2324ababd922eac5931e0222862ff082dc29e012816Joe Onorato       (void*)writeHeader_native },
2334ababd922eac5931e0222862ff082dc29e012816Joe Onorato};
2344ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2354ababd922eac5931e0222862ff082dc29e012816Joe Onoratoint register_android_backup_BackupHelperDispatcher(JNIEnv* env)
2364ababd922eac5931e0222862ff082dc29e012816Joe Onorato{
2374ababd922eac5931e0222862ff082dc29e012816Joe Onorato    jclass clazz;
2384ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2394ababd922eac5931e0222862ff082dc29e012816Joe Onorato    clazz = env->FindClass("java/io/FileDescriptor");
2404ababd922eac5931e0222862ff082dc29e012816Joe Onorato    LOG_FATAL_IF(clazz == NULL, "Unable to find class java.io.FileDescriptor");
2414ababd922eac5931e0222862ff082dc29e012816Joe Onorato    s_descriptorField = env->GetFieldID(clazz, "descriptor", "I");
2424ababd922eac5931e0222862ff082dc29e012816Joe Onorato    LOG_FATAL_IF(s_descriptorField == NULL,
2434ababd922eac5931e0222862ff082dc29e012816Joe Onorato            "Unable to find descriptor field in java.io.FileDescriptor");
2444ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2454528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate    clazz = env->FindClass("android/app/backup/BackupHelperDispatcher$Header");
2464ababd922eac5931e0222862ff082dc29e012816Joe Onorato    LOG_FATAL_IF(clazz == NULL,
2474528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate            "Unable to find class android.app.backup.BackupHelperDispatcher.Header");
2484ababd922eac5931e0222862ff082dc29e012816Joe Onorato    s_chunkSizeField = env->GetFieldID(clazz, "chunkSize", "I");
2494ababd922eac5931e0222862ff082dc29e012816Joe Onorato    LOG_FATAL_IF(s_chunkSizeField == NULL,
2504528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate            "Unable to find chunkSize field in android.app.backup.BackupHelperDispatcher.Header");
2514ababd922eac5931e0222862ff082dc29e012816Joe Onorato    s_keyPrefixField = env->GetFieldID(clazz, "keyPrefix", "Ljava/lang/String;");
2524ababd922eac5931e0222862ff082dc29e012816Joe Onorato    LOG_FATAL_IF(s_keyPrefixField == NULL,
2534528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate            "Unable to find keyPrefix field in android.app.backup.BackupHelperDispatcher.Header");
2544ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2554528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tate    return AndroidRuntime::registerNativeMethods(env, "android/app/backup/BackupHelperDispatcher",
2564ababd922eac5931e0222862ff082dc29e012816Joe Onorato            g_methods, NELEM(g_methods));
2574ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
2584ababd922eac5931e0222862ff082dc29e012816Joe Onorato
2594ababd922eac5931e0222862ff082dc29e012816Joe Onorato}
260