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