1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2011 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// File Finder.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This is a collection of useful functions for finding paths and modification
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// times of files that match an extension pattern in a directory tree.
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// and finding files in it.
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef FILEFINDER_H
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define FILEFINDER_H
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Vector.h>
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/KeyedVector.h>
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/String8.h>
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "DirectoryWalker.h"
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusing namespace android;
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Abstraction to allow for dependency injection. See MockFileFinder.h
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// for the testing implementation.
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass FileFinder {
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           KeyedVector<String8,time_t>& fileStore,
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           DirectoryWalker* dw) = 0;
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual ~FileFinder() {};
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass SystemFileFinder : public FileFinder {
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *           and places path/modification date key/values pointing to
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *          all files with matching extensions found into the KeyedVector
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * PRECONDITIONS
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *     path is a valid system path
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *     extensions should include leading "."
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                This is not necessary, but the comparison directly
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                compares the end of the path string so if the "."
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                is excluded there is a small chance you could have
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                a false positive match. (For example: extension "png"
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                would match a file called "blahblahpng")
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * POSTCONDITIONS
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *     fileStore contains (in no guaranteed order) paths to all
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                matching files encountered in subdirectories of path
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                as keys in the KeyedVector. Each key has the modification time
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *                of the file as its value.
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Calls checkAndAddFile on each file encountered in the directory tree
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Recursively descends into subdirectories.
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           KeyedVector<String8,time_t>& fileStore,
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                           DirectoryWalker* dw);
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /**
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * checkAndAddFile looks at a single file path and stat combo
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * to determine whether it is a matching file (by looking at
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * the extension)
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * PRECONDITIONS
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *    no setup is needed
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * POSTCONDITIONS
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *    If the given file has a matching extension then a new entry
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *    is added to the KeyedVector with the path as the key and the modification
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *    time as the value.
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static void checkAndAddFile(String8 path, const struct stat* stats,
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                Vector<String8>& extensions,
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                                KeyedVector<String8,time_t>& fileStore);
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // FILEFINDER_H
81