18a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin//
28a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Copyright 2011 The Android Open Source Project
38a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin//
48a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
58a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// File Finder.
68a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// This is a collection of useful functions for finding paths and modification
78a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// times of files that match an extension pattern in a directory tree.
88a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// and finding files in it.
98a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
108a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#ifndef FILEFINDER_H
118a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#define FILEFINDER_H
128a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
138a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/Vector.h>
148a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/KeyedVector.h>
158a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/String8.h>
168a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
178a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include "DirectoryWalker.h"
188a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
198a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinusing namespace android;
208a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
218a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Abstraction to allow for dependency injection. See MockFileFinder.h
228a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// for the testing implementation.
238a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass FileFinder {
248a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic:
258a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                           KeyedVector<String8,time_t>& fileStore,
278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                           DirectoryWalker* dw) = 0;
289102165fd8be64bdc9110d0839a84fcdfa5b68cbJosiah Gaskin
299102165fd8be64bdc9110d0839a84fcdfa5b68cbJosiah Gaskin    virtual ~FileFinder() {};
308a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin};
318a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
328a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass SystemFileFinder : public FileFinder {
338a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic:
348a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
358a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    /* findFiles takes a path, a Vector of extensions, and a destination KeyedVector
368a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *           and places path/modification date key/values pointing to
378a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *          all files with matching extensions found into the KeyedVector
388a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * PRECONDITIONS
398a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *     path is a valid system path
408a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *     extensions should include leading "."
418a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                This is not necessary, but the comparison directly
428a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                compares the end of the path string so if the "."
438a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                is excluded there is a small chance you could have
448a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                a false positive match. (For example: extension "png"
458a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                would match a file called "blahblahpng")
468a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *
478a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * POSTCONDITIONS
488a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *     fileStore contains (in no guaranteed order) paths to all
498a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                matching files encountered in subdirectories of path
508a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                as keys in the KeyedVector. Each key has the modification time
518a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *                of the file as its value.
528a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *
538a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * Calls checkAndAddFile on each file encountered in the directory tree
548a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * Recursively descends into subdirectories.
558a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     */
568a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    virtual bool findFiles(String8 basePath, Vector<String8>& extensions,
578a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                           KeyedVector<String8,time_t>& fileStore,
588a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                           DirectoryWalker* dw);
598a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
608a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinprivate:
618a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    /**
628a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * checkAndAddFile looks at a single file path and stat combo
638a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * to determine whether it is a matching file (by looking at
648a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * the extension)
658a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *
668a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * PRECONDITIONS
678a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *    no setup is needed
688a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *
698a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     * POSTCONDITIONS
708a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *    If the given file has a matching extension then a new entry
718a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *    is added to the KeyedVector with the path as the key and the modification
728a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *    time as the value.
738a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     *
748a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin     */
758a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin    static void checkAndAddFile(String8 path, const struct stat* stats,
768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                                Vector<String8>& extensions,
778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin                                KeyedVector<String8,time_t>& fileStore);
788a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin
798a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin};
808a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#endif // FILEFINDER_H
81