diff options
Diffstat (limited to 'writerperfect/source/calc/MSWorksCalcImportFilter.cxx')
-rw-r--r-- | writerperfect/source/calc/MSWorksCalcImportFilter.cxx | 71 |
1 files changed, 66 insertions, 5 deletions
diff --git a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx index d8976389ded0..f68b4a00eab6 100644 --- a/writerperfect/source/calc/MSWorksCalcImportFilter.cxx +++ b/writerperfect/source/calc/MSWorksCalcImportFilter.cxx @@ -14,6 +14,7 @@ #include <libwps/libwps.h> +#include "writerperfect/WPFTEncodingDialog.hxx" #include "MSWorksCalcImportFilter.hxx" using com::sun::star::uno::Sequence; @@ -26,18 +27,78 @@ using com::sun::star::uno::XComponentContext; bool MSWorksCalcImportFilter::doImportDocument(librevenge::RVNGInputStream &rInput, OdsGenerator &rGenerator, utl::MediaDescriptor &) { - return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator); + libwps::WPSKind kind = libwps::WPS_TEXT; + libwps::WPSCreator creator; + bool needEncoding; + const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding); + + std::string fileEncoding(""); + if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE) && (confidence == libwps::WPS_CONFIDENCE_EXCELLENT) && needEncoding) + { + OUString title, encoding; + if (creator == libwps::WPS_MSWORKS) + { + title="Import MsWorks files(libwps)"; + encoding="CP850"; + } + else if (creator == libwps::WPS_LOTUS) + { + title="Import Lotus files(libwps)"; + encoding="CP437"; + } + else if (creator == libwps::WPS_SYMPHONY) + { + title="Import Symphony files(libwps)"; + encoding="CP437"; + } + else + { + title="Import Quattro Pro files(libwps)"; + encoding="CP437"; + } + try + { + const ScopedVclPtrInstance<writerperfect::WPFTEncodingDialog> pDlg(nullptr, &title, &encoding); + if (pDlg->Execute() == RET_OK) + { + if (!pDlg->GetEncoding().isEmpty()) + fileEncoding=pDlg->GetEncoding().toUtf8().getStr(); + } + // we can fail because we are in headless mode, the user has cancelled conversion, ... + else if (pDlg->hasUserCalledCancel()) + return false; + } + catch (...) + { + } + } + return libwps::WPS_OK == libwps::WPSDocument::parse(&rInput, &rGenerator, "", fileEncoding.c_str()); } bool MSWorksCalcImportFilter::doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName) { libwps::WPSKind kind = libwps::WPS_TEXT; - const libwps::WPSConfidence confidence = libwps::WPSDocument::isFileFormatSupported(&rInput, kind); + libwps::WPSCreator creator; + 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_EXCELLENT) { - rTypeName = "calc_MS_Works_Document"; - return true; + if (creator == libwps::WPS_MSWORKS) + { + rTypeName = "calc_MS_Works_Document"; + return true; + } + if (creator == libwps::WPS_LOTUS || creator == libwps::WPS_SYMPHONY) + { + rTypeName = "calc_WPS_Lotus_Document"; + return true; + } + if (creator == libwps::WPS_QUATTRO_PRO) + { + rTypeName = "calc_WPS_QPro_Document"; + return true; + } } return false; |