xref: /aosp_15_r20/frameworks/base/tools/aapt/CrunchCache.h (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker //
2*d57664e9SAndroid Build Coastguard Worker // Copyright 2011 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker //
4*d57664e9SAndroid Build Coastguard Worker // Cache manager for pre-processed PNG files.
5*d57664e9SAndroid Build Coastguard Worker // Contains code for managing which PNG files get processed
6*d57664e9SAndroid Build Coastguard Worker // at build time.
7*d57664e9SAndroid Build Coastguard Worker //
8*d57664e9SAndroid Build Coastguard Worker 
9*d57664e9SAndroid Build Coastguard Worker #ifndef CRUNCHCACHE_H
10*d57664e9SAndroid Build Coastguard Worker #define CRUNCHCACHE_H
11*d57664e9SAndroid Build Coastguard Worker 
12*d57664e9SAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
13*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h>
14*d57664e9SAndroid Build Coastguard Worker #include "FileFinder.h"
15*d57664e9SAndroid Build Coastguard Worker #include "CacheUpdater.h"
16*d57664e9SAndroid Build Coastguard Worker 
17*d57664e9SAndroid Build Coastguard Worker using namespace android;
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker /** CrunchCache
20*d57664e9SAndroid Build Coastguard Worker  *  This class is a cache manager which can pre-process PNG files and store
21*d57664e9SAndroid Build Coastguard Worker  *  them in a mirror-cache. It's capable of doing incremental updates to its
22*d57664e9SAndroid Build Coastguard Worker  *  cache.
23*d57664e9SAndroid Build Coastguard Worker  *
24*d57664e9SAndroid Build Coastguard Worker  *  Usage:
25*d57664e9SAndroid Build Coastguard Worker  *      Create an instance initialized with the root of the source tree, the
26*d57664e9SAndroid Build Coastguard Worker  *      root location to store the cache files, and an instance of a file finder.
27*d57664e9SAndroid Build Coastguard Worker  *      Then update the cache by calling crunch.
28*d57664e9SAndroid Build Coastguard Worker  */
29*d57664e9SAndroid Build Coastguard Worker class CrunchCache {
30*d57664e9SAndroid Build Coastguard Worker public:
31*d57664e9SAndroid Build Coastguard Worker     // Constructor
32*d57664e9SAndroid Build Coastguard Worker     CrunchCache(String8 sourcePath, String8 destPath, FileFinder* ff);
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker     // Nobody should be calling the default constructor
35*d57664e9SAndroid Build Coastguard Worker     // So this space is intentionally left blank
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker     // Default Copy Constructor and Destructor are fine
38*d57664e9SAndroid Build Coastguard Worker 
39*d57664e9SAndroid Build Coastguard Worker     /** crunch is the workhorse of this class.
40*d57664e9SAndroid Build Coastguard Worker      * It goes through all the files found in the sourcePath and compares
41*d57664e9SAndroid Build Coastguard Worker      * them to the cached versions in the destPath. If the optional
42*d57664e9SAndroid Build Coastguard Worker      * argument forceOverwrite is set to true, then all source files are
43*d57664e9SAndroid Build Coastguard Worker      * re-crunched even if they have not been modified recently. Otherwise,
44*d57664e9SAndroid Build Coastguard Worker      * source files are only crunched when they needUpdating. Afterwards,
45*d57664e9SAndroid Build Coastguard Worker      * we delete any leftover files in the cache that are no longer present
46*d57664e9SAndroid Build Coastguard Worker      * in source.
47*d57664e9SAndroid Build Coastguard Worker      *
48*d57664e9SAndroid Build Coastguard Worker      * PRECONDITIONS:
49*d57664e9SAndroid Build Coastguard Worker      *      No setup besides construction is needed
50*d57664e9SAndroid Build Coastguard Worker      * POSTCONDITIONS:
51*d57664e9SAndroid Build Coastguard Worker      *      The cache is updated to fully reflect all changes in source.
52*d57664e9SAndroid Build Coastguard Worker      *      The function then returns the number of files changed in cache
53*d57664e9SAndroid Build Coastguard Worker      *      (counting deletions).
54*d57664e9SAndroid Build Coastguard Worker      */
55*d57664e9SAndroid Build Coastguard Worker     size_t crunch(CacheUpdater* cu, bool forceOverwrite=false);
56*d57664e9SAndroid Build Coastguard Worker 
57*d57664e9SAndroid Build Coastguard Worker private:
58*d57664e9SAndroid Build Coastguard Worker     /** loadFiles is a wrapper to the FileFinder that places matching
59*d57664e9SAndroid Build Coastguard Worker      * files into mSourceFiles and mDestFiles.
60*d57664e9SAndroid Build Coastguard Worker      *
61*d57664e9SAndroid Build Coastguard Worker      *  POSTCONDITIONS
62*d57664e9SAndroid Build Coastguard Worker      *      mDestFiles and mSourceFiles are refreshed to reflect the current
63*d57664e9SAndroid Build Coastguard Worker      *      state of the files in the source and dest directories.
64*d57664e9SAndroid Build Coastguard Worker      *      Any previous contents of mSourceFiles and mDestFiles are cleared.
65*d57664e9SAndroid Build Coastguard Worker      */
66*d57664e9SAndroid Build Coastguard Worker     void loadFiles();
67*d57664e9SAndroid Build Coastguard Worker 
68*d57664e9SAndroid Build Coastguard Worker     /** needsUpdating takes a file path
69*d57664e9SAndroid Build Coastguard Worker      * and returns true if the file represented by this path is newer in the
70*d57664e9SAndroid Build Coastguard Worker      * sourceFiles than in the cache (mDestFiles).
71*d57664e9SAndroid Build Coastguard Worker      *
72*d57664e9SAndroid Build Coastguard Worker      * PRECONDITIONS:
73*d57664e9SAndroid Build Coastguard Worker      *      mSourceFiles and mDestFiles must be initialized and filled.
74*d57664e9SAndroid Build Coastguard Worker      * POSTCONDITIONS:
75*d57664e9SAndroid Build Coastguard Worker      *      returns true if and only if source file's modification time
76*d57664e9SAndroid Build Coastguard Worker      *      is greater than the cached file's mod-time. Otherwise returns false.
77*d57664e9SAndroid Build Coastguard Worker      *
78*d57664e9SAndroid Build Coastguard Worker      * USAGE:
79*d57664e9SAndroid Build Coastguard Worker      *      Should be used something like the following:
80*d57664e9SAndroid Build Coastguard Worker      *      if (needsUpdating(filePath))
81*d57664e9SAndroid Build Coastguard Worker      *          // Recrunch sourceFile out to destFile.
82*d57664e9SAndroid Build Coastguard Worker      *
83*d57664e9SAndroid Build Coastguard Worker      */
84*d57664e9SAndroid Build Coastguard Worker     bool needsUpdating(const String8& relativePath) const;
85*d57664e9SAndroid Build Coastguard Worker 
86*d57664e9SAndroid Build Coastguard Worker     // DATA MEMBERS ====================================================
87*d57664e9SAndroid Build Coastguard Worker 
88*d57664e9SAndroid Build Coastguard Worker     String8 mSourcePath;
89*d57664e9SAndroid Build Coastguard Worker     String8 mDestPath;
90*d57664e9SAndroid Build Coastguard Worker 
91*d57664e9SAndroid Build Coastguard Worker     Vector<String8> mExtensions;
92*d57664e9SAndroid Build Coastguard Worker 
93*d57664e9SAndroid Build Coastguard Worker     // Each vector of paths contains one entry per PNG file encountered.
94*d57664e9SAndroid Build Coastguard Worker     // Each entry consists of a path pointing to that PNG.
95*d57664e9SAndroid Build Coastguard Worker     DefaultKeyedVector<String8,time_t> mSourceFiles;
96*d57664e9SAndroid Build Coastguard Worker     DefaultKeyedVector<String8,time_t> mDestFiles;
97*d57664e9SAndroid Build Coastguard Worker 
98*d57664e9SAndroid Build Coastguard Worker     // Pointer to a FileFinder to use
99*d57664e9SAndroid Build Coastguard Worker     FileFinder* mFileFinder;
100*d57664e9SAndroid Build Coastguard Worker };
101*d57664e9SAndroid Build Coastguard Worker 
102*d57664e9SAndroid Build Coastguard Worker #endif // CRUNCHCACHE_H
103