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