// // Copyright 2011 The Android Open Source Project // // Defines an abstraction for opening a directory on the filesystem and // iterating through it. #ifndef DIRECTORYWALKER_H #define DIRECTORYWALKER_H #include <dirent.h> #include <sys/types.h> #include <sys/param.h> #include <sys/stat.h> #include <unistd.h> #include <utils/String8.h> #include <stdio.h> using namespace android; // Directory Walker // This is an abstraction for walking through a directory and getting files // and descriptions. class DirectoryWalker { public: virtual ~DirectoryWalker() {}; virtual bool openDir(String8 path) = 0; virtual bool openDir(const char* path) = 0; // Advance to next directory entry virtual struct dirent* nextEntry() = 0; // Get the stats for the current entry virtual struct stat* entryStats() = 0; // Clean Up virtual void closeDir() = 0; // This class is able to replicate itself on the heap virtual DirectoryWalker* clone() = 0; // DATA MEMBERS // Current directory entry struct dirent mEntry; // Stats for that directory entry struct stat mStats; // Base path String8 mBasePath; }; // System Directory Walker // This is an implementation of the above abstraction that calls // real system calls and is fully functional. // functions are inlined since they're very short and simple class SystemDirectoryWalker : public DirectoryWalker { // Default constructor, copy constructor, and destructor are fine public: virtual bool openDir(String8 path) { mBasePath = path; dir = NULL; dir = opendir(mBasePath.string() ); if (dir == NULL) return false; return true; }; virtual bool openDir(const char* path) { String8 p(path); openDir(p); return true; }; // Advance to next directory entry virtual struct dirent* nextEntry() { struct dirent* entryPtr = readdir(dir); if (entryPtr == NULL) return NULL; mEntry = *entryPtr; // Get stats String8 fullPath = mBasePath.appendPathCopy(mEntry.d_name); stat(fullPath.string(),&mStats); return &mEntry; }; // Get the stats for the current entry virtual struct stat* entryStats() { return &mStats; }; virtual void closeDir() { closedir(dir); }; virtual DirectoryWalker* clone() { return new SystemDirectoryWalker(*this); }; private: DIR* dir; }; #endif // DIRECTORYWALKER_H