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