android_util_AssetManager.cpp revision 896043d67d3ac75760bd99db8a1561e31ebee1e1
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, 91896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat static_cast<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{ 108896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong amHandle = env->GetLongField(obj, gAssetManagerOffsets.mObject); 109896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat AssetManager* am = reinterpret_cast<AssetManager*>(amHandle); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am != NULL) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return am; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "AssetManager has been finalized!"); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 117896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_openAsset(JNIEnv* env, jobject clazz, 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fileName, jint mode) 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("openAsset in %p (Java object %p)\n", am, clazz); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars fileName8(env, fileName); 12869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (fileName8.c_str() == NULL) { 129896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jniThrowException(env, "java/lang/IllegalArgumentException", "Empty file name"); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) { 1354d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode"); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes Asset* a = am->open(fileName8.c_str(), (Asset::AccessMode)mode); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 14269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Created Asset Stream: %p\n", a); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 148896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return reinterpret_cast<jlong>(a); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject returnParcelFileDescriptor(JNIEnv* env, Asset* a, jlongArray outOffsets) 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 153ddb76c4644756b31be948d70aaa8ee541dd94999Kenny Root off64_t startOffset, length; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int fd = a->openFileDescriptor(&startOffset, &length); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete a; 15669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fd < 0) { 1584d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/io/FileNotFoundException", 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "This file can not be opened as a file descriptor; it is probably compressed"); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jlong* offsets = (jlong*)env->GetPrimitiveArrayCritical(outOffsets, 0); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offsets == NULL) { 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[0] = startOffset; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[1] = length; 17169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outOffsets, offsets, 0); 17369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 174a3804cf77f0edd93f6247a055cdafb856b117eecElliott Hughes jobject fileDesc = jniCreateFileDescriptor(env, fd); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fileDesc == NULL) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project close(fd); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return newParcelFileDescriptor(env, fileDesc); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_content_AssetManager_openAssetFd(JNIEnv* env, jobject clazz, 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fileName, jlongArray outOffsets) 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("openAssetFd in %p (Java object %p)\n", am, clazz); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars fileName8(env, fileName); 19469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (fileName8.c_str() == NULL) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes Asset* a = am->open(fileName8.c_str(), Asset::ACCESS_RANDOM); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 20169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Created Asset Stream: %p\n", a); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return returnParcelFileDescriptor(env, a, outOffsets); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 210896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_openNonAssetNative(JNIEnv* env, jobject clazz, 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint cookie, 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fileName, 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint mode) 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("openNonAssetNative in %p (Java object %p)\n", am, clazz); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars fileName8(env, fileName); 22369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (fileName8.c_str() == NULL) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mode != Asset::ACCESS_UNKNOWN && mode != Asset::ACCESS_RANDOM 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && mode != Asset::ACCESS_STREAMING && mode != Asset::ACCESS_BUFFER) { 2294d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/IllegalArgumentException", "Bad access mode"); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* a = cookie 234745d4efc8369d255341d810790132660e33d3b61Narayan Kamath ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(), 235745d4efc8369d255341d810790132660e33d3b61Narayan Kamath (Asset::AccessMode)mode) 23669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes : am->openNonAsset(fileName8.c_str(), (Asset::AccessMode)mode); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 23969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Created Asset Stream: %p\n", a); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 245896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return reinterpret_cast<jlong>(a); 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_content_AssetManager_openNonAssetFdNative(JNIEnv* env, jobject clazz, 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint cookie, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fileName, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jlongArray outOffsets) 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("openNonAssetFd in %p (Java object %p)\n", am, clazz); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars fileName8(env, fileName); 26169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (fileName8.c_str() == NULL) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* a = cookie 266745d4efc8369d255341d810790132660e33d3b61Narayan Kamath ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(), Asset::ACCESS_RANDOM) 26769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_RANDOM); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 27069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Created Asset Stream: %p\n", a); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return returnParcelFileDescriptor(env, a, outOffsets); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_list(JNIEnv* env, jobject clazz, 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fileName) 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars fileName8(env, fileName); 28869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (fileName8.c_str() == NULL) { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes AssetDir* dir = am->openDir(fileName8.c_str()); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dir == NULL) { 29569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t N = dir->getFileCount(); 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobjectArray array = env->NewObjectArray(dir->getFileCount(), 302aa5fe3d206f72c4e7ff6632e169de2d0df6672e2Vladimir Marko g_stringClass, NULL); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array == NULL) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete dir; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; i<N; i++) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& name = dir->getFileName(i); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str = env->NewStringUTF(name.string()); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == NULL) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete dir; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetObjectArrayElement(array, i, str); 3164d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne env->DeleteLocalRef(str); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete dir; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_destroyAsset(JNIEnv* env, jobject clazz, 325896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong assetHandle) 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 327896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat Asset* a = reinterpret_cast<Asset*>(assetHandle); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Destroying Asset Stream: %p\n", a); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 33269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "asset"); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete a; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_readAssetChar(JNIEnv* env, jobject clazz, 340896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong assetHandle) 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 342896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat Asset* a = reinterpret_cast<Asset*>(assetHandle); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 34569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "asset"); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint8_t b; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t res = a->read(&b, 1); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res == 1 ? b : -1; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_readAsset(JNIEnv* env, jobject clazz, 355896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong assetHandle, jbyteArray bArray, 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint off, jint len) 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 358896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat Asset* a = reinterpret_cast<Asset*>(assetHandle); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL || bArray == NULL) { 36169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "asset"); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (len == 0) { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 36869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jsize bLen = env->GetArrayLength(bArray); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (off < 0 || off >= bLen || len < 0 || len > bLen || (off+len) > bLen) { 3714d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/IndexOutOfBoundsException", ""); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* b = env->GetByteArrayElements(bArray, NULL); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t res = a->read(b+off, len); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseByteArrayElements(bArray, b, 0); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat if (res > 0) return static_cast<jint>(res); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res < 0) { 3824d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/io/IOException", ""); 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_seekAsset(JNIEnv* env, jobject clazz, 388896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong assetHandle, 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jlong offset, jint whence) 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 391896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat Asset* a = reinterpret_cast<Asset*>(assetHandle); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 39469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "asset"); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a->seek( 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offset, (whence > 0) ? SEEK_END : (whence < 0 ? SEEK_SET : SEEK_CUR)); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_getAssetLength(JNIEnv* env, jobject clazz, 403896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong assetHandle) 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 405896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat Asset* a = reinterpret_cast<Asset*>(assetHandle); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 40869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "asset"); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a->getLength(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_content_AssetManager_getAssetRemainingLength(JNIEnv* env, jobject clazz, 416896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong assetHandle) 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 418896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat Asset* a = reinterpret_cast<Asset*>(assetHandle); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 42169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "asset"); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a->getRemainingLength(); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_addAssetPath(JNIEnv* env, jobject clazz, 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring path) 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 43169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars path8(env, path); 43269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (path8.c_str() == NULL) { 433129e19cb37b1d30f8c46f77a3853d347c3e78bb3Glenn Kasten return 0; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 438129e19cb37b1d30f8c46f77a3853d347c3e78bb3Glenn Kasten return 0; 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 441745d4efc8369d255341d810790132660e33d3b61Narayan Kamath int32_t cookie; 44269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes bool res = am->addAssetPath(String8(path8.c_str()), &cookie); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 444745d4efc8369d255341d810790132660e33d3b61Narayan Kamath return (res) ? static_cast<jint>(cookie) : 0; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_isUpToDate(JNIEnv* env, jobject clazz) 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return am->isUpToDate() ? JNI_TRUE : JNI_FALSE; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_setLocale(JNIEnv* env, jobject clazz, 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring locale) 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 45969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars locale8(env, locale); 46069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (locale8.c_str() == NULL) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes am->setLocale(locale8.c_str()); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_getLocales(JNIEnv* env, jobject clazz) 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<String8> locales; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am->getLocales(&locales); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int N = locales.size(); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobjectArray result = env->NewObjectArray(N, g_stringClass, NULL); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (result == NULL) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4910db187a3e62074af6a22802bded52a921f69e7dfGilles Debunne jstring str = env->NewStringUTF(locales[i].string()); 4924d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (str == NULL) { 4934d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne return NULL; 4944d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne } 4954d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne env->SetObjectArrayElement(result, i, str); 4964d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne env->DeleteLocalRef(str); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return result; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_setConfiguration(JNIEnv* env, jobject clazz, 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint mcc, jint mnc, 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring locale, jint orientation, 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint touchscreen, jint density, 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint keyboard, jint keyboardHidden, 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint navigation, 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint screenWidth, jint screenHeight, 50969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn jint smallestScreenWidthDp, 5103fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn jint screenWidthDp, jint screenHeightDp, 51127b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel jint screenLayout, jint uiMode, 51227b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel jint sdkVersion) 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config config; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project memset(&config, 0, sizeof(config)); 52169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* locale8 = locale != NULL ? env->GetStringUTFChars(locale, NULL) : NULL; 52369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.mcc = (uint16_t)mcc; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.mnc = (uint16_t)mnc; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.orientation = (uint8_t)orientation; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.touchscreen = (uint8_t)touchscreen; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.density = (uint16_t)density; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.keyboard = (uint8_t)keyboard; 530c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn config.inputFlags = (uint8_t)keyboardHidden; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.navigation = (uint8_t)navigation; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.screenWidth = (uint16_t)screenWidth; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.screenHeight = (uint16_t)screenHeight; 53469cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn config.smallestScreenWidthDp = (uint16_t)smallestScreenWidthDp; 5353fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn config.screenWidthDp = (uint16_t)screenWidthDp; 5363fc982f41fda1f254bfbc35490d81cd82a0ed90aDianne Hackborn config.screenHeightDp = (uint16_t)screenHeightDp; 537723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn config.screenLayout = (uint8_t)screenLayout; 53827b28b3f62bd3b54fa13acd5d035940b9be464f3Tobias Haamel config.uiMode = (uint8_t)uiMode; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.sdkVersion = (uint16_t)sdkVersion; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project config.minorVersion = 0; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am->setConfiguration(config, locale8); 54269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (locale != NULL) env->ReleaseStringUTFChars(locale, locale8); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getResourceIdentifier(JNIEnv* env, jobject clazz, 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring name, 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring defType, 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring defPackage) 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 55169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedStringChars name16(env, name); 55269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (name16.get() == NULL) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* defType16 = defType 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? env->GetStringChars(defType, NULL) : NULL; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jsize defTypeLen = defType 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? env->GetStringLength(defType) : 0; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char16_t* defPackage16 = defPackage 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? env->GetStringChars(defPackage, NULL) : NULL; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jsize defPackageLen = defPackage 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? env->GetStringLength(defPackage) : 0; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint ident = am->getResources().identifierForName( 57169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes name16.get(), name16.size(), defType16, defTypeLen, defPackage16, defPackageLen); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (defPackage16) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(defPackage, defPackage16); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (defType16) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseStringChars(defType, defType16); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ident; 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceName(JNIEnv* env, jobject clazz, 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint resid) 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable::resource_name name; 592d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (!am->getResources().getResourceName(resid, true, &name)) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 59569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String16 str; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.package != NULL) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.setTo(name.package, name.packageLen); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 600d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (name.type8 != NULL || name.type != NULL) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str.size() > 0) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char16_t div = ':'; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.append(&div, 1); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 605d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (name.type8 != NULL) { 606d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn str.append(String16(name.type8, name.typeLen)); 607d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn } else { 608d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn str.append(name.type, name.typeLen); 609d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 611d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (name.name8 != NULL || 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 } 616d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (name.name8 != NULL) { 617d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn str.append(String16(name.name8, name.nameLen)); 618d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn } else { 619d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn str.append(name.name, name.nameLen); 620d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 62269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString((const jchar*)str.string(), str.size()); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourcePackageName(JNIEnv* env, jobject clazz, 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint resid) 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable::resource_name name; 635d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (!am->getResources().getResourceName(resid, true, &name)) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 63869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.package != NULL) { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString((const jchar*)name.package, name.packageLen); 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 64269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceTypeName(JNIEnv* env, jobject clazz, 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint resid) 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable::resource_name name; 655d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (!am->getResources().getResourceName(resid, true, &name)) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 659d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (name.type8 != NULL) { 660d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn return env->NewStringUTF(name.type8); 661d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn } 662d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.type != NULL) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString((const jchar*)name.type, name.typeLen); 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 66669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getResourceEntryName(JNIEnv* env, jobject clazz, 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint resid) 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 67769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable::resource_name name; 679d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (!am->getResources().getResourceName(resid, true, &name)) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 68269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 683d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn if (name.name8 != NULL) { 684d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn return env->NewStringUTF(name.name8); 685d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn } 686d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.name != NULL) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewString((const jchar*)name.name, name.nameLen); 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 69069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadResourceValue(JNIEnv* env, jobject clazz, 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint ident, 69655fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root jshort density, 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject outValue, 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean resolve) 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7001f7d30770abf0c243e7f577df785ad256b8bfcb0Dianne Hackborn if (outValue == NULL) { 701e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn jniThrowNullPointerException(env, "outValue"); 702d45c68dd24fe3dd510af5a9591b5e2f509b56772Dianne Hackborn return 0; 703e5b50a65ad26a32f6e58588ffdcbc0389eac9257Dianne Hackborn } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config config; 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t typeSpecFlags; 71355fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root ssize_t block = res.getResource(ident, &value, false, density, &typeSpecFlags, &config); 71420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 71520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (block == BAD_INDEX) { 71620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 71720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return 0; 71820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 71920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t ref = ident; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolve) { 722fb5c3dba4ddac023cfd4cdcabdfdbcf343197c94Dianne Hackborn block = res.resolveReference(&value, block, &ref, &typeSpecFlags, &config); 72320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 72420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (block == BAD_INDEX) { 72520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 72620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return 0; 72720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 72820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 730896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat if (block >= 0) { 731896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return copyValue(env, outValue, &res, value, ref, block, typeSpecFlags, &config); 732896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat } 733896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat 734896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return static_cast<jint>(block); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadResourceBagValue(JNIEnv* env, jobject clazz, 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint ident, jint bagEntryId, 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject outValue, jboolean resolve) 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 74669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now lock down the resource object and start pulling stuff from it. 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.lock(); 74969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block = -1; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* entry = NULL; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t typeSpecFlags; 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t entryCount = res.getBagLocked(ident, &entry, &typeSpecFlags); 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (ssize_t i=0; i<entryCount; i++) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((uint32_t)bagEntryId) == entry->map.name.ident) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = entry->stringBlock; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = entry->map.value; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project entry++; 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlock(); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (block < 0) { 768896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return static_cast<jint>(block); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 77069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t ref = ident; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolve) { 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = res.resolveReference(&value, block, &ref, &typeSpecFlags); 77420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 77520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (block == BAD_INDEX) { 77620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 77720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return 0; 77820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 77920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 781896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat if (block >= 0) { 782896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return copyValue(env, outValue, &res, value, ref, block, typeSpecFlags); 783896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat } 784896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat 785896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return static_cast<jint>(block); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getStringBlockCount(JNIEnv* env, jobject clazz) 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return am->getResources().getTableCount(); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 797896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_getNativeStringBlock(JNIEnv* env, jobject clazz, 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint block) 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 804896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return reinterpret_cast<jlong>(am->getResources().getTableStringBlock(block)); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_content_AssetManager_getCookieName(JNIEnv* env, jobject clazz, 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint cookie) 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 814745d4efc8369d255341d810790132660e33d3b61Narayan Kamath String8 name(am->getAssetPath(static_cast<int32_t>(cookie))); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name.length() == 0) { 8164d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/IndexOutOfBoundsException", "Empty cookie name"); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str = env->NewStringUTF(name.string()); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return str; 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 823896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_newTheme(JNIEnv* env, jobject clazz) 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 829896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return reinterpret_cast<jlong>(new ResTable::Theme(am->getResources())); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_deleteTheme(JNIEnv* env, jobject clazz, 833896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong themeHandle) 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 835896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete theme; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_applyThemeStyle(JNIEnv* env, jobject clazz, 840896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong themeHandle, 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint styleRes, 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean force) 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 844896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project theme->applyStyle(styleRes, force ? true : false); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_copyTheme(JNIEnv* env, jobject clazz, 849896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong destHandle, jlong srcHandle) 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 851896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* dest = reinterpret_cast<ResTable::Theme*>(destHandle); 852896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* src = reinterpret_cast<ResTable::Theme*>(srcHandle); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest->setTo(*src); 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_loadThemeAttributeValue( 857896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat JNIEnv* env, jobject clazz, jlong themeHandle, jint ident, jobject outValue, jboolean resolve) 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 859896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(theme->getResTable()); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX value could be different in different configs! 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t typeSpecFlags = 0; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block = theme->getAttribute(ident, &value, &typeSpecFlags); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t ref = 0; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (resolve) { 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = res.resolveReference(&value, block, &ref, &typeSpecFlags); 86920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 87020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (block == BAD_INDEX) { 87120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 87220cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return 0; 87320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 87420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return block >= 0 ? copyValue(env, outValue, &res, value, ref, block, typeSpecFlags) : block; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_dumpTheme(JNIEnv* env, jobject clazz, 880896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong themeHandle, jint pri, 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring tag, jstring prefix) 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 883896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle); 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(theme->getResTable()); 88569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX Need to use params. 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project theme->dumpToLog(); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject clazz, 891896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong themeToken, 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint defStyleAttr, 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint defStyleRes, 894896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong xmlParserToken, 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray attrs, 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray outValues, 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray outIndices) 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8994d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (themeToken == 0) { 90069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "theme token"); 9014d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne return JNI_FALSE; 9024d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne } 9034d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (attrs == NULL) { 90469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "attrs"); 9054d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne return JNI_FALSE; 9064d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne } 9074d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (outValues == NULL) { 90869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "out values"); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 912b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("APPLY STYLE: theme=0x%x defStyleAttr=0x%x defStyleRes=0x%x xml=0x%x", 913b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn themeToken, defStyleAttr, defStyleRes, xmlParserToken)); 91469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 915896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeToken); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res = theme->getResTable(); 917896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat ResXMLParser* xmlParser = reinterpret_cast<ResXMLParser*>(xmlParserToken); 9180d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn ResTable_config config; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NI = env->GetArrayLength(attrs); 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NV = env->GetArrayLength(outValues); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NV < (NI*STYLE_NUM_ENTRIES)) { 9244d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small"); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src == NULL) { 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* dest = baseDest; 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dest == NULL) { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(attrs, src, 0); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* indices = NULL; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int indicesIdx = 0; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outIndices != NULL) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->GetArrayLength(outIndices) > NI) { 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indices = (jint*)env->GetPrimitiveArrayCritical(outIndices, 0); 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Load default style from attribute, if specified... 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t defStyleBagTypeSetFlags = 0; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (defStyleAttr != 0) { 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (theme->getAttribute(defStyleAttr, &value, &defStyleBagTypeSetFlags) >= 0) { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_REFERENCE) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyleRes = value.data; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the style class associated with the current XML tag. 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int style = 0; 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t styleBagTypeSetFlags = 0; 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (xmlParser != NULL) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t idx = xmlParser->indexOfStyle(); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (idx >= 0 && xmlParser->getAttributeValue(idx, &value) >= 0) { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == value.TYPE_ATTRIBUTE) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (theme->getAttribute(value.data, &value, &styleBagTypeSetFlags) < 0) { 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.dataType = Res_value::TYPE_NULL; 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == value.TYPE_REFERENCE) { 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project style = value.data; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now lock down the resource object and start pulling stuff from it. 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.lock(); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the default style bag, if requested. 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* defStyleEnt = NULL; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t defStyleTypeSetFlags = 0; 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t bagOff = defStyleRes != 0 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? res.getBagLocked(defStyleRes, &defStyleEnt, &defStyleTypeSetFlags) : -1; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyleTypeSetFlags |= defStyleBagTypeSetFlags; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* endDefStyleEnt = defStyleEnt + 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (bagOff >= 0 ? bagOff : 0); 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the style class bag, if requested. 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* styleEnt = NULL; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t styleTypeSetFlags = 0; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bagOff = style != 0 ? res.getBagLocked(style, &styleEnt, &styleTypeSetFlags) : -1; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project styleTypeSetFlags |= styleBagTypeSetFlags; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* endStyleEnt = styleEnt + 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (bagOff >= 0 ? bagOff : 0); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the XML attributes, if requested. 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NX = xmlParser ? xmlParser->getAttributeCount() : 0; 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jsize ix=0; 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t curXmlAttr = xmlParser ? xmlParser->getAttributeNameResID(ix) : 0; 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const ssize_t kXmlBlock = 0x10000000; 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now iterate through all of the attributes that the client has requested, 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // filling in each with whatever data we can find. 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block = 0; 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t typeSetFlags; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (jsize ii=0; ii<NI; ii++) { 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t curIdent = (uint32_t)src[ii]; 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1010b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("RETRIEVING ATTR 0x%08x...", curIdent)); 101169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try to find a value for this attribute... we prioritize values 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // coming from, first XML attributes, then XML style, then default 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // style, and finally the theme. 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.dataType = Res_value::TYPE_NULL; 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.data = 0; 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSetFlags = 0; 10180d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn config.density = 0; 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Skip through XML attributes until the end or the next possible match. 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (ix < NX && curIdent > curXmlAttr) { 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ix++; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curXmlAttr = xmlParser->getAttributeNameResID(ix); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the current XML attribute if it matches, and step to next. 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ix < NX && curIdent == curXmlAttr) { 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = kXmlBlock; 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xmlParser->getAttributeValue(ix, &value); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ix++; 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curXmlAttr = xmlParser->getAttributeNameResID(ix); 1031b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> From XML: type=0x%x, data=0x%08x", 1032b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn value.dataType, value.data)); 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Skip through the style values until the end or the next possible match. 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (styleEnt < endStyleEnt && curIdent > styleEnt->map.name.ident) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project styleEnt++; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the current style attribute if it matches, and step to next. 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (styleEnt < endStyleEnt && curIdent == styleEnt->map.name.ident) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_NULL) { 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = styleEnt->stringBlock; 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSetFlags = styleTypeSetFlags; 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = styleEnt->map.value; 1045b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> From style: type=0x%x, data=0x%08x", 1046b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn value.dataType, value.data)); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project styleEnt++; 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Skip through the default style values until the end or the next possible match. 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (defStyleEnt < endDefStyleEnt && curIdent > defStyleEnt->map.name.ident) { 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyleEnt++; 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the current default style attribute if it matches, and step to next. 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (defStyleEnt < endDefStyleEnt && curIdent == defStyleEnt->map.name.ident) { 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_NULL) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = defStyleEnt->stringBlock; 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSetFlags = defStyleTypeSetFlags; 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = defStyleEnt->map.value; 1061b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> From def style: type=0x%x, data=0x%08x", 1062b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn value.dataType, value.data)); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project defStyleEnt++; 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t resid = 0; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType != Res_value::TYPE_NULL) { 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take care of resolving the found resource to its final value. 10700d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn ssize_t newBlock = theme->resolveAttributeReference(&value, block, 10710d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn &resid, &typeSetFlags, &config); 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newBlock >= 0) block = newBlock; 1073b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> Resolved attr: type=0x%x, data=0x%08x", 1074b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn value.dataType, value.data)); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If we still don't have a value for this attribute, try to find 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it in the theme! 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t newBlock = theme->getAttribute(curIdent, &value, &typeSetFlags); 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newBlock >= 0) { 1080b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> From theme: type=0x%x, data=0x%08x", 1081b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn value.dataType, value.data)); 10820d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn newBlock = res.resolveReference(&value, block, &resid, 10830d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn &typeSetFlags, &config); 108420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 108520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (newBlock == BAD_INDEX) { 108620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 108720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return JNI_FALSE; 108820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 108920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newBlock >= 0) block = newBlock; 1091b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> Resolved theme: type=0x%x, data=0x%08x", 1092b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn value.dataType, value.data)); 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Deal with the special @null value -- it turns back to TYPE_NULL. 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) { 1098b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("-> Setting to @null!")); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.dataType = Res_value::TYPE_NULL; 11007fbe4d2e7445ad4db07a42c74fe2934af46d1c7fKenny Root block = kXmlBlock; 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1103b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn DEBUG_STYLES(LOGI("Attribute 0x%08x: type=0x%x, data=0x%08x", 1104b8d81679553ee33f6ae5281310abf2effca4ffcdDianne Hackborn curIdent, value.dataType, value.data)); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Write the final value back to Java. 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_TYPE] = value.dataType; 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_DATA] = value.data; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_ASSET_COOKIE] = 1110896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat block != kXmlBlock ? reinterpret_cast<jint>(res.getTableCookie(block)) : (jint)-1; 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_RESOURCE_ID] = resid; 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; 11130d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn dest[STYLE_DENSITY] = config.density; 111469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indices != NULL && value.dataType != Res_value::TYPE_NULL) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicesIdx++; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indices[indicesIdx] = ii; 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 111969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest += STYLE_NUM_ENTRIES; 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlock(); 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indices != NULL) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indices[0] = indicesIdx; 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outIndices, indices, 0); 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(attrs, src, 0); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, jobject clazz, 1136896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat jlong xmlParserToken, 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray attrs, 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray outValues, 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray outIndices) 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11414d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (xmlParserToken == 0) { 114269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "xmlParserToken"); 11434d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne return JNI_FALSE; 11444d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne } 11454d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (attrs == NULL) { 114669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "attrs"); 11474d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne return JNI_FALSE; 11484d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne } 11494d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne if (outValues == NULL) { 115069a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "out values"); 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 115369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLParser* xmlParser = (ResXMLParser*)xmlParserToken; 11600d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn ResTable_config config; 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 116269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NI = env->GetArrayLength(attrs); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NV = env->GetArrayLength(outValues); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NV < (NI*STYLE_NUM_ENTRIES)) { 11664d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/IndexOutOfBoundsException", "out values too small"); 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 116969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* src = (jint*)env->GetPrimitiveArrayCritical(attrs, 0); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src == NULL) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 117469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0); 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* dest = baseDest; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dest == NULL) { 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(attrs, src, 0); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 118169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* indices = NULL; 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int indicesIdx = 0; 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outIndices != NULL) { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->GetArrayLength(outIndices) > NI) { 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indices = (jint*)env->GetPrimitiveArrayCritical(outIndices, 0); 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now lock down the resource object and start pulling stuff from it. 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.lock(); 119269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the XML attributes, if requested. 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NX = xmlParser->getAttributeCount(); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jsize ix=0; 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t curXmlAttr = xmlParser->getAttributeNameResID(ix); 119769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const ssize_t kXmlBlock = 0x10000000; 119969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now iterate through all of the attributes that the client has requested, 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // filling in each with whatever data we can find. 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block = 0; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t typeSetFlags; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (jsize ii=0; ii<NI; ii++) { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const uint32_t curIdent = (uint32_t)src[ii]; 120669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Try to find a value for this attribute... 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.dataType = Res_value::TYPE_NULL; 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.data = 0; 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSetFlags = 0; 12110d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn config.density = 0; 121269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Skip through XML attributes until the end or the next possible match. 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (ix < NX && curIdent > curXmlAttr) { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ix++; 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curXmlAttr = xmlParser->getAttributeNameResID(ix); 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Retrieve the current XML attribute if it matches, and step to next. 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ix < NX && curIdent == curXmlAttr) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = kXmlBlock; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project xmlParser->getAttributeValue(ix, &value); 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ix++; 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project curXmlAttr = xmlParser->getAttributeNameResID(ix); 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 122569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Attribute 0x%08x: type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t resid = 0; 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType != Res_value::TYPE_NULL) { 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take care of resolving the found resource to its final value. 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Resolving attribute reference\n"); 12310d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn ssize_t newBlock = res.resolveReference(&value, block, &resid, 12320d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn &typeSetFlags, &config); 123320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 123420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (newBlock == BAD_INDEX) { 123520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 123620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return JNI_FALSE; 123720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 123820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newBlock >= 0) block = newBlock; 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 124169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Deal with the special @null value -- it turns back to TYPE_NULL. 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) { 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.dataType = Res_value::TYPE_NULL; 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 124669a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Attribute 0x%08x: final type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data); 124869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Write the final value back to Java. 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_TYPE] = value.dataType; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_DATA] = value.data; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_ASSET_COOKIE] = 1253896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat block != kXmlBlock ? reinterpret_cast<jint>(res.getTableCookie(block)) : (jint)-1; 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_RESOURCE_ID] = resid; 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; 12560d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn dest[STYLE_DENSITY] = config.density; 125769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indices != NULL && value.dataType != Res_value::TYPE_NULL) { 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indicesIdx++; 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indices[indicesIdx] = ii; 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 126269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest += STYLE_NUM_ENTRIES; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 126569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlock(); 126769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (indices != NULL) { 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project indices[0] = indicesIdx; 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outIndices, indices, 0); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 127269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(attrs, src, 0); 127569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getArraySize(JNIEnv* env, jobject clazz, 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id) 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 1284d7c8672ccc8ccd1f99da60accc63d6817d41ac52Olivier Bailly return 0; 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 128769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.lock(); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* defStyleEnt = NULL; 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t bagOff = res.getBagLocked(id, &defStyleEnt); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlock(); 129269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 1293896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return static_cast<jint>(bagOff); 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_retrieveArray(JNIEnv* env, jobject clazz, 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint id, 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray outValues) 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outValues == NULL) { 130169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, "out values"); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 130469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 13100d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn ResTable_config config; 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block; 131369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const jsize NV = env->GetArrayLength(outValues); 131569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* baseDest = (jint*)env->GetPrimitiveArrayCritical(outValues, 0); 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint* dest = baseDest; 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dest == NULL) { 13194d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/OutOfMemoryError", ""); 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 132269a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Now lock down the resource object and start pulling stuff from it. 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.lock(); 132569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* arrayEnt = NULL; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t arrayTypeSetFlags = 0; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t bagOff = res.getBagLocked(id, &arrayEnt, &arrayTypeSetFlags); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* endArrayEnt = arrayEnt + 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (bagOff >= 0 ? bagOff : 0); 133169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int i = 0; 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t typeSetFlags; 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < NV && arrayEnt < endArrayEnt) { 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project block = arrayEnt->stringBlock; 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typeSetFlags = arrayTypeSetFlags; 13370d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn config.density = 0; 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = arrayEnt->map.value; 133969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t resid = 0; 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType != Res_value::TYPE_NULL) { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take care of resolving the found resource to its final value. 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Resolving attribute reference\n"); 13440d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn ssize_t newBlock = res.resolveReference(&value, block, &resid, 13450d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn &typeSetFlags, &config); 134620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 134720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (newBlock == BAD_INDEX) { 134820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 134920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return JNI_FALSE; 135020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 135120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (newBlock >= 0) block = newBlock; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Deal with the special @null value -- it turns back to TYPE_NULL. 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_REFERENCE && value.data == 0) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value.dataType = Res_value::TYPE_NULL; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Attribute 0x%08x: final type=0x%x, data=0x%08x\n", curIdent, value.dataType, value.data); 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Write the final value back to Java. 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_TYPE] = value.dataType; 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_DATA] = value.data; 1365896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat dest[STYLE_ASSET_COOKIE] = reinterpret_cast<jint>(res.getTableCookie(block)); 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_RESOURCE_ID] = resid; 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[STYLE_CHANGING_CONFIGURATIONS] = typeSetFlags; 13680d221012ff5fd314711c00ed30e9b807b9c454c1Dianne Hackborn dest[STYLE_DENSITY] = config.density; 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest += STYLE_NUM_ENTRIES; 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i+= STYLE_NUM_ENTRIES; 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project arrayEnt++; 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 137369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i /= STYLE_NUM_ENTRIES; 137569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlock(); 137769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleasePrimitiveArrayCritical(outValues, baseDest, 0); 137969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i; 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1383896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhatstatic jlong android_content_AssetManager_openXmlAssetNative(JNIEnv* env, jobject clazz, 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint cookie, 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring fileName) 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("openXmlAsset in %p (Java object %p)\n", am, clazz); 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes ScopedUtfChars fileName8(env, fileName); 139569a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes if (fileName8.c_str() == NULL) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* a = cookie 1400745d4efc8369d255341d810790132660e33d3b61Narayan Kamath ? am->openNonAsset(static_cast<int32_t>(cookie), fileName8.c_str(), Asset::ACCESS_BUFFER) 140169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes : am->openNonAsset(fileName8.c_str(), Asset::ACCESS_BUFFER); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == NULL) { 140469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowException(env, "java/io/FileNotFoundException", fileName8.c_str()); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResXMLTree* block = new ResXMLTree(); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = block->setTo(a->getBuffer(true), a->getLength(), true); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a->close(); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete a; 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 14144d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/io/FileNotFoundException", "Corrupt XML binary file"); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1418896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat return reinterpret_cast<jlong>(block); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jintArray android_content_AssetManager_getArrayStringInfo(JNIEnv* env, jobject clazz, 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint arrayResId) 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* startOfBag; 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ssize_t N = res.lockBag(arrayResId, &startOfBag); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray array = env->NewIntArray(N * 2); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array == NULL) { 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlockBag(startOfBag); 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* bag = startOfBag; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i = 0, j = 0; ((ssize_t)i)<N; i++, bag++) { 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint stringIndex = -1; 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint stringBlock = 0; 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = bag->map.value; 144869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take care of resolving the found resource to its final value. 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stringBlock = res.resolveReference(&value, bag->stringBlock, NULL); 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_STRING) { 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stringIndex = value.data; 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 145469a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 145520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 145620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (stringBlock == BAD_INDEX) { 145720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 145820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return array; 145920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 146020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 146169a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //todo: It might be faster to allocate a C array to contain 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the blocknums and indices, put them in there and then 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // do just one SetIntArrayRegion() 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntArrayRegion(array, j, 1, &stringBlock); 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntArrayRegion(array, j + 1, 1, &stringIndex); 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project j = j + 2; 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlockBag(startOfBag); 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobjectArray android_content_AssetManager_getArrayStringResource(JNIEnv* env, jobject clazz, 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint arrayResId) 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* startOfBag; 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ssize_t N = res.lockBag(arrayResId, &startOfBag); 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1488aa5fe3d206f72c4e7ff6632e169de2d0df6672e2Vladimir Marko jobjectArray array = env->NewObjectArray(N, g_stringClass, NULL); 1489485dd21bbefde378c392da3de48887aee9fabebeKenny Root if (env->ExceptionCheck()) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlockBag(startOfBag); 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* bag = startOfBag; 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t strLen = 0; 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; ((ssize_t)i)<N; i++, bag++) { 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = bag->map.value; 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring str = NULL; 1500780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take care of resolving the found resource to its final value. 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block = res.resolveReference(&value, bag->stringBlock, NULL); 150320cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 150420cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (block == BAD_INDEX) { 150520cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 150620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return array; 150720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 150820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType == Res_value::TYPE_STRING) { 1510780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root const ResStringPool* pool = res.getTableStringBlock(block); 1511780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root const char* str8 = pool->string8At(value.data, &strLen); 1512780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root if (str8 != NULL) { 1513780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root str = env->NewStringUTF(str8); 1514780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root } else { 1515780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root const char16_t* str16 = pool->stringAt(value.data, &strLen); 1516780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root str = env->NewString(str16, strLen); 1517485dd21bbefde378c392da3de48887aee9fabebeKenny Root } 1518485dd21bbefde378c392da3de48887aee9fabebeKenny Root 1519485dd21bbefde378c392da3de48887aee9fabebeKenny Root // If one of our NewString{UTF} calls failed due to memory, an 1520485dd21bbefde378c392da3de48887aee9fabebeKenny Root // exception will be pending. 1521485dd21bbefde378c392da3de48887aee9fabebeKenny Root if (env->ExceptionCheck()) { 1522485dd21bbefde378c392da3de48887aee9fabebeKenny Root res.unlockBag(startOfBag); 1523485dd21bbefde378c392da3de48887aee9fabebeKenny Root return NULL; 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1525780d2a1b714724d85227141c76b3c64f543f00b4Kenny Root 15264d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne env->SetObjectArrayElement(array, i, str); 1527485dd21bbefde378c392da3de48887aee9fabebeKenny Root 15284d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne // str is not NULL at that point, otherwise ExceptionCheck would have been true. 15294d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne // If we have a large amount of strings in our array, we might 15304d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne // overflow the local reference table of the VM. 1531485dd21bbefde378c392da3de48887aee9fabebeKenny Root env->DeleteLocalRef(str); 1532485dd21bbefde378c392da3de48887aee9fabebeKenny Root } 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlockBag(startOfBag); 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jintArray android_content_AssetManager_getArrayIntResource(JNIEnv* env, jobject clazz, 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jint arrayResId) 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = assetManagerForJavaObject(env, clazz); 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& res(am->getResources()); 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* startOfBag; 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ssize_t N = res.lockBag(arrayResId, &startOfBag); 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N < 0) { 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jintArray array = env->NewIntArray(N); 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (array == NULL) { 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlockBag(startOfBag); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Res_value value; 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable::bag_entry* bag = startOfBag; 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i=0; ((ssize_t)i)<N; i++, bag++) { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project value = bag->map.value; 156369a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take care of resolving the found resource to its final value. 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ssize_t block = res.resolveReference(&value, bag->stringBlock, NULL); 156620cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#if THROW_ON_BAD_ID 156720cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn if (block == BAD_INDEX) { 156820cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", "Bad resource!"); 156920cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn return array; 157020cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn } 157120cb56e26e91df91bd64d4251222e0d421cdbe47Dianne Hackborn#endif 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value.dataType >= Res_value::TYPE_FIRST_INT 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && value.dataType <= Res_value::TYPE_LAST_INT) { 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int intVal = value.data; 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->SetIntArrayRegion(array, i, 1, &intVal); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res.unlockBag(startOfBag); 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return array; 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_init(JNIEnv* env, jobject clazz) 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = new AssetManager(); 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am == NULL) { 15864d4040b7b3c46ea29a42878c14b325f09f0029adGilles Debunne jniThrowException(env, "java/lang/OutOfMemoryError", ""); 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project am->addDefaultAssets(); 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Created AssetManager %p for Java object %p\n", am, clazz); 1593896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat env->SetLongField(clazz, gAssetManagerOffsets.mObject, reinterpret_cast<jlong>(am)); 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_content_AssetManager_destroy(JNIEnv* env, jobject clazz) 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager* am = (AssetManager*) 1599896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat (env->GetLongField(clazz, gAssetManagerOffsets.mObject)); 160071f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Destroying AssetManager %p for Java object %p\n", am, clazz); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (am != NULL) { 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete am; 1603896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat env->SetLongField(clazz, gAssetManagerOffsets.mObject, 0); 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getGlobalAssetCount(JNIEnv* env, jobject clazz) 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Asset::getGlobalCount(); 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 161282e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackbornstatic jobject android_content_AssetManager_getAssetAllocations(JNIEnv* env, jobject clazz) 161382e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn{ 161482e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn String8 alloc = Asset::getAssetAllocations(); 161582e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn if (alloc.length() <= 0) { 161682e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn return NULL; 161782e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn } 161869a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes 161982e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn jstring str = env->NewStringUTF(alloc.string()); 162082e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn return str; 162182e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn} 162282e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_content_AssetManager_getGlobalAssetManagerCount(JNIEnv* env, jobject clazz) 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AssetManager::getGlobalCount(); 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * JNI registration. 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gAssetManagerMethods[] = { 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Basic asset stuff. 1637896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "openAsset", "(Ljava/lang/String;I)J", 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_openAsset }, 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "openAssetFd", "(Ljava/lang/String;[J)Landroid/os/ParcelFileDescriptor;", 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_openAssetFd }, 1641896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "openNonAssetNative", "(ILjava/lang/String;I)J", 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_openNonAssetNative }, 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "openNonAssetFdNative", "(ILjava/lang/String;[J)Landroid/os/ParcelFileDescriptor;", 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_openNonAssetFdNative }, 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "list", "(Ljava/lang/String;)[Ljava/lang/String;", 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_list }, 1647896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "destroyAsset", "(J)V", 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_destroyAsset }, 1649896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "readAssetChar", "(J)I", 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_readAssetChar }, 1651896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "readAsset", "(J[BII)I", 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_readAsset }, 1653896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "seekAsset", "(JJI)J", 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_seekAsset }, 1655896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "getAssetLength", "(J)J", 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getAssetLength }, 1657896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "getAssetRemainingLength", "(J)J", 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getAssetRemainingLength }, 1659f7be4800df28d7cb6a96003046bf90245e7054abDianne Hackborn { "addAssetPathNative", "(Ljava/lang/String;)I", 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_addAssetPath }, 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "isUpToDate", "()Z", 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_isUpToDate }, 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Resources. 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "setLocale", "(Ljava/lang/String;)V", 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_setLocale }, 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getLocales", "()[Ljava/lang/String;", 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getLocales }, 166969cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn { "setConfiguration", "(IILjava/lang/String;IIIIIIIIIIIIII)V", 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_setConfiguration }, 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getResourceIdentifier","(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I", 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getResourceIdentifier }, 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getResourceName","(I)Ljava/lang/String;", 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getResourceName }, 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getResourcePackageName","(I)Ljava/lang/String;", 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getResourcePackageName }, 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getResourceTypeName","(I)Ljava/lang/String;", 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getResourceTypeName }, 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getResourceEntryName","(I)Ljava/lang/String;", 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getResourceEntryName }, 168155fc850cf992cdcb0993cb109d2f716613c0dbddKenny Root { "loadResourceValue","(ISLandroid/util/TypedValue;Z)I", 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_loadResourceValue }, 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "loadResourceBagValue","(IILandroid/util/TypedValue;Z)I", 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_loadResourceBagValue }, 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getStringBlockCount","()I", 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getStringBlockCount }, 1687896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "getNativeStringBlock","(I)J", 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getNativeStringBlock }, 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCookieName","(I)Ljava/lang/String;", 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getCookieName }, 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Themes. 1693896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "newTheme", "()J", 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_newTheme }, 1695896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "deleteTheme", "(J)V", 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_deleteTheme }, 1697896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "applyThemeStyle", "(JIZ)V", 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_applyThemeStyle }, 1699896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "copyTheme", "(JJ)V", 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_copyTheme }, 1701896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "loadThemeAttributeValue", "(JILandroid/util/TypedValue;Z)I", 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_loadThemeAttributeValue }, 1703896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "dumpTheme", "(JILjava/lang/String;Ljava/lang/String;)V", 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_dumpTheme }, 1705896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "applyStyle","(JIIJ[I[I[I)Z", 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_applyStyle }, 1707896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "retrieveAttributes","(J[I[I[I)Z", 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_retrieveAttributes }, 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getArraySize","(I)I", 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getArraySize }, 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "retrieveArray","(I[I)I", 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_retrieveArray }, 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XML files. 1715896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat { "openXmlAssetNative", "(ILjava/lang/String;)J", 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_openXmlAssetNative }, 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Arrays. 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getArrayStringResource","(I)[Ljava/lang/String;", 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getArrayStringResource }, 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getArrayStringInfo","(I)[I", 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getArrayStringInfo }, 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getArrayIntResource","(I)[I", 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getArrayIntResource }, 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Bookkeeping. 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "()V", 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_init }, 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "destroy", "()V", 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_destroy }, 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getGlobalAssetCount", "()I", 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getGlobalAssetCount }, 173382e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn { "getAssetAllocations", "()Ljava/lang/String;", 173482e1ee93eece8fb0aec6acc3ef4ee7b1c86feec7Dianne Hackborn (void*) android_content_AssetManager_getAssetAllocations }, 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getGlobalAssetManagerCount", "()I", 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) android_content_AssetManager_getGlobalAssetCount }, 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_content_AssetManager(JNIEnv* env) 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass typedValue = env->FindClass("android/util/TypedValue"); 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(typedValue == NULL, "Unable to find class android/util/TypedValue"); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mType 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(typedValue, "type", "I"); 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mType == NULL, "Unable to find TypedValue.type"); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mData 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(typedValue, "data", "I"); 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mData == NULL, "Unable to find TypedValue.data"); 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mString 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(typedValue, "string", "Ljava/lang/CharSequence;"); 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mString == NULL, "Unable to find TypedValue.string"); 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mAssetCookie 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(typedValue, "assetCookie", "I"); 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mAssetCookie == NULL, "Unable to find TypedValue.assetCookie"); 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mResourceId 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(typedValue, "resourceId", "I"); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mResourceId == NULL, "Unable to find TypedValue.resourceId"); 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mChangingConfigurations 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(typedValue, "changingConfigurations", "I"); 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mChangingConfigurations == NULL, "Unable to find TypedValue.changingConfigurations"); 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gTypedValueOffsets.mDensity = env->GetFieldID(typedValue, "density", "I"); 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gTypedValueOffsets.mDensity == NULL, "Unable to find TypedValue.density"); 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass assetFd = env->FindClass("android/content/res/AssetFileDescriptor"); 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(assetFd == NULL, "Unable to find class android/content/res/AssetFileDescriptor"); 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAssetFileDescriptorOffsets.mFd 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(assetFd, "mFd", "Landroid/os/ParcelFileDescriptor;"); 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gAssetFileDescriptorOffsets.mFd == NULL, "Unable to find AssetFileDescriptor.mFd"); 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAssetFileDescriptorOffsets.mStartOffset 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(assetFd, "mStartOffset", "J"); 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gAssetFileDescriptorOffsets.mStartOffset == NULL, "Unable to find AssetFileDescriptor.mStartOffset"); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAssetFileDescriptorOffsets.mLength 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = env->GetFieldID(assetFd, "mLength", "J"); 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gAssetFileDescriptorOffsets.mLength == NULL, "Unable to find AssetFileDescriptor.mLength"); 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass assetManager = env->FindClass("android/content/res/AssetManager"); 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(assetManager == NULL, "Unable to find class android/content/res/AssetManager"); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gAssetManagerOffsets.mObject 1779896043d67d3ac75760bd99db8a1561e31ebee1e1Ashok Bhat = env->GetFieldID(assetManager, "mObject", "J"); 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_FATAL_IF(gAssetManagerOffsets.mObject == NULL, "Unable to find AssetManager.mObject"); 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1782c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro jclass stringClass = env->FindClass("java/lang/String"); 1783c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro LOG_FATAL_IF(stringClass == NULL, "Unable to find class java/lang/String"); 1784c1318babb44dded89b88fb5df950b5cd6c6f83daCarl Shapiro g_stringClass = (jclass)env->NewGlobalRef(stringClass); 1785aa5fe3d206f72c4e7ff6632e169de2d0df6672e2Vladimir Marko LOG_FATAL_IF(g_stringClass == NULL, "Unable to create global reference for class java/lang/String"); 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "android/content/res/AssetManager", gAssetManagerMethods, NELEM(gAssetManagerMethods)); 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 1792