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