1 // 2 // Copyright 2011 The Android Open Source Project 3 // 4 #ifndef MOCKDIRECTORYWALKER_H 5 #define MOCKDIRECTORYWALKER_H 6 7 #include <utils/Vector.h> 8 #include <utils/String8.h> 9 #include <utility> 10 #include "DirectoryWalker.h" 11 12 using namespace android; 13 using std::pair; 14 15 // String8 Directory Walker 16 // This is an implementation of the Directory Walker abstraction that is built 17 // for testing. 18 // Instead of system calls it queries a private data structure for the directory 19 // entries. It takes a path and a map of filenames and their modification times. 20 // functions are inlined since they are short and simple 21 22 class StringDirectoryWalker : public DirectoryWalker { 23 public: StringDirectoryWalker(String8 & path,Vector<pair<String8,time_t>> & data)24 StringDirectoryWalker(String8& path, Vector< pair<String8,time_t> >& data) 25 : mPos(0), mBasePath(path), mData(data) { 26 //fprintf(stdout,"StringDW built to mimic %s with %d files\n", 27 // mBasePath.string()); 28 }; 29 // Default copy constructor, and destructor are fine 30 openDir(String8 path)31 virtual bool openDir(String8 path) { 32 // If the user is trying to query the "directory" that this 33 // walker was initialized with, then return success. Else fail. 34 return path == mBasePath; 35 }; openDir(const char * path)36 virtual bool openDir(const char* path) { 37 String8 p(path); 38 openDir(p); 39 return true; 40 }; 41 // Advance to next entry in the Vector nextEntry()42 virtual struct dirent* nextEntry() { 43 // Advance position and check to see if we're done 44 if (mPos >= mData.size()) 45 return NULL; 46 47 // Place data in the entry descriptor. This class only returns files. 48 mEntry.d_type = DT_REG; 49 mEntry.d_ino = mPos; 50 // Copy chars from the string name to the entry name 51 size_t i = 0; 52 for (i; i < mData[mPos].first.size(); ++i) 53 mEntry.d_name[i] = mData[mPos].first[i]; 54 mEntry.d_name[i] = '\0'; 55 56 // Place data in stats 57 mStats.st_ino = mPos; 58 mStats.st_mtime = mData[mPos].second; 59 60 // Get ready to move to the next entry 61 mPos++; 62 63 return &mEntry; 64 }; 65 // Get the stats for the current entry entryStats()66 virtual struct stat* entryStats() { 67 return &mStats; 68 }; 69 // Nothing to do in clean up closeDir()70 virtual void closeDir() { 71 // Nothing to do 72 }; clone()73 virtual DirectoryWalker* clone() { 74 return new StringDirectoryWalker(*this); 75 }; 76 private: 77 // Current position in the Vector 78 size_t mPos; 79 // Base path 80 String8 mBasePath; 81 // Data to simulate a directory full of files. 82 Vector< pair<String8,time_t> > mData; 83 }; 84 85 #endif // MOCKDIRECTORYWALKER_H