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

David Tardon (via logerrit) logerrit at kemper.freedesktop.org
Sun Feb 21 15:24:16 UTC 2021


 lotuswordpro/source/filter/LotusWordProImportFilter.cxx |  131 ++++++++++++++++
 1 file changed, 131 insertions(+)

New commits:
commit 301b09f0c4fef6fca52fa0b28827a657bbbb6b39
Author:     David Tardon <dtardon at redhat.com>
AuthorDate: Sat Feb 13 15:51:20 2021 +0100
Commit:     David Tardon <dtardon at redhat.com>
CommitDate: Sun Feb 21 16:23:39 2021 +0100

    lotuswordpro: allow to dump intermediate XML into file
    
    If env. variable DBG_LWPIMPORT_DIR= is set to an existing directory, a
    formatted representation of the intermediate XML format is dumped into a
    file named lwpimport.xml in that directory. This makes debugging of
    Lotus Word Pro import a lot easier.
    
    Change-Id: I872c388c2b378d55f476973890a073ec932e1b4b
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111283
    Tested-by: Jenkins
    Reviewed-by: David Tardon <dtardon at redhat.com>

diff --git a/lotuswordpro/source/filter/LotusWordProImportFilter.cxx b/lotuswordpro/source/filter/LotusWordProImportFilter.cxx
index 73335e0bab88..296561bcc375 100644
--- a/lotuswordpro/source/filter/LotusWordProImportFilter.cxx
+++ b/lotuswordpro/source/filter/LotusWordProImportFilter.cxx
@@ -30,6 +30,19 @@
 #include "LotusWordProImportFilter.hxx"
 #include "lwpfilter.hxx"
 
+#if OSL_DEBUG_LEVEL > 0
+#include <memory>
+
+#include <com/sun/star/io/XOutputStream.hpp>
+#include <com/sun/star/xml/sax/Writer.hpp>
+
+#include <comphelper/oslfile2streamwrap.hxx>
+
+#include <cppuhelper/weak.hxx>
+
+#include <osl/file.hxx>
+#endif
+
 using namespace com::sun::star;
 using com::sun::star::uno::Sequence;
 using com::sun::star::uno::Any;
@@ -41,6 +54,100 @@ using com::sun::star::ucb::XCommandEnvironment;
 using com::sun::star::document::XImporter;
 using com::sun::star::xml::sax::XDocumentHandler;
 
+#if OSL_DEBUG_LEVEL > 0
+namespace
+{
+
+class DebugDocumentHandler final : public cppu::WeakImplHelper< XDocumentHandler >
+{
+public:
+    DebugDocumentHandler(const uno::Reference< XDocumentHandler >& handler, const uno::Reference< XDocumentHandler >& debug)
+        : m_handler(handler)
+        , m_debug(debug)
+    {
+    }
+
+    // XDocumentHandler
+
+    virtual void SAL_CALL
+    startDocument() override
+    {
+        m_handler->startDocument();
+        m_debug->startDocument();
+    }
+
+    virtual void SAL_CALL
+    endDocument() override
+    {
+        m_handler->endDocument();
+        m_debug->endDocument();
+    }
+
+    virtual void SAL_CALL
+    startElement(
+            const OUString& aName,
+            const uno::Reference< xml::sax::XAttributeList > & xAttribs) override
+    {
+        m_handler->startElement(aName, xAttribs);
+        m_debug->ignorableWhitespace(" "); // NOTE: needed for pretty-printing
+        m_debug->startElement(aName, xAttribs);
+    }
+
+    virtual void SAL_CALL
+    endElement(const OUString& aName) override
+    {
+        m_handler->endElement(aName);
+        m_debug->ignorableWhitespace(" "); // NOTE: needed for pretty-printing
+        m_debug->endElement(aName);
+    }
+
+    virtual void SAL_CALL
+    characters(const OUString& aChars) override
+    {
+        m_handler->characters(aChars);
+        m_debug->characters(aChars);
+    }
+
+    virtual void SAL_CALL
+    ignorableWhitespace(const OUString& aWhitespaces) override
+    {
+        m_handler->ignorableWhitespace(aWhitespaces);
+        m_debug->ignorableWhitespace(aWhitespaces);
+    }
+
+    virtual void SAL_CALL
+    processingInstruction(const OUString& aTarget, const OUString& aData) override
+    {
+        m_handler->processingInstruction(aTarget, aData);
+        m_debug->processingInstruction(aTarget, aData);
+    }
+
+    virtual void SAL_CALL
+    setDocumentLocator(const uno::Reference< xml::sax::XLocator >& xLocator) override
+    {
+        m_handler->setDocumentLocator(xLocator);
+        m_debug->setDocumentLocator(xLocator);
+    }
+
+    // XInterface
+
+    virtual uno::Any SAL_CALL queryInterface(const uno::Type & rType) override
+    {
+        uno::Any aIface = cppu::WeakImplHelper< XDocumentHandler >::queryInterface(rType);
+        // delegate all queries we cannot satisfy ourselves to the real handler
+        if (!aIface.has< uno::Reference< uno::XInterface > >())
+            aIface = m_handler->queryInterface(rType);
+        return aIface;
+    }
+
+private:
+    uno::Reference< XDocumentHandler > m_handler;
+    uno::Reference< XDocumentHandler > m_debug;
+};
+
+}
+#endif
+
 //                                 W     o     r     d     P     r     o
 const sal_Int8 header[] = { 0x57, 0x6f, 0x72, 0x64, 0x50, 0x72, 0x6f };
 
@@ -61,6 +168,30 @@ bool LotusWordProImportFilter::importImpl( const Sequence< css::beans::PropertyV
     // An XML import service: what we push sax messages to...
     uno::Reference< XDocumentHandler > xInternalHandler(
         mxContext->getServiceManager()->createInstanceWithContext( "com.sun.star.comp.Writer.XMLImporter", mxContext ), UNO_QUERY );
+
+#if OSL_DEBUG_LEVEL > 0
+    std::unique_ptr<osl::File> pDebugFile;
+    const char* pDir = getenv("DBG_LWPIMPORT_DIR");
+    if (pDir)
+    {
+        OUString aStr(OStringToOUString(pDir, RTL_TEXTENCODING_UTF8));
+        OUString aFileURL;
+        osl_getFileURLFromSystemPath(aStr.pData, &aFileURL.pData);
+        pDebugFile = std::make_unique<osl::File>(aFileURL + "/lwpimport.xml");
+        if (pDebugFile->open(osl_File_OpenFlag_Write | osl_File_OpenFlag_Create) != osl::File::E_None)
+        {
+            pDebugFile->open(osl_File_OpenFlag_Write);
+            pDebugFile->setSize(0);
+        }
+
+        uno::Reference< xml::sax::XWriter > xDebugWriter = xml::sax::Writer::create(mxContext);
+        uno::Reference< io::XOutputStream > xOutputStream(new comphelper::OSLOutputStreamWrapper(*pDebugFile));
+        xDebugWriter->setOutputStream(xOutputStream);
+
+        xInternalHandler.set(new DebugDocumentHandler(xInternalHandler, xDebugWriter));
+    }
+#endif
+
     uno::Reference < XImporter > xImporter(xInternalHandler, UNO_QUERY);
     if (xImporter.is())
         xImporter->setTargetDocument(mxDoc);


More information about the Libreoffice-commits mailing list