#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_