12#include <com/sun/star/awt/XWindow.hpp>
13#include <com/sun/star/container/XChild.hpp>
14#include <com/sun/star/sdbc/XResultSet.hpp>
15#include <com/sun/star/sdbc/XRow.hpp>
16#include <com/sun/star/ucb/XContent.hpp>
17#include <com/sun/star/ucb/XContentAccess.hpp>
25#include <libwps/libwps.h>
43getResultSet(
const css::uno::Reference<css::ucb::XContent>& xPackageContent)
47 if (xPackageContent.is())
62 "ignoring Exception in MSWorksCalcImportFilterInternal:getResultSet");
71class FolderStream :
public librevenge::RVNGInputStream
75 explicit FolderStream(css::uno::Reference<css::ucb::XContent> xContent)
81 void addFile(OUString
const& path, std::string
const& shortName)
89 const unsigned char* read(
unsigned long,
unsigned long&)
override {
return nullptr; }
91 long tell()
override {
return 0; }
95 int seek(
long, librevenge::RVNG_SEEK_TYPE)
override {
return 1; }
97 bool isEnd()
override {
return true; }
102 bool isStructured()
override {
return true; }
106 unsigned subStreamCount()
override {
return unsigned(
m_nameToPathMap.size()); }
108 const char* subStreamName(
unsigned id)
override
113 std::map<std::string, OUString>::const_iterator it =
m_nameToPathMap.begin();
114 std::advance(it,
id);
115 return it->first.c_str();
118 bool existsSubStream(
const char*
name)
override
123 librevenge::RVNGInputStream* getSubStreamByName(
const char*
name)
override
131 if (xResultSet.is() && xResultSet->first())
134 uno::UNO_QUERY_THROW);
139 const OUString aTitle(xRow->getString(1));
148 if (xInputStream.is())
151 }
while (xResultSet->next());
156 SAL_WARN(
"writerperfect",
"ignoring Exception in "
157 "MSWorksCalcImportFilterInternal::FolderStream::"
158 "getSubStreamByName");
164 librevenge::RVNGInputStream* getSubStreamById(
unsigned id)
override
166 char const*
name = subStreamName(
id);
167 return name ? getSubStreamByName(
name) : nullptr;
175 FolderStream(
const FolderStream&) =
delete;
176 FolderStream& operator=(
const FolderStream&) =
delete;
183 librevenge::RVNGInputStream& rInput,
184 OdsGenerator& rGenerator,
187 libwps::WPSKind kind = libwps::WPS_TEXT;
188 libwps::WPSCreator creator;
190 const libwps::WPSConfidence confidence
191 = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
193 if ((kind != libwps::WPS_SPREADSHEET && kind != libwps::WPS_DATABASE)
194 || (confidence == libwps::WPS_CONFIDENCE_NONE))
196 std::string fileEncoding;
202 if (!encoding.isEmpty())
203 fileEncoding = encoding.toUtf8().getStr();
209 case libwps::WPS_MSWORKS:
210 title =
WpResId(STR_ENCODING_DIALOG_TITLE_MSWORKS);
213 case libwps::WPS_LOTUS:
214 title =
WpResId(STR_ENCODING_DIALOG_TITLE_LOTUS);
217 case libwps::WPS_SYMPHONY:
218 title =
WpResId(STR_ENCODING_DIALOG_TITLE_SYMPHONY);
221 case libwps::WPS_QUATTRO_PRO:
222 title =
WpResId(STR_ENCODING_DIALOG_TITLE_QUATTROPRO);
225 case libwps::WPS_RESERVED_2:
226 title =
WpResId(STR_ENCODING_DIALOG_TITLE_MSMULTIPLAN);
230 SAL_INFO(
"writerperfect",
"unexpected creator: " << creator);
231 title =
WpResId(STR_ENCODING_DIALOG_TITLE);
236 fileEncoding = encoding.toUtf8().getStr();
243 fileEncoding = aDlg.
GetEncoding().toUtf8().getStr();
252 "ignoring Exception in MSWorksCalcImportFilter::doImportDocument");
257 if (confidence == libwps::WPS_CONFIDENCE_SUPPORTED_ENCRYPTION)
263 if (!sPassword.isEmpty())
272 if (!aPasswdDlg.
run())
283 return libwps::WPS_OK
284 == libwps::WPSDocument::parse(&rInput, &rGenerator,
285 confidence == libwps::WPS_CONFIDENCE_SUPPORTED_ENCRYPTION
286 ? aUtf8Passwd.getStr()
288 fileEncoding.c_str());
296 css::uno::Reference<css::io::XInputStream> xInputStream;
297 css::uno::Reference<ucb::XContent> xContent;
298 css::uno::Reference<css::awt::XWindow> xDialogParent;
300 for (
const auto& rValue : rDescriptor)
302 if (rValue.Name ==
"InputStream")
303 rValue.Value >>= xInputStream;
304 else if (rValue.Name ==
"UCBContent")
305 rValue.Value >>= xContent;
306 else if (rValue.Name ==
"FileName" || rValue.Name ==
"URL")
307 rValue.Value >>= sUrl;
308 else if (rValue.Name ==
"ParentWindow")
309 rValue.Value >>= xDialogParent;
312 if (!getXContext().is() || !xInputStream.is())
319 css::uno::Reference<XInterface> xInternalFilter
320 = getXContext()->getServiceManager()->createInstanceWithContext(
322 assert(xInternalFilter);
323 css::uno::Reference<css::xml::sax::XFastDocumentHandler> xInternalHandler(xInternalFilter,
324 css::uno::UNO_QUERY);
325 assert(xInternalHandler);
328 css::uno::Reference<css::document::XImporter> xImporter(xInternalHandler, css::uno::UNO_QUERY);
330 xImporter->setTargetDocument(getTargetDocument());
338 OdsGenerator exporter;
339 exporter.addDocumentHandler(&aHandler, ODF_FLAT_XML);
347 bool checkForFM3 =
false;
348 if (input.
seek(0, librevenge::RVNG_SEEK_SET) == 0 && xContent.is()
352 unsigned long numBytesRead;
353 const unsigned char* data = input.
read(6, numBytesRead);
354 if (data && numBytesRead == 6 && data[0] == 0 && data[1] == 0 && data[2] == 0x1a
355 && data[3] == 0 && data[4] < 2 && data[5] == 0x10)
361 const css::uno::Reference<container::XChild> xChild(xContent, uno::UNO_QUERY);
366 const css::uno::Reference<ucb::XContent> xPackageContent(xChild->getParent(),
370 if (xResultSet.is() && xResultSet->first())
373 uno::UNO_QUERY_THROW);
379 const OUString& sTestFM3Name
384 const OUString& aTitle(xRow->getString(1));
385 if (aTitle.equalsIgnoreAsciiCase(sTestFM3Name))
387 }
while (xResultSet->next() && sFM3Name.isEmpty());
389 if (!sFM3Name.isEmpty())
391 MSWorksCalcImportFilterInternal::FolderStream structuredInput(xPackageContent);
392 structuredInput.addFile(sWM3Name,
"WK3");
393 structuredInput.addFile(sFM3Name,
"FM3");
395 libwps::WPSKind kind = libwps::WPS_TEXT;
396 libwps::WPSCreator creator;
398 const libwps::WPSConfidence confidence
399 = libwps::WPSDocument::isFileFormatSupported(&structuredInput, kind,
400 creator, needEncoding);
401 if (confidence != libwps::WPS_CONFIDENCE_NONE)
403 structuredInput, exporter, aDescriptor);
418 libwps::WPSKind kind = libwps::WPS_TEXT;
419 libwps::WPSCreator creator;
421 const libwps::WPSConfidence confidence
422 = libwps::WPSDocument::isFileFormatSupported(&rInput, kind, creator, needEncoding);
424 if ((kind == libwps::WPS_SPREADSHEET || kind == libwps::WPS_DATABASE)
425 && confidence != libwps::WPS_CONFIDENCE_NONE)
429 case libwps::WPS_MSWORKS:
430 rTypeName =
"calc_MS_Works_Document";
432 case libwps::WPS_LOTUS:
433 case libwps::WPS_SYMPHONY:
434 rTypeName =
"calc_WPS_Lotus_Document";
436 case libwps::WPS_QUATTRO_PRO:
437 rTypeName =
"calc_WPS_QPro_Document";
439 case libwps::WPS_RESERVED_2:
440 rTypeName =
"calc_MS_Multiplan";
447 return !rTypeName.isEmpty();
455 return "com.sun.star.comp.Calc.MSWorksCalcImportFilter";
465 return {
"com.sun.star.document.ImportFilter",
"com.sun.star.document.ExtendedTypeDetection" };
468extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
470 css::uno::XComponentContext*
const context,
const css::uno::Sequence<css::uno::Any>&)
uno::Reference< ucb::XContent > m_xContent
the main container
std::map< std::string, OUString > m_nameToPathMap
the map short name to path
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_Calc_MSWorksCalcImportFilter_get_implementation(css::uno::XComponentContext *const context, const css::uno::Sequence< css::uno::Any > &)
OUString WpResId(TranslateId aId)
static weld::Window * GetFrameWeld(const css::uno::Reference< css::awt::XWindow > &rWindow)
OUString getName(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool setExtension(std::u16string_view rTheExtension, sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8)
virtual bool doImportDocument(weld::Window *pParent, librevenge::RVNGInputStream &rInput, OdsGenerator &rGenerator, utl::MediaDescriptor &) override
virtual bool doDetectFormat(librevenge::RVNGInputStream &rInput, OUString &rTypeName) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual void doRegisterHandlers(OdsGenerator &rGenerator) override
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual OUString SAL_CALL getImplementationName() override
virtual sal_Bool SAL_CALL filter(const css::uno::Sequence< css::beans::PropertyValue > &rDescriptor) override
OUString GetPassword() const
virtual short run() override
void SetMinLen(sal_uInt16 Len)
css::uno::Reference< css::sdbc::XResultSet > createCursor(const css::uno::Sequence< OUString > &rPropertyNames, ResultSetInclude eMode=INCLUDE_FOLDERS_AND_DOCUMENTS)
OUString GetEncoding() const
bool hasUserCalledCancel() const
#define SAL_WARN(area, stream)
#define SAL_INFO(area, stream)
static uno::Reference< sdbc::XResultSet > getResultSet(const css::uno::Reference< css::ucb::XContent > &xPackageContent)
returns the list of stream name present in a folder
Reference< XComponentContext > getProcessComponentContext()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
Definition of XML import service used with a Generator.