vcl/source/gdi/embeddedfontsmanager.cxx | 64 +++++++++++++------------------- 1 file changed, 27 insertions(+), 37 deletions(-)
New commits: commit 831aa1a94bfdf4296203bd26f302e138aea5a23d Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Tue Aug 12 08:05:15 2025 +0200 Commit: Mike Kaganski <mike.kagan...@collabora.com> CommitDate: Tue Aug 12 14:14:59 2025 +0200 Deduplicate writing to file Change-Id: Idbda55b239122e7a9284152157f244dff8d9d9c8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/189395 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> diff --git a/vcl/source/gdi/embeddedfontsmanager.cxx b/vcl/source/gdi/embeddedfontsmanager.cxx index b08732ccce15..3c9bf1495edd 100644 --- a/vcl/source/gdi/embeddedfontsmanager.cxx +++ b/vcl/source/gdi/embeddedfontsmanager.cxx @@ -134,6 +134,29 @@ OUString fileUrlForTemporaryFont(std::u16string_view name) RTL_TEXTENCODING_UTF8); } +bool writeFontBytesToFile(osl::File& file, const void* data, sal_uInt64 size) +{ + auto bytes = static_cast<const char*>(data); + for (sal_uInt64 writtenTotal = 0; writtenTotal < size;) + { + sal_uInt64 written = 0; + switch (file.write(bytes + writtenTotal, size - writtenTotal, written)) + { + case osl::File::E_None: + writtenTotal += written; + break; + case osl::File::E_AGAIN: + case osl::File::E_INTR: + break; + default: + file.close(); + osl::File::remove(file.getURL()); + return false; + } + } + return true; +} + // Returns actual URL (maybe of an already existing file), or empty string on failure. // // @param name name of the font file @@ -174,19 +197,9 @@ OUString writeFontBytesToFile(const std::vector<char>& bytes, std::u16string_vie if (rc != osl::File::E_None) return {}; - sal_uInt64 writtenTotal = 0; - while (writtenTotal < bytes.size()) - { - sal_uInt64 written = 0; - file->write(bytes.data() + writtenTotal, bytes.size() - writtenTotal, written); - if (written == 0) - { - file->close(); - osl::File::remove(file->getURL()); - return {}; - } - writtenTotal += written; - } + if (!writeFontBytesToFile(*file, bytes.data(), bytes.size())) + return {}; + return url; } } @@ -609,30 +622,7 @@ OUString EmbeddedFontsManager::fontFileUrl( std::u16string_view familyName, Font osl::File file( url ); if( file.open( osl_File_OpenFlag_Write | osl_File_OpenFlag_Create ) == osl::File::E_None ) { - sal_uInt64 written = 0; - sal_uInt64 totalSize = size; - bool error = false; - while( written < totalSize && !error) - { - sal_uInt64 nowWritten; - switch( file.write( data + written, size - written, nowWritten )) - { - case osl::File::E_None: - written += nowWritten; - break; - case osl::File::E_AGAIN: - case osl::File::E_INTR: - break; - default: - error = true; - break; - } - } - file.close(); - if( error ) - osl::File::remove( url ); - else - ok = true; + ok = writeFontBytesToFile(file, data, size); } } }