瀏覽代碼

LibGUI: Add `TextEditor::write_to_file(Core::Stream::File&)`

This overload use the `Core::Stream` API instead of the now deprecated
one `Core::File`.
Lucas CHOLLET 2 年之前
父節點
當前提交
cf1eea27d3
共有 2 個文件被更改,包括 28 次插入0 次删除
  1. 27 0
      Userland/Libraries/LibGUI/TextEditor.cpp
  2. 1 0
      Userland/Libraries/LibGUI/TextEditor.h

+ 27 - 0
Userland/Libraries/LibGUI/TextEditor.cpp

@@ -1512,6 +1512,33 @@ bool TextEditor::write_to_file(Core::File& file)
     return true;
 }
 
+ErrorOr<void> TextEditor::write_to_file(Core::Stream::File& file)
+{
+    off_t file_size = 0;
+    if (line_count() == 1 && line(0).is_empty()) {
+        // Truncate to zero.
+    } else {
+        // Compute the final file size and ftruncate() to make writing fast.
+        // FIXME: Remove this once the kernel is smart enough to do this instead.
+        for (size_t i = 0; i < line_count(); ++i)
+            file_size += line(i).length();
+        file_size += line_count();
+    }
+
+    TRY(file.truncate(file_size));
+
+    if (file_size == 0) {
+        // A size 0 file doesn't need a data copy.
+    } else {
+        for (size_t i = 0; i < line_count(); ++i) {
+            TRY(file.write(line(i).to_utf8().bytes()));
+            TRY(file.write("\n"sv.bytes()));
+        }
+    }
+    document().set_unmodified();
+    return {};
+}
+
 DeprecatedString TextEditor::text() const
 {
     return document().text();

+ 1 - 0
Userland/Libraries/LibGUI/TextEditor.h

@@ -131,6 +131,7 @@ public:
     void replace_all_text_without_resetting_undo_stack(StringView text);
     bool write_to_file(DeprecatedString const& path);
     bool write_to_file(Core::File&);
+    ErrorOr<void> write_to_file(Core::Stream::File&);
     bool has_selection() const { return m_selection.is_valid(); }
     DeprecatedString selected_text() const;
     size_t number_of_words() const;