1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2011 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// File Finder. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This is a collection of useful functions for finding paths and modification 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// times of files that match an extension pattern in a directory tree. 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// and finding files in it. 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef FILEFINDER_H 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define FILEFINDER_H 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Vector.h> 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/KeyedVector.h> 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/String8.h> 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "DirectoryWalker.h" 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusing namespace android; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Abstraction to allow for dependency injection. See MockFileFinder.h 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// for the testing implementation. 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass FileFinder { 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool findFiles(String8 basePath, Vector<String8>& extensions, 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski KeyedVector<String8,time_t>& fileStore, 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DirectoryWalker* dw) = 0; 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual ~FileFinder() {}; 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass SystemFileFinder : public FileFinder { 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * and places path/modification date key/values pointing to 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * all files with matching extensions found into the KeyedVector 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * PRECONDITIONS 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * path is a valid system path 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * extensions should include leading "." 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This is not necessary, but the comparison directly 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * compares the end of the path string so if the "." 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * is excluded there is a small chance you could have 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * a false positive match. (For example: extension "png" 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * would match a file called "blahblahpng") 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * POSTCONDITIONS 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * fileStore contains (in no guaranteed order) paths to all 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * matching files encountered in subdirectories of path 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * as keys in the KeyedVector. Each key has the modification time 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * of the file as its value. 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Calls checkAndAddFile on each file encountered in the directory tree 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Recursively descends into subdirectories. 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool findFiles(String8 basePath, Vector<String8>& extensions, 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski KeyedVector<String8,time_t>& fileStore, 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski DirectoryWalker* dw); 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /** 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * checkAndAddFile looks at a single file path and stat combo 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * to determine whether it is a matching file (by looking at 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * the extension) 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * PRECONDITIONS 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * no setup is needed 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * POSTCONDITIONS 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If the given file has a matching extension then a new entry 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * is added to the KeyedVector with the path as the key and the modification 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * time as the value. 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski static void checkAndAddFile(String8 path, const struct stat* stats, 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<String8>& extensions, 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski KeyedVector<String8,time_t>& fileStore); 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // FILEFINDER_H 81