16d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
36d739b60SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
46d739b60SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
56d739b60SAndrew Rist  * distributed with this work for additional information
66d739b60SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
76d739b60SAndrew Rist  * to you under the Apache License, Version 2.0 (the
86d739b60SAndrew Rist  * "License"); you may not use this file except in compliance
96d739b60SAndrew Rist  * with the License.  You may obtain a copy of the License at
106d739b60SAndrew Rist  *
116d739b60SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
126d739b60SAndrew Rist  *
136d739b60SAndrew Rist  * Unless required by applicable law or agreed to in writing,
146d739b60SAndrew Rist  * software distributed under the License is distributed on an
156d739b60SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
166d739b60SAndrew Rist  * KIND, either express or implied.  See the License for the
176d739b60SAndrew Rist  * specific language governing permissions and limitations
186d739b60SAndrew Rist  * under the License.
196d739b60SAndrew Rist  *
206d739b60SAndrew Rist  *************************************************************/
216d739b60SAndrew Rist 
226d739b60SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir //_______________________________________________
28cdf0e10cSrcweir //	my own includes
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #ifndef __FRAMEWORK_DISPATCH_INTERCEPTIONHELPER_HXX_
31cdf0e10cSrcweir #include <dispatch/interceptionhelper.hxx>
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir 
34cdf0e10cSrcweir //_______________________________________________
35cdf0e10cSrcweir //	interface includes
36cdf0e10cSrcweir #include <com/sun/star/frame/XInterceptorInfo.hpp>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir //_______________________________________________
39cdf0e10cSrcweir //	includes of other projects
40cdf0e10cSrcweir #include <vcl/svapp.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir //_______________________________________________
43cdf0e10cSrcweir //	namespace
44cdf0e10cSrcweir 
45cdf0e10cSrcweir namespace framework{
46cdf0e10cSrcweir 
47cdf0e10cSrcweir //_______________________________________________
48cdf0e10cSrcweir //	non exported const
49cdf0e10cSrcweir 
50cdf0e10cSrcweir sal_Bool InterceptionHelper::m_bPreferrFirstInterceptor = sal_True;
51cdf0e10cSrcweir 
52cdf0e10cSrcweir //_______________________________________________
53cdf0e10cSrcweir //	non exported definitions
54cdf0e10cSrcweir 
55cdf0e10cSrcweir //_______________________________________________
56cdf0e10cSrcweir //	declarations
57cdf0e10cSrcweir 
58cdf0e10cSrcweir /*-----------------------------------------------------------------------------
59cdf0e10cSrcweir     31.03.2003 09:02
60cdf0e10cSrcweir -----------------------------------------------------------------------------*/
DEFINE_XINTERFACE_3(InterceptionHelper,OWeakObject,DIRECT_INTERFACE (css::frame::XDispatchProvider),DIRECT_INTERFACE (css::frame::XDispatchProviderInterception),DIRECT_INTERFACE (css::lang::XEventListener))61cdf0e10cSrcweir DEFINE_XINTERFACE_3(InterceptionHelper                                         ,
62cdf0e10cSrcweir                     OWeakObject                                                ,
63cdf0e10cSrcweir                     DIRECT_INTERFACE(css::frame::XDispatchProvider            ),
64cdf0e10cSrcweir                     DIRECT_INTERFACE(css::frame::XDispatchProviderInterception),
65cdf0e10cSrcweir                     DIRECT_INTERFACE(css::lang::XEventListener                ))
66cdf0e10cSrcweir 
67cdf0e10cSrcweir /*-----------------------------------------------------------------------------
68cdf0e10cSrcweir     31.03.2003 09:02
69cdf0e10cSrcweir -----------------------------------------------------------------------------*/
70cdf0e10cSrcweir InterceptionHelper::InterceptionHelper(const css::uno::Reference< css::frame::XFrame >&            xOwner,
71cdf0e10cSrcweir                                        const css::uno::Reference< css::frame::XDispatchProvider >& xSlave)
72cdf0e10cSrcweir     //  Init baseclasses first
73cdf0e10cSrcweir     : ThreadHelpBase(&Application::GetSolarMutex())
74cdf0e10cSrcweir     , OWeakObject   (                             )
75cdf0e10cSrcweir     // Init member
76cdf0e10cSrcweir     , m_xOwnerWeak  (xOwner                       )
77cdf0e10cSrcweir     , m_xSlave      (xSlave                       )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir }
80cdf0e10cSrcweir 
81cdf0e10cSrcweir /*-----------------------------------------------------------------------------
82cdf0e10cSrcweir     31.03.2003 09:02
83cdf0e10cSrcweir -----------------------------------------------------------------------------*/
~InterceptionHelper()84cdf0e10cSrcweir InterceptionHelper::~InterceptionHelper()
85cdf0e10cSrcweir {
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir /*-----------------------------------------------------------------------------
89cdf0e10cSrcweir     31.03.2003 09:09
90cdf0e10cSrcweir -----------------------------------------------------------------------------*/
queryDispatch(const css::util::URL & aURL,const::rtl::OUString & sTargetFrameName,sal_Int32 nSearchFlags)91cdf0e10cSrcweir css::uno::Reference< css::frame::XDispatch > SAL_CALL InterceptionHelper::queryDispatch(const css::util::URL&  aURL            ,
92cdf0e10cSrcweir                                                                                         const ::rtl::OUString& sTargetFrameName,
93cdf0e10cSrcweir                                                                                               sal_Int32        nSearchFlags    )
94cdf0e10cSrcweir     throw(css::uno::RuntimeException)
95cdf0e10cSrcweir {
96cdf0e10cSrcweir     // SAFE {
97cdf0e10cSrcweir     ReadGuard aReadLock(m_aLock);
98cdf0e10cSrcweir 
99cdf0e10cSrcweir     // a) first search an interceptor, which match to this URL by it's URL pattern registration
10007a3d7f1SPedro Giffuni     //    Note: if it return NULL - it does not mean an empty interceptor list automatically!
101cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatchProvider > xInterceptor;
102cdf0e10cSrcweir     InterceptorList::const_iterator pIt = m_lInterceptionRegs.findByPattern(aURL.Complete);
103cdf0e10cSrcweir     if (pIt != m_lInterceptionRegs.end())
104cdf0e10cSrcweir         xInterceptor = pIt->xInterceptor;
105cdf0e10cSrcweir 
106cdf0e10cSrcweir     // b) No match by registration - but a valid interceptor list.
107cdf0e10cSrcweir     //    Use first interceptor everytimes.
108cdf0e10cSrcweir     //    Note: it doesn't matter, which direction this helper implementation use to ask interceptor objects.
109cdf0e10cSrcweir     //    Using of member m_aInterceptorList will starts at the beginning everytimes.
11007a3d7f1SPedro Giffuni     //    It depends from the filling operation, in which direction it works really!
111cdf0e10cSrcweir     if (!xInterceptor.is() && m_lInterceptionRegs.size()>0)
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         pIt          = m_lInterceptionRegs.begin();
114cdf0e10cSrcweir         xInterceptor = pIt->xInterceptor;
115cdf0e10cSrcweir     }
116cdf0e10cSrcweir 
117cdf0e10cSrcweir     // c) No registered interceptor => use our direct slave.
118cdf0e10cSrcweir     //    This helper exist by design and must be valid everytimes ...
119cdf0e10cSrcweir     //    But to be more feature proof - we should check that .-)
120cdf0e10cSrcweir     if (!xInterceptor.is() && m_xSlave.is())
121cdf0e10cSrcweir         xInterceptor = m_xSlave;
122cdf0e10cSrcweir 
123cdf0e10cSrcweir     aReadLock.unlock();
124cdf0e10cSrcweir     // } SAFE
125cdf0e10cSrcweir 
126cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatch > xReturn;
127cdf0e10cSrcweir     if (xInterceptor.is())
128cdf0e10cSrcweir         xReturn = xInterceptor->queryDispatch(aURL, sTargetFrameName, nSearchFlags);
129cdf0e10cSrcweir 	return xReturn;
130cdf0e10cSrcweir }
131cdf0e10cSrcweir 
132cdf0e10cSrcweir /*-----------------------------------------------------------------------------
133cdf0e10cSrcweir     31.03.2003 07:58
134cdf0e10cSrcweir -----------------------------------------------------------------------------*/
queryDispatches(const css::uno::Sequence<css::frame::DispatchDescriptor> & lDescriptor)135cdf0e10cSrcweir css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL InterceptionHelper::queryDispatches( const css::uno::Sequence< css::frame::DispatchDescriptor >& lDescriptor )
136cdf0e10cSrcweir     throw(css::uno::RuntimeException)
137cdf0e10cSrcweir {
138cdf0e10cSrcweir           sal_Int32                                                          c           = lDescriptor.getLength();
139cdf0e10cSrcweir           css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > lDispatches (c);
140cdf0e10cSrcweir           css::uno::Reference< css::frame::XDispatch >*                      pDispatches = lDispatches.getArray();
141cdf0e10cSrcweir     const css::frame::DispatchDescriptor*                                    pDescriptor = lDescriptor.getConstArray();
142cdf0e10cSrcweir 
143cdf0e10cSrcweir     for (sal_Int32 i=0; i<c; ++i)
144cdf0e10cSrcweir         pDispatches[i] = queryDispatch(pDescriptor[i].FeatureURL, pDescriptor[i].FrameName, pDescriptor[i].SearchFlags);
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     return lDispatches;
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir /*-----------------------------------------------------------------------------
150cdf0e10cSrcweir     31.03.2003 10:20
151cdf0e10cSrcweir -----------------------------------------------------------------------------*/
registerDispatchProviderInterceptor(const css::uno::Reference<css::frame::XDispatchProviderInterceptor> & xInterceptor)152cdf0e10cSrcweir void SAL_CALL InterceptionHelper::registerDispatchProviderInterceptor(const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor)
153cdf0e10cSrcweir     throw(css::uno::RuntimeException)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir     // reject wrong calling of this interface method
156cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatchProvider > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
157cdf0e10cSrcweir     if (!xInterceptor.is())
158cdf0e10cSrcweir         throw css::uno::RuntimeException(DECLARE_ASCII("NULL references not allowed as in parameter"), xThis);
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	// Fill a new info structure for new interceptor.
161cdf0e10cSrcweir 	// Save his reference and try to get an additional URL/pattern list from him.
162cdf0e10cSrcweir 	// If no list exist register these interceptor for all dispatch events with "*"!
163cdf0e10cSrcweir     InterceptorInfo aInfo;
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     aInfo.xInterceptor = css::uno::Reference< css::frame::XDispatchProvider >(xInterceptor, css::uno::UNO_QUERY);
166cdf0e10cSrcweir     css::uno::Reference< css::frame::XInterceptorInfo > xInfo(xInterceptor, css::uno::UNO_QUERY);
167cdf0e10cSrcweir     if (xInfo.is())
168cdf0e10cSrcweir         aInfo.lURLPattern = xInfo->getInterceptedURLs();
169cdf0e10cSrcweir 	else
170cdf0e10cSrcweir 	{
171cdf0e10cSrcweir         aInfo.lURLPattern.realloc(1);
172cdf0e10cSrcweir         aInfo.lURLPattern[0] = ::rtl::OUString::createFromAscii("*");
173cdf0e10cSrcweir 	}
174cdf0e10cSrcweir 
175cdf0e10cSrcweir     // SAFE {
176cdf0e10cSrcweir     WriteGuard aWriteLock(m_aLock);
177cdf0e10cSrcweir 
178cdf0e10cSrcweir     // a) no interceptor at all - set this instance as master for given interceptor
179cdf0e10cSrcweir     //    and set our slave as it's slave - and put this interceptor to the list.
180cdf0e10cSrcweir     //    It's place there doesn matter. Because this list is currently empty.
181cdf0e10cSrcweir     if (m_lInterceptionRegs.empty())
182cdf0e10cSrcweir     {
183cdf0e10cSrcweir         xInterceptor->setMasterDispatchProvider(xThis   );
184cdf0e10cSrcweir         xInterceptor->setSlaveDispatchProvider (m_xSlave);
185cdf0e10cSrcweir         m_lInterceptionRegs.push_back(aInfo);
186cdf0e10cSrcweir     }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     // b) OK - there is at least one interceptor already registered.
189cdf0e10cSrcweir     //    It's slave and it's master must be valid references ...
190cdf0e10cSrcweir     //    because we created it. But we have to look for the static bool which
191cdf0e10cSrcweir     //    regulate direction of using of interceptor objects!
192cdf0e10cSrcweir 
193cdf0e10cSrcweir     // b1) If "m_bPreferrFirstInterceptor" is set to true, we have to
194cdf0e10cSrcweir     //     insert it behind any other existing interceptor - means at the end of our list.
195cdf0e10cSrcweir     else if (m_bPreferrFirstInterceptor)
196cdf0e10cSrcweir 	{
197cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProvider >            xMasterD = m_lInterceptionRegs.rbegin()->xInterceptor;
198cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProviderInterceptor > xMasterI (xMasterD, css::uno::UNO_QUERY);
199cdf0e10cSrcweir 
200cdf0e10cSrcweir         xInterceptor->setMasterDispatchProvider(xMasterD          );
201cdf0e10cSrcweir         xInterceptor->setSlaveDispatchProvider (m_xSlave          );
202cdf0e10cSrcweir         xMasterI->setSlaveDispatchProvider     (aInfo.xInterceptor);
203cdf0e10cSrcweir 
204cdf0e10cSrcweir         m_lInterceptionRegs.push_back(aInfo);
205cdf0e10cSrcweir 	}
206cdf0e10cSrcweir 
207cdf0e10cSrcweir     // b2) If "m_bPreferrFirstInterceptor" is set to false, we have to
208cdf0e10cSrcweir     //     insert it before any other existing interceptor - means at the beginning of our list.
209cdf0e10cSrcweir     else
210cdf0e10cSrcweir     {
211cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProvider >            xSlaveD = m_lInterceptionRegs.begin()->xInterceptor;
212cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProviderInterceptor > xSlaveI (xSlaveD , css::uno::UNO_QUERY);
213cdf0e10cSrcweir 
214cdf0e10cSrcweir         xInterceptor->setMasterDispatchProvider(xThis             );
215cdf0e10cSrcweir         xInterceptor->setSlaveDispatchProvider (xSlaveD           );
216cdf0e10cSrcweir         xSlaveI->setMasterDispatchProvider     (aInfo.xInterceptor);
217cdf0e10cSrcweir 
218cdf0e10cSrcweir         m_lInterceptionRegs.push_front(aInfo);
219cdf0e10cSrcweir     }
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     css::uno::Reference< css::frame::XFrame > xOwner(m_xOwnerWeak.get(), css::uno::UNO_QUERY);
222cdf0e10cSrcweir 
223cdf0e10cSrcweir     aWriteLock.unlock();
224cdf0e10cSrcweir     // } SAFE
225cdf0e10cSrcweir 
226cdf0e10cSrcweir     // Don't forget to send a frame action event "context changed".
227cdf0e10cSrcweir     // Any cached dispatch objects must be validated now!
228cdf0e10cSrcweir     if (xOwner.is())
229cdf0e10cSrcweir 		xOwner->contextChanged();
230cdf0e10cSrcweir }
231cdf0e10cSrcweir 
232cdf0e10cSrcweir /*-----------------------------------------------------------------------------
233cdf0e10cSrcweir     31.03.2003 10:27
234cdf0e10cSrcweir -----------------------------------------------------------------------------*/
releaseDispatchProviderInterceptor(const css::uno::Reference<css::frame::XDispatchProviderInterceptor> & xInterceptor)235cdf0e10cSrcweir void SAL_CALL InterceptionHelper::releaseDispatchProviderInterceptor(const css::uno::Reference< css::frame::XDispatchProviderInterceptor >& xInterceptor)
236cdf0e10cSrcweir     throw(css::uno::RuntimeException)
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     // reject wrong calling of this interface method
239cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatchProvider > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY);
240cdf0e10cSrcweir     if (!xInterceptor.is())
241cdf0e10cSrcweir         throw css::uno::RuntimeException(DECLARE_ASCII("NULL references not allowed as in parameter"), xThis);
242cdf0e10cSrcweir 
243cdf0e10cSrcweir     // SAFE {
244cdf0e10cSrcweir     WriteGuard aWriteLock(m_aLock);
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     // search this interceptor ...
247cdf0e10cSrcweir     // If it could be located inside cache -
248cdf0e10cSrcweir     // use it's slave/master relations to update the interception list;
249cdf0e10cSrcweir     // set empty references for it as new master and slave;
250cdf0e10cSrcweir     // and relase it from out cache.
251cdf0e10cSrcweir     InterceptorList::iterator pIt = m_lInterceptionRegs.findByReference(xInterceptor);
252cdf0e10cSrcweir     if (pIt != m_lInterceptionRegs.end())
253cdf0e10cSrcweir     {
254cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProvider >            xSlaveD  (xInterceptor->getSlaveDispatchProvider() , css::uno::UNO_QUERY);
255cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProvider >            xMasterD (xInterceptor->getMasterDispatchProvider(), css::uno::UNO_QUERY);
256cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProviderInterceptor > xSlaveI  (xSlaveD                                  , css::uno::UNO_QUERY);
257cdf0e10cSrcweir         css::uno::Reference< css::frame::XDispatchProviderInterceptor > xMasterI (xMasterD                                 , css::uno::UNO_QUERY);
258cdf0e10cSrcweir 
259cdf0e10cSrcweir         if (xMasterI.is())
260cdf0e10cSrcweir             xMasterI->setSlaveDispatchProvider(xSlaveD);
261cdf0e10cSrcweir 
262cdf0e10cSrcweir         if (xSlaveI.is())
263cdf0e10cSrcweir             xSlaveI->setMasterDispatchProvider(xMasterD);
264cdf0e10cSrcweir 
265cdf0e10cSrcweir         xInterceptor->setSlaveDispatchProvider (css::uno::Reference< css::frame::XDispatchProvider >());
266cdf0e10cSrcweir         xInterceptor->setMasterDispatchProvider(css::uno::Reference< css::frame::XDispatchProvider >());
267cdf0e10cSrcweir 
268cdf0e10cSrcweir         m_lInterceptionRegs.erase(pIt);
269cdf0e10cSrcweir     }
270cdf0e10cSrcweir 
271cdf0e10cSrcweir     css::uno::Reference< css::frame::XFrame > xOwner(m_xOwnerWeak.get(), css::uno::UNO_QUERY);
272cdf0e10cSrcweir 
273cdf0e10cSrcweir     aWriteLock.unlock();
274cdf0e10cSrcweir     // } SAFE
275cdf0e10cSrcweir 
276cdf0e10cSrcweir     // Don't forget to send a frame action event "context changed".
277cdf0e10cSrcweir     // Any cached dispatch objects must be validated now!
278cdf0e10cSrcweir     if (xOwner.is())
279cdf0e10cSrcweir 		xOwner->contextChanged();
280cdf0e10cSrcweir }
281cdf0e10cSrcweir 
282cdf0e10cSrcweir /*-----------------------------------------------------------------------------
283cdf0e10cSrcweir     31.03.2003 10:31
284cdf0e10cSrcweir -----------------------------------------------------------------------------*/
285cdf0e10cSrcweir #define FORCE_DESTRUCTION_OF_INTERCEPTION_CHAIN
disposing(const css::lang::EventObject & aEvent)286cdf0e10cSrcweir void SAL_CALL InterceptionHelper::disposing(const css::lang::EventObject& aEvent)
287cdf0e10cSrcweir     throw(css::uno::RuntimeException)
288cdf0e10cSrcweir {
289cdf0e10cSrcweir     #ifdef FORCE_DESTRUCTION_OF_INTERCEPTION_CHAIN
290cdf0e10cSrcweir     // SAFE ->
291cdf0e10cSrcweir     ReadGuard aReadLock(m_aLock);
292cdf0e10cSrcweir 
293cdf0e10cSrcweir     // check calli ... we accept such disposing call's only from our onwer frame.
294cdf0e10cSrcweir     css::uno::Reference< css::frame::XFrame > xOwner(m_xOwnerWeak.get(), css::uno::UNO_QUERY);
295cdf0e10cSrcweir     if (aEvent.Source != xOwner)
296cdf0e10cSrcweir         return;
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     // Because every interceptor hold at least one reference to us ... and we destruct this list
299cdf0e10cSrcweir     // of interception objects ... we should hold ourself alive .-)
300cdf0e10cSrcweir     css::uno::Reference< css::frame::XDispatchProvider > xThis(static_cast< ::cppu::OWeakObject* >(this), css::uno::UNO_QUERY_THROW);
301cdf0e10cSrcweir 
302cdf0e10cSrcweir     // We need a full copy of all currently registered interceptor objects.
30307a3d7f1SPedro Giffuni     // Otherwise we can't iterate over this vector without the risk, that our iterator will be invalid.
304cdf0e10cSrcweir     // Because this vetor will be influenced by every deregistered interceptor.
305cdf0e10cSrcweir     InterceptionHelper::InterceptorList aCopy = m_lInterceptionRegs;
306cdf0e10cSrcweir 
307cdf0e10cSrcweir     aReadLock.unlock();
308cdf0e10cSrcweir     // <- SAFE
309cdf0e10cSrcweir 
310cdf0e10cSrcweir     InterceptionHelper::InterceptorList::iterator pIt;
311cdf0e10cSrcweir     for (  pIt  = aCopy.begin();
312cdf0e10cSrcweir            pIt != aCopy.end()  ;
313cdf0e10cSrcweir          ++pIt                 )
314cdf0e10cSrcweir     {
315cdf0e10cSrcweir         InterceptionHelper::InterceptorInfo& rInfo = *pIt;
316cdf0e10cSrcweir         if (rInfo.xInterceptor.is())
317cdf0e10cSrcweir         {
318cdf0e10cSrcweir             css::uno::Reference< css::frame::XDispatchProviderInterceptor > xInterceptor(rInfo.xInterceptor, css::uno::UNO_QUERY_THROW);
319cdf0e10cSrcweir             releaseDispatchProviderInterceptor(xInterceptor);
320cdf0e10cSrcweir             rInfo.xInterceptor.clear();
321cdf0e10cSrcweir         }
322cdf0e10cSrcweir     }
323cdf0e10cSrcweir 
324cdf0e10cSrcweir     aCopy.clear();
325cdf0e10cSrcweir 
326cdf0e10cSrcweir     #if OSL_DEBUG_LEVEL > 0
327cdf0e10cSrcweir     // SAFE ->
328cdf0e10cSrcweir     aReadLock.lock();
329cdf0e10cSrcweir     if (!m_lInterceptionRegs.empty() )
330*cfd52e18Smseidel         OSL_ENSURE(sal_False, "There are some pending interceptor objects, which seems to be registered during (!) the destruction of a frame.");
331cdf0e10cSrcweir     aReadLock.unlock();
332cdf0e10cSrcweir     // <- SAFE
333cdf0e10cSrcweir     #endif // ODL_DEBUG_LEVEL>0
334cdf0e10cSrcweir 
335cdf0e10cSrcweir     #endif // FORCE_DESTRUCTION_OF_INTERCEPTION_CHAIN
336cdf0e10cSrcweir }
337cdf0e10cSrcweir 
338cdf0e10cSrcweir } // namespace framework
339