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