| // | |
| // Copyright 2011 The Android Open Source Project | |
| // | |
| // File Finder. | |
| // This is a collection of useful functions for finding paths and modification | |
| // times of files that match an extension pattern in a directory tree. | |
| // and finding files in it. | |
| #ifndef FILEFINDER_H | |
| #define FILEFINDER_H | |
| #include <utils/Vector.h> | |
| #include <utils/KeyedVector.h> | |
| #include <utils/String8.h> | |
| #include "DirectoryWalker.h" | |
| using namespace android; | |
| // Abstraction to allow for dependency injection. See MockFileFinder.h | |
| // for the testing implementation. | |
| class FileFinder { | |
| public: | |
| virtual bool findFiles(String8 basePath, Vector<String8>& extensions, | |
| KeyedVector<String8,time_t>& fileStore, | |
| DirectoryWalker* dw) = 0; | |
| virtual ~FileFinder() {}; | |
| }; | |
| class SystemFileFinder : public FileFinder { | |
| public: | |
| /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector | |
| * and places path/modification date key/values pointing to | |
| * all files with matching extensions found into the KeyedVector | |
| * PRECONDITIONS | |
| * path is a valid system path | |
| * extensions should include leading "." | |
| * This is not necessary, but the comparison directly | |
| * compares the end of the path string so if the "." | |
| * is excluded there is a small chance you could have | |
| * a false positive match. (For example: extension "png" | |
| * would match a file called "blahblahpng") | |
| * | |
| * POSTCONDITIONS | |
| * fileStore contains (in no guaranteed order) paths to all | |
| * matching files encountered in subdirectories of path | |
| * as keys in the KeyedVector. Each key has the modification time | |
| * of the file as its value. | |
| * | |
| * Calls checkAndAddFile on each file encountered in the directory tree | |
| * Recursively descends into subdirectories. | |
| */ | |
| virtual bool findFiles(String8 basePath, Vector<String8>& extensions, | |
| KeyedVector<String8,time_t>& fileStore, | |
| DirectoryWalker* dw); | |
| private: | |
| /** | |
| * checkAndAddFile looks at a single file path and stat combo | |
| * to determine whether it is a matching file (by looking at | |
| * the extension) | |
| * | |
| * PRECONDITIONS | |
| * no setup is needed | |
| * | |
| * POSTCONDITIONS | |
| * If the given file has a matching extension then a new entry | |
| * is added to the KeyedVector with the path as the key and the modification | |
| * time as the value. | |
| * | |
| */ | |
| static void checkAndAddFile(const String8& path, const struct stat* stats, | |
| Vector<String8>& extensions, | |
| KeyedVector<String8,time_t>& fileStore); | |
| }; | |
| #endif // FILEFINDER_H |