18a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 28a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Copyright 2011 The Android Open Source Project 38a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 48a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Cache manager for pre-processed PNG files. 58a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Contains code for managing which PNG files get processed 68a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// at build time. 78a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 88a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 98a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#ifndef CRUNCHCACHE_H 108a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#define CRUNCHCACHE_H 118a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 128a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/KeyedVector.h> 138a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/String8.h> 148a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include "FileFinder.h" 158a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include "CacheUpdater.h" 168a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 178a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinusing namespace android; 188a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 198a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin/** CrunchCache 208a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * This class is a cache manager which can pre-process PNG files and store 218a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * them in a mirror-cache. It's capable of doing incremental updates to its 228a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * cache. 238a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 248a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Usage: 258a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Create an instance initialized with the root of the source tree, the 268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * root location to store the cache files, and an instance of a file finder. 278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Then update the cache by calling crunch. 288a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 298a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass CrunchCache { 308a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic: 318a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Constructor 328a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin CrunchCache(String8 sourcePath, String8 destPath, FileFinder* ff); 338a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 348a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Nobody should be calling the default constructor 358a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // So this space is intentionally left blank 368a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 378a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Default Copy Constructor and Destructor are fine 388a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 398a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin /** crunch is the workhorse of this class. 408a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * It goes through all the files found in the sourcePath and compares 418a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * them to the cached versions in the destPath. If the optional 428a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * argument forceOverwrite is set to true, then all source files are 438a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * re-crunched even if they have not been modified recently. Otherwise, 448a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * source files are only crunched when they needUpdating. Afterwards, 458a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * we delete any leftover files in the cache that are no longer present 468a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * in source. 478a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 488a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * PRECONDITIONS: 498a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * No setup besides construction is needed 508a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * POSTCONDITIONS: 518a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * The cache is updated to fully reflect all changes in source. 528a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * The function then returns the number of files changed in cache 538a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * (counting deletions). 548a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 558a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin size_t crunch(CacheUpdater* cu, bool forceOverwrite=false); 568a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 578a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinprivate: 588a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin /** loadFiles is a wrapper to the FileFinder that places matching 598a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * files into mSourceFiles and mDestFiles. 608a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 618a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * POSTCONDITIONS 628a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * mDestFiles and mSourceFiles are refreshed to reflect the current 638a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * state of the files in the source and dest directories. 648a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Any previous contents of mSourceFiles and mDestFiles are cleared. 658a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 668a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin void loadFiles(); 678a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 688a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin /** needsUpdating takes a file path 698a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * and returns true if the file represented by this path is newer in the 708a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * sourceFiles than in the cache (mDestFiles). 718a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 728a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * PRECONDITIONS: 738a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * mSourceFiles and mDestFiles must be initialized and filled. 748a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * POSTCONDITIONS: 758a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * returns true if and only if source file's modification time 768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * is greater than the cached file's mod-time. Otherwise returns false. 778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 788a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * USAGE: 798a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Should be used something like the following: 808a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * if (needsUpdating(filePath)) 818a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * // Recrunch sourceFile out to destFile. 828a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 838a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 848a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin bool needsUpdating(String8 relativePath) const; 858a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 868a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // DATA MEMBERS ==================================================== 878a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 888a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 mSourcePath; 898a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 mDestPath; 908a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 918a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin Vector<String8> mExtensions; 928a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 938a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Each vector of paths contains one entry per PNG file encountered. 948a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Each entry consists of a path pointing to that PNG. 958a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin DefaultKeyedVector<String8,time_t> mSourceFiles; 968a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin DefaultKeyedVector<String8,time_t> mDestFiles; 978a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 988a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Pointer to a FileFinder to use 998a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin FileFinder* mFileFinder; 1008a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin}; 1018a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 1028a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#endif // CRUNCHCACHE_H 103