From cf1eea27d3757fe0208065f05663a1b601e37f31 Mon Sep 17 00:00:00 2001 From: Lucas CHOLLET Date: Sat, 7 Jan 2023 11:52:46 -0500 Subject: [PATCH] LibGUI: Add `TextEditor::write_to_file(Core::Stream::File&)` This overload use the `Core::Stream` API instead of the now deprecated one `Core::File`. --- Userland/Libraries/LibGUI/TextEditor.cpp | 27 ++++++++++++++++++++++++ Userland/Libraries/LibGUI/TextEditor.h | 1 + 2 files changed, 28 insertions(+) diff --git a/Userland/Libraries/LibGUI/TextEditor.cpp b/Userland/Libraries/LibGUI/TextEditor.cpp index b75d851b10..3236d3c5fc 100644 --- a/Userland/Libraries/LibGUI/TextEditor.cpp +++ b/Userland/Libraries/LibGUI/TextEditor.cpp @@ -1512,6 +1512,33 @@ bool TextEditor::write_to_file(Core::File& file) return true; } +ErrorOr 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(); diff --git a/Userland/Libraries/LibGUI/TextEditor.h b/Userland/Libraries/LibGUI/TextEditor.h index fe51519593..f5586d000b 100644 --- a/Userland/Libraries/LibGUI/TextEditor.h +++ b/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 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;