[Libreoffice-commits] .: filter/source

Peter Jentsch pjentsch at kemper.freedesktop.org
Sun May 1 04:27:46 PDT 2011


 filter/source/xsltfilter/LibXSLTTransformer.cxx |   14 ++-
 filter/source/xsltfilter/LibXSLTTransformer.hxx |   10 ++
 filter/source/xsltfilter/XSLTFilter.cxx         |   85 ++++++++++++++++--------
 filter/source/xsltfilter/makefile.mk            |    8 +-
 4 files changed, 82 insertions(+), 35 deletions(-)

New commits:
commit 2e9f9d82110342601d28408ae77d63b673993ebe
Author: Peter Jentsch <pjotr at guineapics.de>
Date:   Wed Apr 27 09:27:01 2011 +0200

    Introduced timeout for import thru XSLTFilter. Fixes fdo#35543
    
    This fixes only the "HANG" part of fdo#35543. The Excel2003ML import
     filter  remains broken.

diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx
index 18f18dc..ec9e374 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.cxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.cxx
@@ -51,6 +51,7 @@
 #include <cppuhelper/servicefactory.hxx>
 #include <cppuhelper/implbase4.hxx>
 #include <cppuhelper/implbase.hxx>
+
 #include <osl/module.h>
 #include <osl/file.hxx>
 #include <osl/process.h>
@@ -135,10 +136,10 @@ namespace XSLT
         }
     };
     /**
-     * ExtFuncOleCB forwards XPath extension function calls registers with libxslt to the OleHandler instance that actually
+     * ExtFuncOleCB forwards XPath extension function calls registered with libxslt to the OleHandler instance that actually
      * provides the implementation for those functions.
      *
-     * The OLE extension module currently supplies to functions
+     * The OLE extension module currently supplies two functions
      * insertByName: registers an OLE object to be later inserted into the output tree.
      * getByName: reads a previously registered OLE object and returns a base64 encoded string representation.
      */
@@ -390,7 +391,7 @@ namespace XSLT
 
     LibXSLTTransformer::LibXSLTTransformer(
             const Reference<XMultiServiceFactory> &r) :
-        m_rServiceFactory(r)
+        m_rServiceFactory(r), m_Reader(NULL)
     {
     }
 
@@ -447,8 +448,9 @@ namespace XSLT
                 Reference<XStreamListener> xl = *it;
                 xl.get()->started();
             }
-        Reader* r = new Reader(this);
-        r->create();
+        OSL_ENSURE(m_Reader == NULL, "Somebody forgot to call terminate *and* holds a reference to this LibXSLTTransformer instance");
+        m_Reader = new Reader(this);
+        m_Reader->create();
     }
 
     void
@@ -484,6 +486,8 @@ namespace XSLT
     void
     LibXSLTTransformer::terminate() throw (RuntimeException)
     {
+        m_Reader->terminate();
+        delete(m_Reader);
         m_parameters.clear();
     }
 
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.hxx b/filter/source/xsltfilter/LibXSLTTransformer.hxx
index 2554558..ccd1dbb 100644
--- a/filter/source/xsltfilter/LibXSLTTransformer.hxx
+++ b/filter/source/xsltfilter/LibXSLTTransformer.hxx
@@ -116,6 +116,16 @@ namespace XSLT
 
         ::std::map<const char *, OString> m_parameters;
 
+        osl::Thread* m_Reader;
+
+    protected:
+        virtual ~LibXSLTTransformer() {
+            if (m_Reader) {
+                    m_Reader->terminate();
+            }
+            delete(m_Reader);
+        }
+
     public:
 
         // ctor...
diff --git a/filter/source/xsltfilter/XSLTFilter.cxx b/filter/source/xsltfilter/XSLTFilter.cxx
index 1757ca2..c84a76f 100644
--- a/filter/source/xsltfilter/XSLTFilter.cxx
+++ b/filter/source/xsltfilter/XSLTFilter.cxx
@@ -44,14 +44,13 @@
 #include <osl/time.h>
 #include <osl/conditn.h>
 #include <tools/urlobj.hxx>
-#include <osl/module.h>
-#include <osl/file.hxx>
-#include <osl/process.h>
+
+#include <comphelper/interaction.hxx>
 
 #include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/EventObject.hpp>
 
 #include <com/sun/star/uno/Any.hxx>
-#include <com/sun/star/uno/Type.hxx>
 
 #include <com/sun/star/beans/PropertyValue.hpp>
 
@@ -63,6 +62,7 @@
 #include <com/sun/star/xml/XImportFilter.hpp>
 #include <com/sun/star/xml/XExportFilter.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
+
 #include <com/sun/star/util/XMacroExpander.hpp>
 
 #include <com/sun/star/io/XInputStream.hpp>
@@ -71,15 +71,19 @@
 #include <com/sun/star/io/XActiveDataSink.hpp>
 #include <com/sun/star/io/XActiveDataControl.hpp>
 #include <com/sun/star/io/XStreamListener.hpp>
-#include <com/sun/star/uno/Any.hxx>
-#include <com/sun/star/lang/EventObject.hpp>
 #include <com/sun/star/util/XStringSubstitution.hpp>
 #include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/task/XInteractionHandler.hpp>
+#include <com/sun/star/task/XInteractionRequest.hpp>
+#include <com/sun/star/ucb/InteractiveAugmentedIOException.hpp>
 
 #include <xmloff/attrlist.hxx>
+
 #include <fla.hxx>
 #include <LibXSLTTransformer.hxx>
 
+#define TRANSFORMATION_TIMEOUT_SEC 60
+
 using namespace ::rtl;
 using namespace ::cppu;
 using namespace ::osl;
@@ -92,12 +96,12 @@ using namespace ::com::sun::star::registry;
 using namespace ::com::sun::star::xml;
 using namespace ::com::sun::star::xml::sax;
 using namespace ::com::sun::star::util;
+using namespace ::com::sun::star::task;
 
 namespace XSLT
 {
-
     /*
-     * FLABridge provides some obscure attribute mangling to wordml2000 import/export filters.
+     * FLABridge provides some obscure attribute mangling to wordml2003 import/export filters.
      * In the long run, you might want to replace this with an XSLT extension function.
      */
     class FLABridge : public WeakImplHelper1< DocumentHandlerAdapter >
@@ -180,22 +184,23 @@ namespace XSLT
     }
 
     /*
-     * XSLTFilter reads flat xml streams from the XML filter framework and passes
+     * XSLTFilter reads flat XML streams from the XML filter framework and passes
      * them to an XSLT transformation service. XSLT transformation errors are
      * reported to XSLTFilter.
      *
-     * Currently, two implemations for the XSLT transformation service exist:
+     * Currently, two implementations for the XSLT transformation service exist:
      * a java based service (see XSLTransformer.java) and  a libxslt based
      * service (LibXSLTTransformer.cxx).
      *
-     * The libxslt implementation will be used, if the value of the 2nd "UserData"
-     * parameter of the filter configuration is "libxslt"
+     * The libxslt implementation will be used by default.
+     *
+     * If the value of the 2nd "UserData" parameter of the filter configuration is
+     * not empty, the service name given there will be used.
      */
     class XSLTFilter : public WeakImplHelper4<XImportFilter, XExportFilter,
             XStreamListener, ExtendedDocumentHandlerAdapter>
     {
     private:
-        static const OUString LIBXSLT_HELPER_SERVICE_IMPL;
 
         // the UNO ServiceFactory
         Reference<XMultiServiceFactory> m_rServiceFactory;
@@ -361,15 +366,19 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
         sal_Int32 nLength = aSourceData.getLength();
         OUString aName, aFileName, aURL;
         Reference<XInputStream> xInputStream;
+        Reference<XInteractionHandler> xInterActionHandler;
         for (sal_Int32 i = 0; i < nLength; i++)
             {
                 aName = aSourceData[i].Name;
+                Any value = aSourceData[i].Value;
                 if (aName.equalsAscii("InputStream"))
-                    aSourceData[i].Value >>= xInputStream;
+                    value >>= xInputStream;
                 else if (aName.equalsAscii("FileName"))
-                    aSourceData[i].Value >>= aFileName;
+                    value >>= aFileName;
                 else if (aName.equalsAscii("URL"))
-                    aSourceData[i].Value >>= aURL;
+                    value >>= aURL;
+                else if (aName.equalsAscii("InteractionHandler"))
+                    value >>= xInterActionHandler;
             }
         OSL_ASSERT(xInputStream.is());
         if (!xInputStream.is())
@@ -447,18 +456,38 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
 
                         // transform
                         m_tcontrol->start();
-                        // osl_waitCondition(m_cTransformed, 0);
-                        if (!m_bError && !m_bTerminated)
-                            {
-                                // parse the transformed XML buffered in the pipe
+                        TimeValue timeout = { TRANSFORMATION_TIMEOUT_SEC, 0};
+                        oslConditionResult result(osl_waitCondition(m_cTransformed, &timeout));
+                        while (osl_cond_result_timeout == result) {
+                                if (xInterActionHandler.is()) {
+                                        Sequence<Any> excArgs(0);
+                                        ::com::sun::star::ucb::InteractiveAugmentedIOException exc(
+                                                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Timeout!")),
+                                                static_cast< OWeakObject * >( this ),
+                                                InteractionClassification_ERROR,
+                                                ::com::sun::star::ucb::IOErrorCode_GENERAL,
+                                                 excArgs);
+                                        Any r;
+                                        r <<= exc;
+                                        ::comphelper::OInteractionRequest* pRequest = new ::comphelper::OInteractionRequest(r);
+                                        Reference< XInteractionRequest > xRequest(pRequest);
+                                        ::comphelper::OInteractionRetry* pRetry = new ::comphelper::OInteractionRetry;
+                                        ::comphelper::OInteractionAbort* pAbort = new ::comphelper::OInteractionAbort;
+                                        pRequest->addContinuation(pRetry);
+                                        pRequest->addContinuation(pAbort);
+                                        xInterActionHandler->handle(xRequest);
+                                        if (pAbort->wasSelected()) {
+                                                m_bError = sal_True;
+                                                osl_setCondition(m_cTransformed);
+                                        }
+                                }
+                                result = osl_waitCondition(m_cTransformed, &timeout);
+                        };
+                        if (!m_bError) {
                                 xSaxParser->parseStream(aInput);
-                                osl_waitCondition(m_cTransformed, 0);
-                                return sal_True;
-                            }
-                        else
-                            {
-                                return sal_False;
-                            }
+                        }
+                        m_tcontrol->terminate();
+                        return !m_bError;
                     }
 #if OSL_DEBUG_LEVEL > 0
                 catch( Exception& exc)
@@ -607,6 +636,7 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
         ExtendedDocumentHandlerAdapter::endDocument();
         // wait for the transformer to finish
         osl_waitCondition(m_cTransformed, 0);
+        m_tcontrol->terminate();
         if (!m_bError && !m_bTerminated)
             {
                 return;
@@ -618,6 +648,7 @@ m_rServiceFactory(r), m_bTerminated(sal_False), m_bError(sal_False)
 
     }
 
+
     // --------------------------------------
     // Component management
     // --------------------------------------
diff --git a/filter/source/xsltfilter/makefile.mk b/filter/source/xsltfilter/makefile.mk
index 473c98f..50faea7 100644
--- a/filter/source/xsltfilter/makefile.mk
+++ b/filter/source/xsltfilter/makefile.mk
@@ -54,9 +54,11 @@ SHL1DEF=$(MISC)$/$(SHL1TARGET).def
 DEF1NAME=$(SHL1TARGET)
 
 SHL1STDLIBS= \
-    $(TOOLSLIB)         \
-    $(CPPUHELPERLIB)    \
-    $(CPPULIB)          \
+    $(TOOLSLIB) \
+    $(CPPUHELPERLIB) \
+    $(UCBHELPERLIB) \
+    $(COMPHELPERLIB) \
+    $(CPPULIB) \
     $(XMLOFFLIB) \
     $(SALLIB) \
     $(LIBXML2LIB) \


More information about the Libreoffice-commits mailing list