xref: /aosp_15_r20/frameworks/base/tools/aapt/CrunchCache.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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 // Implementation file for CrunchCache
5*d57664e9SAndroid Build Coastguard Worker // This file defines functions laid out and documented in
6*d57664e9SAndroid Build Coastguard Worker // CrunchCache.h
7*d57664e9SAndroid Build Coastguard Worker 
8*d57664e9SAndroid Build Coastguard Worker #include <androidfw/PathUtils.h>
9*d57664e9SAndroid Build Coastguard Worker #include <utils/Compat.h>
10*d57664e9SAndroid Build Coastguard Worker #include <utils/Vector.h>
11*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h>
12*d57664e9SAndroid Build Coastguard Worker 
13*d57664e9SAndroid Build Coastguard Worker #include "DirectoryWalker.h"
14*d57664e9SAndroid Build Coastguard Worker #include "FileFinder.h"
15*d57664e9SAndroid Build Coastguard Worker #include "CacheUpdater.h"
16*d57664e9SAndroid Build Coastguard Worker #include "CrunchCache.h"
17*d57664e9SAndroid Build Coastguard Worker 
18*d57664e9SAndroid Build Coastguard Worker using namespace android;
19*d57664e9SAndroid Build Coastguard Worker 
CrunchCache(String8 sourcePath,String8 destPath,FileFinder * ff)20*d57664e9SAndroid Build Coastguard Worker CrunchCache::CrunchCache(String8 sourcePath, String8 destPath, FileFinder* ff)
21*d57664e9SAndroid Build Coastguard Worker     : mSourcePath(sourcePath), mDestPath(destPath), mSourceFiles(0), mDestFiles(0), mFileFinder(ff)
22*d57664e9SAndroid Build Coastguard Worker {
23*d57664e9SAndroid Build Coastguard Worker     // We initialize the default value to return to 0 so if a file doesn't exist
24*d57664e9SAndroid Build Coastguard Worker     // then all files are automatically "newer" than it.
25*d57664e9SAndroid Build Coastguard Worker 
26*d57664e9SAndroid Build Coastguard Worker     // Set file extensions to look for. Right now just pngs.
27*d57664e9SAndroid Build Coastguard Worker     mExtensions.push(String8(".png"));
28*d57664e9SAndroid Build Coastguard Worker 
29*d57664e9SAndroid Build Coastguard Worker     // Load files into our data members
30*d57664e9SAndroid Build Coastguard Worker     loadFiles();
31*d57664e9SAndroid Build Coastguard Worker }
32*d57664e9SAndroid Build Coastguard Worker 
crunch(CacheUpdater * cu,bool forceOverwrite)33*d57664e9SAndroid Build Coastguard Worker size_t CrunchCache::crunch(CacheUpdater* cu, bool forceOverwrite)
34*d57664e9SAndroid Build Coastguard Worker {
35*d57664e9SAndroid Build Coastguard Worker     size_t numFilesUpdated = 0;
36*d57664e9SAndroid Build Coastguard Worker 
37*d57664e9SAndroid Build Coastguard Worker     // Iterate through the source files and compare to cache.
38*d57664e9SAndroid Build Coastguard Worker     // After processing a file, remove it from the source files and
39*d57664e9SAndroid Build Coastguard Worker     // from the dest files.
40*d57664e9SAndroid Build Coastguard Worker     // We're done when we're out of files in source.
41*d57664e9SAndroid Build Coastguard Worker     String8 relativePath;
42*d57664e9SAndroid Build Coastguard Worker     while (mSourceFiles.size() > 0) {
43*d57664e9SAndroid Build Coastguard Worker         // Get the full path to the source file, then convert to a c-string
44*d57664e9SAndroid Build Coastguard Worker         // and offset our beginning pointer to the length of the sourcePath
45*d57664e9SAndroid Build Coastguard Worker         // This efficiently strips the source directory prefix from our path.
46*d57664e9SAndroid Build Coastguard Worker         // Also, String8 doesn't have a substring method so this is what we've
47*d57664e9SAndroid Build Coastguard Worker         // got to work with.
48*d57664e9SAndroid Build Coastguard Worker         const char* rPathPtr = mSourceFiles.keyAt(0).c_str()+mSourcePath.length();
49*d57664e9SAndroid Build Coastguard Worker         // Strip leading slash if present
50*d57664e9SAndroid Build Coastguard Worker         int offset = 0;
51*d57664e9SAndroid Build Coastguard Worker         if (rPathPtr[0] == OS_PATH_SEPARATOR)
52*d57664e9SAndroid Build Coastguard Worker             offset = 1;
53*d57664e9SAndroid Build Coastguard Worker         relativePath = String8(rPathPtr + offset);
54*d57664e9SAndroid Build Coastguard Worker 
55*d57664e9SAndroid Build Coastguard Worker         if (forceOverwrite || needsUpdating(relativePath)) {
56*d57664e9SAndroid Build Coastguard Worker             cu->processImage(appendPathCopy(mSourcePath, relativePath),
57*d57664e9SAndroid Build Coastguard Worker                              appendPathCopy(mDestPath, relativePath));
58*d57664e9SAndroid Build Coastguard Worker             numFilesUpdated++;
59*d57664e9SAndroid Build Coastguard Worker             // crunchFile(relativePath);
60*d57664e9SAndroid Build Coastguard Worker         }
61*d57664e9SAndroid Build Coastguard Worker         // Delete this file from the source files and (if it exists) from the
62*d57664e9SAndroid Build Coastguard Worker         // dest files.
63*d57664e9SAndroid Build Coastguard Worker         mSourceFiles.removeItemsAt(0);
64*d57664e9SAndroid Build Coastguard Worker         mDestFiles.removeItem(appendPathCopy(mDestPath, relativePath));
65*d57664e9SAndroid Build Coastguard Worker     }
66*d57664e9SAndroid Build Coastguard Worker 
67*d57664e9SAndroid Build Coastguard Worker     // Iterate through what's left of destFiles and delete leftovers
68*d57664e9SAndroid Build Coastguard Worker     while (mDestFiles.size() > 0) {
69*d57664e9SAndroid Build Coastguard Worker         cu->deleteFile(mDestFiles.keyAt(0));
70*d57664e9SAndroid Build Coastguard Worker         mDestFiles.removeItemsAt(0);
71*d57664e9SAndroid Build Coastguard Worker     }
72*d57664e9SAndroid Build Coastguard Worker 
73*d57664e9SAndroid Build Coastguard Worker     // Update our knowledge of the files cache
74*d57664e9SAndroid Build Coastguard Worker     // both source and dest should be empty by now.
75*d57664e9SAndroid Build Coastguard Worker     loadFiles();
76*d57664e9SAndroid Build Coastguard Worker 
77*d57664e9SAndroid Build Coastguard Worker     return numFilesUpdated;
78*d57664e9SAndroid Build Coastguard Worker }
79*d57664e9SAndroid Build Coastguard Worker 
loadFiles()80*d57664e9SAndroid Build Coastguard Worker void CrunchCache::loadFiles()
81*d57664e9SAndroid Build Coastguard Worker {
82*d57664e9SAndroid Build Coastguard Worker     // Clear out our data structures to avoid putting in duplicates
83*d57664e9SAndroid Build Coastguard Worker     mSourceFiles.clear();
84*d57664e9SAndroid Build Coastguard Worker     mDestFiles.clear();
85*d57664e9SAndroid Build Coastguard Worker 
86*d57664e9SAndroid Build Coastguard Worker     // Make a directory walker that points to the system.
87*d57664e9SAndroid Build Coastguard Worker     DirectoryWalker* dw = new SystemDirectoryWalker();
88*d57664e9SAndroid Build Coastguard Worker 
89*d57664e9SAndroid Build Coastguard Worker     // Load files in the source directory
90*d57664e9SAndroid Build Coastguard Worker     mFileFinder->findFiles(mSourcePath, mExtensions, mSourceFiles,dw);
91*d57664e9SAndroid Build Coastguard Worker 
92*d57664e9SAndroid Build Coastguard Worker     // Load files in the destination directory
93*d57664e9SAndroid Build Coastguard Worker     mFileFinder->findFiles(mDestPath,mExtensions,mDestFiles,dw);
94*d57664e9SAndroid Build Coastguard Worker 
95*d57664e9SAndroid Build Coastguard Worker     delete dw;
96*d57664e9SAndroid Build Coastguard Worker }
97*d57664e9SAndroid Build Coastguard Worker 
needsUpdating(const String8 & relativePath) const98*d57664e9SAndroid Build Coastguard Worker bool CrunchCache::needsUpdating(const String8& relativePath) const
99*d57664e9SAndroid Build Coastguard Worker {
100*d57664e9SAndroid Build Coastguard Worker     // Retrieve modification dates for this file entry under the source and
101*d57664e9SAndroid Build Coastguard Worker     // cache directory trees. The vectors will return a modification date of 0
102*d57664e9SAndroid Build Coastguard Worker     // if the file doesn't exist.
103*d57664e9SAndroid Build Coastguard Worker     time_t sourceDate = mSourceFiles.valueFor(appendPathCopy(mSourcePath, relativePath));
104*d57664e9SAndroid Build Coastguard Worker     time_t destDate = mDestFiles.valueFor(appendPathCopy(mDestPath, relativePath));
105*d57664e9SAndroid Build Coastguard Worker     return sourceDate > destDate;
106*d57664e9SAndroid Build Coastguard Worker }
107