You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-05 12:10:55 +00:00
Make FileAccess and DirAccess classes reference counted.
This commit is contained in:
@@ -217,8 +217,8 @@ String DirAccess::fix_path(String p_path) const {
|
||||
|
||||
DirAccess::CreateFunc DirAccess::create_func[ACCESS_MAX] = { nullptr, nullptr, nullptr };
|
||||
|
||||
DirAccess *DirAccess::create_for_path(const String &p_path) {
|
||||
DirAccess *da = nullptr;
|
||||
Ref<DirAccess> DirAccess::create_for_path(const String &p_path) {
|
||||
Ref<DirAccess> da;
|
||||
if (p_path.begins_with("res://")) {
|
||||
da = create(ACCESS_RESOURCES);
|
||||
} else if (p_path.begins_with("user://")) {
|
||||
@@ -230,25 +230,23 @@ DirAccess *DirAccess::create_for_path(const String &p_path) {
|
||||
return da;
|
||||
}
|
||||
|
||||
DirAccess *DirAccess::open(const String &p_path, Error *r_error) {
|
||||
DirAccess *da = create_for_path(p_path);
|
||||
|
||||
ERR_FAIL_COND_V_MSG(!da, nullptr, "Cannot create DirAccess for path '" + p_path + "'.");
|
||||
Ref<DirAccess> DirAccess::open(const String &p_path, Error *r_error) {
|
||||
Ref<DirAccess> da = create_for_path(p_path);
|
||||
ERR_FAIL_COND_V_MSG(da.is_null(), nullptr, "Cannot create DirAccess for path '" + p_path + "'.");
|
||||
Error err = da->change_dir(p_path);
|
||||
if (r_error) {
|
||||
*r_error = err;
|
||||
}
|
||||
if (err != OK) {
|
||||
memdelete(da);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return da;
|
||||
}
|
||||
|
||||
DirAccess *DirAccess::create(AccessType p_access) {
|
||||
DirAccess *da = create_func[p_access] ? create_func[p_access]() : nullptr;
|
||||
if (da) {
|
||||
Ref<DirAccess> DirAccess::create(AccessType p_access) {
|
||||
Ref<DirAccess> da = create_func[p_access] ? create_func[p_access]() : nullptr;
|
||||
if (da.is_valid()) {
|
||||
da->_access_type = p_access;
|
||||
|
||||
// for ACCESS_RESOURCES and ACCESS_FILESYSTEM, current_dir already defaults to where game was started
|
||||
@@ -264,34 +262,24 @@ DirAccess *DirAccess::create(AccessType p_access) {
|
||||
}
|
||||
|
||||
String DirAccess::get_full_path(const String &p_path, AccessType p_access) {
|
||||
DirAccess *d = DirAccess::create(p_access);
|
||||
if (!d) {
|
||||
Ref<DirAccess> d = DirAccess::create(p_access);
|
||||
if (d.is_null()) {
|
||||
return p_path;
|
||||
}
|
||||
|
||||
d->change_dir(p_path);
|
||||
String full = d->get_current_dir();
|
||||
memdelete(d);
|
||||
return full;
|
||||
}
|
||||
|
||||
Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) {
|
||||
//printf("copy %s -> %s\n",p_from.ascii().get_data(),p_to.ascii().get_data());
|
||||
Error err;
|
||||
FileAccess *fsrc = FileAccess::open(p_from, FileAccess::READ, &err);
|
||||
Ref<FileAccess> fsrc = FileAccess::open(p_from, FileAccess::READ, &err);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Failed to open " + p_from);
|
||||
|
||||
if (err) {
|
||||
ERR_PRINT("Failed to open " + p_from);
|
||||
return err;
|
||||
}
|
||||
|
||||
FileAccess *fdst = FileAccess::open(p_to, FileAccess::WRITE, &err);
|
||||
if (err) {
|
||||
fsrc->close();
|
||||
memdelete(fsrc);
|
||||
ERR_PRINT("Failed to open " + p_to);
|
||||
return err;
|
||||
}
|
||||
Ref<FileAccess> fdst = FileAccess::open(p_to, FileAccess::WRITE, &err);
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Failed to open " + p_to);
|
||||
|
||||
fsrc->seek_end(0);
|
||||
int size = fsrc->get_position();
|
||||
@@ -311,7 +299,6 @@ Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) {
|
||||
}
|
||||
|
||||
if (err == OK && p_chmod_flags != -1) {
|
||||
fdst->close();
|
||||
err = FileAccess::set_unix_permissions(p_to, p_chmod_flags);
|
||||
// If running on a platform with no chmod support (i.e., Windows), don't fail
|
||||
if (err == ERR_UNAVAILABLE) {
|
||||
@@ -319,9 +306,6 @@ Error DirAccess::copy(String p_from, String p_to, int p_chmod_flags) {
|
||||
}
|
||||
}
|
||||
|
||||
memdelete(fsrc);
|
||||
memdelete(fdst);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -343,7 +327,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
Error DirAccess::_copy_dir(DirAccess *p_target_da, String p_to, int p_chmod_flags, bool p_copy_links) {
|
||||
Error DirAccess::_copy_dir(Ref<DirAccess> &p_target_da, String p_to, int p_chmod_flags, bool p_copy_links) {
|
||||
List<String> dirs;
|
||||
|
||||
String curdir = get_current_dir();
|
||||
@@ -399,14 +383,11 @@ Error DirAccess::_copy_dir(DirAccess *p_target_da, String p_to, int p_chmod_flag
|
||||
Error DirAccess::copy_dir(String p_from, String p_to, int p_chmod_flags, bool p_copy_links) {
|
||||
ERR_FAIL_COND_V_MSG(!dir_exists(p_from), ERR_FILE_NOT_FOUND, "Source directory doesn't exist.");
|
||||
|
||||
DirAccess *target_da = DirAccess::create_for_path(p_to);
|
||||
ERR_FAIL_COND_V_MSG(!target_da, ERR_CANT_CREATE, "Cannot create DirAccess for path '" + p_to + "'.");
|
||||
Ref<DirAccess> target_da = DirAccess::create_for_path(p_to);
|
||||
ERR_FAIL_COND_V_MSG(target_da.is_null(), ERR_CANT_CREATE, "Cannot create DirAccess for path '" + p_to + "'.");
|
||||
|
||||
if (!target_da->dir_exists(p_to)) {
|
||||
Error err = target_da->make_dir_recursive(p_to);
|
||||
if (err) {
|
||||
memdelete(target_da);
|
||||
}
|
||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot create directory '" + p_to + "'.");
|
||||
}
|
||||
|
||||
@@ -416,12 +397,11 @@ Error DirAccess::copy_dir(String p_from, String p_to, int p_chmod_flags, bool p_
|
||||
|
||||
DirChanger dir_changer(this, p_from);
|
||||
Error err = _copy_dir(target_da, p_to, p_chmod_flags, p_copy_links);
|
||||
memdelete(target_da);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
bool DirAccess::exists(String p_dir) {
|
||||
DirAccessRef da = DirAccess::create_for_path(p_dir);
|
||||
Ref<DirAccess> da = DirAccess::create_for_path(p_dir);
|
||||
return da->change_dir(p_dir) == OK;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user