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