102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/*
202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * Copyright 2010, The Android Open Source Project
302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root *
402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * you may not use this file except in compliance with the License.
602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * You may obtain a copy of the License at
702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root *
802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root *     http://www.apache.org/licenses/LICENSE-2.0
902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root *
1002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * Unless required by applicable law or agreed to in writing, software
1102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
1202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * See the License for the specific language governing permissions and
1402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * limitations under the License.
1502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */
1602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
1702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define LOG_TAG "ObbScanner"
1802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
1902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include <utils/Log.h>
2002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include <utils/String8.h>
21b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ObbFile.h>
2202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
2302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "jni.h"
242279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/JNIHelp.h>
2502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "utils/misc.h"
2602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "android_runtime/AndroidRuntime.h"
2702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
28987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h"
29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
3002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootnamespace android {
3102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
3202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic struct {
3302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jclass clazz;
3402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
3502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jfieldID packageName;
3602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jfieldID version;
3702ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    jfieldID flags;
383b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    jfieldID salt;
3902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} gObbInfoClassInfo;
4002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
4105105f7abe02b2dff91d6260b3628c8b97816babKenny Rootstatic void android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz, jstring file,
4202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        jobject obbInfo)
4302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{
44dd66bcbf9d6ef0c50a18d9c4b1b39ce7ef7afcc4Elliott Hughes    const char* filePath = env->GetStringUTFChars(file, NULL);
4502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
4602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    sp<ObbFile> obb = new ObbFile();
4702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    if (!obb->readFrom(filePath)) {
4802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        env->ReleaseStringUTFChars(file, filePath);
498451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        jniThrowException(env, "java/io/IOException", "Could not read OBB file");
5005105f7abe02b2dff91d6260b3628c8b97816babKenny Root        return;
5102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    }
5202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
5302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    env->ReleaseStringUTFChars(file, filePath);
5402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
5502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    const char* packageNameStr = obb->getPackageName().string();
5602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
5702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jstring packageName = env->NewStringUTF(packageNameStr);
5802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    if (packageName == NULL) {
598451b25a4422656bbd6657a5855e69c0f4d53c74Elliott Hughes        jniThrowException(env, "java/io/IOException", "Could not read OBB file");
6005105f7abe02b2dff91d6260b3628c8b97816babKenny Root        return;
6102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    }
6202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
6302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    env->SetObjectField(obbInfo, gObbInfoClassInfo.packageName, packageName);
6402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    env->SetIntField(obbInfo, gObbInfoClassInfo.version, obb->getVersion());
6505105f7abe02b2dff91d6260b3628c8b97816babKenny Root    env->SetIntField(obbInfo, gObbInfoClassInfo.flags, obb->getFlags());
663b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root
673b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    size_t saltLen;
683b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    const unsigned char* salt = obb->getSalt(&saltLen);
693b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    if (saltLen > 0) {
703b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        jbyteArray saltArray = env->NewByteArray(saltLen);
713b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        env->SetByteArrayRegion(saltArray, 0, saltLen, (jbyte*)salt);
723b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root        env->SetObjectField(obbInfo, gObbInfoClassInfo.salt, saltArray);
733b1abba6bbc895d63da3e82e9b158c01bd12edddKenny Root    }
7402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}
7502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
7602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/*
7702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * JNI registration.
7802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */
7976f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
8002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    /* name, signature, funcPtr */
8105105f7abe02b2dff91d6260b3628c8b97816babKenny Root    { "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)V",
8202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root            (void*) android_content_res_ObbScanner_getObbInfo },
8302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root};
8402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
8502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootint register_android_content_res_ObbScanner(JNIEnv* env)
8602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{
87987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = FindClassOrDie(env, "android/content/res/ObbInfo");
88987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
89987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gObbInfoClassInfo.packageName = GetFieldIDOrDie(env, clazz, "packageName",
90987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                                    "Ljava/lang/String;");
91987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gObbInfoClassInfo.version = GetFieldIDOrDie(env, clazz, "version", "I");
92987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gObbInfoClassInfo.flags = GetFieldIDOrDie(env, clazz, "flags", "I");
93987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    gObbInfoClassInfo.salt = GetFieldIDOrDie(env, clazz, "salt", "[B");
94987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
95987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return RegisterMethodsOrDie(env, "android/content/res/ObbScanner", gMethods, NELEM(gMethods));
9602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}
9702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
9802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; // namespace android
99