mirror of https://github.com/godotengine/godot
[Web] Fix `DirAccess::unlink()` not updating the IDBFS
This commit is contained in:
parent
aa8d9b83f6
commit
a6c5373a09
|
|
@ -438,11 +438,19 @@ Error DirAccessUnix::remove(String p_path) {
|
||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int err;
|
||||||
if (S_ISDIR(flags.st_mode) && !is_link(p_path)) {
|
if (S_ISDIR(flags.st_mode) && !is_link(p_path)) {
|
||||||
return ::rmdir(p_path.utf8().get_data()) == 0 ? OK : FAILED;
|
err = ::rmdir(p_path.utf8().get_data());
|
||||||
} else {
|
} else {
|
||||||
return ::unlink(p_path.utf8().get_data()) == 0 ? OK : FAILED;
|
err = ::unlink(p_path.utf8().get_data());
|
||||||
}
|
}
|
||||||
|
if (err != 0) {
|
||||||
|
return FAILED;
|
||||||
|
}
|
||||||
|
if (remove_notification_func != nullptr) {
|
||||||
|
remove_notification_func(p_path);
|
||||||
|
}
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DirAccessUnix::is_link(String p_file) {
|
bool DirAccessUnix::is_link(String p_file) {
|
||||||
|
|
@ -552,6 +560,8 @@ DirAccessUnix::DirAccessUnix() {
|
||||||
change_dir(current_dir);
|
change_dir(current_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DirAccessUnix::RemoveNotificationFunc DirAccessUnix::remove_notification_func = nullptr;
|
||||||
|
|
||||||
DirAccessUnix::~DirAccessUnix() {
|
DirAccessUnix::~DirAccessUnix() {
|
||||||
list_dir_end();
|
list_dir_end();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,9 @@ protected:
|
||||||
virtual bool is_hidden(const String &p_name);
|
virtual bool is_hidden(const String &p_name);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
typedef void (*RemoveNotificationFunc)(const String &p_file);
|
||||||
|
static RemoveNotificationFunc remove_notification_func;
|
||||||
|
|
||||||
virtual Error list_dir_begin() override; ///< This starts dir listing
|
virtual Error list_dir_begin() override; ///< This starts dir listing
|
||||||
virtual String get_next() override;
|
virtual String get_next() override;
|
||||||
virtual bool current_is_dir() const override;
|
virtual bool current_is_dir() const override;
|
||||||
|
|
|
||||||
|
|
@ -443,7 +443,7 @@ void FileAccessUnix::close() {
|
||||||
_close();
|
_close();
|
||||||
}
|
}
|
||||||
|
|
||||||
CloseNotificationFunc FileAccessUnix::close_notification_func = nullptr;
|
FileAccessUnix::CloseNotificationFunc FileAccessUnix::close_notification_func = nullptr;
|
||||||
|
|
||||||
FileAccessUnix::~FileAccessUnix() {
|
FileAccessUnix::~FileAccessUnix() {
|
||||||
_close();
|
_close();
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,6 @@
|
||||||
|
|
||||||
#if defined(UNIX_ENABLED)
|
#if defined(UNIX_ENABLED)
|
||||||
|
|
||||||
typedef void (*CloseNotificationFunc)(const String &p_file, int p_flags);
|
|
||||||
|
|
||||||
class FileAccessUnix : public FileAccess {
|
class FileAccessUnix : public FileAccess {
|
||||||
FILE *f = nullptr;
|
FILE *f = nullptr;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
@ -56,6 +54,7 @@ class FileAccessUnix : public FileAccess {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
typedef void (*CloseNotificationFunc)(const String &p_file, int p_flags);
|
||||||
static CloseNotificationFunc close_notification_func;
|
static CloseNotificationFunc close_notification_func;
|
||||||
|
|
||||||
virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file
|
virtual Error open_internal(const String &p_path, int p_mode_flags) override; ///< open a file
|
||||||
|
|
|
||||||
|
|
@ -224,6 +224,18 @@ void OS_Web::file_access_close_callback(const String &p_file, int p_flags) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OS_Web::dir_access_remove_callback(const String &p_file) {
|
||||||
|
OS_Web *os = OS_Web::get_singleton();
|
||||||
|
bool is_file_persistent = p_file.begins_with("/userfs");
|
||||||
|
#ifdef TOOLS_ENABLED
|
||||||
|
// Hack for editor persistence (can we track).
|
||||||
|
is_file_persistent = is_file_persistent || p_file.begins_with("/home/web_user/");
|
||||||
|
#endif
|
||||||
|
if (is_file_persistent) {
|
||||||
|
os->idb_needs_sync = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void OS_Web::update_pwa_state_callback() {
|
void OS_Web::update_pwa_state_callback() {
|
||||||
if (OS_Web::get_singleton()) {
|
if (OS_Web::get_singleton()) {
|
||||||
OS_Web::get_singleton()->pwa_is_waiting = true;
|
OS_Web::get_singleton()->pwa_is_waiting = true;
|
||||||
|
|
@ -287,4 +299,5 @@ OS_Web::OS_Web() {
|
||||||
_set_logger(memnew(CompositeLogger(loggers)));
|
_set_logger(memnew(CompositeLogger(loggers)));
|
||||||
|
|
||||||
FileAccessUnix::close_notification_func = file_access_close_callback;
|
FileAccessUnix::close_notification_func = file_access_close_callback;
|
||||||
|
DirAccessUnix::remove_notification_func = dir_access_remove_callback;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,7 @@ class OS_Web : public OS_Unix {
|
||||||
WASM_EXPORT static void main_loop_callback();
|
WASM_EXPORT static void main_loop_callback();
|
||||||
|
|
||||||
WASM_EXPORT static void file_access_close_callback(const String &p_file, int p_flags);
|
WASM_EXPORT static void file_access_close_callback(const String &p_file, int p_flags);
|
||||||
|
WASM_EXPORT static void dir_access_remove_callback(const String &p_file);
|
||||||
WASM_EXPORT static void fs_sync_callback();
|
WASM_EXPORT static void fs_sync_callback();
|
||||||
WASM_EXPORT static void update_pwa_state_callback();
|
WASM_EXPORT static void update_pwa_state_callback();
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue