mirror of
https://github.com/Relintai/sfw.git
synced 2024-12-20 21:06:49 +01:00
146 lines
2.4 KiB
C++
146 lines
2.4 KiB
C++
|
|
//--STRIP
|
|
#include "dir_access.h"
|
|
|
|
#include "3rd_tinydir.h"
|
|
#include <cstdio>
|
|
//--STRIP
|
|
|
|
Error DirAccess::open_dir(const String &path, bool skip_specials) {
|
|
if (_dir_open) {
|
|
return ERR_CANT_ACQUIRE_RESOURCE;
|
|
}
|
|
|
|
_skip_specials = skip_specials;
|
|
|
|
if (tinydir_open(_dir, path.utf8().get_data()) == -1) {
|
|
return FAILED;
|
|
}
|
|
|
|
_dir_open = true;
|
|
|
|
return OK;
|
|
}
|
|
|
|
Error DirAccess::open_dir(const char *path, bool skip_specials) {
|
|
if (_dir_open) {
|
|
return ERR_CANT_ACQUIRE_RESOURCE;
|
|
}
|
|
|
|
_skip_specials = skip_specials;
|
|
|
|
if (tinydir_open(_dir, path) == -1) {
|
|
return FAILED;
|
|
}
|
|
|
|
_dir_open = true;
|
|
|
|
return OK;
|
|
}
|
|
|
|
void DirAccess::close_dir() {
|
|
if (!_dir_open) {
|
|
return;
|
|
}
|
|
|
|
tinydir_close(_dir);
|
|
|
|
_dir_open = false;
|
|
}
|
|
|
|
bool DirAccess::has_next() {
|
|
if (!_dir) {
|
|
return false;
|
|
}
|
|
|
|
return _dir->has_next;
|
|
}
|
|
bool DirAccess::read() {
|
|
_read_file_result = tinydir_readfile(_dir, _file);
|
|
|
|
return _read_file_result != -1;
|
|
}
|
|
bool DirAccess::next() {
|
|
if (!_dir->has_next) {
|
|
return false;
|
|
}
|
|
|
|
bool rres = read();
|
|
while (!rres && _dir->has_next) {
|
|
tinydir_next(_dir);
|
|
rres = read();
|
|
}
|
|
|
|
if (!rres) {
|
|
return false;
|
|
}
|
|
|
|
if (_dir->has_next) {
|
|
tinydir_next(_dir);
|
|
}
|
|
|
|
if (_skip_specials && current_is_dir() && current_is_special_dir()) {
|
|
return next();
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool DirAccess::current_is_ok() {
|
|
return _read_file_result == 01;
|
|
}
|
|
String DirAccess::current_get_name() {
|
|
return String(_file->name);
|
|
}
|
|
String DirAccess::current_get_path() {
|
|
return String(_file->path);
|
|
}
|
|
String DirAccess::current_get_extension() {
|
|
return String(_file->extension);
|
|
}
|
|
const char *DirAccess::current_get_name_cstr() {
|
|
return _file->name;
|
|
}
|
|
const char *DirAccess::current_get_path_cstr() {
|
|
return _file->path;
|
|
}
|
|
const char *DirAccess::current_get_extension_cstr() {
|
|
return _file->extension;
|
|
}
|
|
bool DirAccess::current_is_file() {
|
|
return !_file->is_dir;
|
|
}
|
|
bool DirAccess::current_is_dir() {
|
|
return _file->is_dir;
|
|
}
|
|
bool DirAccess::current_is_special_dir() {
|
|
if ((_file->name[0] == '.' && _file->name[1] == '\0') || (_file->name[0] == '.' && _file->name[1] == '.')) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool DirAccess::is_dir_open() {
|
|
return _dir_open;
|
|
}
|
|
bool DirAccess::is_dir_closed() {
|
|
return !_dir_open;
|
|
}
|
|
|
|
DirAccess::DirAccess() {
|
|
_skip_specials = true;
|
|
_read_file_result = 0;
|
|
_dir_open = false;
|
|
_dir = memnew(tinydir_dir);
|
|
_file = memnew(tinydir_file);
|
|
}
|
|
DirAccess::~DirAccess() {
|
|
if (is_dir_open()) {
|
|
close_dir();
|
|
}
|
|
|
|
memdelete(_dir);
|
|
memdelete(_file);
|
|
}
|