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