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