1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_comphelper.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "comphelper_module.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloseBroadcaster.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XCloseable.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/DisposedException.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/IllegalArgumentException.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/XDesktop.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/DoubleInitializationException.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/frame/DoubleInitializationException.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski #include "instancelocker.hxx"
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski // ====================================================================
44*b1cdbd2cSJim Jagielski // OInstanceLocker
45*b1cdbd2cSJim Jagielski // ====================================================================
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski // --------------------------------------------------------
OInstanceLocker(const uno::Reference<uno::XComponentContext> & xContext)48*b1cdbd2cSJim Jagielski OInstanceLocker::OInstanceLocker( const uno::Reference< uno::XComponentContext >& xContext )
49*b1cdbd2cSJim Jagielski : m_xContext( xContext )
50*b1cdbd2cSJim Jagielski , m_pLockListener( NULL )
51*b1cdbd2cSJim Jagielski , m_pListenersContainer( NULL )
52*b1cdbd2cSJim Jagielski , m_bDisposed( sal_False )
53*b1cdbd2cSJim Jagielski , m_bInitialized( sal_False )
54*b1cdbd2cSJim Jagielski {
55*b1cdbd2cSJim Jagielski }
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski // --------------------------------------------------------
~OInstanceLocker()58*b1cdbd2cSJim Jagielski OInstanceLocker::~OInstanceLocker()
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski 	if ( !m_bDisposed )
61*b1cdbd2cSJim Jagielski 	{
62*b1cdbd2cSJim Jagielski 		m_refCount++; // to call dispose
63*b1cdbd2cSJim Jagielski 		try {
64*b1cdbd2cSJim Jagielski 			dispose();
65*b1cdbd2cSJim Jagielski 		}
66*b1cdbd2cSJim Jagielski 		catch ( uno::RuntimeException& )
67*b1cdbd2cSJim Jagielski 		{}
68*b1cdbd2cSJim Jagielski 	}
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 	if ( m_pListenersContainer )
71*b1cdbd2cSJim Jagielski 	{
72*b1cdbd2cSJim Jagielski 		delete m_pListenersContainer;
73*b1cdbd2cSJim Jagielski 		m_pListenersContainer = NULL;
74*b1cdbd2cSJim Jagielski 	}
75*b1cdbd2cSJim Jagielski }
76*b1cdbd2cSJim Jagielski 
77*b1cdbd2cSJim Jagielski // XComponent
78*b1cdbd2cSJim Jagielski // --------------------------------------------------------
dispose()79*b1cdbd2cSJim Jagielski void SAL_CALL OInstanceLocker::dispose()
80*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 	if ( m_bDisposed )
85*b1cdbd2cSJim Jagielski 		throw lang::DisposedException();
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski    	lang::EventObject aSource( static_cast< ::cppu::OWeakObject* >(this) );
88*b1cdbd2cSJim Jagielski 	if ( m_pListenersContainer )
89*b1cdbd2cSJim Jagielski 		m_pListenersContainer->disposeAndClear( aSource );
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	if ( m_xLockListener.is() )
92*b1cdbd2cSJim Jagielski 	{
93*b1cdbd2cSJim Jagielski 		if ( m_pLockListener )
94*b1cdbd2cSJim Jagielski 		{
95*b1cdbd2cSJim Jagielski 			m_pLockListener->Dispose();
96*b1cdbd2cSJim Jagielski 			m_pLockListener = NULL;
97*b1cdbd2cSJim Jagielski 		}
98*b1cdbd2cSJim Jagielski 		m_xLockListener = uno::Reference< uno::XInterface >();
99*b1cdbd2cSJim Jagielski 	}
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski 	m_bDisposed = sal_True;
102*b1cdbd2cSJim Jagielski }
103*b1cdbd2cSJim Jagielski 
104*b1cdbd2cSJim Jagielski // --------------------------------------------------------
addEventListener(const uno::Reference<lang::XEventListener> & xListener)105*b1cdbd2cSJim Jagielski void SAL_CALL OInstanceLocker::addEventListener( const uno::Reference< lang::XEventListener >& xListener )
106*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
109*b1cdbd2cSJim Jagielski 	if ( m_bDisposed )
110*b1cdbd2cSJim Jagielski 		throw lang::DisposedException(); // TODO
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 	if ( !m_pListenersContainer )
113*b1cdbd2cSJim Jagielski 		m_pListenersContainer = new ::cppu::OInterfaceContainerHelper( m_aMutex );
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski 	m_pListenersContainer->addInterface( xListener );
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski // --------------------------------------------------------
removeEventListener(const uno::Reference<lang::XEventListener> & xListener)119*b1cdbd2cSJim Jagielski void SAL_CALL OInstanceLocker::removeEventListener( const uno::Reference< lang::XEventListener >& xListener )
120*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
123*b1cdbd2cSJim Jagielski 	if ( m_pListenersContainer )
124*b1cdbd2cSJim Jagielski 		m_pListenersContainer->removeInterface( xListener );
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski // XInitialization
128*b1cdbd2cSJim Jagielski // --------------------------------------------------------
initialize(const uno::Sequence<uno::Any> & aArguments)129*b1cdbd2cSJim Jagielski void SAL_CALL OInstanceLocker::initialize( const uno::Sequence< uno::Any >& aArguments )
130*b1cdbd2cSJim Jagielski 	throw (uno::Exception, uno::RuntimeException)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	::osl::MutexGuard aGuard( m_aMutex );
133*b1cdbd2cSJim Jagielski 	if ( m_bInitialized )
134*b1cdbd2cSJim Jagielski 		throw frame::DoubleInitializationException();
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 	if ( m_bDisposed )
137*b1cdbd2cSJim Jagielski 		throw lang::DisposedException(); // TODO
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	if ( !m_refCount )
140*b1cdbd2cSJim Jagielski 		throw uno::RuntimeException(); // the object must be refcounted already!
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	uno::Reference< uno::XInterface > xInstance;
143*b1cdbd2cSJim Jagielski 	uno::Reference< embed::XActionsApproval > xApproval;
144*b1cdbd2cSJim Jagielski 	sal_Int32 nModes = 0;
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 	try
147*b1cdbd2cSJim Jagielski 	{
148*b1cdbd2cSJim Jagielski 		sal_Int32 nLen = aArguments.getLength();
149*b1cdbd2cSJim Jagielski 		if ( nLen < 2 || nLen > 3 )
150*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException(
151*b1cdbd2cSJim Jagielski 							::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Wrong count of parameters!" ) ),
152*b1cdbd2cSJim Jagielski 							uno::Reference< uno::XInterface >(),
153*b1cdbd2cSJim Jagielski 							0 );
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 		if ( !( aArguments[0] >>= xInstance ) || !xInstance.is() )
156*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException(
157*b1cdbd2cSJim Jagielski 					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Nonempty reference is expected as the first argument!" ) ),
158*b1cdbd2cSJim Jagielski 					uno::Reference< uno::XInterface >(),
159*b1cdbd2cSJim Jagielski 					0 );
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 		if (
162*b1cdbd2cSJim Jagielski             !( aArguments[1] >>= nModes ) ||
163*b1cdbd2cSJim Jagielski             (
164*b1cdbd2cSJim Jagielski               !( nModes & embed::Actions::PREVENT_CLOSE ) &&
165*b1cdbd2cSJim Jagielski               !( nModes & embed::Actions::PREVENT_TERMINATION )
166*b1cdbd2cSJim Jagielski             )
167*b1cdbd2cSJim Jagielski            )
168*b1cdbd2cSJim Jagielski         {
169*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException(
170*b1cdbd2cSJim Jagielski 					::rtl::OUString(
171*b1cdbd2cSJim Jagielski 							RTL_CONSTASCII_USTRINGPARAM("The correct modes set is expected as the second argument!" ) ),
172*b1cdbd2cSJim Jagielski 					uno::Reference< uno::XInterface >(),
173*b1cdbd2cSJim Jagielski 					0 );
174*b1cdbd2cSJim Jagielski         }
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 		if ( nLen == 3 && !( aArguments[2] >>= xApproval ) )
177*b1cdbd2cSJim Jagielski 			throw lang::IllegalArgumentException(
178*b1cdbd2cSJim Jagielski 					::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("If the third argument is provided, it must be XActionsApproval implementation!" ) ),
179*b1cdbd2cSJim Jagielski 					uno::Reference< uno::XInterface >(),
180*b1cdbd2cSJim Jagielski 					0 );
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski 		m_pLockListener = new OLockListener( uno::Reference< lang::XComponent > ( static_cast< lang::XComponent* >( this ) ),
183*b1cdbd2cSJim Jagielski 											xInstance,
184*b1cdbd2cSJim Jagielski 											nModes,
185*b1cdbd2cSJim Jagielski 											xApproval );
186*b1cdbd2cSJim Jagielski 		m_xLockListener = uno::Reference< uno::XInterface >( static_cast< OWeakObject* >( m_pLockListener ) );
187*b1cdbd2cSJim Jagielski 		m_pLockListener->Init();
188*b1cdbd2cSJim Jagielski 	}
189*b1cdbd2cSJim Jagielski 	catch( uno::Exception& )
190*b1cdbd2cSJim Jagielski 	{
191*b1cdbd2cSJim Jagielski 		dispose();
192*b1cdbd2cSJim Jagielski 		throw;
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	m_bInitialized = sal_True;
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski // XServiceInfo
200*b1cdbd2cSJim Jagielski // --------------------------------------------------------
getImplementationName()201*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL OInstanceLocker::getImplementationName(  )
202*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
203*b1cdbd2cSJim Jagielski {
204*b1cdbd2cSJim Jagielski 	return getImplementationName_static();
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski // --------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)208*b1cdbd2cSJim Jagielski ::sal_Bool SAL_CALL OInstanceLocker::supportsService( const ::rtl::OUString& ServiceName )
209*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
210*b1cdbd2cSJim Jagielski {
211*b1cdbd2cSJim Jagielski 	uno::Sequence< ::rtl::OUString > aSeq = getSupportedServiceNames();
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 	for ( sal_Int32 nInd = 0; nInd < aSeq.getLength(); nInd++ )
214*b1cdbd2cSJim Jagielski     	if ( ServiceName.compareTo( aSeq[nInd] ) == 0 )
215*b1cdbd2cSJim Jagielski         	return sal_True;
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 	return sal_False;
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski // --------------------------------------------------------
getSupportedServiceNames()221*b1cdbd2cSJim Jagielski uno::Sequence< ::rtl::OUString > SAL_CALL OInstanceLocker::getSupportedServiceNames()
222*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski 	return getSupportedServiceNames_static();
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski 
227*b1cdbd2cSJim Jagielski // Static methods
228*b1cdbd2cSJim Jagielski // --------------------------------------------------------
getSupportedServiceNames_static()229*b1cdbd2cSJim Jagielski uno::Sequence< ::rtl::OUString > SAL_CALL OInstanceLocker::getSupportedServiceNames_static()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski     const rtl::OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.embed.InstanceLocker" ) );
232*b1cdbd2cSJim Jagielski     return uno::Sequence< rtl::OUString >( &aServiceName, 1 );
233*b1cdbd2cSJim Jagielski }
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski // --------------------------------------------------------
getImplementationName_static()236*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL OInstanceLocker::getImplementationName_static()
237*b1cdbd2cSJim Jagielski {
238*b1cdbd2cSJim Jagielski     return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.embed.InstanceLocker" ) );
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski // --------------------------------------------------------
Create(const uno::Reference<uno::XComponentContext> & rxContext)242*b1cdbd2cSJim Jagielski uno::Reference< uno::XInterface > SAL_CALL OInstanceLocker::Create(
243*b1cdbd2cSJim Jagielski 								const uno::Reference< uno::XComponentContext >& rxContext )
244*b1cdbd2cSJim Jagielski {
245*b1cdbd2cSJim Jagielski     return static_cast< cppu::OWeakObject * >( new OInstanceLocker( rxContext ) );
246*b1cdbd2cSJim Jagielski }
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski // ====================================================================
251*b1cdbd2cSJim Jagielski // OLockListener
252*b1cdbd2cSJim Jagielski // ====================================================================
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski // --------------------------------------------------------
OLockListener(const uno::WeakReference<lang::XComponent> & xWrapper,const uno::Reference<uno::XInterface> & xInstance,sal_Int32 nMode,const uno::Reference<embed::XActionsApproval> xApproval)255*b1cdbd2cSJim Jagielski OLockListener::OLockListener( const uno::WeakReference< lang::XComponent >& xWrapper,
256*b1cdbd2cSJim Jagielski 					const uno::Reference< uno::XInterface >& xInstance,
257*b1cdbd2cSJim Jagielski 					sal_Int32 nMode,
258*b1cdbd2cSJim Jagielski 					const uno::Reference< embed::XActionsApproval > xApproval )
259*b1cdbd2cSJim Jagielski : m_xInstance( xInstance )
260*b1cdbd2cSJim Jagielski , m_xApproval( xApproval )
261*b1cdbd2cSJim Jagielski , m_xWrapper( xWrapper )
262*b1cdbd2cSJim Jagielski , m_bDisposed( sal_False )
263*b1cdbd2cSJim Jagielski , m_bInitialized( sal_False )
264*b1cdbd2cSJim Jagielski , m_nMode( nMode )
265*b1cdbd2cSJim Jagielski {
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski // --------------------------------------------------------
~OLockListener()269*b1cdbd2cSJim Jagielski OLockListener::~OLockListener()
270*b1cdbd2cSJim Jagielski {
271*b1cdbd2cSJim Jagielski }
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski // --------------------------------------------------------
Dispose()274*b1cdbd2cSJim Jagielski void OLockListener::Dispose()
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski 	if ( m_bDisposed )
279*b1cdbd2cSJim Jagielski 		return;
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	if ( m_nMode & embed::Actions::PREVENT_CLOSE )
282*b1cdbd2cSJim Jagielski 	{
283*b1cdbd2cSJim Jagielski 		try
284*b1cdbd2cSJim Jagielski 		{
285*b1cdbd2cSJim Jagielski 			uno::Reference< util::XCloseBroadcaster > xCloseBroadcaster( m_xInstance, uno::UNO_QUERY );
286*b1cdbd2cSJim Jagielski 			if ( xCloseBroadcaster.is() )
287*b1cdbd2cSJim Jagielski 				xCloseBroadcaster->removeCloseListener( static_cast< util::XCloseListener* >( this ) );
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski 			uno::Reference< util::XCloseable > xCloseable( m_xInstance, uno::UNO_QUERY );
290*b1cdbd2cSJim Jagielski 			if ( xCloseable.is() )
291*b1cdbd2cSJim Jagielski 				xCloseable->close( sal_True );
292*b1cdbd2cSJim Jagielski 		}
293*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
294*b1cdbd2cSJim Jagielski 		{}
295*b1cdbd2cSJim Jagielski 	}
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 	if ( m_nMode & embed::Actions::PREVENT_TERMINATION )
298*b1cdbd2cSJim Jagielski 	{
299*b1cdbd2cSJim Jagielski 		try
300*b1cdbd2cSJim Jagielski 		{
301*b1cdbd2cSJim Jagielski 			uno::Reference< frame::XDesktop > xDesktop( m_xInstance, uno::UNO_QUERY_THROW );
302*b1cdbd2cSJim Jagielski 			xDesktop->removeTerminateListener( static_cast< frame::XTerminateListener* >( this ) );
303*b1cdbd2cSJim Jagielski 		}
304*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
305*b1cdbd2cSJim Jagielski 		{}
306*b1cdbd2cSJim Jagielski 	}
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski 	m_xInstance = uno::Reference< uno::XInterface >();
309*b1cdbd2cSJim Jagielski 	m_bDisposed = sal_True;
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski 
312*b1cdbd2cSJim Jagielski // XEventListener
313*b1cdbd2cSJim Jagielski // --------------------------------------------------------
disposing(const lang::EventObject & aEvent)314*b1cdbd2cSJim Jagielski void SAL_CALL OLockListener::disposing( const lang::EventObject& aEvent )
315*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
318*b1cdbd2cSJim Jagielski 
319*b1cdbd2cSJim Jagielski 	// object is disposed
320*b1cdbd2cSJim Jagielski 	if ( aEvent.Source == m_xInstance )
321*b1cdbd2cSJim Jagielski 	{
322*b1cdbd2cSJim Jagielski 		// the object does not listen for anything any more
323*b1cdbd2cSJim Jagielski 		m_nMode = 0;
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 		// dispose the wrapper;
326*b1cdbd2cSJim Jagielski 		uno::Reference< lang::XComponent > xComponent( m_xWrapper.get(), uno::UNO_QUERY );
327*b1cdbd2cSJim Jagielski 		aGuard.clear();
328*b1cdbd2cSJim Jagielski 		if ( xComponent.is() )
329*b1cdbd2cSJim Jagielski 		{
330*b1cdbd2cSJim Jagielski 			try { xComponent->dispose(); }
331*b1cdbd2cSJim Jagielski 			catch( uno::Exception& ){}
332*b1cdbd2cSJim Jagielski 		}
333*b1cdbd2cSJim Jagielski 	}
334*b1cdbd2cSJim Jagielski }
335*b1cdbd2cSJim Jagielski 
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski // XCloseListener
338*b1cdbd2cSJim Jagielski // --------------------------------------------------------
queryClosing(const lang::EventObject & aEvent,sal_Bool)339*b1cdbd2cSJim Jagielski void SAL_CALL OLockListener::queryClosing( const lang::EventObject& aEvent, sal_Bool )
340*b1cdbd2cSJim Jagielski 	throw (util::CloseVetoException, uno::RuntimeException)
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski 	// GetsOwnership parameter is always ignored, the user of the service must close the object always
343*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
344*b1cdbd2cSJim Jagielski 	if ( !m_bDisposed && aEvent.Source == m_xInstance && ( m_nMode & embed::Actions::PREVENT_CLOSE ) )
345*b1cdbd2cSJim Jagielski 	{
346*b1cdbd2cSJim Jagielski 		try
347*b1cdbd2cSJim Jagielski 		{
348*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XActionsApproval > xApprove = m_xApproval;
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski 			// unlock the mutex here
351*b1cdbd2cSJim Jagielski 			aGuard.clear();
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 			if ( xApprove.is() && xApprove->approveAction( embed::Actions::PREVENT_CLOSE ) )
354*b1cdbd2cSJim Jagielski 				throw util::CloseVetoException();
355*b1cdbd2cSJim Jagielski 		}
356*b1cdbd2cSJim Jagielski 		catch( util::CloseVetoException& )
357*b1cdbd2cSJim Jagielski 		{
358*b1cdbd2cSJim Jagielski 			// rethrow this exception
359*b1cdbd2cSJim Jagielski 			throw;
360*b1cdbd2cSJim Jagielski 		}
361*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
362*b1cdbd2cSJim Jagielski 		{
363*b1cdbd2cSJim Jagielski 			// no action should be done
364*b1cdbd2cSJim Jagielski 		}
365*b1cdbd2cSJim Jagielski 	}
366*b1cdbd2cSJim Jagielski }
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski // --------------------------------------------------------
notifyClosing(const lang::EventObject & aEvent)369*b1cdbd2cSJim Jagielski void SAL_CALL OLockListener::notifyClosing( const lang::EventObject& aEvent )
370*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
371*b1cdbd2cSJim Jagielski {
372*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 	// object is closed, no reason to listen
375*b1cdbd2cSJim Jagielski 	if ( aEvent.Source == m_xInstance )
376*b1cdbd2cSJim Jagielski 	{
377*b1cdbd2cSJim Jagielski 		uno::Reference< util::XCloseBroadcaster > xCloseBroadcaster( aEvent.Source, uno::UNO_QUERY );
378*b1cdbd2cSJim Jagielski 		if ( xCloseBroadcaster.is() )
379*b1cdbd2cSJim Jagielski 		{
380*b1cdbd2cSJim Jagielski 			xCloseBroadcaster->removeCloseListener( static_cast< util::XCloseListener* >( this ) );
381*b1cdbd2cSJim Jagielski 			m_nMode &= ~embed::Actions::PREVENT_CLOSE;
382*b1cdbd2cSJim Jagielski 			if ( !m_nMode )
383*b1cdbd2cSJim Jagielski 			{
384*b1cdbd2cSJim Jagielski 				// dispose the wrapper;
385*b1cdbd2cSJim Jagielski 				uno::Reference< lang::XComponent > xComponent( m_xWrapper.get(), uno::UNO_QUERY );
386*b1cdbd2cSJim Jagielski 				aGuard.clear();
387*b1cdbd2cSJim Jagielski 				if ( xComponent.is() )
388*b1cdbd2cSJim Jagielski 				{
389*b1cdbd2cSJim Jagielski 					try { xComponent->dispose(); }
390*b1cdbd2cSJim Jagielski 					catch( uno::Exception& ){}
391*b1cdbd2cSJim Jagielski 				}
392*b1cdbd2cSJim Jagielski 			}
393*b1cdbd2cSJim Jagielski 		}
394*b1cdbd2cSJim Jagielski 	}
395*b1cdbd2cSJim Jagielski }
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 
398*b1cdbd2cSJim Jagielski // XTerminateListener
399*b1cdbd2cSJim Jagielski // --------------------------------------------------------
queryTermination(const lang::EventObject & aEvent)400*b1cdbd2cSJim Jagielski void SAL_CALL OLockListener::queryTermination( const lang::EventObject& aEvent )
401*b1cdbd2cSJim Jagielski 	throw (frame::TerminationVetoException, uno::RuntimeException)
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
404*b1cdbd2cSJim Jagielski 	if ( aEvent.Source == m_xInstance && ( m_nMode & embed::Actions::PREVENT_TERMINATION ) )
405*b1cdbd2cSJim Jagielski 	{
406*b1cdbd2cSJim Jagielski 		try
407*b1cdbd2cSJim Jagielski 		{
408*b1cdbd2cSJim Jagielski 			uno::Reference< embed::XActionsApproval > xApprove = m_xApproval;
409*b1cdbd2cSJim Jagielski 
410*b1cdbd2cSJim Jagielski 			// unlock the mutex here
411*b1cdbd2cSJim Jagielski 			aGuard.clear();
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski 			if ( xApprove.is() && xApprove->approveAction( embed::Actions::PREVENT_TERMINATION ) )
414*b1cdbd2cSJim Jagielski 				throw frame::TerminationVetoException();
415*b1cdbd2cSJim Jagielski 		}
416*b1cdbd2cSJim Jagielski 		catch( frame::TerminationVetoException& )
417*b1cdbd2cSJim Jagielski 		{
418*b1cdbd2cSJim Jagielski 			// rethrow this exception
419*b1cdbd2cSJim Jagielski 			throw;
420*b1cdbd2cSJim Jagielski 		}
421*b1cdbd2cSJim Jagielski 		catch( uno::Exception& )
422*b1cdbd2cSJim Jagielski 		{
423*b1cdbd2cSJim Jagielski 			// no action should be done
424*b1cdbd2cSJim Jagielski 		}
425*b1cdbd2cSJim Jagielski 	}
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski // --------------------------------------------------------
notifyTermination(const lang::EventObject & aEvent)429*b1cdbd2cSJim Jagielski void SAL_CALL OLockListener::notifyTermination( const lang::EventObject& aEvent )
430*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
433*b1cdbd2cSJim Jagielski 
434*b1cdbd2cSJim Jagielski 	// object is terminated, no reason to listen
435*b1cdbd2cSJim Jagielski 	if ( aEvent.Source == m_xInstance )
436*b1cdbd2cSJim Jagielski 	{
437*b1cdbd2cSJim Jagielski 		uno::Reference< frame::XDesktop > xDesktop( aEvent.Source, uno::UNO_QUERY );
438*b1cdbd2cSJim Jagielski 		if ( xDesktop.is() )
439*b1cdbd2cSJim Jagielski 		{
440*b1cdbd2cSJim Jagielski 			try
441*b1cdbd2cSJim Jagielski 			{
442*b1cdbd2cSJim Jagielski 				xDesktop->removeTerminateListener( static_cast< frame::XTerminateListener* >( this ) );
443*b1cdbd2cSJim Jagielski 				m_nMode &= ~embed::Actions::PREVENT_TERMINATION;
444*b1cdbd2cSJim Jagielski 				if ( !m_nMode )
445*b1cdbd2cSJim Jagielski 				{
446*b1cdbd2cSJim Jagielski 					// dispose the wrapper;
447*b1cdbd2cSJim Jagielski 					uno::Reference< lang::XComponent > xComponent( m_xWrapper.get(), uno::UNO_QUERY );
448*b1cdbd2cSJim Jagielski 					aGuard.clear();
449*b1cdbd2cSJim Jagielski 					if ( xComponent.is() )
450*b1cdbd2cSJim Jagielski 					{
451*b1cdbd2cSJim Jagielski 						try { xComponent->dispose(); }
452*b1cdbd2cSJim Jagielski 						catch( uno::Exception& ){}
453*b1cdbd2cSJim Jagielski 					}
454*b1cdbd2cSJim Jagielski 				}
455*b1cdbd2cSJim Jagielski 			}
456*b1cdbd2cSJim Jagielski 			catch( uno::Exception& )
457*b1cdbd2cSJim Jagielski 			{}
458*b1cdbd2cSJim Jagielski 		}
459*b1cdbd2cSJim Jagielski 	}
460*b1cdbd2cSJim Jagielski }
461*b1cdbd2cSJim Jagielski 
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski // XInitialization
464*b1cdbd2cSJim Jagielski // --------------------------------------------------------
Init()465*b1cdbd2cSJim Jagielski sal_Bool OLockListener::Init()
466*b1cdbd2cSJim Jagielski {
467*b1cdbd2cSJim Jagielski 	::osl::ResettableMutexGuard aGuard( m_aMutex );
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 	if ( m_bDisposed || m_bInitialized )
470*b1cdbd2cSJim Jagielski 		return sal_False;
471*b1cdbd2cSJim Jagielski 
472*b1cdbd2cSJim Jagielski 	try
473*b1cdbd2cSJim Jagielski 	{
474*b1cdbd2cSJim Jagielski 		if ( m_nMode & embed::Actions::PREVENT_CLOSE )
475*b1cdbd2cSJim Jagielski 		{
476*b1cdbd2cSJim Jagielski 			uno::Reference< util::XCloseBroadcaster > xCloseBroadcaster( m_xInstance, uno::UNO_QUERY_THROW );
477*b1cdbd2cSJim Jagielski 			xCloseBroadcaster->addCloseListener( static_cast< util::XCloseListener* >( this ) );
478*b1cdbd2cSJim Jagielski 		}
479*b1cdbd2cSJim Jagielski 
480*b1cdbd2cSJim Jagielski 		if ( m_nMode & embed::Actions::PREVENT_TERMINATION )
481*b1cdbd2cSJim Jagielski 		{
482*b1cdbd2cSJim Jagielski 			uno::Reference< frame::XDesktop > xDesktop( m_xInstance, uno::UNO_QUERY_THROW );
483*b1cdbd2cSJim Jagielski 			xDesktop->addTerminateListener( static_cast< frame::XTerminateListener* >( this ) );
484*b1cdbd2cSJim Jagielski 		}
485*b1cdbd2cSJim Jagielski 	}
486*b1cdbd2cSJim Jagielski 	catch( uno::Exception& )
487*b1cdbd2cSJim Jagielski 	{
488*b1cdbd2cSJim Jagielski 		// dispose the wrapper;
489*b1cdbd2cSJim Jagielski 		uno::Reference< lang::XComponent > xComponent( m_xWrapper.get(), uno::UNO_QUERY );
490*b1cdbd2cSJim Jagielski 		aGuard.clear();
491*b1cdbd2cSJim Jagielski 		if ( xComponent.is() )
492*b1cdbd2cSJim Jagielski 		{
493*b1cdbd2cSJim Jagielski 			try { xComponent->dispose(); }
494*b1cdbd2cSJim Jagielski 			catch( uno::Exception& ){}
495*b1cdbd2cSJim Jagielski 		}
496*b1cdbd2cSJim Jagielski 
497*b1cdbd2cSJim Jagielski 		throw;
498*b1cdbd2cSJim Jagielski 	}
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski 	m_bInitialized = sal_True;
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 	return sal_True;
503*b1cdbd2cSJim Jagielski }
504*b1cdbd2cSJim Jagielski 
createRegistryInfo_OInstanceLocker()505*b1cdbd2cSJim Jagielski void createRegistryInfo_OInstanceLocker()
506*b1cdbd2cSJim Jagielski {
507*b1cdbd2cSJim Jagielski     static ::comphelper::module::OAutoRegistration< OInstanceLocker > aAutoRegistration;
508*b1cdbd2cSJim Jagielski }
509