]> git.saurik.com Git - android/aapt.git/blame - FileFinder.cpp
am 84be06e4: resolved conflicts for merge of ea9e6d24 to honeycomb-plus-aosp
[android/aapt.git] / FileFinder.cpp
CommitLineData
dddb1fc7
JG
1//
2// Copyright 2011 The Android Open Source Project
3//
4
5// File Finder implementation.
6// Implementation for the functions declared and documented in FileFinder.h
7
8#include <utils/Vector.h>
9#include <utils/String8.h>
10#include <utils/KeyedVector.h>
11
12
13#include <iostream>
14
15#include "DirectoryWalker.h"
16#include "FileFinder.h"
17
18//#define DEBUG
19
20using android::String8;
21using std::cout;
22using std::endl;
23
24bool SystemFileFinder::findFiles(String8 basePath, Vector<String8>& extensions,
25 KeyedVector<String8,time_t>& fileStore,
26 DirectoryWalker* dw)
27{
28 // Scan the directory pointed to by basePath
29 // check files and recurse into subdirectories.
30 if (!dw->openDir(basePath)) {
31 return false;
32 }
33#ifdef DEBUG
34 cout << "FileFinder looking in " << basePath << endl;
35#endif // DEBUG
36 /*
37 * Go through all directory entries. Check each file using checkAndAddFile
38 * and recurse into sub-directories.
39 */
40 struct dirent* entry;
41 while ((entry = dw->nextEntry()) != NULL) {
42 String8 entryName(entry->d_name);
43 if (entry->d_name[0] == '.') // Skip hidden files and directories
44 continue;
45
46 String8 fullPath = basePath.appendPathCopy(entryName);
47 // If this entry is a directory we'll recurse into it
48 if (entry->d_type == DT_DIR) {
49 DirectoryWalker* copy = dw->clone();
50 findFiles(fullPath, extensions, fileStore,copy);
51 delete copy;
52 }
53
54 // If this entry is a file, we'll pass it over to checkAndAddFile
55 if (entry->d_type == DT_REG) {
56 checkAndAddFile(fullPath,dw->entryStats(),extensions,fileStore);
57 }
58 }
59
60 // Clean up
61 dw->closeDir();
62
63 return true;
64}
65
66void SystemFileFinder::checkAndAddFile(String8 path, const struct stat* stats,
67 Vector<String8>& extensions,
68 KeyedVector<String8,time_t>& fileStore)
69{
70#ifdef DEBUG
71 cout << "Checking file " << path << "...";
72#endif // DEBUG
73 // Loop over the extensions, checking for a match
74 bool done = false;
75 String8 ext(path.getPathExtension());
76 ext.toLower();
77 for (size_t i = 0; i < extensions.size() && !done; ++i) {
78 String8 ext2 = extensions[i].getPathExtension();
79 ext2.toLower();
80 // Compare the extensions. If a match is found, add to storage.
81 if (ext == ext2) {
82#ifdef DEBUG
83 cout << "Match";
84#endif // DEBUG
85 done = true;
86 fileStore.add(path,stats->st_mtime);
87 }
88 }
89#ifdef DEBUG
90 cout << endl;
91#endif //DEBUG
92}