[Libreoffice-commits] core.git: sw/source

Manfred Blume manfred.blume at cib.de
Sun Aug 27 22:52:00 UTC 2017


 sw/source/filter/docx/swdocxreader.cxx |   43 ++++++++++++++++++++++++++++++---
 1 file changed, 40 insertions(+), 3 deletions(-)

New commits:
commit 9600f5179795380749aa5a7c9fa0bf5387d2b95f
Author: Manfred Blume <manfred.blume at cib.de>
Date:   Wed Aug 23 18:45:00 2017 +0200

    fix tdf#112025 insert docx into existing document
    
    Change-Id: I41f694bf3c2aa4edcad19a05d5dda6e87456d08f
    Reviewed-on: https://gerrit.libreoffice.org/41469
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>

diff --git a/sw/source/filter/docx/swdocxreader.cxx b/sw/source/filter/docx/swdocxreader.cxx
index 25ee0567a95e..5dcbb557c63d 100644
--- a/sw/source/filter/docx/swdocxreader.cxx
+++ b/sw/source/filter/docx/swdocxreader.cxx
@@ -38,7 +38,7 @@
 #include <tools/ref.hxx>
 #include <unotxdoc.hxx>
 #include <unotools/streamwrap.hxx>
-
+#include <unotextrange.hxx>
 #define AUTOTEXT_GALLERY "autoTxt"
 
 using namespace css;
@@ -48,9 +48,46 @@ extern "C" SAL_DLLPUBLIC_EXPORT Reader* SAL_CALL ImportDOCX()
     return new SwDOCXReader;
 }
 
-ErrCode SwDOCXReader::Read( SwDoc& /* rDoc */, const OUString& /* rBaseURL */, SwPaM& /* rPaM */, const OUString& /* FileName */ )
+ErrCode SwDOCXReader::Read(SwDoc& rDoc, const OUString& /* rBaseURL */, SwPaM& rPam, const OUString& /* FileName */ )
 {
-    return ERR_SWG_READ_ERROR;
+    if (!pMedium->GetInStream())
+        return ERR_SWG_READ_ERROR;
+
+    // We want to work in an empty paragraph.
+    std::shared_ptr<SwNodeIndex> pSttNdIdx(new SwNodeIndex(rDoc.GetNodes()));
+    const SwPosition* pPos = rPam.GetPoint();
+    rDoc.getIDocumentContentOperations().SplitNode(*pPos, false);
+    rDoc.SetTextFormatColl(rPam, rDoc.getIDocumentStylePoolAccess().GetTextCollFromPool(RES_POOLCOLL_STANDARD, false));
+
+    uno::Reference<lang::XMultiServiceFactory> xMultiServiceFactory(comphelper::getProcessServiceFactory());
+    uno::Reference<uno::XInterface> xInterface(xMultiServiceFactory->createInstance("com.sun.star.comp.Writer.WriterFilter"), uno::UNO_QUERY_THROW);
+
+    SwDocShell* pDocShell(rDoc.GetDocShell());
+    uno::Reference<lang::XComponent> xDstDoc(pDocShell->GetModel(), uno::UNO_QUERY_THROW);
+    uno::Reference<document::XImporter> xImporter(xInterface, uno::UNO_QUERY_THROW);
+    xImporter->setTargetDocument(xDstDoc);
+
+    const uno::Reference<text::XTextRange> xInsertTextRange = SwXTextRange::CreateXTextRange(rDoc, *rPam.GetPoint(), nullptr);
+    uno::Reference<io::XStream> xStream(new utl::OStreamWrapper(*pMedium->GetInStream()));
+    uno::Sequence<beans::PropertyValue> aDescriptor(comphelper::InitPropertySequence(
+    {
+        { "InputStream", uno::Any(xStream) },
+        { "InsertMode", uno::Any(true) },
+        { "TextInsertModeRange", uno::Any(xInsertTextRange) }
+    }));
+
+    ErrCode ret = ERRCODE_NONE;
+    uno::Reference<document::XFilter> xFilter(xInterface, uno::UNO_QUERY_THROW);
+    try
+    {
+        xFilter->filter(aDescriptor);
+    }
+    catch (uno::Exception const& e)
+    {
+        SAL_WARN("sw.docx", "SwDOCXReader::Read(): exception: " << e.Message);
+        ret = ERR_SWG_READ_ERROR;
+    }
+    return ret;
 }
 
 int SwDOCXReader::GetReaderType()


More information about the Libreoffice-commits mailing list