#ifndef ANDROID_DVR_PERFORMANCED_DIRECTORY_READER_H_ #define ANDROID_DVR_PERFORMANCED_DIRECTORY_READER_H_ #include #include #include #include #include #include namespace android { namespace dvr { // Utility class around readdir() that handles automatic cleanup. class DirectoryReader { public: explicit DirectoryReader(base::unique_fd directory_fd) { int fd = directory_fd.release(); directory_ = fdopendir(fd); error_ = errno; if (directory_ == nullptr) close(fd); } ~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_