19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// Asset management class. AssetManager objects are thread-safe. 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef __LIBS_ASSETMANAGER_H 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define __LIBS_ASSETMANAGER_H 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/Asset.h> 24b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <androidfw/AssetDir.h> 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/KeyedVector.h> 26b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <utils/SortedVector.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String16.h> 28b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <utils/String8.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 30b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <utils/Vector.h> 31a982dc05d7ca919c07f50e446549ef9dceadf6bdColin Cross#include <utils/ZipFileRO.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 336cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate/* 346cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate * Native-app access is via the opaque typedef struct AAssetManager in the C namespace. 356cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate */ 366cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#ifdef __cplusplus 376cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tateextern "C" { 386cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#endif 396cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 406cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tatestruct AAssetManager { }; 416cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 426cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#ifdef __cplusplus 436cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate}; 446cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate#endif 456cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 466cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 476cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate/* 486cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate * Now the proper C++ android-namespace definitions 496cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate */ 506cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tate 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass Asset; // fwd decl for things that include Asset.h first 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass ResTable; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct ResTable_config; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Every application that uses assets needs one instance of this. A 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * single instance may be shared across multiple threads, and a single 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * thread may have more than one instance (the latter is discouraged). 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The purpose of the AssetManager is to create Asset objects. To do 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this efficiently it may cache information about the locations of 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * files it has seen. This can be controlled with the "cacheMode" 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * argument. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The asset hierarchy may be examined like a filesystem, using 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * AssetDir objects to peruse a single directory. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 706cce32b6adbb3a9725fc730ba0e0068a74657e60Christopher Tateclass AssetManager : public AAssetManager { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef enum CacheMode { 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CACHE_UNKNOWN = 0, 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CACHE_OFF, // don't try to cache file locations 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CACHE_DEFER, // construct cache as pieces are needed 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //CACHE_SCAN, // scan full(!) asset hierarchy at init() time 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } CacheMode; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager(CacheMode cacheMode = CACHE_OFF); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AssetManager(void); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int32_t getGlobalCount(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new source for assets. This can be called multiple times to 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * look in multiple places for assets. It can be either a directory (for 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * finding assets as raw files on the disk) or a ZIP file. This newly 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * added asset path will be examined first when searching for assets, 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before any that were previously added. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns "true" on success, "false" on failure. If 'cookie' is non-NULL, 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then on success, *cookie is set to the value corresponding to the 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * newly-added asset source. 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool addAssetPath(const String8& path, void** cookie); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convenience for adding the standard system assets. Uses the 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ANDROID_ROOT environment variable to find them. 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool addDefaultAssets(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Iterate over the asset paths in this manager. (Previously 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * added via addAssetPath() and addDefaultAssets().) On first call, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 'cookie' must be NULL, resulting in the first cookie being returned. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Each next cookie will be returned there-after, until NULL indicating 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the end has been reached. 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void* nextAssetPath(void* cookie) const; 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an asset path in the manager. 'which' must be between 0 and 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * countAssetPaths(). 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 getAssetPath(void* cookie) const; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current locale and vendor. The locale can change during 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the lifetime of an AssetManager if the user updates the device's 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * language setting. The vendor is less likely to change. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass in NULL to indicate no preference. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setLocale(const char* locale); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setVendor(const char* vendor); 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Choose screen orientation for resources values returned. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setConfiguration(const ResTable_config& config, const char* locale = NULL); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn void getConfiguration(ResTable_config* outConfig) const; 13408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef Asset::AccessMode AccessMode; // typing shortcut 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open an asset. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will search through locale-specific and vendor-specific 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * directories and packages to find the file. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The object returned does not depend on the AssetManager. It should 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be freed by calling Asset::close(). 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* open(const char* fileName, AccessMode mode); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a non-asset file as an asset. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is for opening files that are included in an asset package 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but aren't assets. These sit outside the usual "locale/vendor" 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path hierarchy, and will not be seen by "AssetDir" or included 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in our filename cache. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openNonAsset(const char* fileName, AccessMode mode); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Explicit non-asset file. The file explicitly named by the cookie (the 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource set to look in) and fileName will be opened and returned. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openNonAsset(void* cookie, const char* fileName, AccessMode mode); 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a directory within the asset hierarchy. 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The contents of the directory are an amalgam of vendor-specific, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * locale-specific, and generic assets stored loosely or in asset 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages. Depending on the cache setting and previous accesses, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this call may incur significant disk overhead. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To open the top-level directory, pass in "". 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetDir* openDir(const char* dirName); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 177bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * Open a directory within a particular path of the asset manager. 178bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * 179bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * The contents of the directory are an amalgam of vendor-specific, 180bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * locale-specific, and generic assets stored loosely or in asset 181bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * packages. Depending on the cache setting and previous accesses, 182bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * this call may incur significant disk overhead. 183bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * 184bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * To open the top-level directory, pass in "". 185bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn */ 186bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn AssetDir* openNonAssetDir(void* cookie, const char* dirName); 187bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn 188bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn /* 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the type of a file in the asset hierarchy. They will either 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be "regular" or "directory". [Currently only works for "regular".] 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Can also be used as a quick test for existence of a file. 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType getFileType(const char* fileName); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the complete resource table to find things in the package. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& getResources(bool required = true) const; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Discard cached filename information. This only needs to be called 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if somebody has updated the set of "loose" files, and we want to 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * discard our cached notion of what's where. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void purge(void) { purgeFileNameCacheLocked(); } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the files this AssetManager references are all 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * up-to-date (have not been changed since it was created). If false 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is returned, you will need to create a new AssetManager to get 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current data. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isUpToDate(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the known locales for this asset manager object. 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void getLocales(Vector<String8>* locales) const; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct asset_path 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 path; 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type; 22657f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad String8 idmap; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openInPathLocked(const char* fileName, AccessMode mode, 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openNonAssetInPathLocked(const char* fileName, AccessMode mode, 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openInLocaleVendorLocked(const char* fileName, AccessMode mode, 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* locale, const char* vendor); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 createPathNameLocked(const asset_path& path, const char* locale, 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* vendor); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 createPathNameLocked(const asset_path& path, const char* rootDir); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 createZipSourceNameLocked(const String8& zipFileName, 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& dirName, const String8& fileName); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* getZipFileLocked(const asset_path& path); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openAssetFromFileLocked(const String8& fileName, AccessMode mode); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openAssetFromZipLocked(const ZipFileRO* pZipFile, 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ZipEntryRO entry, AccessMode mode, const String8& entryName); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* rootDir, const char* dirName); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AssetDir::FileInfo>* scanDirLocked(const String8& path); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* rootDir, const char* dirName); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SortedVector<AssetDir::FileInfo>* pContents); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void loadFileNameCacheLocked(void); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void fncScanLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* dirName); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool fncScanAndMergeDirLocked( 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AssetDir::FileInfo>* pMergedInfo, 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* locale, const char* vendor, 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* dirName); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void purgeFileNameCacheLocked(void); 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable* getResTable(bool required = true) const; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setLocaleLocked(const char* locale); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateResourceParamsLocked() const; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26757f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad bool createIdmapFileLocked(const String8& originalPath, const String8& overlayPath, 26857f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad const String8& idmapPath); 26957f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad 27057f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad bool isIdmapStaleLocked(const String8& originalPath, const String8& overlayPath, 27157f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad const String8& idmapPath); 27257f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad 27357f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad Asset* openIdmapLocked(const struct asset_path& ap) const; 27457f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad 27557f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad bool getZipEntryCrcLocked(const String8& zipPath, const char* entryFilename, uint32_t* pCrc); 27657f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class SharedZip : public RefBase { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static sp<SharedZip> get(const String8& path); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* getZip(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* getResourceTableAsset(); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* setResourceTableAsset(Asset* asset); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28678c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* getResourceTable(); 28778c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* setResourceTable(ResTable* res); 28878c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isUpToDate(); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~SharedZip(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedZip(const String8& path, time_t modWhen); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedZip(); // <-- not implemented 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 mPath; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* mZipFile; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time_t mModWhen; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* mResourceTableAsset; 30378c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* mResourceTable; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static Mutex gLock; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static DefaultKeyedVector<String8, wp<SharedZip> > gOpen; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Manage a set of Zip files. For each file we need a pointer to the 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ZipFile and a time_t with the file's modification date. 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We currently only have two zip files (current app, "common" app). 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (This was originally written for 8, based on app/locale/vendor.) 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class ZipSet { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipSet(void); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~ZipSet(void); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a ZipFileRO structure for a ZipFileRO with the specified 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* getZip(const String8& path); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32778c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn Asset* getZipResourceTableAsset(const String8& path); 32878c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn Asset* setZipResourceTableAsset(const String8& path, Asset* asset); 32978c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn 33078c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* getZipResourceTable(const String8& path); 33178c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* setZipResourceTable(const String8& path, ResTable* res); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // generate path, e.g. "common/en-US-noogle.zip" 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static String8 getPathName(const char* path); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isUpToDate(); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void closeZip(int idx); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getIndex(const String8& zip) const; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Vector<String8> mZipPath; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Vector<sp<SharedZip> > mZipFile; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Protect all internal state. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Mutex mLock; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipSet mZipSet; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<asset_path> mAssetPaths; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* mLocale; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* mVendor; 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable ResTable* mResources; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* mConfig; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cached data for "loose" files. This lets us avoid poking at the 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filesystem when searching for loose assets. Each entry is the 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "extended partial" path, e.g. "default/default/foo/bar.txt". The 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * full set of files is present, including ".EXCLUDE" entries. 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We do not cache directory names. We don't retain the ".gz", 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because to our clients "foo" and "foo.gz" both look like "foo". 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CacheMode mCacheMode; // is the cache enabled? 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mCacheValid; // clear when locale or vendor changes 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AssetDir::FileInfo> mCache; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // __LIBS_ASSETMANAGER_H 375