1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Copyright 2011 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef MOCKDIRECTORYWALKER_H 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define MOCKDIRECTORYWALKER_H 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Vector.h> 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/String8.h> 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utility> 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "DirectoryWalker.h" 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusing namespace android; 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiusing std::pair; 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// String8 Directory Walker 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// This is an implementation of the Directory Walker abstraction that is built 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// for testing. 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// Instead of system calls it queries a private data structure for the directory 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// entries. It takes a path and a map of filenames and their modification times. 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// functions are inlined since they are short and simple 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass StringDirectoryWalker : public DirectoryWalker { 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski StringDirectoryWalker(String8& path, Vector< pair<String8,time_t> >& data) 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski : mPos(0), mBasePath(path), mData(data) { 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski //fprintf(stdout,"StringDW built to mimic %s with %d files\n", 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // mBasePath.string()); 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Default copy constructor, and destructor are fine 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool openDir(String8 path) { 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // If the user is trying to query the "directory" that this 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // walker was initialized with, then return success. Else fail. 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return path == mBasePath; 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual bool openDir(const char* path) { 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String8 p(path); 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski openDir(p); 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return true; 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Advance to next entry in the Vector 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual struct dirent* nextEntry() { 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Advance position and check to see if we're done 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mPos >= mData.size()) 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return NULL; 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Place data in the entry descriptor. This class only returns files. 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mEntry.d_type = DT_REG; 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mEntry.d_ino = mPos; 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Copy chars from the string name to the entry name 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t i = 0; 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (i; i < mData[mPos].first.size(); ++i) 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mEntry.d_name[i] = mData[mPos].first[i]; 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mEntry.d_name[i] = '\0'; 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Place data in stats 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mStats.st_ino = mPos; 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mStats.st_mtime = mData[mPos].second; 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Get ready to move to the next entry 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mPos++; 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return &mEntry; 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Get the stats for the current entry 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual struct stat* entryStats() { 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return &mStats; 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Nothing to do in clean up 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual void closeDir() { 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Nothing to do 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual DirectoryWalker* clone() { 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return new StringDirectoryWalker(*this); 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Current position in the Vector 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski size_t mPos; 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Base path 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski String8 mBasePath; 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Data to simulate a directory full of files. 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector< pair<String8,time_t> > mData; 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // MOCKDIRECTORYWALKER_H