/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace com::sun::star; namespace { uno::Reference getStatusIndicator(const SfxMedium& rMedium) { uno::Reference xStatusIndicator; SfxItemSet* pSet = rMedium.GetItemSet(); if (pSet) { const SfxUnoAnyItem* pItem = pSet->GetItem(SID_PROGRESS_STATUSBAR_CONTROL); if (pItem) xStatusIndicator.set(pItem->GetValue(), uno::UNO_QUERY); } return xStatusIndicator; } bool loadFileContent(SfxMedium& rMedium, orcus::iface::import_filter& filter) { SvStream* pStream = rMedium.GetInStream(); pStream->Seek(0); static const size_t nReadBuffer = 1024 * 32; OStringBuffer aBuffer((int(nReadBuffer))); size_t nRead = 0; do { char pData[nReadBuffer]; nRead = pStream->ReadBytes(pData, nReadBuffer); aBuffer.append(pData, nRead); } while (nRead == nReadBuffer); try { filter.read_stream(aBuffer); } catch (const std::exception& e) { SAL_WARN("sc", "Unable to load file via orcus filter! " << e.what()); return false; } return true; } } bool ScOrcusFiltersImpl::importCSV(ScDocument& rDoc, SfxMedium& rMedium) const { ScOrcusFactory aFactory(rDoc); aFactory.setStatusIndicator(getStatusIndicator(rMedium)); orcus::orcus_csv filter(&aFactory); return loadFileContent(rMedium, filter); } bool ScOrcusFiltersImpl::importGnumeric(ScDocument& rDoc, SfxMedium& rMedium) const { ScOrcusFactory aFactory(rDoc); aFactory.setStatusIndicator(getStatusIndicator(rMedium)); orcus::orcus_gnumeric filter(&aFactory); return loadFileContent(rMedium, filter); } bool ScOrcusFiltersImpl::importExcel2003XML(ScDocument& rDoc, SfxMedium& rMedium) const { ScOrcusFactory aFactory(rDoc); aFactory.setStatusIndicator(getStatusIndicator(rMedium)); orcus::orcus_xls_xml filter(&aFactory); return loadFileContent(rMedium, filter); } bool ScOrcusFiltersImpl::importXLSX(ScDocument& rDoc, SfxMedium& rMedium) const { ScOrcusFactory aFactory(rDoc); aFactory.setStatusIndicator(getStatusIndicator(rMedium)); orcus::orcus_xlsx filter(&aFactory); return loadFileContent(rMedium, filter); } bool ScOrcusFiltersImpl::importODS(ScDocument& rDoc, SfxMedium& rMedium) const { ScOrcusFactory aFactory(rDoc); aFactory.setStatusIndicator(getStatusIndicator(rMedium)); orcus::orcus_ods filter(&aFactory); return loadFileContent(rMedium, filter); } bool ScOrcusFiltersImpl::importODS_Styles(ScDocument& rDoc, OUString& aPath) const { try { #if defined _WIN32 OString aPath8 = OUStringToOString(aPath, RTL_TEXTENCODING_UTF8); #else OString aPath8 = OUStringToOString(aPath, osl_getThreadTextEncoding()); #endif orcus::file_content content(aPath8); ScOrcusFactory aFactory(rDoc); ScOrcusStyles aStyles(aFactory); orcus::import_ods::read_styles(content.str(), &aStyles); } catch (const std::exception& e) { SAL_WARN("sc", "Unable to load styles from xml file! " << e.what()); return false; } return true; } std::unique_ptr ScOrcusFiltersImpl::createXMLContext(ScDocument& rDoc, const OUString& rPath) const { return std::make_unique(rDoc, rPath); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */