filter/qa/unit/textfilterdetect.cxx             |   19 +++++++++++++++++++
 filter/source/textfilterdetect/filterdetect.cxx |    6 +++++-
 sfx2/source/doc/objstor.cxx                     |   10 +++++++++-
 3 files changed, 33 insertions(+), 2 deletions(-)

New commits:
commit e519d7465f38367205b37bc80f0244029e352306
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Tue Dec 21 14:31:34 2021 +0100
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Tue Dec 21 17:04:51 2021 +0100

    filter: try to detect 0-byte DOC files based on extension
    
    Commit ae1f51b4888a3aa14837ac6e4083f33b2176ca45 (tdf#123476 filter: try
    to detect 0-byte files based on extension, 2020-10-28), already
    implemented this UNO-based import filters, do the same for built-in
    filters as well.
    
    Another problem in filter/ was to pick the WW6 filter for .doc --
    require export+preferred support in the filter to get WW8 instead.
    
    An additional filter that may kick in is MS Word 2003 XML: this is
    avoided by requiring "preferred".
    
    Change-Id: I46e280beb5341213b0fe7a09a549b52c0c1ea3f6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127219
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/filter/qa/unit/data/empty.doc b/filter/qa/unit/data/empty.doc
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/filter/qa/unit/textfilterdetect.cxx 
b/filter/qa/unit/textfilterdetect.cxx
index 95c2b7697159..62d0d60a23a7 100644
--- a/filter/qa/unit/textfilterdetect.cxx
+++ b/filter/qa/unit/textfilterdetect.cxx
@@ -112,6 +112,25 @@ CPPUNIT_TEST_FIXTURE(TextFilterDetectTest, testEmptyFile)
     // Writer instead.
     
CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.presentation.PresentationDocument"));
     getComponent()->dispose();
+
+    // ... and DOC
+    aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "empty.doc";
+    // Without the accompanying fix in place, this test would have failed, the 
import filter aborted
+    // loading.
+    getComponent() = loadFromDesktop(aURL);
+    xServiceInfo.set(getComponent(), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xServiceInfo.is());
+    
CPPUNIT_ASSERT(xServiceInfo->supportsService("com.sun.star.text.TextDocument"));
+    uno::Reference<frame::XModel> xModel(getComponent(), uno::UNO_QUERY);
+    uno::Sequence<beans::PropertyValue> aArgs = xModel->getArgs();
+    comphelper::SequenceAsHashMap aMap(aArgs);
+    OUString aFilterName;
+    aMap["FilterName"] >>= aFilterName;
+    // Without the accompanying fix in place, this test would have failed with:
+    // - Expected: MS Word 97
+    // - Actual  : MS WinWord 6.0
+    // i.e. opening worked, but saving back failed instead of producing a WW8 
binary file.
+    CPPUNIT_ASSERT_EQUAL(OUString("MS Word 97"), aFilterName);
 }
 }
 
diff --git a/filter/source/textfilterdetect/filterdetect.cxx 
b/filter/source/textfilterdetect/filterdetect.cxx
index 22db169b36e5..f8fc5cb865eb 100644
--- a/filter/source/textfilterdetect/filterdetect.cxx
+++ b/filter/source/textfilterdetect/filterdetect.cxx
@@ -148,7 +148,11 @@ bool HandleEmptyFileUrlByExtension(MediaDescriptor& 
rMediaDesc, const OUString&
         return false;
     }
 
-    std::shared_ptr<const SfxFilter> 
pFilter(SfxFilterMatcher().GetFilter4Extension(rExt));
+    // Requiring the export+preferred flags helps to find the relevant filter, 
e.g. .doc -> WW8 (and
+    // not WW6 or Mac_Word).
+    SfxFilterFlags nMust
+        = SfxFilterFlags::IMPORT | SfxFilterFlags::EXPORT | 
SfxFilterFlags::PREFERED;
+    std::shared_ptr<const SfxFilter> 
pFilter(SfxFilterMatcher().GetFilter4Extension(rExt, nMust));
     if (!pFilter)
     {
         return false;
diff --git a/sfx2/source/doc/objstor.cxx b/sfx2/source/doc/objstor.cxx
index 8b3c8f6d3e9d..0dc1b0f7d452 100644
--- a/sfx2/source/doc/objstor.cxx
+++ b/sfx2/source/doc/objstor.cxx
@@ -754,7 +754,15 @@ bool SfxObjectShell::DoLoad( SfxMedium *pMed )
             }
             else
             {
-                bOk = ConvertFrom(*pMedium);
+                if (tools::isEmptyFileUrl(pMedium->GetName()))
+                {
+                    // The import filter would fail with empty input.
+                    bOk = true;
+                }
+                else
+                {
+                    bOk = ConvertFrom(*pMedium);
+                }
                 InitOwnModel_Impl();
             }
         }

Reply via email to