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);
                 }
             }
         }

Reply via email to