fdo#74697 Add Bluez 5 support for impress remote.
[LibreOffice.git] / svx / source / form / formdispatchinterceptor.cxx
blobcfde37763c31a0ecf9e22ac89bf6bb22ae23a546
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "formdispatchinterceptor.hxx"
22 #include <tools/debug.hxx>
24 //........................................................................
25 namespace svxform
27 //........................................................................
29 using ::com::sun::star::uno::Reference;
30 using ::com::sun::star::uno::XInterface;
31 using ::com::sun::star::uno::UNO_QUERY;
32 using ::com::sun::star::uno::UNO_QUERY_THROW;
33 using ::com::sun::star::uno::UNO_SET_THROW;
34 using ::com::sun::star::uno::Exception;
35 using ::com::sun::star::uno::RuntimeException;
36 using ::com::sun::star::uno::Any;
37 using ::com::sun::star::uno::makeAny;
38 using ::com::sun::star::uno::Sequence;
39 using ::com::sun::star::uno::Type;
40 using ::com::sun::star::frame::XDispatchProviderInterception;
41 using ::com::sun::star::frame::XDispatchProviderInterceptor;
42 using ::com::sun::star::lang::XComponent;
43 using ::com::sun::star::util::URL;
44 using ::com::sun::star::frame::XDispatch;
45 using ::com::sun::star::frame::DispatchDescriptor;
46 using ::com::sun::star::frame::XDispatchProvider;
47 using ::com::sun::star::lang::EventObject;
49 //========================================================================
50 //= DispatchInterceptionMultiplexer
51 //========================================================================
53 DBG_NAME(DispatchInterceptionMultiplexer)
54 //------------------------------------------------------------------------
55 DispatchInterceptionMultiplexer::DispatchInterceptionMultiplexer(
56 const Reference< XDispatchProviderInterception >& _rxToIntercept, DispatchInterceptor* _pMaster )
57 :DispatchInterceptionMultiplexer_BASE(_pMaster && _pMaster->getInterceptorMutex() ? *_pMaster->getInterceptorMutex() : m_aFallback)
58 ,m_aFallback()
59 ,m_pMutex( _pMaster && _pMaster->getInterceptorMutex() ? _pMaster->getInterceptorMutex() : &m_aFallback )
60 ,m_xIntercepted(_rxToIntercept)
61 ,m_bListening(sal_False)
62 ,m_pMaster(_pMaster)
64 DBG_CTOR(DispatchInterceptionMultiplexer,NULL);
66 ::osl::MutexGuard aGuard( *m_pMutex );
67 ::comphelper::increment(m_refCount);
68 if (_rxToIntercept.is())
70 _rxToIntercept->registerDispatchProviderInterceptor((XDispatchProviderInterceptor*)this);
71 // this should make us the top-level dispatch-provider for the component, via a call to our
72 // setDispatchProvider we should have got an fallback for requests we (i.e. our master) cannot fullfill
73 Reference< XComponent> xInterceptedComponent(_rxToIntercept, UNO_QUERY);
74 if (xInterceptedComponent.is())
76 xInterceptedComponent->addEventListener(this);
77 m_bListening = sal_True;
80 ::comphelper::decrement(m_refCount);
83 //------------------------------------------------------------------------
84 DispatchInterceptionMultiplexer::~DispatchInterceptionMultiplexer()
86 if (!rBHelper.bDisposed)
87 dispose();
89 DBG_DTOR(DispatchInterceptionMultiplexer,NULL);
92 //------------------------------------------------------------------------------
93 Reference< XDispatch > SAL_CALL DispatchInterceptionMultiplexer::queryDispatch( const URL& aURL, const OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw(RuntimeException)
95 ::osl::MutexGuard aGuard( *m_pMutex );
96 Reference< XDispatch> xResult;
97 // ask our 'real' interceptor
98 if (m_pMaster)
99 xResult = m_pMaster->interceptedQueryDispatch( aURL, aTargetFrameName, nSearchFlags);
101 // ask our slave provider
102 if (!xResult.is() && m_xSlaveDispatcher.is())
103 xResult = m_xSlaveDispatcher->queryDispatch(aURL, aTargetFrameName, nSearchFlags);
105 return xResult;
108 //------------------------------------------------------------------------------
109 Sequence< Reference< XDispatch > > SAL_CALL
110 DispatchInterceptionMultiplexer::queryDispatches( const Sequence< DispatchDescriptor >& aDescripts ) throw(RuntimeException)
112 ::osl::MutexGuard aGuard( *m_pMutex );
113 Sequence< Reference< XDispatch> > aReturn(aDescripts.getLength());
114 Reference< XDispatch>* pReturn = aReturn.getArray();
115 const DispatchDescriptor* pDescripts = aDescripts.getConstArray();
116 for (sal_Int16 i=0; i<aDescripts.getLength(); ++i, ++pReturn, ++pDescripts)
118 *pReturn = queryDispatch(pDescripts->FeatureURL, pDescripts->FrameName, pDescripts->SearchFlags);
120 return aReturn;
123 //------------------------------------------------------------------------------
124 Reference< XDispatchProvider > SAL_CALL DispatchInterceptionMultiplexer::getSlaveDispatchProvider( ) throw(RuntimeException)
126 ::osl::MutexGuard aGuard( *m_pMutex );
127 return m_xSlaveDispatcher;
130 //------------------------------------------------------------------------------
131 void SAL_CALL DispatchInterceptionMultiplexer::setSlaveDispatchProvider(const Reference< XDispatchProvider>& xNewDispatchProvider) throw( RuntimeException )
133 ::osl::MutexGuard aGuard( *m_pMutex );
134 m_xSlaveDispatcher = xNewDispatchProvider;
137 //------------------------------------------------------------------------------
138 Reference< XDispatchProvider> SAL_CALL DispatchInterceptionMultiplexer::getMasterDispatchProvider(void) throw( RuntimeException )
140 ::osl::MutexGuard aGuard( *m_pMutex );
141 return m_xMasterDispatcher;
144 //------------------------------------------------------------------------------
145 void SAL_CALL DispatchInterceptionMultiplexer::setMasterDispatchProvider(const Reference< XDispatchProvider>& xNewSupplier) throw( RuntimeException )
147 ::osl::MutexGuard aGuard( *m_pMutex );
148 m_xMasterDispatcher = xNewSupplier;
151 //------------------------------------------------------------------------------
152 void SAL_CALL DispatchInterceptionMultiplexer::disposing(const EventObject& Source) throw( RuntimeException )
154 if (m_bListening)
156 Reference< XDispatchProviderInterception > xIntercepted(m_xIntercepted.get(), UNO_QUERY);
157 if (Source.Source == xIntercepted)
158 ImplDetach();
162 //------------------------------------------------------------------------------
163 void DispatchInterceptionMultiplexer::ImplDetach()
165 ::osl::MutexGuard aGuard( *m_pMutex );
166 OSL_ENSURE(m_bListening, "DispatchInterceptionMultiplexer::ImplDetach: invalid call!");
168 // deregister ourself from the interception component
169 Reference< XDispatchProviderInterception > xIntercepted(m_xIntercepted.get(), UNO_QUERY);
170 if (xIntercepted.is())
171 xIntercepted->releaseDispatchProviderInterceptor(static_cast<XDispatchProviderInterceptor*>(this));
173 // m_xIntercepted = Reference< XDispatchProviderInterception >();
174 // Don't reset m_xIntercepted: It may be needed by our owner to check for which object we were
175 // responsible. As we hold the object with a weak reference only, this should be no problem.
176 // 88936 - 23.07.2001 - frank.schoenheit@sun.com
177 m_pMaster = NULL;
178 m_pMutex = &m_aFallback;
179 m_bListening = sal_False;
182 //------------------------------------------------------------------------------
183 void DispatchInterceptionMultiplexer::disposing()
185 // remove ourself as event listener from the interception component
186 if (m_bListening)
188 Reference< XComponent> xInterceptedComponent(m_xIntercepted.get(), UNO_QUERY);
189 if (xInterceptedComponent.is())
190 xInterceptedComponent->removeEventListener(static_cast<XEventListener*>(this));
192 // detach from the interception component
193 ImplDetach();
197 //........................................................................
198 } // namespace svxform
199 //........................................................................
201 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */