summaryrefslogtreecommitdiff
path: root/filter/source
diff options
context:
space:
mode:
Diffstat (limited to 'filter/source')
-rw-r--r--filter/source/config/cache/typedetection.cxx12
-rw-r--r--filter/source/config/cache/typedetection.hxx41
2 files changed, 48 insertions, 5 deletions
diff --git a/filter/source/config/cache/typedetection.cxx b/filter/source/config/cache/typedetection.cxx
index 278115c8af6c..74b0b978f5f6 100644
--- a/filter/source/config/cache/typedetection.cxx
+++ b/filter/source/config/cache/typedetection.cxx
@@ -21,6 +21,7 @@
#include "constant.hxx"
#include <com/sun/star/document/XExtendedFilterDetection.hpp>
+#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/util/URLTransformer.hpp>
#include <com/sun/star/util/XURLTransformer.hpp>
@@ -50,7 +51,10 @@ namespace filter{
TypeDetection::TypeDetection(const css::uno::Reference< css::uno::XComponentContext >& rxContext)
: m_xContext(rxContext)
+ , m_xTerminateListener(new TerminateDetection(this))
+ , m_bCancel(false)
{
+ css::frame::Desktop::create(m_xContext)->addTerminateListener(m_xTerminateListener.get());
BaseContainer::init(rxContext ,
TypeDetection::impl_getImplementationName() ,
TypeDetection::impl_getSupportedServiceNames(),
@@ -60,6 +64,7 @@ TypeDetection::TypeDetection(const css::uno::Reference< css::uno::XComponentCont
TypeDetection::~TypeDetection()
{
+ css::frame::Desktop::create(m_xContext)->removeTerminateListener(m_xTerminateListener.get());
}
@@ -426,18 +431,17 @@ OUString SAL_CALL TypeDetection::queryTypeByDescriptor(css::uno::Sequence< css::
if (lFlatTypes.size()>0)
sType = impl_detectTypeFlatAndDeep(stlDescriptor, lFlatTypes, bAllowDeep, lUsedDetectors, sLastChance);
-
// flat detection failed
// pure deep detection failed
// => ask might existing InteractionHandler
// means: ask user for its decision
- if (sType.isEmpty())
+ if (sType.isEmpty() && !m_bCancel)
sType = impl_askUserForTypeAndFilterIfAllowed(stlDescriptor);
// no real detected type - but a might valid one.
// update descriptor and set last chance for return.
- if (sType.isEmpty() && !sLastChance.isEmpty())
+ if (sType.isEmpty() && !sLastChance.isEmpty() && !m_bCancel)
{
OSL_FAIL("set first flat detected type without a registered deep detection service as \"last chance\" ... nevertheless some other deep detections said \"NO\". I TRY IT!");
sType = sLastChance;
@@ -898,7 +902,7 @@ OUString TypeDetection::impl_detectTypeFlatAndDeep( utl::MediaDescriptor& r
// obtained from the cache => ignore it, and continue with search
for (FlatDetection::const_iterator pFlatIt = lFlatTypes.begin();
- pFlatIt != lFlatTypes.end() ;
+ pFlatIt != lFlatTypes.end() && !m_bCancel;
++pFlatIt )
{
const FlatDetectionInfo& aFlatTypeInfo = *pFlatIt;
diff --git a/filter/source/config/cache/typedetection.hxx b/filter/source/config/cache/typedetection.hxx
index 548a14343925..f948e6522697 100644
--- a/filter/source/config/cache/typedetection.hxx
+++ b/filter/source/config/cache/typedetection.hxx
@@ -21,14 +21,16 @@
#include "basecontainer.hxx"
#include <com/sun/star/document/XTypeDetection.hpp>
+#include <com/sun/star/frame/XTerminateListener.hpp>
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <unotools/mediadescriptor.hxx>
+#include <cppuhelper/compbase.hxx>
#include <cppuhelper/implbase.hxx>
-
namespace filter{ namespace config {
+class TerminateDetection;
/** @short implements the service <type scope="com.sun.star.document">TypeDetection</type>.
*/
@@ -39,6 +41,8 @@ class TypeDetection : public ::cppu::ImplInheritanceHelper< BaseContainer
// native interface
css::uno::Reference< css::uno::XComponentContext > m_xContext;
+ rtl::Reference<TerminateDetection> m_xTerminateListener;
+ bool m_bCancel;
public:
@@ -53,6 +57,11 @@ public:
*/
explicit TypeDetection(const css::uno::Reference< css::uno::XComponentContext >& rxContext);
+ void cancel()
+ {
+ m_bCancel = true;
+ }
+
/** @short standard dtor.
*/
@@ -365,6 +374,36 @@ public:
static css::uno::Reference< css::uno::XInterface > impl_createInstance(const css::uno::Reference< css::lang::XMultiServiceFactory >& xSMGR);
};
+class TerminateDetection : public cppu::WeakComponentImplHelper<css::frame::XTerminateListener>
+{
+private:
+ osl::Mutex m_aLock;
+ TypeDetection* m_pTypeDetection;
+
+public:
+
+ using cppu::WeakComponentImplHelperBase::disposing;
+ virtual void SAL_CALL disposing(const css::lang::EventObject&) override
+ {
+ }
+
+ // XTerminateListener
+ virtual void SAL_CALL queryTermination(const css::lang::EventObject&) override
+ {
+ m_pTypeDetection->cancel();
+ }
+
+ virtual void SAL_CALL notifyTermination(const css::lang::EventObject&) override
+ {
+ }
+
+ TerminateDetection(TypeDetection* pTypeDetection)
+ : cppu::WeakComponentImplHelper<css::frame::XTerminateListener>(m_aLock)
+ , m_pTypeDetection(pTypeDetection)
+ {
+ }
+};
+
}}
#endif // INCLUDED_FILTER_SOURCE_CONFIG_CACHE_TYPEDETECTION_HXX