android_util_AssetManager.cpp revision b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_util_AssetManager.cpp
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** Licensed under the Apache License, Version 2.0 (the "License");
669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** you may not use this file except in compliance with the License.
769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
1169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** Unless required by applicable law or agreed to in writing, software
1269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** distributed under the License is distributed on an "AS IS" BASIS,
1369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "asset"
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn#define DEBUG_STYLES(x) //x
2120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#define THROW_ON_BAD_ID 0
22b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/android_util_AssetManager.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "jni.h"
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h"
2769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "ScopedStringChars.h"
2869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes#include "ScopedUtfChars.h"
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h"
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h>
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/Asset.h>
35b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/AssetManager.h>
36b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/ResourceTypes.h>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct typedvalue_offsets_t
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mType;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mData;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mString;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mAssetCookie;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mResourceId;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mChangingConfigurations;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mDensity;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gTypedValueOffsets;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct assetfiledescriptor_offsets_t
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mFd;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mStartOffset;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mLength;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gAssetFileDescriptorOffsets;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct assetmanager_offsets_t
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jfieldID mObject;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gAssetManagerOffsets;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjclass g_stringClass = NULL;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectenum {
720d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    STYLE_NUM_ENTRIES = 6,
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_TYPE = 0,
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_DATA = 1,
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_ASSET_COOKIE = 2,
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    STYLE_RESOURCE_ID = 3,
770d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    STYLE_CHANGING_CONFIGURATIONS = 4,
780d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    STYLE_DENSITY = 5
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint copyValue(JNIEnv* env, jobject outValue, const ResTable* table,
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      const Res_value& value, uint32_t ref, ssize_t block,
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                      uint32_t typeSpecFlags, ResTable_config* config = NULL);
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint copyValue(JNIEnv* env, jobject outValue, const ResTable* table,
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               const Res_value& value, uint32_t ref, ssize_t block,
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project               uint32_t typeSpecFlags, ResTable_config* config)
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mType, value.dataType);
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mAssetCookie,
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        (jint)table->getTableCookie(block));
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mData, value.data);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetObjectField(outValue, gTypedValueOffsets.mString, NULL);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mResourceId, ref);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(outValue, gTypedValueOffsets.mChangingConfigurations,
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            typeSpecFlags);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (config != NULL) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntField(outValue, gTypedValueOffsets.mDensity, config->density);
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return block;
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// this guy is exported to other jni routines
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectAssetManager* assetManagerForJavaObject(JNIEnv* env, jobject obj)
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = (AssetManager*)env->GetIntField(obj, gAssetManagerOffsets.mObject);
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am != NULL) {
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return am;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jniThrowException(env, "java/lang/IllegalStateException", "AssetManager has been finalized!");
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz,
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jstring fileName, jint mode)
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openAsset in %p (Java object %p)\n", am, clazz);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
12769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {
1334d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    Asset* a = am->open(fileName8.c_str(), (Asset::AccessMode)mode);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
14069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)a;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject returnParcelFileDescriptor(JNIEnv* env, Asset* a, jlongArray outOffsets)
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
151ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root    off64_t startOffset, length;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int fd = a->openFileDescriptor(&startOffset, &length);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete a;
15469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fd < 0) {
1564d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/io/FileNotFoundException",
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "This file can not be opened as a file descriptor; it is probably compressed");
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jlong* offsets = (jlong*)env->GetPrimitiveArrayCritical(outOffsets, 0);
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (offsets == NULL) {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(fd);
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    offsets[0] = startOffset;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    offsets[1] = length;
16969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outOffsets, offsets, 0);
17169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
172a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes    jobject fileDesc = jniCreateFileDescriptor(env, fd);
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (fileDesc == NULL) {
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        close(fd);
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return newParcelFileDescriptor(env, fileDesc);
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_content_AssetManager_openAssetFd(JNIEnv* env, jobject clazz,
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jstring fileName, jlongArray outOffsets)
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18971f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openAssetFd in %p (Java object %p)\n", am, clazz);
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
19269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    Asset* a = am->open(fileName8.c_str(), Asset::ACCESS_RANDOM);
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
19969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnParcelFileDescriptor(env, a, outOffsets);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_openNonAssetNative(JNIEnv* env, jobject clazz,
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint cookie,
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jstring fileName,
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint mode)
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openNonAssetNative in %p (Java object %p)\n", am, clazz);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
22169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) {
2274d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode");
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = cookie
23269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        ? am->openNonAsset((void*)cookie, fileName8.c_str(), (Asset::AccessMode)mode)
23369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        : am->openNonAsset(fileName8.c_str(), (Asset::AccessMode)mode);
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
23669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)a;
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_content_AssetManager_openNonAssetFdNative(JNIEnv* env, jobject clazz,
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint cookie,
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jstring fileName,
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jlongArray outOffsets)
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openNonAssetFd in %p (Java object %p)\n", am, clazz);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
25869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = cookie
26369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        ? am->openNonAsset((void*)cookie, fileName8.c_str(), Asset::ACCESS_RANDOM)
26469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_RANDOM);
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
26769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Created Asset Stream: %p\n", a);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return returnParcelFileDescriptor(env, a, outOffsets);
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz,
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jstring fileName)
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
28569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    AssetDir* dir = am->openDir(fileName8.c_str());
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dir == NULL) {
29269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass cls = env->FindClass("java/lang/String");
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(cls == NULL, "No string class?!?");
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (cls == NULL) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete dir;
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t N = dir->getFileCount();
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobjectArray array = env->NewObjectArray(dir->getFileCount(),
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                cls, NULL);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (array == NULL) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete dir;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; i<N; i++) {
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const String8& name = dir->getFileName(i);
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jstring str = env->NewStringUTF(name.string());
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str == NULL) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete dir;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetObjectArrayElement(array, i, str);
3204d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        env->DeleteLocalRef(str);
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete dir;
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_destroyAsset(JNIEnv* env, jobject clazz,
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jint asset)
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = (Asset*)asset;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //printf("Destroying Asset Stream: %p\n", a);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
33669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete a;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_readAssetChar(JNIEnv* env, jobject clazz,
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                    jint asset)
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = (Asset*)asset;
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
34969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint8_t b;
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t res = a->read(&b, 1);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return res == 1 ? b : -1;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_readAsset(JNIEnv* env, jobject clazz,
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jint asset, jbyteArray bArray,
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jint off, jint len)
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = (Asset*)asset;
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL || bArray == NULL) {
36569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (len == 0) {
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
37269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize bLen = env->GetArrayLength(bArray);
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (off < 0 || off >= bLen || len < 0 || len > bLen || (off+len) > bLen) {
3754d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "");
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jbyte* b = env->GetByteArrayElements(bArray, NULL);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t res = a->read(b+off, len);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleaseByteArrayElements(bArray, b, 0);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res > 0) return res;
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (res < 0) {
3864d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/io/IOException", "");
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return -1;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_seekAsset(JNIEnv* env, jobject clazz,
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 jint asset,
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                 jlong offset, jint whence)
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = (Asset*)asset;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
39869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a->seek(
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        offset, (whence > 0) ? SEEK_END : (whence < 0 ? SEEK_SET : SEEK_CUR));
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_getAssetLength(JNIEnv* env, jobject clazz,
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                      jint asset)
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = (Asset*)asset;
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
41269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a->getLength();
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_getAssetRemainingLength(JNIEnv* env, jobject clazz,
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                               jint asset)
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = (Asset*)asset;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
42569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "asset");
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return -1;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return a->getRemainingLength();
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_addAssetPath(JNIEnv* env, jobject clazz,
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       jstring path)
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
43569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars path8(env, path);
43669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (path8.c_str() == NULL) {
437129e19cb37b1d30f8c46f77a3853d347c3e78bb3Glenn Kasten        return 0;
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
442129e19cb37b1d30f8c46f77a3853d347c3e78bb3Glenn Kasten        return 0;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void* cookie;
44669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    bool res = am->addAssetPath(String8(path8.c_str()), &cookie);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (res) ? (jint)cookie : 0;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_isUpToDate(JNIEnv* env, jobject clazz)
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_TRUE;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return am->isUpToDate() ? JNI_TRUE : JNI_FALSE;
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_setLocale(JNIEnv* env, jobject clazz,
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                jstring locale)
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
46369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars locale8(env, locale);
46469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (locale8.c_str() == NULL) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
47369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    am->setLocale(locale8.c_str());
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_getLocales(JNIEnv* env, jobject clazz)
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Vector<String8> locales;
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    am->getLocales(&locales);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int N = locales.size();
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobjectArray result = env->NewObjectArray(N, g_stringClass, NULL);
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result == NULL) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (int i=0; i<N; i++) {
4950db187a3e62074af6a22802bded52a921f69e7dfGilles Debunne        jstring str = env->NewStringUTF(locales[i].string());
4964d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        if (str == NULL) {
4974d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            return NULL;
4984d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        }
4994d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        env->SetObjectArrayElement(result, i, str);
5004d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        env->DeleteLocalRef(str);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject clazz,
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint mcc, jint mnc,
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jstring locale, jint orientation,
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint touchscreen, jint density,
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint keyboard, jint keyboardHidden,
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint navigation,
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                          jint screenWidth, jint screenHeight,
51369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn                                                          jint smallestScreenWidthDp,
5143fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn                                                          jint screenWidthDp, jint screenHeightDp,
51527b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                                          jint screenLayout, jint uiMode,
51627b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel                                                          jint sdkVersion)
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable_config config;
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    memset(&config, 0, sizeof(config));
52569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char* locale8 = locale != NULL ? env->GetStringUTFChars(locale, NULL) : NULL;
52769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.mcc = (uint16_t)mcc;
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.mnc = (uint16_t)mnc;
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.orientation = (uint8_t)orientation;
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.touchscreen = (uint8_t)touchscreen;
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.density = (uint16_t)density;
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.keyboard = (uint8_t)keyboard;
534c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn    config.inputFlags = (uint8_t)keyboardHidden;
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.navigation = (uint8_t)navigation;
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.screenWidth = (uint16_t)screenWidth;
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.screenHeight = (uint16_t)screenHeight;
53869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    config.smallestScreenWidthDp = (uint16_t)smallestScreenWidthDp;
5393fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn    config.screenWidthDp = (uint16_t)screenWidthDp;
5403fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn    config.screenHeightDp = (uint16_t)screenHeightDp;
541723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn    config.screenLayout = (uint8_t)screenLayout;
54227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel    config.uiMode = (uint8_t)uiMode;
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.sdkVersion = (uint16_t)sdkVersion;
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    config.minorVersion = 0;
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    am->setConfiguration(config, locale8);
54669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (locale != NULL) env->ReleaseStringUTFChars(locale, locale8);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getResourceIdentifier(JNIEnv* env, jobject clazz,
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jstring name,
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jstring defType,
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jstring defPackage)
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
55569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedStringChars name16(env, name);
55669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (name16.get() == NULL) {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char16_t* defType16 = defType
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringChars(defType, NULL) : NULL;
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize defTypeLen = defType
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringLength(defType) : 0;
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const char16_t* defPackage16 = defPackage
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringChars(defPackage, NULL) : NULL;
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize defPackageLen = defPackage
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ? env->GetStringLength(defPackage) : 0;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint ident = am->getResources().identifierForName(
57569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        name16.get(), name16.size(), defType16, defTypeLen, defPackage16, defPackageLen);
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (defPackage16) {
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(defPackage, defPackage16);
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (defType16) {
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleaseStringChars(defType, defType16);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return ident;
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceName(JNIEnv* env, jobject clazz,
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                            jint resid)
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!am->getResources().getResourceName(resid, &name)) {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String16 str;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.package != NULL) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str.setTo(name.package, name.packageLen);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.type != NULL) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str.size() > 0) {
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char16_t div = ':';
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str.append(&div, 1);
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str.append(name.type, name.typeLen);
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.name != NULL) {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (str.size() > 0) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            char16_t div = '/';
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            str.append(&div, 1);
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str.append(name.name, name.nameLen);
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return env->NewString((const jchar*)str.string(), str.size());
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourcePackageName(JNIEnv* env, jobject clazz,
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                   jint resid)
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
62969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!am->getResources().getResourceName(resid, &name)) {
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.package != NULL) {
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return env->NewString((const jchar*)name.package, name.packageLen);
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceTypeName(JNIEnv* env, jobject clazz,
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                jint resid)
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
64969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!am->getResources().getResourceName(resid, &name)) {
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.type != NULL) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return env->NewString((const jchar*)name.type, name.typeLen);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
65869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceEntryName(JNIEnv* env, jobject clazz,
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                 jint resid)
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
66969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::resource_name name;
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!am->getResources().getResourceName(resid, &name)) {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
67469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.name != NULL) {
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return env->NewString((const jchar*)name.name, name.nameLen);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
67869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NULL;
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadResourceValue(JNIEnv* env, jobject clazz,
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jint ident,
68455fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root                                                           jshort density,
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jobject outValue,
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jboolean resolve)
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable_config config;
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSpecFlags;
69755fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root    ssize_t block = res.getResource(ident, &value, false, density, &typeSpecFlags, &config);
69820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
69920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn    if (block == BAD_INDEX) {
70020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
70120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        return 0;
70220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn    }
70320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t ref = ident;
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (resolve) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = res.resolveReference(&value, block, &ref);
70720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
70820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
70920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
71020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return 0;
71120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
71220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags, &config) : block;
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadResourceBagValue(JNIEnv* env, jobject clazz,
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jint ident, jint bagEntryId,
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jobject outValue, jboolean resolve)
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
72669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
72969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = -1;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* entry = NULL;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSpecFlags;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t entryCount = res.getBagLocked(ident, &entry, &typeSpecFlags);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (ssize_t i=0; i<entryCount; i++) {
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (((uint32_t)bagEntryId) == entry->map.name.ident) {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block = entry->stringBlock;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value = entry->map.value;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        entry++;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (block < 0) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return block;
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t ref = ident;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (resolve) {
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = res.resolveReference(&value, block, &ref, &typeSpecFlags);
75420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
75520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
75620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
75720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return 0;
75820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
75920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags) : block;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getStringBlockCount(JNIEnv* env, jobject clazz)
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return am->getResources().getTableCount();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getNativeStringBlock(JNIEnv* env, jobject clazz,
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                           jint block)
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)am->getResources().getTableStringBlock(block);
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getCookieName(JNIEnv* env, jobject clazz,
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       jint cookie)
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    String8 name(am->getAssetPath((void*)cookie));
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (name.length() == 0) {
7924d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "Empty cookie name");
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jstring str = env->NewStringUTF(name.string());
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return str;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_newTheme(JNIEnv* env, jobject clazz)
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)(new ResTable::Theme(am->getResources()));
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_deleteTheme(JNIEnv* env, jobject clazz,
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                     jint themeInt)
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* theme = (ResTable::Theme*)themeInt;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete theme;
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_applyThemeStyle(JNIEnv* env, jobject clazz,
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint themeInt,
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint styleRes,
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jboolean force)
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* theme = (ResTable::Theme*)themeInt;
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    theme->applyStyle(styleRes, force ? true : false);
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_copyTheme(JNIEnv* env, jobject clazz,
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jint destInt, jint srcInt)
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* dest = (ResTable::Theme*)destInt;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* src = (ResTable::Theme*)srcInt;
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    dest->setTo(*src);
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadThemeAttributeValue(
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    JNIEnv* env, jobject clazz, jint themeInt, jint ident, jobject outValue, jboolean resolve)
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* theme = (ResTable::Theme*)themeInt;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(theme->getResTable());
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX value could be different in different configs!
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSpecFlags = 0;
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = theme->getAttribute(ident, &value, &typeSpecFlags);
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t ref = 0;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (resolve) {
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = res.resolveReference(&value, block, &ref, &typeSpecFlags);
84520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
84620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
84720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
84820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return 0;
84920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
85020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags) : block;
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_dumpTheme(JNIEnv* env, jobject clazz,
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jint themeInt, jint pri,
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                   jstring tag, jstring prefix)
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* theme = (ResTable::Theme*)themeInt;
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(theme->getResTable());
86169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XXX Need to use params.
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    theme->dumpToLog();
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject clazz,
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint themeToken,
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint defStyleAttr,
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint defStyleRes,
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint xmlParserToken,
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray attrs,
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outValues,
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outIndices)
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8754d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (themeToken == 0) {
87669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "theme token");
8774d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
8784d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
8794d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (attrs == NULL) {
88069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "attrs");
8814d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
8824d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
8834d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (outValues == NULL) {
88469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "out values");
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
888b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn    DEBUG_STYLES(LOGI("APPLY STYLE: theme=0x%x defStyleAttr=0x%x defStyleRes=0x%x xml=0x%x",
889b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn        themeToken, defStyleAttr, defStyleRes, xmlParserToken));
89069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResTable::Theme* theme = (ResTable::Theme*)themeToken;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res = theme->getResTable();
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken;
8940d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    ResTable_config config;
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NI = env->GetArrayLength(attrs);
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NV = env->GetArrayLength(outValues);
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (NV < (NI*STYLE_NUM_ENTRIES)) {
9004d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small");
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0);
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (src == NULL) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* dest = baseDest;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dest == NULL) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(attrs, src, 0);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* indices = NULL;
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int indicesIdx = 0;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outIndices != NULL) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (env->GetArrayLength(outIndices) > NI) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices = (jint*)env->GetPrimitiveArrayCritical(outIndices, 0);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Load default style from attribute, if specified...
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t defStyleBagTypeSetFlags = 0;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (defStyleAttr != 0) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Res_value value;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (theme->getAttribute(defStyleAttr, &value, &defStyleBagTypeSetFlags) >= 0) {
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == Res_value::TYPE_REFERENCE) {
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                defStyleRes = value.data;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the style class associated with the current XML tag.
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int style = 0;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t styleBagTypeSetFlags = 0;
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (xmlParser != NULL) {
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t idx = xmlParser->indexOfStyle();
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (idx >= 0 && xmlParser->getAttributeValue(idx, &value) >= 0) {
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == value.TYPE_ATTRIBUTE) {
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (theme->getAttribute(value.data, &value, &styleBagTypeSetFlags) < 0) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    value.dataType = Res_value::TYPE_NULL;
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == value.TYPE_REFERENCE) {
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                style = value.data;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the default style bag, if requested.
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* defStyleEnt = NULL;
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t defStyleTypeSetFlags = 0;
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t bagOff = defStyleRes != 0
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ? res.getBagLocked(defStyleRes, &defStyleEnt, &defStyleTypeSetFlags) : -1;
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    defStyleTypeSetFlags |= defStyleBagTypeSetFlags;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* endDefStyleEnt = defStyleEnt +
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (bagOff >= 0 ? bagOff : 0);
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the style class bag, if requested.
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* styleEnt = NULL;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t styleTypeSetFlags = 0;
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bagOff = style != 0 ? res.getBagLocked(style, &styleEnt, &styleTypeSetFlags) : -1;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    styleTypeSetFlags |= styleBagTypeSetFlags;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* endStyleEnt = styleEnt +
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (bagOff >= 0 ? bagOff : 0);
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the XML attributes, if requested.
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NX = xmlParser ? xmlParser->getAttributeCount() : 0;
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize ix=0;
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t curXmlAttr = xmlParser ? xmlParser->getAttributeNameResID(ix) : 0;
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const ssize_t kXmlBlock = 0x10000000;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now iterate through all of the attributes that the client has requested,
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // filling in each with whatever data we can find.
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = 0;
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSetFlags;
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jsize ii=0; ii<NI; ii++) {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const uint32_t curIdent = (uint32_t)src[ii];
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
986b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn        DEBUG_STYLES(LOGI("RETRIEVING ATTR 0x%08x...", curIdent));
98769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Try to find a value for this attribute...  we prioritize values
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // coming from, first XML attributes, then XML style, then default
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // style, and finally the theme.
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.dataType = Res_value::TYPE_NULL;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.data = 0;
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typeSetFlags = 0;
9940d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        config.density = 0;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through XML attributes until the end or the next possible match.
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (ix < NX && curIdent > curXmlAttr) {
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current XML attribute if it matches, and step to next.
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ix < NX && curIdent == curXmlAttr) {
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block = kXmlBlock;
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            xmlParser->getAttributeValue(ix, &value);
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
1007b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn            DEBUG_STYLES(LOGI("-> From XML: type=0x%x, data=0x%08x",
1008b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                    value.dataType, value.data));
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through the style values until the end or the next possible match.
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (styleEnt < endStyleEnt && curIdent > styleEnt->map.name.ident) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            styleEnt++;
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current style attribute if it matches, and step to next.
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (styleEnt < endStyleEnt && curIdent == styleEnt->map.name.ident) {
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == Res_value::TYPE_NULL) {
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                block = styleEnt->stringBlock;
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                typeSetFlags = styleTypeSetFlags;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = styleEnt->map.value;
1021b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> From style: type=0x%x, data=0x%08x",
1022b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            styleEnt++;
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through the default style values until the end or the next possible match.
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (defStyleEnt < endDefStyleEnt && curIdent > defStyleEnt->map.name.ident) {
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            defStyleEnt++;
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current default style attribute if it matches, and step to next.
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (defStyleEnt < endDefStyleEnt && curIdent == defStyleEnt->map.name.ident) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (value.dataType == Res_value::TYPE_NULL) {
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                block = defStyleEnt->stringBlock;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                typeSetFlags = defStyleTypeSetFlags;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                value = defStyleEnt->map.value;
1037b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> From def style: type=0x%x, data=0x%08x",
1038b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            defStyleEnt++;
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t resid = 0;
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType != Res_value::TYPE_NULL) {
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Take care of resolving the found resource to its final value.
10460d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn            ssize_t newBlock = theme->resolveAttributeReference(&value, block,
10470d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                    &resid, &typeSetFlags, &config);
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) block = newBlock;
1049b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn            DEBUG_STYLES(LOGI("-> Resolved attr: type=0x%x, data=0x%08x",
1050b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                    value.dataType, value.data));
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // If we still don't have a value for this attribute, try to find
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // it in the theme!
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ssize_t newBlock = theme->getAttribute(curIdent, &value, &typeSetFlags);
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) {
1056b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> From theme: type=0x%x, data=0x%08x",
1057b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10580d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                newBlock = res.resolveReference(&value, block, &resid,
10590d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                        &typeSetFlags, &config);
106020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
106120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                if (newBlock == BAD_INDEX) {
106220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                    jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
106320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                    return JNI_FALSE;
106420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                }
106520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (newBlock >= 0) block = newBlock;
1067b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                DEBUG_STYLES(LOGI("-> Resolved theme: type=0x%x, data=0x%08x",
1068b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                        value.dataType, value.data));
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deal with the special @null value -- it turns back to TYPE_NULL.
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) {
1074b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn            DEBUG_STYLES(LOGI("-> Setting to @null!"));
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value.dataType = Res_value::TYPE_NULL;
10767fbe4d2e7445ad4db07a42c74fe2934af46d1c7fKenny Root            block = kXmlBlock;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1079b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn        DEBUG_STYLES(LOGI("Attribute 0x%08x: type=0x%x, data=0x%08x",
1080b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn                curIdent, value.dataType, value.data));
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the final value back to Java.
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_TYPE] = value.dataType;
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_DATA] = value.data;
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_ASSET_COOKIE] =
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block != kXmlBlock ? (jint)res.getTableCookie(block) : (jint)-1;
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_RESOURCE_ID] = resid;
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags;
10890d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        dest[STYLE_DENSITY] = config.density;
109069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (indices != NULL && value.dataType != Res_value::TYPE_NULL) {
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indicesIdx++;
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices[indicesIdx] = ii;
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
109569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest += STYLE_NUM_ENTRIES;
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (indices != NULL) {
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indices[0] = indicesIdx;
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(outIndices, indices, 0);
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0);
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(attrs, src, 0);
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_TRUE;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, jobject clazz,
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint xmlParserToken,
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray attrs,
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outValues,
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outIndices)
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
11174d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (xmlParserToken == 0) {
111869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "xmlParserToken");
11194d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
11204d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
11214d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (attrs == NULL) {
112269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "attrs");
11234d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        return JNI_FALSE;
11244d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    }
11254d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne    if (outValues == NULL) {
112669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "out values");
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
112969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken;
11360d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    ResTable_config config;
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
113869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NI = env->GetArrayLength(attrs);
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NV = env->GetArrayLength(outValues);
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (NV < (NI*STYLE_NUM_ENTRIES)) {
11424d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small");
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
114569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0);
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (src == NULL) {
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
115069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* dest = baseDest;
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dest == NULL) {
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(attrs, src, 0);
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
115769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* indices = NULL;
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int indicesIdx = 0;
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outIndices != NULL) {
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (env->GetArrayLength(outIndices) > NI) {
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices = (jint*)env->GetPrimitiveArrayCritical(outIndices, 0);
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
116869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Retrieve the XML attributes, if requested.
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NX = xmlParser->getAttributeCount();
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jsize ix=0;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t curXmlAttr = xmlParser->getAttributeNameResID(ix);
117369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const ssize_t kXmlBlock = 0x10000000;
117569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now iterate through all of the attributes that the client has requested,
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // filling in each with whatever data we can find.
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block = 0;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSetFlags;
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (jsize ii=0; ii<NI; ii++) {
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const uint32_t curIdent = (uint32_t)src[ii];
118269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Try to find a value for this attribute...
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.dataType = Res_value::TYPE_NULL;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value.data = 0;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typeSetFlags = 0;
11870d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        config.density = 0;
118869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Skip through XML attributes until the end or the next possible match.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (ix < NX && curIdent > curXmlAttr) {
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Retrieve the current XML attribute if it matches, and step to next.
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ix < NX && curIdent == curXmlAttr) {
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block = kXmlBlock;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            xmlParser->getAttributeValue(ix, &value);
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ix++;
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            curXmlAttr = xmlParser->getAttributeNameResID(ix);
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
120169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("Attribute 0x%08x: type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data);
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t resid = 0;
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType != Res_value::TYPE_NULL) {
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Take care of resolving the found resource to its final value.
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //printf("Resolving attribute reference\n");
12070d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn            ssize_t newBlock = res.resolveReference(&value, block, &resid,
12080d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                    &typeSetFlags, &config);
120920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
121020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            if (newBlock == BAD_INDEX) {
121120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
121220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                return JNI_FALSE;
121320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            }
121420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) block = newBlock;
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
121769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deal with the special @null value -- it turns back to TYPE_NULL.
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) {
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value.dataType = Res_value::TYPE_NULL;
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
122269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("Attribute 0x%08x: final type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data);
122469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the final value back to Java.
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_TYPE] = value.dataType;
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_DATA] = value.data;
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_ASSET_COOKIE] =
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            block != kXmlBlock ? (jint)res.getTableCookie(block) : (jint)-1;
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_RESOURCE_ID] = resid;
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags;
12320d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        dest[STYLE_DENSITY] = config.density;
123369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (indices != NULL && value.dataType != Res_value::TYPE_NULL) {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indicesIdx++;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            indices[indicesIdx] = ii;
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
123869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest += STYLE_NUM_ENTRIES;
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
124169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
124369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (indices != NULL) {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        indices[0] = indicesIdx;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->ReleasePrimitiveArrayCritical(outIndices, indices, 0);
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
124869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0);
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(attrs, src, 0);
125169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return JNI_TRUE;
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getArraySize(JNIEnv* env, jobject clazz,
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                       jint id)
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
1260d7c8672ccc8ccd1f99da60accc63d6817d41ac52Olivier Bailly        return 0;
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
126369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* defStyleEnt = NULL;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t bagOff = res.getBagLocked(id, &defStyleEnt);
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
126869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return bagOff;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject clazz,
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jint id,
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                        jintArray outValues)
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (outValues == NULL) {
127769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowNullPointerException(env, "out values");
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
128069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
12860d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn    ResTable_config config;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t block;
128969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const jsize NV = env->GetArrayLength(outValues);
129169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0);
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jint* dest = baseDest;
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (dest == NULL) {
12954d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/OutOfMemoryError", "");
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return JNI_FALSE;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
129869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Now lock down the resource object and start pulling stuff from it.
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.lock();
130169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* arrayEnt = NULL;
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t arrayTypeSetFlags = 0;
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ssize_t bagOff = res.getBagLocked(id, &arrayEnt, &arrayTypeSetFlags);
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* endArrayEnt = arrayEnt +
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (bagOff >= 0 ? bagOff : 0);
130769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int i = 0;
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    uint32_t typeSetFlags;
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (i < NV && arrayEnt < endArrayEnt) {
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        block = arrayEnt->stringBlock;
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        typeSetFlags = arrayTypeSetFlags;
13130d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        config.density = 0;
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = arrayEnt->map.value;
131569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        uint32_t resid = 0;
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType != Res_value::TYPE_NULL) {
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Take care of resolving the found resource to its final value.
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //printf("Resolving attribute reference\n");
13200d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn            ssize_t newBlock = res.resolveReference(&value, block, &resid,
13210d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn                    &typeSetFlags, &config);
132220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
132320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            if (newBlock == BAD_INDEX) {
132420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
132520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn                return JNI_FALSE;
132620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            }
132720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (newBlock >= 0) block = newBlock;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Deal with the special @null value -- it turns back to TYPE_NULL.
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) {
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            value.dataType = Res_value::TYPE_NULL;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //printf("Attribute 0x%08x: final type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data);
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Write the final value back to Java.
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_TYPE] = value.dataType;
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_DATA] = value.data;
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_ASSET_COOKIE] = (jint)res.getTableCookie(block);
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_RESOURCE_ID] = resid;
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags;
13440d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn        dest[STYLE_DENSITY] = config.density;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        dest += STYLE_NUM_ENTRIES;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        i+= STYLE_NUM_ENTRIES;
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        arrayEnt++;
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
134969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    i /= STYLE_NUM_ENTRIES;
135169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlock();
135369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0);
135569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return i;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobject clazz,
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jint cookie,
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                         jstring fileName)
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
136871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("openXmlAsset in %p (Java object %p)\n", am, clazz);
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
137069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    ScopedUtfChars fileName8(env, fileName);
137169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes    if (fileName8.c_str() == NULL) {
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Asset* a = cookie
137669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        ? am->openNonAsset((void*)cookie, fileName8.c_str(), Asset::ACCESS_BUFFER)
137769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_BUFFER);
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (a == NULL) {
138069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes        jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str());
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    ResXMLTree* block = new ResXMLTree();
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = block->setTo(a->getBuffer(true), a->getLength(), true);
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    a->close();
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    delete a;
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR) {
13904d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/io/FileNotFoundException", "Corrupt XML binary file");
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return (jint)block;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jintArray android_content_AssetManager_getArrayStringInfo(JNIEnv* env, jobject clazz,
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                 jint arrayResId)
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* startOfBag;
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t N = res.lockBag(arrayResId, &startOfBag);
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (N < 0) {
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jintArray array = env->NewIntArray(N * 2);
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (array == NULL) {
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res.unlockBag(startOfBag);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* bag = startOfBag;
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i = 0, j = 0; ((ssize_t)i)<N; i++, bag++) {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint stringIndex = -1;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jint stringBlock = 0;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = bag->map.value;
142469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Take care of resolving the found resource to its final value.
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stringBlock = res.resolveReference(&value, bag->stringBlock, NULL);
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_STRING) {
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stringIndex = value.data;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
143069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
143120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
143220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (stringBlock == BAD_INDEX) {
143320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
143420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return array;
143520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
143620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
143769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //todo: It might be faster to allocate a C array to contain
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //      the blocknums and indices, put them in there and then
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //      do just one SetIntArrayRegion()
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntArrayRegion(array, j, 1, &stringBlock);
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntArrayRegion(array, j + 1, 1, &stringIndex);
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        j = j + 2;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlockBag(startOfBag);
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_getArrayStringResource(JNIEnv* env, jobject clazz,
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                        jint arrayResId)
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass cls = env->FindClass("java/lang/String");
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(cls == NULL, "No string class?!?");
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (cls == NULL) {
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* startOfBag;
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t N = res.lockBag(arrayResId, &startOfBag);
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (N < 0) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jobjectArray array = env->NewObjectArray(N, cls, NULL);
1471485dd21bbefde378c392da3de48887aee9fabebeKenny Root    if (env->ExceptionCheck()) {
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res.unlockBag(startOfBag);
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* bag = startOfBag;
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    size_t strLen = 0;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; ((ssize_t)i)<N; i++, bag++) {
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = bag->map.value;
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        jstring str = NULL;
1482780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Take care of resolving the found resource to its final value.
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t block = res.resolveReference(&value, bag->stringBlock, NULL);
148520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
148620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
148720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
148820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return array;
148920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
149020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType == Res_value::TYPE_STRING) {
1492780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            const ResStringPool* pool = res.getTableStringBlock(block);
1493780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            const char* str8 = pool->string8At(value.data, &strLen);
1494780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            if (str8 != NULL) {
1495780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root                str = env->NewStringUTF(str8);
1496780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root            } else {
1497780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root                const char16_t* str16 = pool->stringAt(value.data, &strLen);
1498780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root                str = env->NewString(str16, strLen);
1499485dd21bbefde378c392da3de48887aee9fabebeKenny Root            }
1500485dd21bbefde378c392da3de48887aee9fabebeKenny Root
1501485dd21bbefde378c392da3de48887aee9fabebeKenny Root            // If one of our NewString{UTF} calls failed due to memory, an
1502485dd21bbefde378c392da3de48887aee9fabebeKenny Root            // exception will be pending.
1503485dd21bbefde378c392da3de48887aee9fabebeKenny Root            if (env->ExceptionCheck()) {
1504485dd21bbefde378c392da3de48887aee9fabebeKenny Root                res.unlockBag(startOfBag);
1505485dd21bbefde378c392da3de48887aee9fabebeKenny Root                return NULL;
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1507780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root
15084d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            env->SetObjectArrayElement(array, i, str);
1509485dd21bbefde378c392da3de48887aee9fabebeKenny Root
15104d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            // str is not NULL at that point, otherwise ExceptionCheck would have been true.
15114d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            // If we have a large amount of strings in our array, we might
15124d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne            // overflow the local reference table of the VM.
1513485dd21bbefde378c392da3de48887aee9fabebeKenny Root            env->DeleteLocalRef(str);
1514485dd21bbefde378c392da3de48887aee9fabebeKenny Root        }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlockBag(startOfBag);
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jintArray android_content_AssetManager_getArrayIntResource(JNIEnv* env, jobject clazz,
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                                        jint arrayResId)
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = assetManagerForJavaObject(env, clazz);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable& res(am->getResources());
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* startOfBag;
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ssize_t N = res.lockBag(arrayResId, &startOfBag);
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (N < 0) {
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jintArray array = env->NewIntArray(N);
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (array == NULL) {
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        res.unlockBag(startOfBag);
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NULL;
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Res_value value;
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const ResTable::bag_entry* bag = startOfBag;
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    for (size_t i=0; ((ssize_t)i)<N; i++, bag++) {
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        value = bag->map.value;
154569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Take care of resolving the found resource to its final value.
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ssize_t block = res.resolveReference(&value, bag->stringBlock, NULL);
154820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID
154920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        if (block == BAD_INDEX) {
155020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!");
155120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn            return array;
155220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn        }
155320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (value.dataType >= Res_value::TYPE_FIRST_INT
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                && value.dataType <= Res_value::TYPE_LAST_INT) {
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int intVal = value.data;
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            env->SetIntArrayRegion(array, i, 1, &intVal);
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    res.unlockBag(startOfBag);
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return array;
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_init(JNIEnv* env, jobject clazz)
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = new AssetManager();
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am == NULL) {
15684d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne        jniThrowException(env, "java/lang/OutOfMemoryError", "");
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    am->addDefaultAssets();
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
157471f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("Created AssetManager %p for Java object %p\n", am, clazz);
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    env->SetIntField(clazz, gAssetManagerOffsets.mObject, (jint)am);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_destroy(JNIEnv* env, jobject clazz)
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    AssetManager* am = (AssetManager*)
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (env->GetIntField(clazz, gAssetManagerOffsets.mObject));
158271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block    ALOGV("Destroying AssetManager %p for Java object %p\n", am, clazz);
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (am != NULL) {
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        delete am;
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        env->SetIntField(clazz, gAssetManagerOffsets.mObject, 0);
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getGlobalAssetCount(JNIEnv* env, jobject clazz)
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return Asset::getGlobalCount();
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
159482e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackbornstatic jobject android_content_AssetManager_getAssetAllocations(JNIEnv* env, jobject clazz)
159582e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn{
159682e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    String8 alloc = Asset::getAssetAllocations();
159782e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    if (alloc.length() <= 0) {
159882e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn        return NULL;
159982e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    }
160069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes
160182e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    jstring str = env->NewStringUTF(alloc.string());
160282e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    return str;
160382e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn}
160482e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getGlobalAssetManagerCount(JNIEnv* env, jobject clazz)
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AssetManager::getGlobalCount();
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ----------------------------------------------------------------------------
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration.
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gAssetManagerMethods[] = {
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /* name, signature, funcPtr */
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Basic asset stuff.
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openAsset",      "(Ljava/lang/String;I)I",
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openAsset },
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openAssetFd",      "(Ljava/lang/String;[J)Landroid/os/ParcelFileDescriptor;",
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openAssetFd },
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openNonAssetNative", "(ILjava/lang/String;I)I",
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openNonAssetNative },
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openNonAssetFdNative", "(ILjava/lang/String;[J)Landroid/os/ParcelFileDescriptor;",
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openNonAssetFdNative },
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "list",           "(Ljava/lang/String;)[Ljava/lang/String;",
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_list },
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "destroyAsset",   "(I)V",
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_destroyAsset },
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "readAssetChar",  "(I)I",
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_readAssetChar },
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "readAsset",      "(I[BII)I",
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_readAsset },
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "seekAsset",      "(IJI)J",
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_seekAsset },
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getAssetLength", "(I)J",
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getAssetLength },
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getAssetRemainingLength", "(I)J",
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getAssetRemainingLength },
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "addAssetPath",   "(Ljava/lang/String;)I",
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_addAssetPath },
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "isUpToDate",     "()Z",
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_isUpToDate },
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Resources.
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "setLocale",      "(Ljava/lang/String;)V",
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_setLocale },
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getLocales",      "()[Ljava/lang/String;",
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getLocales },
165169cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn    { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIII)V",
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_setConfiguration },
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceIdentifier },
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceName","(I)Ljava/lang/String;",
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceName },
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourcePackageName","(I)Ljava/lang/String;",
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourcePackageName },
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceTypeName","(I)Ljava/lang/String;",
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceTypeName },
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getResourceEntryName","(I)Ljava/lang/String;",
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getResourceEntryName },
166355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root    { "loadResourceValue","(ISLandroid/util/TypedValue;Z)I",
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_loadResourceValue },
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "loadResourceBagValue","(IILandroid/util/TypedValue;Z)I",
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_loadResourceBagValue },
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getStringBlockCount","()I",
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getStringBlockCount },
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getNativeStringBlock","(I)I",
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getNativeStringBlock },
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getCookieName","(I)Ljava/lang/String;",
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getCookieName },
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Themes.
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "newTheme", "()I",
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_newTheme },
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "deleteTheme", "(I)V",
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_deleteTheme },
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "applyThemeStyle", "(IIZ)V",
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_applyThemeStyle },
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "copyTheme", "(II)V",
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_copyTheme },
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "loadThemeAttributeValue", "(IILandroid/util/TypedValue;Z)I",
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_loadThemeAttributeValue },
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "dumpTheme", "(IILjava/lang/String;Ljava/lang/String;)V",
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_dumpTheme },
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "applyStyle","(IIII[I[I[I)Z",
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_applyStyle },
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "retrieveAttributes","(I[I[I[I)Z",
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_retrieveAttributes },
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArraySize","(I)I",
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArraySize },
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "retrieveArray","(I[I)I",
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_retrieveArray },
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // XML files.
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "openXmlAssetNative", "(ILjava/lang/String;)I",
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_openXmlAssetNative },
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Arrays.
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArrayStringResource","(I)[Ljava/lang/String;",
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArrayStringResource },
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArrayStringInfo","(I)[I",
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArrayStringInfo },
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getArrayIntResource","(I)[I",
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getArrayIntResource },
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Bookkeeping.
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "init",           "()V",
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_init },
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "destroy",        "()V",
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_destroy },
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getGlobalAssetCount", "()I",
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getGlobalAssetCount },
171582e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn    { "getAssetAllocations", "()Ljava/lang/String;",
171682e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn        (void*) android_content_AssetManager_getAssetAllocations },
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    { "getGlobalAssetManagerCount", "()I",
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*) android_content_AssetManager_getGlobalAssetCount },
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_content_AssetManager(JNIEnv* env)
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass typedValue = env->FindClass("android/util/TypedValue");
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(typedValue == NULL, "Unable to find class android/util/TypedValue");
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mType
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "type", "I");
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mType == NULL, "Unable to find TypedValue.type");
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mData
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "data", "I");
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mData == NULL, "Unable to find TypedValue.data");
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mString
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "string", "Ljava/lang/CharSequence;");
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mString == NULL, "Unable to find TypedValue.string");
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mAssetCookie
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "assetCookie", "I");
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mAssetCookie == NULL, "Unable to find TypedValue.assetCookie");
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mResourceId
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "resourceId", "I");
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mResourceId == NULL, "Unable to find TypedValue.resourceId");
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mChangingConfigurations
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(typedValue, "changingConfigurations", "I");
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mChangingConfigurations == NULL, "Unable to find TypedValue.changingConfigurations");
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gTypedValueOffsets.mDensity = env->GetFieldID(typedValue, "density", "I");
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gTypedValueOffsets.mDensity == NULL, "Unable to find TypedValue.density");
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass assetFd = env->FindClass("android/content/res/AssetFileDescriptor");
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(assetFd == NULL, "Unable to find class android/content/res/AssetFileDescriptor");
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetFileDescriptorOffsets.mFd
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetFd, "mFd", "Landroid/os/ParcelFileDescriptor;");
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetFileDescriptorOffsets.mFd == NULL, "Unable to find AssetFileDescriptor.mFd");
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetFileDescriptorOffsets.mStartOffset
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetFd, "mStartOffset", "J");
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetFileDescriptorOffsets.mStartOffset == NULL, "Unable to find AssetFileDescriptor.mStartOffset");
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetFileDescriptorOffsets.mLength
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetFd, "mLength", "J");
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetFileDescriptorOffsets.mLength == NULL, "Unable to find AssetFileDescriptor.mLength");
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    jclass assetManager = env->FindClass("android/content/res/AssetManager");
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(assetManager == NULL, "Unable to find class android/content/res/AssetManager");
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gAssetManagerOffsets.mObject
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        = env->GetFieldID(assetManager, "mObject", "I");
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_FATAL_IF(gAssetManagerOffsets.mObject == NULL, "Unable to find AssetManager.mObject");
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1764c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro    jclass stringClass = env->FindClass("java/lang/String");
1765c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro    LOG_FATAL_IF(stringClass == NULL, "Unable to find class java/lang/String");
1766c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro    g_stringClass = (jclass)env->NewGlobalRef(stringClass);
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return AndroidRuntime::registerNativeMethods(env,
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            "android/content/res/AssetManager", gAssetManagerMethods, NELEM(gAssetManagerMethods));
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1773