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