18a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 28a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Copyright 2011 The Android Open Source Project 38a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// 48a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#ifndef MOCKDIRECTORYWALKER_H 58a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#define MOCKDIRECTORYWALKER_H 68a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 78a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/Vector.h> 88a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utils/String8.h> 98a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include <utility> 108a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#include "DirectoryWalker.h" 118a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 128a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinusing namespace android; 138a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinusing std::pair; 148a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 158a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// String8 Directory Walker 168a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// This is an implementation of the Directory Walker abstraction that is built 178a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// for testing. 188a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// Instead of system calls it queries a private data structure for the directory 198a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// entries. It takes a path and a map of filenames and their modification times. 208a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin// functions are inlined since they are short and simple 218a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 228a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinclass StringDirectoryWalker : public DirectoryWalker { 238a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinpublic: 248a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin StringDirectoryWalker(String8& path, Vector< pair<String8,time_t> >& data) 258a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin : mPos(0), mBasePath(path), mData(data) { 268a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin //fprintf(stdout,"StringDW built to mimic %s with %d files\n", 278a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // mBasePath.string()); 288a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 298a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Default copy constructor, and destructor are fine 308a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 318a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual bool openDir(String8 path) { 328a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // If the user is trying to query the "directory" that this 338a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // walker was initialized with, then return success. Else fail. 348a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return path == mBasePath; 358a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 368a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual bool openDir(const char* path) { 378a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 p(path); 388a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin openDir(p); 398a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return true; 408a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 418a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Advance to next entry in the Vector 428a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual struct dirent* nextEntry() { 438a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Advance position and check to see if we're done 448a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin if (mPos >= mData.size()) 458a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return NULL; 468a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 478a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Place data in the entry descriptor. This class only returns files. 488a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mEntry.d_type = DT_REG; 498a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mEntry.d_ino = mPos; 508a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Copy chars from the string name to the entry name 518a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin size_t i = 0; 528a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin for (i; i < mData[mPos].first.size(); ++i) 538a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mEntry.d_name[i] = mData[mPos].first[i]; 548a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mEntry.d_name[i] = '\0'; 558a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 568a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Place data in stats 578a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mStats.st_ino = mPos; 588a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mStats.st_mtime = mData[mPos].second; 598a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 608a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Get ready to move to the next entry 618a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin mPos++; 628a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 638a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return &mEntry; 648a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 658a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Get the stats for the current entry 668a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual struct stat* entryStats() { 678a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return &mStats; 688a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 698a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Nothing to do in clean up 708a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual void closeDir() { 718a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Nothing to do 728a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 738a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin virtual DirectoryWalker* clone() { 748a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin return new StringDirectoryWalker(*this); 758a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin }; 768a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskinprivate: 778a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Current position in the Vector 788a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin size_t mPos; 798a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Base path 808a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin String8 mBasePath; 818a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin // Data to simulate a directory full of files. 828a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin Vector< pair<String8,time_t> > mData; 838a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin}; 848a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin 858a39da80b33691b0c82458c3b7727e13ff71277eJosiah Gaskin#endif // MOCKDIRECTORYWALKER_H