From b0067c89e6b2a4e29465d9da9a731ae30a66dce6 Mon Sep 17 00:00:00 2001 From: osnola Date: Sun, 2 Apr 2017 09:42:59 +0200 Subject: libwps import filter improvements + some astyle modifications, + add .wk4 and .123 to the list of file extensions, + add support to open Lotus files protected by a password. Change-Id: I94d4afffd73f0999ff2b1958704cb3985fcd0cc9 --- writerperfect/Library_wpftcalc.mk | 1 + writerperfect/qa/unit/DrawingImportTest.cxx | 2 +- writerperfect/qa/unit/PresentationImportTest.cxx | 2 +- writerperfect/qa/unit/SpreadsheetImportTest.cxx | 2 +- writerperfect/qa/unit/TextImportTest.cxx | 2 +- .../source/calc/MSWorksCalcImportFilter.cxx | 41 ++++++++++++++++------ writerperfect/source/common/DocumentHandler.cxx | 6 ++-- 7 files changed, 39 insertions(+), 17 deletions(-) (limited to 'writerperfect') diff --git a/writerperfect/Library_wpftcalc.mk b/writerperfect/Library_wpftcalc.mk index 311741d26f5d..c4aecf391d44 100644 --- a/writerperfect/Library_wpftcalc.mk +++ b/writerperfect/Library_wpftcalc.mk @@ -33,6 +33,7 @@ $(eval $(call gb_Library_use_libraries,wpftcalc,\ cppu \ cppuhelper \ sal \ + sfx \ sot \ svx \ tl \ diff --git a/writerperfect/qa/unit/DrawingImportTest.cxx b/writerperfect/qa/unit/DrawingImportTest.cxx index 433c9a4458c4..661f851d3a0f 100644 --- a/writerperfect/qa/unit/DrawingImportTest.cxx +++ b/writerperfect/qa/unit/DrawingImportTest.cxx @@ -120,7 +120,7 @@ void DrawingImportTest::test() { using namespace css; - rtl::Reference xFilter{new DrawingImportFilter(m_xContext)}; + rtl::Reference xFilter {new DrawingImportFilter(m_xContext)}; writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(), "private:factory/sdraw", m_xDesktop, m_xContext); uno::Reference xDoc(aLoader.getDocument(), uno::UNO_QUERY); diff --git a/writerperfect/qa/unit/PresentationImportTest.cxx b/writerperfect/qa/unit/PresentationImportTest.cxx index 7c1154ba6cfa..4181d55be85b 100644 --- a/writerperfect/qa/unit/PresentationImportTest.cxx +++ b/writerperfect/qa/unit/PresentationImportTest.cxx @@ -120,7 +120,7 @@ void PresentationImportTest::test() { using namespace css; - rtl::Reference xFilter{new PresentationImportFilter(m_xContext)}; + rtl::Reference xFilter {new PresentationImportFilter(m_xContext)}; writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(), "private:factory/simpress", m_xDesktop, m_xContext); uno::Reference xDoc(aLoader.getDocument(), uno::UNO_QUERY); diff --git a/writerperfect/qa/unit/SpreadsheetImportTest.cxx b/writerperfect/qa/unit/SpreadsheetImportTest.cxx index 379f57ae1fd5..55d03151924b 100644 --- a/writerperfect/qa/unit/SpreadsheetImportTest.cxx +++ b/writerperfect/qa/unit/SpreadsheetImportTest.cxx @@ -115,7 +115,7 @@ void SpreadsheetImportTest::test() { using namespace css; - rtl::Reference xFilter{new SpreadsheetImportFilter(m_xContext)}; + rtl::Reference xFilter {new SpreadsheetImportFilter(m_xContext)}; writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(), "private:factory/scalc", m_xDesktop, m_xContext); uno::Reference xDoc(aLoader.getDocument(), uno::UNO_QUERY); diff --git a/writerperfect/qa/unit/TextImportTest.cxx b/writerperfect/qa/unit/TextImportTest.cxx index ba464c6c0ac4..4789d003abec 100644 --- a/writerperfect/qa/unit/TextImportTest.cxx +++ b/writerperfect/qa/unit/TextImportTest.cxx @@ -108,7 +108,7 @@ void TextImportTest::test() { using namespace css; - rtl::Reference xFilter{new TextImportFilter(m_xContext)}; + rtl::Reference xFilter {new TextImportFilter(m_xContext)}; writerperfect::test::WpftLoader aLoader(createDummyInput(), xFilter.get(), "private:factory/swriter", m_xDesktop, m_xContext); uno::Reference xDoc(aLoader.getDocument(), uno::UNO_QUERY); diff --git a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx index 94a111ec7127..11881202ad28 100644 --- a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx +++ b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -90,7 +91,7 @@ public: /*! \brief seeks to a offset position, from actual, beginning or ending position * \return 0 if ok */ - int seek(long , librevenge::RVNG_SEEK_TYPE) override + int seek(long, librevenge::RVNG_SEEK_TYPE) override { return 1; } @@ -191,8 +192,10 @@ bool MSWorksCalcImportFilter::doImportDocument(librevenge::RVNGInputStream &rInp bool needEncoding; const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding); + if ((kind != libwps::WPS_SPREADSHEET && kind != libwps::WPS_DATABASE) || (confidence == libwps::WPS_CONFIDENCE_NONE)) + return false; std::string fileEncoding(""); - if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT) && needEncoding) + if (needEncoding) { OUString title, encoding; if (creator == libwps::WPS_MSWORKS) @@ -232,7 +235,25 @@ bool MSWorksCalcImportFilter::doImportDocument(librevenge::RVNGInputStream &rInp SAL_WARN("writerperfect", "ignoring Exception in MSWorksCalcImportFilter::doImportDocument"); } } - return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator, "", fileEncoding.c_str()); + OString aUtf8Passwd; + if (confidence==libwps::WPS_CONFIDENCE_SUPPORTED_ENCRYPTION) + { + // try to ask for a password + try + { + ScopedVclPtrInstance< SfxPasswordDialog > aPasswdDlg(nullptr); + aPasswdDlg->SetMinLen(1); + if (!aPasswdDlg->Execute()) + return false; + OUString aPasswd = aPasswdDlg->GetPassword(); + aUtf8Passwd = OUStringToOString(aPasswd, RTL_TEXTENCODING_UTF8); + } + catch (...) + { + return false; + } + } + return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator, confidence==libwps::WPS_CONFIDENCE_SUPPORTED_ENCRYPTION ? aUtf8Passwd.getStr() : nullptr, fileEncoding.c_str()); } //XExtendedFilterDetection @@ -326,12 +347,12 @@ sal_Bool MSWorksCalcImportFilter::filter(const css::uno::Sequence< css::beans::P structuredInput.addFile(sWM3Name,"WK3"); structuredInput.addFile(sFM3Name,"FM3"); - // If the file is valid and libwps is at least 0.4.4, doImportDocument will convert it. - // If libwps is at most 0.4.3, doImportDocument will fail when checking if the file is supported - // and it is ok to call again doImportDocument with the main input. - // If the file is corrupted beyond all retrieval, doImportDocument will fail two times :-~ - if (this->doImportDocument(structuredInput, exporter, aDescriptor)) - return true; + libwps::WPSKind kind = libwps::WPS_TEXT; + libwps::WPSCreator creator; + bool needEncoding; + const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&structuredInput, kind, creator, needEncoding); + if (confidence!=libwps::WPS_CONFIDENCE_NONE) + return this->doImportDocument(structuredInput, exporter, aDescriptor); } } } @@ -350,7 +371,7 @@ bool MSWorksCalcImportFilter::doDetectFormat(librevenge::RVNGInputStream &rInput bool needEncoding; const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding); - if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && confidence == libwps::WPS_CONFIDENCE_EXCELLENT) + if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && confidence != libwps::WPS_CONFIDENCE_NONE) { if (creator == libwps::WPS_MSWORKS) { diff --git a/writerperfect/source/common/DocumentHandler.cxx b/writerperfect/source/common/DocumentHandler.cxx index 29788200b6de..a38f8fc0fcf8 100644 --- a/writerperfect/source/common/DocumentHandler.cxx +++ b/writerperfect/source/common/DocumentHandler.cxx @@ -111,10 +111,10 @@ using com::sun::star::xml::sax::XAttributeList; using com::sun::star::xml::sax::XDocumentHandler; DocumentHandler::DocumentHandler(Reference < XDocumentHandler > &xHandler) : - mxHandler( xHandler ) + mxHandler(xHandler) { - if (SvXMLImport *pFastHandler = dynamic_cast(mxHandler.get())) - mxHandler.set( new SvXMLLegacyToFastDocHandler( pFastHandler ) ); + if (SvXMLImport *pFastHandler = dynamic_cast(mxHandler.get())) + mxHandler.set(new SvXMLLegacyToFastDocHandler(pFastHandler)); } void DocumentHandler::startDocument() -- cgit