android_content_res_ObbScanner.cpp revision 05105f7abe02b2dff91d6260b3628c8b97816bab
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>
2102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include <utils/ObbFile.h>
2202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
2302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "jni.h"
2402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "utils/misc.h"
2502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#include "android_runtime/AndroidRuntime.h"
2602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
2702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootnamespace android {
2802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
2902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic struct {
3002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jclass clazz;
3102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
3202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jfieldID packageName;
3302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jfieldID version;
3402ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    jfieldID flags;
3502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root} gObbInfoClassInfo;
3602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
3705105f7abe02b2dff91d6260b3628c8b97816babKenny Rootstatic void doThrow(JNIEnv* env, const char* exc, const char* msg = NULL)
3805105f7abe02b2dff91d6260b3628c8b97816babKenny Root{
3905105f7abe02b2dff91d6260b3628c8b97816babKenny Root    jclass npeClazz;
4005105f7abe02b2dff91d6260b3628c8b97816babKenny Root
4105105f7abe02b2dff91d6260b3628c8b97816babKenny Root    npeClazz = env->FindClass(exc);
4205105f7abe02b2dff91d6260b3628c8b97816babKenny Root    LOG_FATAL_IF(npeClazz == NULL, "Unable to find class %s", exc);
4305105f7abe02b2dff91d6260b3628c8b97816babKenny Root
4405105f7abe02b2dff91d6260b3628c8b97816babKenny Root    env->ThrowNew(npeClazz, msg);
4505105f7abe02b2dff91d6260b3628c8b97816babKenny Root}
4605105f7abe02b2dff91d6260b3628c8b97816babKenny Root
4705105f7abe02b2dff91d6260b3628c8b97816babKenny Rootstatic void android_content_res_ObbScanner_getObbInfo(JNIEnv* env, jobject clazz, jstring file,
4802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        jobject obbInfo)
4902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{
5002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    const char* filePath = env->GetStringUTFChars(file, JNI_FALSE);
5102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
5202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    sp<ObbFile> obb = new ObbFile();
5302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    if (!obb->readFrom(filePath)) {
5402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        env->ReleaseStringUTFChars(file, filePath);
5505105f7abe02b2dff91d6260b3628c8b97816babKenny Root        doThrow(env, "java/io/IOException", "Could not read OBB file");
5605105f7abe02b2dff91d6260b3628c8b97816babKenny Root        return;
5702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    }
5802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
5902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    env->ReleaseStringUTFChars(file, filePath);
6002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
6102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    const char* packageNameStr = obb->getPackageName().string();
6202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
6302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    jstring packageName = env->NewStringUTF(packageNameStr);
6402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    if (packageName == NULL) {
6505105f7abe02b2dff91d6260b3628c8b97816babKenny Root        doThrow(env, "java/io/IOException", "Could not read OBB file");
6605105f7abe02b2dff91d6260b3628c8b97816babKenny Root        return;
6702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    }
6802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
6902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    env->SetObjectField(obbInfo, gObbInfoClassInfo.packageName, packageName);
7002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    env->SetIntField(obbInfo, gObbInfoClassInfo.version, obb->getVersion());
7105105f7abe02b2dff91d6260b3628c8b97816babKenny Root    env->SetIntField(obbInfo, gObbInfoClassInfo.flags, obb->getFlags());
7202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}
7302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
7402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root/*
7502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root * JNI registration.
7602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root */
7702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootstatic JNINativeMethod gMethods[] = {
7802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    /* name, signature, funcPtr */
7905105f7abe02b2dff91d6260b3628c8b97816babKenny Root    { "getObbInfo_native", "(Ljava/lang/String;Landroid/content/res/ObbInfo;)V",
8002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root            (void*) android_content_res_ObbScanner_getObbInfo },
8102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root};
8202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
8302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define FIND_CLASS(var, className) \
8402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        var = env->FindClass(className); \
8502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        LOG_FATAL_IF(! var, "Unable to find class " className); \
8602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        var = jclass(env->NewGlobalRef(var));
8702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
8802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root#define GET_FIELD_ID(var, clazz, fieldName, fieldDescriptor) \
8902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        var = env->GetFieldID(clazz, fieldName, fieldDescriptor); \
9002c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root        LOG_FATAL_IF(! var, "Unable to find field " fieldName);
9102c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
9202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Rootint register_android_content_res_ObbScanner(JNIEnv* env)
9302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root{
9402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    FIND_CLASS(gObbInfoClassInfo.clazz, "android/content/res/ObbInfo");
9502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
9602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    GET_FIELD_ID(gObbInfoClassInfo.packageName, gObbInfoClassInfo.clazz,
9702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root            "packageName", "Ljava/lang/String;");
9802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    GET_FIELD_ID(gObbInfoClassInfo.version, gObbInfoClassInfo.clazz,
9902c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root            "version", "I");
10002ca31fbae9f35dd30f79de6927fae11b549391aKenny Root    GET_FIELD_ID(gObbInfoClassInfo.flags, gObbInfoClassInfo.clazz,
10102ca31fbae9f35dd30f79de6927fae11b549391aKenny Root            "flags", "I");
10202c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
10302c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root    return AndroidRuntime::registerNativeMethods(env, "android/content/res/ObbScanner", gMethods,
10402c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root            NELEM(gMethods));
10502c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}
10602c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
10702c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root}; // namespace android
10802c8730c1bf19daf48bec8c6995df676a00a73b1Kenny Root
109