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