#ifndef ANDROID_DVR_PERFORMANCED_DIRECTORY_READER_H_ #define ANDROID_DVR_PERFORMANCED_DIRECTORY_READER_H_ #include <dirent.h> #include <errno.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <android-base/unique_fd.h> namespace android { namespace dvr { // Utility class around readdir() that handles automatic cleanup. class DirectoryReader { public: explicit DirectoryReader(base::unique_fd directory_fd) { directory_ = fdopendir(directory_fd.get()); error_ = errno; if (directory_ != nullptr) directory_fd.release(); } ~DirectoryReader() { if (directory_) closedir(directory_); } bool IsValid() const { return directory_ != nullptr; } explicit operator bool() const { return IsValid(); } int GetError() const { return error_; } // Returns a pointer to a dirent describing the next directory entry. The // pointer is only valid unitl the next call to Next() or the DirectoryReader // is destroyed. Returns nullptr when the end of the directory is reached. dirent* Next() { if (directory_) return readdir(directory_); else return nullptr; } private: DIR* directory_; int error_; DirectoryReader(const DirectoryReader&) = delete; void operator=(const DirectoryReader&) = delete; }; } // namespace dvr } // namespace android #endif // ANDROID_DVR_PERFORMANCED_DIRECTORY_READER_H_