| // |
| // 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 <androidfw/PathUtils.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.c_str() ); |
| |
| 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 = appendPathCopy(mBasePath, mEntry.d_name); |
| stat(fullPath.c_str(),&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 |