| // |
| // Copyright 2011 The Android Open Source Project |
| // |
| #ifndef MOCKDIRECTORYWALKER_H |
| #define MOCKDIRECTORYWALKER_H |
| |
| #include <utils/Vector.h> |
| #include <utils/String8.h> |
| #include <utility> |
| #include "DirectoryWalker.h" |
| |
| using namespace android; |
| using std::pair; |
| |
| // String8 Directory Walker |
| // This is an implementation of the Directory Walker abstraction that is built |
| // for testing. |
| // Instead of system calls it queries a private data structure for the directory |
| // entries. It takes a path and a map of filenames and their modification times. |
| // functions are inlined since they are short and simple |
| |
| class StringDirectoryWalker : public DirectoryWalker { |
| public: |
| StringDirectoryWalker(String8& path, Vector< pair<String8,time_t> >& data) |
| : mPos(0), mBasePath(path), mData(data) { |
| //fprintf(stdout,"StringDW built to mimic %s with %d files\n", |
| // mBasePath.string()); |
| }; |
| // Default copy constructor, and destructor are fine |
| |
| virtual bool openDir(String8 path) { |
| // If the user is trying to query the "directory" that this |
| // walker was initialized with, then return success. Else fail. |
| return path == mBasePath; |
| }; |
| virtual bool openDir(const char* path) { |
| String8 p(path); |
| openDir(p); |
| return true; |
| }; |
| // Advance to next entry in the Vector |
| virtual struct dirent* nextEntry() { |
| // Advance position and check to see if we're done |
| if (mPos >= mData.size()) |
| return NULL; |
| |
| // Place data in the entry descriptor. This class only returns files. |
| mEntry.d_type = DT_REG; |
| mEntry.d_ino = mPos; |
| // Copy chars from the string name to the entry name |
| size_t i = 0; |
| for (i; i < mData[mPos].first.size(); ++i) |
| mEntry.d_name[i] = mData[mPos].first[i]; |
| mEntry.d_name[i] = '\0'; |
| |
| // Place data in stats |
| mStats.st_ino = mPos; |
| mStats.st_mtime = mData[mPos].second; |
| |
| // Get ready to move to the next entry |
| mPos++; |
| |
| return &mEntry; |
| }; |
| // Get the stats for the current entry |
| virtual struct stat* entryStats() { |
| return &mStats; |
| }; |
| // Nothing to do in clean up |
| virtual void closeDir() { |
| // Nothing to do |
| }; |
| virtual DirectoryWalker* clone() { |
| return new StringDirectoryWalker(*this); |
| }; |
| private: |
| // Current position in the Vector |
| size_t mPos; |
| // Base path |
| String8 mBasePath; |
| // Data to simulate a directory full of files. |
| Vector< pair<String8,time_t> > mData; |
| }; |
| |
| #endif // MOCKDIRECTORYWALKER_H |