diff --git a/Libraries/LibGUI/FileSystemModel.cpp b/Libraries/LibGUI/FileSystemModel.cpp index 11878536bf..3f029b6f18 100644 --- a/Libraries/LibGUI/FileSystemModel.cpp +++ b/Libraries/LibGUI/FileSystemModel.cpp @@ -60,6 +60,7 @@ bool FileSystemModel::Node::fetch_data(const String& full_path, bool is_root) else rc = lstat(full_path.characters(), &st); if (rc < 0) { + m_error = errno; perror("stat/lstat"); return false; } @@ -95,6 +96,7 @@ void FileSystemModel::Node::traverse_if_needed(const FileSystemModel& model) auto full_path = this->full_path(model); Core::DirIterator di(full_path, Core::DirIterator::SkipDots); if (di.has_error()) { + m_error = di.error(); fprintf(stderr, "DirIterator: %s\n", di.error_string()); return; } @@ -288,11 +290,14 @@ static String permission_string(mode_t mode) void FileSystemModel::set_root_path(const StringView& root_path) { m_root_path = canonicalized_path(root_path); - - if (on_root_path_change) - on_root_path_change(); - update(); + + if (m_root->has_error()) { + if (on_error) + on_error(m_root->error(), m_root->error_string()); + } else if (on_complete) { + on_complete(); + } } void FileSystemModel::update() diff --git a/Libraries/LibGUI/FileSystemModel.h b/Libraries/LibGUI/FileSystemModel.h index c979487d72..a190919bb0 100644 --- a/Libraries/LibGUI/FileSystemModel.h +++ b/Libraries/LibGUI/FileSystemModel.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -79,6 +80,10 @@ public: bool is_directory() const { return S_ISDIR(mode); } bool is_executable() const { return mode & (S_IXUSR | S_IXGRP | S_IXOTH); } + bool has_error() const { return m_error != 0; } + int error() const { return m_error; } + const char* error_string() const { return strerror(m_error); } + String full_path(const FileSystemModel&) const; private: @@ -91,6 +96,8 @@ public: int m_watch_fd { -1 }; RefPtr m_notifier; + int m_error { 0 }; + ModelIndex index(const FileSystemModel&, int column) const; void traverse_if_needed(const FileSystemModel&); void reify_if_needed(const FileSystemModel&); @@ -112,7 +119,8 @@ public: GUI::Icon icon_for_file(const mode_t mode, const String& name) const; Function on_thumbnail_progress; - Function on_root_path_change; + Function on_complete; + Function on_error; virtual int tree_column() const override { return Column::Name; } virtual int row_count(const ModelIndex& = ModelIndex()) const override;