Pārlūkot izejas kodu

LibGUI: Added error events to FileSystemModel

This will allow us to catch errors early on FileManager
angel 5 gadi atpakaļ
vecāks
revīzija
451b3fa73c

+ 9 - 4
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()

+ 9 - 1
Libraries/LibGUI/FileSystemModel.h

@@ -31,6 +31,7 @@
 #include <LibCore/DateTime.h>
 #include <LibCore/Notifier.h>
 #include <LibGUI/Model.h>
+#include <string.h>
 #include <sys/stat.h>
 #include <time.h>
 
@@ -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<Core::Notifier> 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<void(int done, int total)> on_thumbnail_progress;
-    Function<void()> on_root_path_change;
+    Function<void()> on_complete;
+    Function<void(int error, const char* error_string)> on_error;
 
     virtual int tree_column() const override { return Column::Name; }
     virtual int row_count(const ModelIndex& = ModelIndex()) const override;