57 lines
1.4 KiB
C
57 lines
1.4 KiB
C
|
#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) {
|
||
|
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_
|