Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve/fix packed data API (3.2) #40747

Merged
merged 1 commit into from
Nov 10, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 25 additions & 6 deletions core/io/file_access_pack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -403,9 +403,15 @@ String DirAccessPack::get_drive(int p_drive) {
return "";
}

Error DirAccessPack::change_dir(String p_dir) {
PackedData::PackedDir *DirAccessPack::_find_dir(String p_dir) {

String nd = p_dir.replace("\\", "/");

// Special handling since simplify_path() will forbid it
if (p_dir == "..") {
return current->parent;
}

bool absolute = false;
if (nd.begins_with("res://")) {
nd = nd.replace_first("res://", "");
Expand Down Expand Up @@ -445,13 +451,22 @@ Error DirAccessPack::change_dir(String p_dir) {

} else {

return ERR_INVALID_PARAMETER;
return NULL;
}
}

current = pd;
return pd;
}

return OK;
Error DirAccessPack::change_dir(String p_dir) {

PackedData::PackedDir *pd = _find_dir(p_dir);
if (pd) {
current = pd;
return OK;
} else {
return ERR_INVALID_PARAMETER;
}
}

String DirAccessPack::get_current_dir() {
Expand All @@ -471,14 +486,18 @@ bool DirAccessPack::file_exists(String p_file) {

p_file = fix_path(p_file);

return current->files.has(p_file);
PackedData::PackedDir *pd = _find_dir(p_file.get_base_dir());
if (!pd) {
return false;
}
return pd->files.has(p_file.get_file());
}

bool DirAccessPack::dir_exists(String p_dir) {

p_dir = fix_path(p_dir);

return current->subdirs.has(p_dir);
return _find_dir(p_dir) != NULL;
}

Error DirAccessPack::make_dir(String p_dir) {
Expand Down
26 changes: 26 additions & 0 deletions core/io/file_access_pack.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,9 @@ class PackedData {
_FORCE_INLINE_ FileAccess *try_open_path(const String &p_path);
_FORCE_INLINE_ bool has_path(const String &p_path);

_FORCE_INLINE_ DirAccess *try_open_directory(const String &p_path);
_FORCE_INLINE_ bool has_directory(const String &p_path);

PackedData();
~PackedData();
};
Expand Down Expand Up @@ -197,6 +200,17 @@ bool PackedData::has_path(const String &p_path) {
return files.has(PathMD5(p_path.md5_buffer()));
}

bool PackedData::has_directory(const String &p_path) {

DirAccess *da = try_open_directory(p_path);
if (da) {
memdelete(da);
return true;
} else {
return false;
}
}

class DirAccessPack : public DirAccess {

PackedData::PackedDir *current;
Expand All @@ -205,6 +219,8 @@ class DirAccessPack : public DirAccess {
List<String> list_files;
bool cdir;

PackedData::PackedDir *_find_dir(String p_dir);

public:
virtual Error list_dir_begin();
virtual String get_next();
Expand Down Expand Up @@ -234,4 +250,14 @@ class DirAccessPack : public DirAccess {
~DirAccessPack();
};

DirAccess *PackedData::try_open_directory(const String &p_path) {

DirAccess *da = memnew(DirAccessPack());
if (da->change_dir(p_path) != OK) {
memdelete(da);
da = NULL;
}
return da;
}

#endif // FILE_ACCESS_PACK_H
9 changes: 6 additions & 3 deletions core/os/file_access.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ FileAccess *FileAccess::create(AccessType p_access) {

bool FileAccess::exists(const String &p_name) {

if (PackedData::get_singleton() && PackedData::get_singleton()->has_path(p_name))
if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_name))
return true;

FileAccess *f = open(p_name, READ);
Expand Down Expand Up @@ -494,7 +494,7 @@ void FileAccess::store_double(double p_dest) {

uint64_t FileAccess::get_modified_time(const String &p_file) {

if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_file))
if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && (PackedData::get_singleton()->has_path(p_file) || PackedData::get_singleton()->has_directory(p_file)))
return 0;

FileAccess *fa = create_for_path(p_file);
Expand All @@ -507,7 +507,7 @@ uint64_t FileAccess::get_modified_time(const String &p_file) {

uint32_t FileAccess::get_unix_permissions(const String &p_file) {

if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && PackedData::get_singleton()->has_path(p_file))
if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && (PackedData::get_singleton()->has_path(p_file) || PackedData::get_singleton()->has_directory(p_file)))
return 0;

FileAccess *fa = create_for_path(p_file);
Expand All @@ -520,6 +520,9 @@ uint32_t FileAccess::get_unix_permissions(const String &p_file) {

Error FileAccess::set_unix_permissions(const String &p_file, uint32_t p_permissions) {

if (PackedData::get_singleton() && !PackedData::get_singleton()->is_disabled() && (PackedData::get_singleton()->has_path(p_file) || PackedData::get_singleton()->has_directory(p_file)))
return ERR_UNAVAILABLE;

FileAccess *fa = create_for_path(p_file);
ERR_FAIL_COND_V_MSG(!fa, ERR_CANT_CREATE, "Cannot create FileAccess for path '" + p_file + "'.");

Expand Down