18a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 28a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Copyright 2011 The Android Open Source Project 38a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 48a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 58a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// File Finder. 68a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// This is a collection of useful functions for finding paths and modification 78a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// times of files that match an extension pattern in a directory tree. 88a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// and finding files in it. 98a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 108a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#ifndef FILEFINDER_H 118a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#define FILEFINDER_H 128a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 138a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/Vector.h> 148a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/KeyedVector.h> 158a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/String8.h> 168a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 178a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include "DirectoryWalker.h" 188a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 198a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinusing namespace android; 208a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 218a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Abstraction to allow for dependency injection. See MockFileFinder.h 228a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// for the testing implementation. 238a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass FileFinder { 248a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic: 258a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual bool findFiles(String8 basePath, Vector<String8>& extensions, 268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin KeyedVector<String8,time_t>& fileStore, 278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin DirectoryWalker* dw) = 0; 289102165fd8be64bdc9110d0839a84fcdfa5b68cbJosiah Gaskin 299102165fd8be64bdc9110d0839a84fcdfa5b68cbJosiah Gaskin virtual ~FileFinder() {}; 308a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin}; 318a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 328a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass SystemFileFinder : public FileFinder { 338a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic: 348a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 358a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector 368a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * and places path/modification date key/values pointing to 378a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * all files with matching extensions found into the KeyedVector 388a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * PRECONDITIONS 398a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * path is a valid system path 408a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * extensions should include leading "." 418a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * This is not necessary, but the comparison directly 428a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * compares the end of the path string so if the "." 438a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * is excluded there is a small chance you could have 448a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * a false positive match. (For example: extension "png" 458a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * would match a file called "blahblahpng") 468a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 478a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * POSTCONDITIONS 488a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * fileStore contains (in no guaranteed order) paths to all 498a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * matching files encountered in subdirectories of path 508a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * as keys in the KeyedVector. Each key has the modification time 518a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * of the file as its value. 528a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 538a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Calls checkAndAddFile on each file encountered in the directory tree 548a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * Recursively descends into subdirectories. 558a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 568a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual bool findFiles(String8 basePath, Vector<String8>& extensions, 578a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin KeyedVector<String8,time_t>& fileStore, 588a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin DirectoryWalker* dw); 598a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 608a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinprivate: 618a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin /** 628a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * checkAndAddFile looks at a single file path and stat combo 638a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * to determine whether it is a matching file (by looking at 648a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * the extension) 658a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 668a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * PRECONDITIONS 678a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * no setup is needed 688a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 698a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * POSTCONDITIONS 708a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * If the given file has a matching extension then a new entry 718a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * is added to the KeyedVector with the path as the key and the modification 728a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * time as the value. 738a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin * 748a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin */ 758a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin static void checkAndAddFile(String8 path, const struct stat* stats, 768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin Vector<String8>& extensions, 778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin KeyedVector<String8,time_t>& fileStore); 788a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 798a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin}; 808a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#endif // FILEFINDER_H 81