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> 251f5762e646bed2290934280464832782766ee68eMathias Agopian#include <androidfw/ZipFileRO.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/KeyedVector.h> 27b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <utils/SortedVector.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/String16.h> 29b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <utils/String8.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 31b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian#include <utils/Vector.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: 7265a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad static const char* RESOURCES_FILENAME; 7348d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad static const char* IDMAP_BIN; 7448d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad static const char* OVERLAY_DIR; 7548d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad static const char* TARGET_PACKAGE_NAME; 7648d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad static const char* TARGET_APK_PATH; 7748d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad static const char* IDMAP_DIR; 7848d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef enum CacheMode { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CACHE_UNKNOWN = 0, 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CACHE_OFF, // don't try to cache file locations 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CACHE_DEFER, // construct cache as pieces are needed 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //CACHE_SCAN, // scan full(!) asset hierarchy at init() time 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } CacheMode; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager(CacheMode cacheMode = CACHE_OFF); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AssetManager(void); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static int32_t getGlobalCount(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Add a new source for assets. This can be called multiple times to 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * look in multiple places for assets. It can be either a directory (for 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * finding assets as raw files on the disk) or a ZIP file. This newly 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * added asset path will be examined first when searching for assets, 96a6d7e3fb9c9233b9ae46b702d17433854c43d6a0Tao Bai * before any that were previously added, the assets are added as shared 97a6d7e3fb9c9233b9ae46b702d17433854c43d6a0Tao Bai * library if appAsLib is true. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns "true" on success, "false" on failure. If 'cookie' is non-NULL, 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * then on success, *cookie is set to the value corresponding to the 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * newly-added asset source. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1031c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader bool addAssetPath(const String8& path, int32_t* cookie, 1041c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader bool appAsLib=false, bool isSystemAsset=false); 10548d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad bool addOverlayPath(const String8& path, int32_t* cookie); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1071c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader /* 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Convenience for adding the standard system assets. Uses the 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ANDROID_ROOT environment variable to find them. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool addDefaultAssets(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1131c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader /* 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Iterate over the asset paths in this manager. (Previously 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * added via addAssetPath() and addDefaultAssets().) On first call, 116745d4efc8369d255341d810790132660e33d3b61Narayan Kamath * 'cookie' must be 0, resulting in the first cookie being returned. 117745d4efc8369d255341d810790132660e33d3b61Narayan Kamath * Each next cookie will be returned there-after, until -1 indicating 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the end has been reached. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 120745d4efc8369d255341d810790132660e33d3b61Narayan Kamath int32_t nextAssetPath(const int32_t cookie) const; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1221c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader /* 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return an asset path in the manager. 'which' must be between 0 and 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * countAssetPaths(). 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 126745d4efc8369d255341d810790132660e33d3b61Narayan Kamath String8 getAssetPath(const int32_t cookie) const; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set the current locale and vendor. The locale can change during 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the lifetime of an AssetManager if the user updates the device's 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * language setting. The vendor is less likely to change. 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pass in NULL to indicate no preference. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setLocale(const char* locale); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setVendor(const char* vendor); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Choose screen orientation for resources values returned. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setConfiguration(const ResTable_config& config, const char* locale = NULL); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14308d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn void getConfiguration(ResTable_config* outConfig) const; 14408d5b8fad8d46ccb64db2fdcb4d66972ec87bf48Dianne Hackborn 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project typedef Asset::AccessMode AccessMode; // typing shortcut 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open an asset. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This will search through locale-specific and vendor-specific 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * directories and packages to find the file. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The object returned does not depend on the AssetManager. It should 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be freed by calling Asset::close(). 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* open(const char* fileName, AccessMode mode); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a non-asset file as an asset. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This is for opening files that are included in an asset package 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * but aren't assets. These sit outside the usual "locale/vendor" 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * path hierarchy, and will not be seen by "AssetDir" or included 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in our filename cache. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 166de898ff42912bd7ca1bfb099cd439562496765a4Adam Lesinski Asset* openNonAsset(const char* fileName, AccessMode mode, int32_t* outCookie = NULL); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Explicit non-asset file. The file explicitly named by the cookie (the 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * resource set to look in) and fileName will be opened and returned. 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 172745d4efc8369d255341d810790132660e33d3b61Narayan Kamath Asset* openNonAsset(const int32_t cookie, const char* fileName, AccessMode mode); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Open a directory within the asset hierarchy. 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The contents of the directory are an amalgam of vendor-specific, 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * locale-specific, and generic assets stored loosely or in asset 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packages. Depending on the cache setting and previous accesses, 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this call may incur significant disk overhead. 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To open the top-level directory, pass in "". 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetDir* openDir(const char* dirName); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 187bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * Open a directory within a particular path of the asset manager. 188bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * 189bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * The contents of the directory are an amalgam of vendor-specific, 190bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * locale-specific, and generic assets stored loosely or in asset 191bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * packages. Depending on the cache setting and previous accesses, 192bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * this call may incur significant disk overhead. 193bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * 194bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn * To open the top-level directory, pass in "". 195bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn */ 196745d4efc8369d255341d810790132660e33d3b61Narayan Kamath AssetDir* openNonAssetDir(const int32_t cookie, const char* dirName); 197bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn 198bb9ea30ea9e390e69602935571795d2c80dc7b91Dianne Hackborn /* 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the type of a file in the asset hierarchy. They will either 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be "regular" or "directory". [Currently only works for "regular".] 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Can also be used as a quick test for existence of a file. 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType getFileType(const char* fileName); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return the complete resource table to find things in the package. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable& getResources(bool required = true) const; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Discard cached filename information. This only needs to be called 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if somebody has updated the set of "loose" files, and we want to 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * discard our cached notion of what's where. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void purge(void) { purgeFileNameCacheLocked(); } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return true if the files this AssetManager references are all 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * up-to-date (have not been changed since it was created). If false 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is returned, you will need to create a new AssetManager to get 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the current data. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isUpToDate(); 2251c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the known locales for this asset manager object. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2291c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader void getLocales(Vector<String8>* locales, bool includeSystemLocales=true) const; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23165a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad /** 23265a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad * Generate idmap data to translate resources IDs between a package and a 23365a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad * corresponding overlay package. 23465a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad */ 23565a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad bool createIdmap(const char* targetApkPath, const char* overlayApkPath, 236d9e385b111ebf811beb0f29178a2fbd4d667509fDianne Hackborn uint32_t targetCrc, uint32_t overlayCrc, uint32_t** outData, size_t* outSize); 23765a05fd56dbc9fd9c2511a97f49c445a748fb3c5Mårten Kongstad 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project struct asset_path 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2411c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader asset_path() : path(""), type(kFileTypeRegular), idmap(""), 2421c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader isSystemOverlay(false), isSystemAsset(false) {} 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 path; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileType type; 24557f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad String8 idmap; 246cb7b63d928cd562ea66d10d816056b984f50193aMårten Kongstad bool isSystemOverlay; 2471c686f2ce6cbfa3fdb598f452aa31d38f3eb2320Roozbeh Pournader bool isSystemAsset; 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openInPathLocked(const char* fileName, AccessMode mode, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openNonAssetInPathLocked(const char* fileName, AccessMode mode, 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openInLocaleVendorLocked(const char* fileName, AccessMode mode, 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* locale, const char* vendor); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 createPathNameLocked(const asset_path& path, const char* locale, 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* vendor); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 createPathNameLocked(const asset_path& path, const char* rootDir); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 createZipSourceNameLocked(const String8& zipFileName, 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const String8& dirName, const String8& fileName); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* getZipFileLocked(const asset_path& path); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openAssetFromFileLocked(const String8& fileName, AccessMode mode); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* openAssetFromZipLocked(const ZipFileRO* pZipFile, 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ZipEntryRO entry, AccessMode mode, const String8& entryName); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool scanAndMergeDirLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* rootDir, const char* dirName); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AssetDir::FileInfo>* scanDirLocked(const String8& path); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool scanAndMergeZipLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* rootDir, const char* dirName); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void mergeInfoLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const SortedVector<AssetDir::FileInfo>* pContents); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void loadFileNameCacheLocked(void); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void fncScanLocked(SortedVector<AssetDir::FileInfo>* pMergedInfo, 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* dirName); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool fncScanAndMergeDirLocked( 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AssetDir::FileInfo>* pMergedInfo, 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const asset_path& path, const char* locale, const char* vendor, 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* dirName); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void purgeFileNameCacheLocked(void); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const ResTable* getResTable(bool required = true) const; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void setLocaleLocked(const char* locale); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void updateResourceParamsLocked() const; 287a6d7e3fb9c9233b9ae46b702d17433854c43d6a0Tao Bai bool appendPathToResTable(const asset_path& ap, bool appAsLib=false) const; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28957f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad Asset* openIdmapLocked(const struct asset_path& ap) const; 29057f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad 29148d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad void addSystemOverlays(const char* pathOverlaysList, const String8& targetPackagePath, 29248d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad ResTable* sharedRes, size_t offset) const; 29357f4b77c89bafedf9468f9a636561c0c193405c9Mårten Kongstad 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class SharedZip : public RefBase { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 29648d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad static sp<SharedZip> get(const String8& path, bool createIfNotPresent = true); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* getZip(); 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* getResourceTableAsset(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* setResourceTableAsset(Asset* asset); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30378c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* getResourceTable(); 30478c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* setResourceTable(ResTable* res); 30578c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isUpToDate(); 30748d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad 30848d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad void addOverlay(const asset_path& ap); 30948d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad bool getOverlay(size_t idx, asset_path* out) const; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected: 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~SharedZip(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedZip(const String8& path, time_t modWhen); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SharedZip(); // <-- not implemented 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String8 mPath; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* mZipFile; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time_t mModWhen; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* mResourceTableAsset; 32378c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* mResourceTable; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32548d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad Vector<asset_path> mOverlays; 32648d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static Mutex gLock; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static DefaultKeyedVector<String8, wp<SharedZip> > gOpen; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Manage a set of Zip files. For each file we need a pointer to the 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ZipFile and a time_t with the file's modification date. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We currently only have two zip files (current app, "common" app). 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (This was originally written for 8, based on app/locale/vendor.) 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project class ZipSet { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public: 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipSet(void); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ~ZipSet(void); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return a ZipFileRO structure for a ZipFileRO with the specified 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * parameters. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipFileRO* getZip(const String8& path); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34978c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn Asset* getZipResourceTableAsset(const String8& path); 35078c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn Asset* setZipResourceTableAsset(const String8& path, Asset* asset); 35178c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn 35278c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* getZipResourceTable(const String8& path); 35378c405178c57bb45e40f1e2839d6a18d91f7f02cDianne Hackborn ResTable* setZipResourceTable(const String8& path, ResTable* res); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // generate path, e.g. "common/en-US-noogle.zip" 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static String8 getPathName(const char* path); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool isUpToDate(); 35948d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad 36048d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad void addOverlay(const String8& path, const asset_path& overlay); 36148d22323ce39f9aab003dce74456889b6414af55Mårten Kongstad bool getOverlay(const String8& path, size_t idx, asset_path* out) const; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private: 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void closeZip(int idx); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int getIndex(const String8& zip) const; 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Vector<String8> mZipPath; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Vector<sp<SharedZip> > mZipFile; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Protect all internal state. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable Mutex mLock; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ZipSet mZipSet; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Vector<asset_path> mAssetPaths; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* mLocale; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char* mVendor; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mutable ResTable* mResources; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResTable_config* mConfig; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cached data for "loose" files. This lets us avoid poking at the 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * filesystem when searching for loose assets. Each entry is the 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * "extended partial" path, e.g. "default/default/foo/bar.txt". The 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * full set of files is present, including ".EXCLUDE" entries. 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * We do not cache directory names. We don't retain the ".gz", 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * because to our clients "foo" and "foo.gz" both look like "foo". 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CacheMode mCacheMode; // is the cache enabled? 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool mCacheValid; // clear when locale or vendor changes 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SortedVector<AssetDir::FileInfo> mCache; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // __LIBS_ASSETMANAGER_H 400