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