1*96de5490SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*96de5490SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*96de5490SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*96de5490SAndrew Rist  * distributed with this work for additional information
6*96de5490SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*96de5490SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*96de5490SAndrew Rist  * "License"); you may not use this file except in compliance
9*96de5490SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*96de5490SAndrew Rist  *
11*96de5490SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*96de5490SAndrew Rist  *
13*96de5490SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*96de5490SAndrew Rist  * software distributed under the License is distributed on an
15*96de5490SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*96de5490SAndrew Rist  * KIND, either express or implied.  See the License for the
17*96de5490SAndrew Rist  * specific language governing permissions and limitations
18*96de5490SAndrew Rist  * under the License.
19*96de5490SAndrew Rist  *
20*96de5490SAndrew Rist  *************************************************************/
21*96de5490SAndrew Rist 
22*96de5490SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_dbaccess.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "intercept.hxx"
28cdf0e10cSrcweir #include "dbastrings.hrc"
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <com/sun/star/embed/EmbedStates.hpp>
31cdf0e10cSrcweir #include <com/sun/star/document/XEventBroadcaster.hpp>
32cdf0e10cSrcweir #include <com/sun/star/util/XModifiable.hpp>
33cdf0e10cSrcweir #include <cppuhelper/weak.hxx>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #include <comphelper/types.hxx>
36cdf0e10cSrcweir #include <tools/debug.hxx>
37cdf0e10cSrcweir #include <tools/diagnose_ex.h>
38cdf0e10cSrcweir 
39cdf0e10cSrcweir 
40cdf0e10cSrcweir namespace dbaccess
41cdf0e10cSrcweir {
42cdf0e10cSrcweir using namespace ::com::sun::star::uno;
43cdf0e10cSrcweir using namespace ::com::sun::star::util;
44cdf0e10cSrcweir using namespace ::com::sun::star::ucb;
45cdf0e10cSrcweir using namespace ::com::sun::star::beans;
46cdf0e10cSrcweir using namespace ::com::sun::star::lang;
47cdf0e10cSrcweir using namespace ::com::sun::star::sdbc;
48cdf0e10cSrcweir using namespace ::com::sun::star::frame;
49cdf0e10cSrcweir using namespace ::com::sun::star::io;
50cdf0e10cSrcweir using namespace ::com::sun::star::embed;
51cdf0e10cSrcweir using namespace ::com::sun::star::container;
52cdf0e10cSrcweir using namespace ::comphelper;
53cdf0e10cSrcweir using namespace ::cppu;
54cdf0e10cSrcweir 
55cdf0e10cSrcweir #define DISPATCH_SAVEAS		0
56cdf0e10cSrcweir #define DISPATCH_SAVE		1
57cdf0e10cSrcweir #define DISPATCH_CLOSEDOC	2
58cdf0e10cSrcweir #define DISPATCH_CLOSEWIN	3
59cdf0e10cSrcweir #define DISPATCH_CLOSEFRAME	4
60cdf0e10cSrcweir #define DISPATCH_RELOAD		5
61cdf0e10cSrcweir // the OSL_ENSURE in CTOR has to be changed too, when adding new defines
62cdf0e10cSrcweir 
dispose()63cdf0e10cSrcweir void SAL_CALL OInterceptor::dispose()
64cdf0e10cSrcweir 	throw( RuntimeException )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir 	EventObject aEvt( *this );
67cdf0e10cSrcweir 
68cdf0e10cSrcweir     osl::MutexGuard aGuard(m_aMutex);
69cdf0e10cSrcweir 
70cdf0e10cSrcweir     if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
71cdf0e10cSrcweir 		m_pDisposeEventListeners->disposeAndClear( aEvt );
72cdf0e10cSrcweir 
73cdf0e10cSrcweir 	if ( m_pStatCL )
74cdf0e10cSrcweir 		m_pStatCL->disposeAndClear( aEvt );
75cdf0e10cSrcweir 
76cdf0e10cSrcweir 	m_xSlaveDispatchProvider.clear();
77cdf0e10cSrcweir 	m_xMasterDispatchProvider.clear();
78cdf0e10cSrcweir 
79cdf0e10cSrcweir     m_pContentHolder = NULL;
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 
DBG_NAME(OInterceptor)83cdf0e10cSrcweir DBG_NAME(OInterceptor)
84cdf0e10cSrcweir 
85cdf0e10cSrcweir OInterceptor::OInterceptor( ODocumentDefinition* _pContentHolder,sal_Bool _bAllowEditDoc )
86cdf0e10cSrcweir     :m_pContentHolder( _pContentHolder )
87cdf0e10cSrcweir     ,m_aInterceptedURL(7)
88cdf0e10cSrcweir     ,m_pDisposeEventListeners(0)
89cdf0e10cSrcweir     ,m_pStatCL(0)
90cdf0e10cSrcweir     ,m_bAllowEditDoc(_bAllowEditDoc)
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     DBG_CTOR(OInterceptor,NULL);
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	OSL_ENSURE(DISPATCH_RELOAD < m_aInterceptedURL.getLength(),"Illegal size.");
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 	m_aInterceptedURL[DISPATCH_SAVEAS]		= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:SaveAs"));
97cdf0e10cSrcweir 	m_aInterceptedURL[DISPATCH_SAVE]		= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:Save"));
98cdf0e10cSrcweir 	m_aInterceptedURL[DISPATCH_CLOSEDOC]	= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:CloseDoc"));
99cdf0e10cSrcweir 	m_aInterceptedURL[DISPATCH_CLOSEWIN]	= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:CloseWin"));
100cdf0e10cSrcweir 	m_aInterceptedURL[DISPATCH_CLOSEFRAME]	= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:CloseFrame"));
101cdf0e10cSrcweir 	m_aInterceptedURL[DISPATCH_RELOAD]		= rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:Reload"));
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
~OInterceptor()105cdf0e10cSrcweir OInterceptor::~OInterceptor()
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	if( m_pDisposeEventListeners )
108cdf0e10cSrcweir 		delete m_pDisposeEventListeners;
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 	if(m_pStatCL)
111cdf0e10cSrcweir 		delete m_pStatCL;
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     DBG_DTOR(OInterceptor,NULL);
114cdf0e10cSrcweir }
115cdf0e10cSrcweir 
116cdf0e10cSrcweir struct DispatchHelper
117cdf0e10cSrcweir {
118cdf0e10cSrcweir     URL aURL;
119cdf0e10cSrcweir     Sequence<PropertyValue > aArguments;
120cdf0e10cSrcweir };
121cdf0e10cSrcweir 
122cdf0e10cSrcweir //XDispatch
dispatch(const URL & _URL,const Sequence<PropertyValue> & Arguments)123cdf0e10cSrcweir void SAL_CALL OInterceptor::dispatch( const URL& _URL,const Sequence<PropertyValue >& Arguments ) throw (RuntimeException)
124cdf0e10cSrcweir {
125cdf0e10cSrcweir     ::osl::MutexGuard aGuard( m_aMutex );
126cdf0e10cSrcweir 	if ( !m_pContentHolder )
127cdf0e10cSrcweir         return;
128cdf0e10cSrcweir 
129cdf0e10cSrcweir     if ( _URL.Complete == m_aInterceptedURL[ DISPATCH_SAVE ] )
130cdf0e10cSrcweir 	{
131cdf0e10cSrcweir 		m_pContentHolder->save( sal_False );
132cdf0e10cSrcweir         return;
133cdf0e10cSrcweir     }
134cdf0e10cSrcweir 
135cdf0e10cSrcweir 	if ( _URL.Complete == m_aInterceptedURL[ DISPATCH_RELOAD ] )
136cdf0e10cSrcweir 	{
137cdf0e10cSrcweir         ODocumentDefinition::fillReportData(
138cdf0e10cSrcweir             m_pContentHolder->getContext(),
139cdf0e10cSrcweir             m_pContentHolder->getComponent(),
140cdf0e10cSrcweir             m_pContentHolder->getConnection()
141cdf0e10cSrcweir         );
142cdf0e10cSrcweir         return;
143cdf0e10cSrcweir 	}
144cdf0e10cSrcweir 
145cdf0e10cSrcweir 	if( _URL.Complete == m_aInterceptedURL[ DISPATCH_SAVEAS ] )
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir         if ( m_pContentHolder->isNewReport() )
148cdf0e10cSrcweir         {
149cdf0e10cSrcweir             m_pContentHolder->saveAs();
150cdf0e10cSrcweir         }
151cdf0e10cSrcweir         else if ( m_xSlaveDispatchProvider.is() )
152cdf0e10cSrcweir         {
153cdf0e10cSrcweir 		    Sequence< PropertyValue > aNewArgs = Arguments;
154cdf0e10cSrcweir 		    sal_Int32 nInd = 0;
155cdf0e10cSrcweir 
156cdf0e10cSrcweir 		    while( nInd < aNewArgs.getLength() )
157cdf0e10cSrcweir 		    {
158cdf0e10cSrcweir 			    if ( aNewArgs[nInd].Name.equalsAscii( "SaveTo" ) )
159cdf0e10cSrcweir 			    {
160cdf0e10cSrcweir 				    aNewArgs[nInd].Value <<= sal_True;
161cdf0e10cSrcweir 				    break;
162cdf0e10cSrcweir 			    }
163cdf0e10cSrcweir 			    nInd++;
164cdf0e10cSrcweir 		    }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 		    if ( nInd == aNewArgs.getLength() )
167cdf0e10cSrcweir 		    {
168cdf0e10cSrcweir 			    aNewArgs.realloc( nInd + 1 );
169cdf0e10cSrcweir 			    aNewArgs[nInd].Name = ::rtl::OUString::createFromAscii( "SaveTo" );
170cdf0e10cSrcweir 			    aNewArgs[nInd].Value <<= sal_True;
171cdf0e10cSrcweir 		    }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir 		    Reference< XDispatch > xDispatch = m_xSlaveDispatchProvider->queryDispatch(
174cdf0e10cSrcweir 			    _URL, ::rtl::OUString::createFromAscii( "_self" ), 0 );
175cdf0e10cSrcweir 		    if ( xDispatch.is() )
176cdf0e10cSrcweir 			    xDispatch->dispatch( _URL, aNewArgs );
177cdf0e10cSrcweir         }
178cdf0e10cSrcweir         return;
179cdf0e10cSrcweir 	}
180cdf0e10cSrcweir 
181cdf0e10cSrcweir 	if  (   _URL.Complete == m_aInterceptedURL[ DISPATCH_CLOSEDOC ]
182cdf0e10cSrcweir         ||  _URL.Complete == m_aInterceptedURL[ DISPATCH_CLOSEWIN ]
183cdf0e10cSrcweir         ||  _URL.Complete == m_aInterceptedURL[ DISPATCH_CLOSEFRAME ]
184cdf0e10cSrcweir         )
185cdf0e10cSrcweir     {
186cdf0e10cSrcweir         DispatchHelper* pHelper = new DispatchHelper;
187cdf0e10cSrcweir         pHelper->aArguments = Arguments;
188cdf0e10cSrcweir         pHelper->aURL = _URL;
189cdf0e10cSrcweir         Application::PostUserEvent( LINK( this, OInterceptor, OnDispatch ), reinterpret_cast< void* >( pHelper ) );
190cdf0e10cSrcweir         return;
191cdf0e10cSrcweir 	}
192cdf0e10cSrcweir }
193cdf0e10cSrcweir 
IMPL_LINK(OInterceptor,OnDispatch,void *,_pDispatcher)194cdf0e10cSrcweir IMPL_LINK( OInterceptor, OnDispatch, void*, _pDispatcher )
195cdf0e10cSrcweir {
196cdf0e10cSrcweir     ::std::auto_ptr<DispatchHelper> pHelper( reinterpret_cast< DispatchHelper* >( _pDispatcher ) );
197cdf0e10cSrcweir 	try
198cdf0e10cSrcweir 	{
199cdf0e10cSrcweir         if ( m_pContentHolder && m_pContentHolder->prepareClose() && m_xSlaveDispatchProvider.is() )
200cdf0e10cSrcweir 		{
201cdf0e10cSrcweir 		    Reference< XDispatch > xDispatch = m_xSlaveDispatchProvider->queryDispatch(
202cdf0e10cSrcweir                 pHelper->aURL, ::rtl::OUString::createFromAscii( "_self" ), 0 );
203cdf0e10cSrcweir 		    if ( xDispatch.is() )
204cdf0e10cSrcweir             {
205cdf0e10cSrcweir                 Reference< ::com::sun::star::document::XEventBroadcaster> xEvtB(m_pContentHolder->getComponent(),UNO_QUERY);
206cdf0e10cSrcweir                 if ( xEvtB.is() )
207cdf0e10cSrcweir                     xEvtB->removeEventListener(this);
208cdf0e10cSrcweir 
209cdf0e10cSrcweir                 Reference< XInterface > xKeepContentHolderAlive( *m_pContentHolder );
210cdf0e10cSrcweir                 xDispatch->dispatch( pHelper->aURL,pHelper->aArguments);
211cdf0e10cSrcweir             }
212cdf0e10cSrcweir 		}
213cdf0e10cSrcweir     }
214cdf0e10cSrcweir 	catch ( const Exception& )
215cdf0e10cSrcweir 	{
216cdf0e10cSrcweir         DBG_UNHANDLED_EXCEPTION();
217cdf0e10cSrcweir 	}
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 	return 0L;
220cdf0e10cSrcweir }
221cdf0e10cSrcweir 
addStatusListener(const Reference<XStatusListener> & Control,const URL & _URL)222cdf0e10cSrcweir void SAL_CALL OInterceptor::addStatusListener(
223cdf0e10cSrcweir 	const Reference<
224cdf0e10cSrcweir 	XStatusListener >& Control,
225cdf0e10cSrcweir 	const URL& _URL )
226cdf0e10cSrcweir 	throw (
227cdf0e10cSrcweir 		RuntimeException
228cdf0e10cSrcweir 	)
229cdf0e10cSrcweir {
230cdf0e10cSrcweir 	if(!Control.is())
231cdf0e10cSrcweir 		return;
232cdf0e10cSrcweir 
233cdf0e10cSrcweir 	if ( m_pContentHolder && _URL.Complete == m_aInterceptedURL[DISPATCH_SAVEAS] )
234cdf0e10cSrcweir 	{   // SaveAs
235cdf0e10cSrcweir 
236cdf0e10cSrcweir         if ( !m_pContentHolder->isNewReport() )
237cdf0e10cSrcweir         {
238cdf0e10cSrcweir             FeatureStateEvent aStateEvent;
239cdf0e10cSrcweir 		    aStateEvent.FeatureURL.Complete = m_aInterceptedURL[DISPATCH_SAVEAS];
240cdf0e10cSrcweir 		    aStateEvent.FeatureDescriptor = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SaveCopyTo"));
241cdf0e10cSrcweir 		    aStateEvent.IsEnabled = sal_True;
242cdf0e10cSrcweir 		    aStateEvent.Requery = sal_False;
243cdf0e10cSrcweir 		    aStateEvent.State <<= (rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("($3)")));
244cdf0e10cSrcweir             Control->statusChanged(aStateEvent);
245cdf0e10cSrcweir         }
246cdf0e10cSrcweir 
247cdf0e10cSrcweir 		{
248cdf0e10cSrcweir 			osl::MutexGuard aGuard(m_aMutex);
249cdf0e10cSrcweir 			if(!m_pStatCL)
250cdf0e10cSrcweir 				m_pStatCL = new PropertyChangeListenerContainer(m_aMutex);
251cdf0e10cSrcweir 		}
252cdf0e10cSrcweir 
253cdf0e10cSrcweir 		m_pStatCL->addInterface(_URL.Complete,Control);
254cdf0e10cSrcweir 	}
255cdf0e10cSrcweir 	else if ( m_pContentHolder && _URL.Complete == m_aInterceptedURL[DISPATCH_SAVE] )
256cdf0e10cSrcweir 	{   // Save
257cdf0e10cSrcweir 		FeatureStateEvent aStateEvent;
258cdf0e10cSrcweir 		aStateEvent.FeatureURL.Complete = m_aInterceptedURL[DISPATCH_SAVE];
259cdf0e10cSrcweir 		aStateEvent.FeatureDescriptor = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Update"));
260cdf0e10cSrcweir 		aStateEvent.IsEnabled = m_pContentHolder != NULL && m_pContentHolder->isModified();
261cdf0e10cSrcweir 		aStateEvent.Requery = sal_False;
262cdf0e10cSrcweir 
263cdf0e10cSrcweir 		Control->statusChanged(aStateEvent);
264cdf0e10cSrcweir 		{
265cdf0e10cSrcweir 			osl::MutexGuard aGuard(m_aMutex);
266cdf0e10cSrcweir 			if(!m_pStatCL)
267cdf0e10cSrcweir 				m_pStatCL = new PropertyChangeListenerContainer(m_aMutex);
268cdf0e10cSrcweir 		}
269cdf0e10cSrcweir 
270cdf0e10cSrcweir 		m_pStatCL->addInterface(_URL.Complete,Control);
271cdf0e10cSrcweir 		Reference< ::com::sun::star::document::XEventBroadcaster> xEvtB(m_pContentHolder->getComponent(),UNO_QUERY);
272cdf0e10cSrcweir 		if ( xEvtB.is() )
273cdf0e10cSrcweir 			xEvtB->addEventListener(this);
274cdf0e10cSrcweir 	}
275cdf0e10cSrcweir 	else
276cdf0e10cSrcweir 	{
277cdf0e10cSrcweir 		sal_Int32 i = 2;
278cdf0e10cSrcweir 		if(_URL.Complete == m_aInterceptedURL[i] ||
279cdf0e10cSrcweir 			_URL.Complete == m_aInterceptedURL[++i] ||
280cdf0e10cSrcweir 			_URL.Complete == m_aInterceptedURL[++i] ||
281cdf0e10cSrcweir 			_URL.Complete == m_aInterceptedURL[i = DISPATCH_RELOAD] )
282cdf0e10cSrcweir 		{   // Close and return
283cdf0e10cSrcweir 			FeatureStateEvent aStateEvent;
284cdf0e10cSrcweir 			aStateEvent.FeatureURL.Complete = m_aInterceptedURL[i];
285cdf0e10cSrcweir 			aStateEvent.FeatureDescriptor = rtl::OUString(
286cdf0e10cSrcweir 				RTL_CONSTASCII_USTRINGPARAM("Close and Return"));
287cdf0e10cSrcweir 			aStateEvent.IsEnabled = sal_True;
288cdf0e10cSrcweir 			aStateEvent.Requery = sal_False;
289cdf0e10cSrcweir 			Control->statusChanged(aStateEvent);
290cdf0e10cSrcweir 
291cdf0e10cSrcweir 
292cdf0e10cSrcweir 			{
293cdf0e10cSrcweir 				osl::MutexGuard aGuard(m_aMutex);
294cdf0e10cSrcweir 				if(!m_pStatCL)
295cdf0e10cSrcweir 					m_pStatCL = new PropertyChangeListenerContainer(m_aMutex);
296cdf0e10cSrcweir 			}
297cdf0e10cSrcweir 
298cdf0e10cSrcweir 			m_pStatCL->addInterface(_URL.Complete,Control);
299cdf0e10cSrcweir 			return;
300cdf0e10cSrcweir 		}
301cdf0e10cSrcweir 	}
302cdf0e10cSrcweir }
303cdf0e10cSrcweir 
304cdf0e10cSrcweir 
removeStatusListener(const Reference<XStatusListener> & Control,const URL & _URL)305cdf0e10cSrcweir void SAL_CALL OInterceptor::removeStatusListener(
306cdf0e10cSrcweir 	const Reference<
307cdf0e10cSrcweir 	XStatusListener >& Control,
308cdf0e10cSrcweir 	const URL& _URL )
309cdf0e10cSrcweir 	throw (
310cdf0e10cSrcweir 		RuntimeException
311cdf0e10cSrcweir 	)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir 	if(!(Control.is() && m_pStatCL))
314cdf0e10cSrcweir 		return;
315cdf0e10cSrcweir 	else
316cdf0e10cSrcweir 	{
317cdf0e10cSrcweir 		m_pStatCL->removeInterface(_URL.Complete,Control);
318cdf0e10cSrcweir 		return;
319cdf0e10cSrcweir 	}
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 
323cdf0e10cSrcweir //XInterceptorInfo
getInterceptedURLs()324cdf0e10cSrcweir Sequence< ::rtl::OUString > SAL_CALL OInterceptor::getInterceptedURLs(  ) 	throw ( RuntimeException	)
325cdf0e10cSrcweir {
326cdf0e10cSrcweir 	// now implemented as update
327cdf0e10cSrcweir 	return m_aInterceptedURL;
328cdf0e10cSrcweir }
329cdf0e10cSrcweir 
330cdf0e10cSrcweir 
331cdf0e10cSrcweir // XDispatchProvider
332cdf0e10cSrcweir 
queryDispatch(const URL & _URL,const::rtl::OUString & TargetFrameName,sal_Int32 SearchFlags)333cdf0e10cSrcweir Reference< XDispatch > SAL_CALL OInterceptor::queryDispatch( const URL& _URL,const ::rtl::OUString& TargetFrameName,sal_Int32 SearchFlags )
334cdf0e10cSrcweir 	throw (RuntimeException)
335cdf0e10cSrcweir {
336cdf0e10cSrcweir 	osl::MutexGuard aGuard(m_aMutex);
337cdf0e10cSrcweir 	const ::rtl::OUString* pIter = m_aInterceptedURL.getConstArray();
338cdf0e10cSrcweir 	const ::rtl::OUString* pEnd	  = pIter + m_aInterceptedURL.getLength();
339cdf0e10cSrcweir 	for(;pIter != pEnd;++pIter)
340cdf0e10cSrcweir 	{
341cdf0e10cSrcweir 		if ( _URL.Complete == *pIter )
342cdf0e10cSrcweir 			return (XDispatch*)this;
343cdf0e10cSrcweir 	}
344cdf0e10cSrcweir 
345cdf0e10cSrcweir 	if(m_xSlaveDispatchProvider.is())
346cdf0e10cSrcweir 		return m_xSlaveDispatchProvider->queryDispatch(_URL,TargetFrameName,SearchFlags);
347cdf0e10cSrcweir 	else
348cdf0e10cSrcweir 		return Reference<XDispatch>();
349cdf0e10cSrcweir }
350cdf0e10cSrcweir 
queryDispatches(const Sequence<DispatchDescriptor> & Requests)351cdf0e10cSrcweir Sequence< Reference< XDispatch > > SAL_CALL OInterceptor::queryDispatches( 	const Sequence<DispatchDescriptor >& Requests )	throw (		RuntimeException	)
352cdf0e10cSrcweir {
353cdf0e10cSrcweir 	Sequence< Reference< XDispatch > > aRet;
354cdf0e10cSrcweir 	osl::MutexGuard aGuard(m_aMutex);
355cdf0e10cSrcweir 	if(m_xSlaveDispatchProvider.is())
356cdf0e10cSrcweir 		aRet = m_xSlaveDispatchProvider->queryDispatches(Requests);
357cdf0e10cSrcweir 	else
358cdf0e10cSrcweir 		aRet.realloc(Requests.getLength());
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 	for(sal_Int32 i = 0; i < Requests.getLength(); ++i)
361cdf0e10cSrcweir 	{
362cdf0e10cSrcweir 		const ::rtl::OUString* pIter = m_aInterceptedURL.getConstArray();
363cdf0e10cSrcweir 		const ::rtl::OUString* pEnd	  = pIter + m_aInterceptedURL.getLength();
364cdf0e10cSrcweir 		for(;pIter != pEnd;++pIter)
365cdf0e10cSrcweir 		{
366cdf0e10cSrcweir 			if ( Requests[i].FeatureURL.Complete == *pIter )
367cdf0e10cSrcweir 			{
368cdf0e10cSrcweir 				aRet[i] = (XDispatch*) this;
369cdf0e10cSrcweir 				break;
370cdf0e10cSrcweir 			}
371cdf0e10cSrcweir 		}
372cdf0e10cSrcweir 	}
373cdf0e10cSrcweir 
374cdf0e10cSrcweir 	return aRet;
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 
379cdf0e10cSrcweir //XDispatchProviderInterceptor
380cdf0e10cSrcweir 
getSlaveDispatchProvider()381cdf0e10cSrcweir Reference< XDispatchProvider > SAL_CALL OInterceptor::getSlaveDispatchProvider(  ) 	throw ( RuntimeException 	)
382cdf0e10cSrcweir {
383cdf0e10cSrcweir 	osl::MutexGuard aGuard(m_aMutex);
384cdf0e10cSrcweir 	return m_xSlaveDispatchProvider;
385cdf0e10cSrcweir }
386cdf0e10cSrcweir 
387cdf0e10cSrcweir void SAL_CALL
setSlaveDispatchProvider(const Reference<XDispatchProvider> & NewDispatchProvider)388cdf0e10cSrcweir OInterceptor::setSlaveDispatchProvider(	const Reference< XDispatchProvider >& NewDispatchProvider )
389cdf0e10cSrcweir 	throw (		RuntimeException	)
390cdf0e10cSrcweir {
391cdf0e10cSrcweir 	osl::MutexGuard aGuard(m_aMutex);
392cdf0e10cSrcweir 	m_xSlaveDispatchProvider = NewDispatchProvider;
393cdf0e10cSrcweir }
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 
getMasterDispatchProvider()396cdf0e10cSrcweir Reference< XDispatchProvider > SAL_CALL OInterceptor::getMasterDispatchProvider(  )
397cdf0e10cSrcweir 	throw (
398cdf0e10cSrcweir 		RuntimeException
399cdf0e10cSrcweir 	)
400cdf0e10cSrcweir {
401cdf0e10cSrcweir 	osl::MutexGuard aGuard(m_aMutex);
402cdf0e10cSrcweir 	return m_xMasterDispatchProvider;
403cdf0e10cSrcweir }
404cdf0e10cSrcweir 
405cdf0e10cSrcweir 
setMasterDispatchProvider(const Reference<XDispatchProvider> & NewSupplier)406cdf0e10cSrcweir void SAL_CALL OInterceptor::setMasterDispatchProvider(
407cdf0e10cSrcweir 	const Reference< XDispatchProvider >& NewSupplier )
408cdf0e10cSrcweir 	throw (
409cdf0e10cSrcweir 		RuntimeException
410cdf0e10cSrcweir 	)
411cdf0e10cSrcweir {
412cdf0e10cSrcweir 	osl::MutexGuard aGuard(m_aMutex);
413cdf0e10cSrcweir 	m_xMasterDispatchProvider = NewSupplier;
414cdf0e10cSrcweir }
415cdf0e10cSrcweir // -----------------------------------------------------------------------------
notifyEvent(const::com::sun::star::document::EventObject & Event)416cdf0e10cSrcweir void SAL_CALL OInterceptor::notifyEvent( const ::com::sun::star::document::EventObject& Event ) throw (::com::sun::star::uno::RuntimeException)
417cdf0e10cSrcweir {
418cdf0e10cSrcweir 	osl::ResettableMutexGuard _rGuard(m_aMutex);
419cdf0e10cSrcweir 	if ( m_pStatCL &&	Event.EventName == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OnModifyChanged")) )
420cdf0e10cSrcweir 	{
421cdf0e10cSrcweir 		OInterfaceContainerHelper* pListener = m_pStatCL->getContainer(m_aInterceptedURL[DISPATCH_SAVE]);
422cdf0e10cSrcweir 		if ( pListener )
423cdf0e10cSrcweir 		{
424cdf0e10cSrcweir 			FeatureStateEvent aEvt;
425cdf0e10cSrcweir 			aEvt.FeatureURL.Complete = m_aInterceptedURL[DISPATCH_SAVE];
426cdf0e10cSrcweir 			aEvt.FeatureDescriptor = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Update"));
427cdf0e10cSrcweir 			Reference<XModifiable> xModel(Event.Source,UNO_QUERY);
428cdf0e10cSrcweir 			aEvt.IsEnabled = xModel.is() && xModel->isModified();
429cdf0e10cSrcweir 			aEvt.Requery = sal_False;
430cdf0e10cSrcweir 
431cdf0e10cSrcweir 			NOTIFY_LISTERNERS((*pListener),XStatusListener,statusChanged)
432cdf0e10cSrcweir 		}
433cdf0e10cSrcweir 	}
434cdf0e10cSrcweir }
435cdf0e10cSrcweir // -----------------------------------------------------------------------------
disposing(const::com::sun::star::lang::EventObject &)436cdf0e10cSrcweir void SAL_CALL OInterceptor::disposing( const ::com::sun::star::lang::EventObject& /*Source*/ ) throw (::com::sun::star::uno::RuntimeException)
437cdf0e10cSrcweir {
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir //........................................................................
441cdf0e10cSrcweir }	// namespace dbaccess
442cdf0e10cSrcweir //........................................................................
443cdf0e10cSrcweir 
444