DirectoryWalker.h revision 8a39da80b33691b0c82458c3b7727e13ff71277e
19258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org//
29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Copyright 2011 The Android Open Source Project
39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//
49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Defines an abstraction for opening a directory on the filesystem and
59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// iterating through it.
69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#ifndef DIRECTORYWALKER_H
89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#define DIRECTORYWALKER_H
99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <dirent.h>
119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <sys/types.h>
129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <sys/param.h>
139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <sys/stat.h>
149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <unistd.h>
159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <utils/String8.h>
169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <stdio.h>
189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace android;
209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Directory Walker
229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// This is an abstraction for walking through a directory and getting files
239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// and descriptions.
249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass DirectoryWalker {
269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.compublic:
279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    virtual ~DirectoryWalker() {};
289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    virtual bool openDir(String8 path) = 0;
299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    virtual bool openDir(const char* path) = 0;
309a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // Advance to next directory entry
31c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    virtual struct dirent* nextEntry() = 0;
32c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    // Get the stats for the current entry
339a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    virtual struct stat*   entryStats() = 0;
34245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // Clean Up
35245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    virtual void closeDir() = 0;
36245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // This class is able to replicate itself on the heap
37245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    virtual DirectoryWalker* clone() = 0;
38245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org
39245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // DATA MEMBERS
40245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // Current directory entry
41245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    struct dirent mEntry;
42245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    // Stats for that directory entry
43245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    struct stat mStats;
449258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    // Base path
459258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org    String8 mBasePath;
469258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org};
479258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org
48245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// System Directory Walker
49245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// This is an implementation of the above abstraction that calls
50245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org// real system calls and is fully functional.
519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// functions are inlined since they're very short and simple
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comclass SystemDirectoryWalker : public DirectoryWalker {
54e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
55e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    // Default constructor, copy constructor, and destructor are fine
56e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgpublic:
57e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    virtual bool openDir(String8 path) {
58e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        mBasePath = path;
59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        dir = NULL;
60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        dir = opendir(mBasePath.string() );
61e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
62e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        if (dir == NULL)
63e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org            return false;
64e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
65e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        return true;
66e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    };
67e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    virtual bool openDir(const char* path) {
68e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        String8 p(path);
69e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        openDir(p);
70e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        return true;
71e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    };
72e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    // Advance to next directory entry
73e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    virtual struct dirent* nextEntry() {
74c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org        struct dirent* entryPtr = readdir(dir);
75c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org        if (entryPtr == NULL)
76c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org            return NULL;
77c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
789a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        mEntry = *entryPtr;
799a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        // Get stats
809a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        String8 fullPath = mBasePath.appendPathCopy(mEntry.d_name);
819258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org        stat(fullPath.string(),&mStats);
82245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org        return &mEntry;
839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    };
849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    // Get the stats for the current entry
859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    virtual struct stat*   entryStats() {
869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com        return &mStats;
879a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com    };
88245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org    virtual void closeDir() {
899258b6bc66e09368ada54001f619d53b4fc976d5ager@chromium.org        closedir(dir);
9046a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org    };
9157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    virtual DirectoryWalker* clone() {
9257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org        return new SystemDirectoryWalker(*this);
9357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    };
9457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.orgprivate:
9557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    DIR* dir;
9657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org};
97e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org
982c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org#endif // DIRECTORYWALKER_H
992c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org