1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2011 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Cache manager for pre-processed PNG files. 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Contains code for managing which PNG files get processed 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// at build time. 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef CRUNCHCACHE_H 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define CRUNCHCACHE_H 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/KeyedVector.h> 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/String8.h> 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "FileFinder.h" 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "CacheUpdater.h" 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusing namespace android; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** CrunchCache 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This class is a cache manager which can pre-process PNG files and store 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * them in a mirror-cache. It's capable of doing incremental updates to its 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * cache. 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Usage: 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Create an instance initialized with the root of the source tree, the 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * root location to store the cache files, and an instance of a file finder. 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Then update the cache by calling crunch. 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass CrunchCache { 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Constructor 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski CrunchCache(String8 sourcePath, String8 destPath, FileFinder* ff); 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Nobody should be calling the default constructor 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // So this space is intentionally left blank 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Default Copy Constructor and Destructor are fine 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** crunch is the workhorse of this class. 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * It goes through all the files found in the sourcePath and compares 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * them to the cached versions in the destPath. If the optional 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * argument forceOverwrite is set to true, then all source files are 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * re-crunched even if they have not been modified recently. Otherwise, 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * source files are only crunched when they needUpdating. Afterwards, 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * we delete any leftover files in the cache that are no longer present 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * in source. 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * PRECONDITIONS: 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * No setup besides construction is needed 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * POSTCONDITIONS: 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * The cache is updated to fully reflect all changes in source. 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * The function then returns the number of files changed in cache 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * (counting deletions). 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t crunch(CacheUpdater* cu, bool forceOverwrite=false); 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** loadFiles is a wrapper to the FileFinder that places matching 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * files into mSourceFiles and mDestFiles. 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * POSTCONDITIONS 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * mDestFiles and mSourceFiles are refreshed to reflect the current 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * state of the files in the source and dest directories. 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Any previous contents of mSourceFiles and mDestFiles are cleared. 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void loadFiles(); 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** needsUpdating takes a file path 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * and returns true if the file represented by this path is newer in the 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * sourceFiles than in the cache (mDestFiles). 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * PRECONDITIONS: 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * mSourceFiles and mDestFiles must be initialized and filled. 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * POSTCONDITIONS: 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * returns true if and only if source file's modification time 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * is greater than the cached file's mod-time. Otherwise returns false. 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * USAGE: 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Should be used something like the following: 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * if (needsUpdating(filePath)) 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * // Recrunch sourceFile out to destFile. 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool needsUpdating(String8 relativePath) const; 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // DATA MEMBERS ==================================================== 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String8 mSourcePath; 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String8 mDestPath; 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<String8> mExtensions; 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Each vector of paths contains one entry per PNG file encountered. 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Each entry consists of a path pointing to that PNG. 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String8,time_t> mSourceFiles; 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DefaultKeyedVector<String8,time_t> mDestFiles; 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Pointer to a FileFinder to use 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski FileFinder* mFileFinder; 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // CRUNCHCACHE_H 103