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 5*d57664e9SAndroid Build Coastguard Worker // File Finder. 6*d57664e9SAndroid Build Coastguard Worker // This is a collection of useful functions for finding paths and modification 7*d57664e9SAndroid Build Coastguard Worker // times of files that match an extension pattern in a directory tree. 8*d57664e9SAndroid Build Coastguard Worker // and finding files in it. 9*d57664e9SAndroid Build Coastguard Worker 10*d57664e9SAndroid Build Coastguard Worker #ifndef FILEFINDER_H 11*d57664e9SAndroid Build Coastguard Worker #define FILEFINDER_H 12*d57664e9SAndroid Build Coastguard Worker 13*d57664e9SAndroid Build Coastguard Worker #include <utils/Vector.h> 14*d57664e9SAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 15*d57664e9SAndroid Build Coastguard Worker #include <utils/String8.h> 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #include "DirectoryWalker.h" 18*d57664e9SAndroid Build Coastguard Worker 19*d57664e9SAndroid Build Coastguard Worker using namespace android; 20*d57664e9SAndroid Build Coastguard Worker 21*d57664e9SAndroid Build Coastguard Worker // Abstraction to allow for dependency injection. See MockFileFinder.h 22*d57664e9SAndroid Build Coastguard Worker // for the testing implementation. 23*d57664e9SAndroid Build Coastguard Worker class FileFinder { 24*d57664e9SAndroid Build Coastguard Worker public: 25*d57664e9SAndroid Build Coastguard Worker virtual bool findFiles(String8 basePath, Vector<String8>& extensions, 26*d57664e9SAndroid Build Coastguard Worker KeyedVector<String8,time_t>& fileStore, 27*d57664e9SAndroid Build Coastguard Worker DirectoryWalker* dw) = 0; 28*d57664e9SAndroid Build Coastguard Worker ~FileFinder()29*d57664e9SAndroid Build Coastguard Worker virtual ~FileFinder() {}; 30*d57664e9SAndroid Build Coastguard Worker }; 31*d57664e9SAndroid Build Coastguard Worker 32*d57664e9SAndroid Build Coastguard Worker class SystemFileFinder : public FileFinder { 33*d57664e9SAndroid Build Coastguard Worker public: 34*d57664e9SAndroid Build Coastguard Worker 35*d57664e9SAndroid Build Coastguard Worker /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector 36*d57664e9SAndroid Build Coastguard Worker * and places path/modification date key/values pointing to 37*d57664e9SAndroid Build Coastguard Worker * all files with matching extensions found into the KeyedVector 38*d57664e9SAndroid Build Coastguard Worker * PRECONDITIONS 39*d57664e9SAndroid Build Coastguard Worker * path is a valid system path 40*d57664e9SAndroid Build Coastguard Worker * extensions should include leading "." 41*d57664e9SAndroid Build Coastguard Worker * This is not necessary, but the comparison directly 42*d57664e9SAndroid Build Coastguard Worker * compares the end of the path string so if the "." 43*d57664e9SAndroid Build Coastguard Worker * is excluded there is a small chance you could have 44*d57664e9SAndroid Build Coastguard Worker * a false positive match. (For example: extension "png" 45*d57664e9SAndroid Build Coastguard Worker * would match a file called "blahblahpng") 46*d57664e9SAndroid Build Coastguard Worker * 47*d57664e9SAndroid Build Coastguard Worker * POSTCONDITIONS 48*d57664e9SAndroid Build Coastguard Worker * fileStore contains (in no guaranteed order) paths to all 49*d57664e9SAndroid Build Coastguard Worker * matching files encountered in subdirectories of path 50*d57664e9SAndroid Build Coastguard Worker * as keys in the KeyedVector. Each key has the modification time 51*d57664e9SAndroid Build Coastguard Worker * of the file as its value. 52*d57664e9SAndroid Build Coastguard Worker * 53*d57664e9SAndroid Build Coastguard Worker * Calls checkAndAddFile on each file encountered in the directory tree 54*d57664e9SAndroid Build Coastguard Worker * Recursively descends into subdirectories. 55*d57664e9SAndroid Build Coastguard Worker */ 56*d57664e9SAndroid Build Coastguard Worker virtual bool findFiles(String8 basePath, Vector<String8>& extensions, 57*d57664e9SAndroid Build Coastguard Worker KeyedVector<String8,time_t>& fileStore, 58*d57664e9SAndroid Build Coastguard Worker DirectoryWalker* dw); 59*d57664e9SAndroid Build Coastguard Worker 60*d57664e9SAndroid Build Coastguard Worker private: 61*d57664e9SAndroid Build Coastguard Worker /** 62*d57664e9SAndroid Build Coastguard Worker * checkAndAddFile looks at a single file path and stat combo 63*d57664e9SAndroid Build Coastguard Worker * to determine whether it is a matching file (by looking at 64*d57664e9SAndroid Build Coastguard Worker * the extension) 65*d57664e9SAndroid Build Coastguard Worker * 66*d57664e9SAndroid Build Coastguard Worker * PRECONDITIONS 67*d57664e9SAndroid Build Coastguard Worker * no setup is needed 68*d57664e9SAndroid Build Coastguard Worker * 69*d57664e9SAndroid Build Coastguard Worker * POSTCONDITIONS 70*d57664e9SAndroid Build Coastguard Worker * If the given file has a matching extension then a new entry 71*d57664e9SAndroid Build Coastguard Worker * is added to the KeyedVector with the path as the key and the modification 72*d57664e9SAndroid Build Coastguard Worker * time as the value. 73*d57664e9SAndroid Build Coastguard Worker * 74*d57664e9SAndroid Build Coastguard Worker */ 75*d57664e9SAndroid Build Coastguard Worker static void checkAndAddFile(const String8& path, const struct stat* stats, 76*d57664e9SAndroid Build Coastguard Worker Vector<String8>& extensions, 77*d57664e9SAndroid Build Coastguard Worker KeyedVector<String8,time_t>& fileStore); 78*d57664e9SAndroid Build Coastguard Worker 79*d57664e9SAndroid Build Coastguard Worker }; 80*d57664e9SAndroid Build Coastguard Worker #endif // FILEFINDER_H 81