diff options
author | Peter Jentsch <pjotr@guineapics.de> | 2011-04-27 09:27:01 +0200 |
---|---|---|
committer | Peter Jentsch <pjotr@guineapics.de> | 2011-05-01 11:21:15 +0200 |
commit | 2e9f9d82110342601d28408ae77d63b673993ebe (patch) | |
tree | f5f90f0c1b1c399bebe419dc5a1186146a5e4109 | |
parent | e374d8f45345d24eb87ed6c8aae3f1eecfb8d368 (diff) |
Introduced timeout for import thru XSLTFilter. Fixes fdo#35543
This fixes only the "HANG" part of fdo#35543. The Excel2003ML import
filter remains broken.
-rw-r--r-- | filter/source/xsltfilter/LibXSLTTransformer.cxx | 14 | ||||
-rw-r--r-- | filter/source/xsltfilter/LibXSLTTransformer.hxx | 10 | ||||
-rw-r--r-- | filter/source/xsltfilter/XSLTFilter.cxx | 85 | ||||
-rw-r--r-- | filter/source/xsltfilter/makefile.mk | 8 |
4 files changed, 82 insertions, 35 deletions
diff --git a/filter/source/xsltfilter/LibXSLTTransformer.cxx b/filter/source/xsltfilter/LibXSLTTransformer.cxx index 18f18dcab..ec9e37441 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 2554558d0..ccd1dbb6e 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 1757ca26a..c84a76f9f 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 473c98f34..50faea7fe 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) \ |