| // | 
 | // Copyright 2011 The Android Open Source Project | 
 | // | 
 |  | 
 | // File Finder implementation. | 
 | // Implementation for the functions declared and documented in FileFinder.h | 
 |  | 
 | #include <utils/Vector.h> | 
 | #include <utils/String8.h> | 
 | #include <utils/KeyedVector.h> | 
 |  | 
 | #include <dirent.h> | 
 | #include <sys/stat.h> | 
 |  | 
 | #include "DirectoryWalker.h" | 
 | #include "FileFinder.h" | 
 |  | 
 | //#define DEBUG | 
 |  | 
 | using android::String8; | 
 |  | 
 | // Private function to check whether a file is a directory or not | 
 | bool isDirectory(const char* filename) { | 
 |     struct stat fileStat; | 
 |     if (stat(filename, &fileStat) == -1) { | 
 |         return false; | 
 |     } | 
 |     return(S_ISDIR(fileStat.st_mode)); | 
 | } | 
 |  | 
 |  | 
 | // Private function to check whether a file is a regular file or not | 
 | bool isFile(const char* filename) { | 
 |     struct stat fileStat; | 
 |     if (stat(filename, &fileStat) == -1) { | 
 |         return false; | 
 |     } | 
 |     return(S_ISREG(fileStat.st_mode)); | 
 | } | 
 |  | 
 | bool SystemFileFinder::findFiles(String8 basePath, Vector<String8>& extensions, | 
 |                                  KeyedVector<String8,time_t>& fileStore, | 
 |                                  DirectoryWalker* dw) | 
 | { | 
 |     // Scan the directory pointed to by basePath | 
 |     // check files and recurse into subdirectories. | 
 |     if (!dw->openDir(basePath)) { | 
 |         return false; | 
 |     } | 
 |     /* | 
 |      *  Go through all directory entries. Check each file using checkAndAddFile | 
 |      *  and recurse into sub-directories. | 
 |      */ | 
 |     struct dirent* entry; | 
 |     while ((entry = dw->nextEntry()) != NULL) { | 
 |         String8 entryName(entry->d_name); | 
 |         if (entry->d_name[0] == '.') // Skip hidden files and directories | 
 |             continue; | 
 |  | 
 |         String8 fullPath = basePath.appendPathCopy(entryName); | 
 |         // If this entry is a directory we'll recurse into it | 
 |         if (isDirectory(fullPath.string()) ) { | 
 |             DirectoryWalker* copy = dw->clone(); | 
 |             findFiles(fullPath, extensions, fileStore,copy); | 
 |             delete copy; | 
 |         } | 
 |  | 
 |         // If this entry is a file, we'll pass it over to checkAndAddFile | 
 |         if (isFile(fullPath.string()) ) { | 
 |             checkAndAddFile(fullPath,dw->entryStats(),extensions,fileStore); | 
 |         } | 
 |     } | 
 |  | 
 |     // Clean up | 
 |     dw->closeDir(); | 
 |  | 
 |     return true; | 
 | } | 
 |  | 
 | void SystemFileFinder::checkAndAddFile(String8 path, const struct stat* stats, | 
 |                                        Vector<String8>& extensions, | 
 |                                        KeyedVector<String8,time_t>& fileStore) | 
 | { | 
 |     // Loop over the extensions, checking for a match | 
 |     bool done = false; | 
 |     String8 ext(path.getPathExtension()); | 
 |     ext.toLower(); | 
 |     for (size_t i = 0; i < extensions.size() && !done; ++i) { | 
 |         String8 ext2 = extensions[i].getPathExtension(); | 
 |         ext2.toLower(); | 
 |         // Compare the extensions. If a match is found, add to storage. | 
 |         if (ext == ext2) { | 
 |             done = true; | 
 |             fileStore.add(path,stats->st_mtime); | 
 |         } | 
 |     } | 
 | } | 
 |  |