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