1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 #ifndef __INSTANCELOCKER_HXX_ 29 #define __INSTANCELOCKER_HXX_ 30 31 #include <com/sun/star/uno/XComponentContext.hpp> 32 #include <com/sun/star/lang/XComponent.hpp> 33 #include <com/sun/star/util/XCloseListener.hpp> 34 #include <com/sun/star/frame/XTerminateListener.hpp> 35 #include <com/sun/star/lang/XInitialization.hpp> 36 #include <com/sun/star/lang/XServiceInfo.hpp> 37 #include <com/sun/star/embed/XActionsApproval.hpp> 38 #include <com/sun/star/embed/Actions.hpp> 39 #include <cppuhelper/weakref.hxx> 40 #include <osl/mutex.hxx> 41 #include <cppuhelper/implbase3.hxx> 42 #include <cppuhelper/implbase2.hxx> 43 #include <cppuhelper/interfacecontainer.h> 44 45 46 class OLockListener; 47 48 // the service is implemented as a wrapper to be able to die by refcount 49 // the disposing mechanics is required for java related scenarios 50 class OInstanceLocker : public ::cppu::WeakImplHelper3< ::com::sun::star::lang::XComponent, 51 ::com::sun::star::lang::XInitialization, 52 ::com::sun::star::lang::XServiceInfo > 53 { 54 ::osl::Mutex m_aMutex; 55 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > m_xContext; 56 57 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xLockListener; 58 OLockListener* m_pLockListener; 59 60 ::cppu::OInterfaceContainerHelper* m_pListenersContainer; // list of listeners 61 62 sal_Bool m_bDisposed; 63 sal_Bool m_bInitialized; 64 65 public: 66 OInstanceLocker( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& xContext ); 67 ~OInstanceLocker(); 68 69 static ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL 70 getSupportedServiceNames_static(); 71 72 static ::rtl::OUString SAL_CALL getImplementationName_static(); 73 74 static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL 75 Create( 76 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext >& rxContext ); 77 78 // XComponent 79 virtual void SAL_CALL dispose() throw (::com::sun::star::uno::RuntimeException); 80 virtual void SAL_CALL addEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& xListener ) throw (::com::sun::star::uno::RuntimeException); 81 virtual void SAL_CALL removeEventListener( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener ) throw (::com::sun::star::uno::RuntimeException); 82 83 // XInitialization 84 virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aArguments ) throw (::com::sun::star::uno::Exception, ::com::sun::star::uno::RuntimeException); 85 86 // XServiceInfo 87 virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (::com::sun::star::uno::RuntimeException); 88 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (::com::sun::star::uno::RuntimeException); 89 virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (::com::sun::star::uno::RuntimeException); 90 91 }; 92 93 94 class OLockListener : public ::cppu::WeakImplHelper2< ::com::sun::star::util::XCloseListener, 95 ::com::sun::star::frame::XTerminateListener > 96 { 97 ::osl::Mutex m_aMutex; 98 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > m_xInstance; 99 ::com::sun::star::uno::Reference< ::com::sun::star::embed::XActionsApproval > m_xApproval; 100 101 ::com::sun::star::uno::WeakReference< ::com::sun::star::lang::XComponent > m_xWrapper; 102 103 sal_Bool m_bDisposed; 104 sal_Bool m_bInitialized; 105 106 sal_Int32 m_nMode; 107 108 public: 109 OLockListener( const ::com::sun::star::uno::WeakReference< ::com::sun::star::lang::XComponent >& xWrapper, 110 const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xInstance, 111 sal_Int32 nMode, 112 const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XActionsApproval > xApproval ); 113 114 ~OLockListener(); 115 116 sal_Bool Init(); 117 void Dispose(); 118 119 // XEventListener 120 virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); 121 122 // XCloseListener 123 virtual void SAL_CALL queryClosing( const ::com::sun::star::lang::EventObject& Source, sal_Bool GetsOwnership ) throw (::com::sun::star::util::CloseVetoException, ::com::sun::star::uno::RuntimeException); 124 virtual void SAL_CALL notifyClosing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException); 125 126 // XTerminateListener 127 virtual void SAL_CALL queryTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::frame::TerminationVetoException, ::com::sun::star::uno::RuntimeException); 128 virtual void SAL_CALL notifyTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::uno::RuntimeException); 129 130 }; 131 132 #endif 133 134