summaryrefslogtreecommitdiff
path: root/unotools
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2011-10-31 21:18:24 +0100
committerMichael Stahl <mstahl@redhat.com>2011-10-31 21:18:24 +0100
commit7edb1da8c566c8c17b6bf9dd4f88101c14a07df8 (patch)
tree8cd098bc13c07811e17af668652fa5efc7c546e6 /unotools
parent17f1adc78adf3b8b943dc36882855b901259d4c1 (diff)
move CloseVeto from dbaccess to unotools
Diffstat (limited to 'unotools')
-rw-r--r--unotools/Library_utl.mk1
-rw-r--r--unotools/Package_inc.mk1
-rw-r--r--unotools/inc/unotools/closeveto.hxx70
-rw-r--r--unotools/source/misc/closeveto.cxx183
4 files changed, 255 insertions, 0 deletions
diff --git a/unotools/Library_utl.mk b/unotools/Library_utl.mk
index 9d9770849546..3937493899d5 100644
--- a/unotools/Library_utl.mk
+++ b/unotools/Library_utl.mk
@@ -131,6 +131,7 @@ $(eval $(call gb_Library_add_exception_objects,utl,\
unotools/source/i18n/textsearch \
unotools/source/i18n/transliterationwrapper \
unotools/source/misc/atom \
+ unotools/source/misc/closeveto \
unotools/source/misc/componentresmodule \
unotools/source/misc/datetime \
unotools/source/misc/desktopterminationobserver \
diff --git a/unotools/Package_inc.mk b/unotools/Package_inc.mk
index d1e177ddaa43..2c62667b8d74 100644
--- a/unotools/Package_inc.mk
+++ b/unotools/Package_inc.mk
@@ -37,6 +37,7 @@ $(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/cacheoptions.hxx,uno
$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/calendarwrapper.hxx,unotools/calendarwrapper.hxx))
$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/caserotate.hxx,unotools/caserotate.hxx))
$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/charclass.hxx,unotools/charclass.hxx))
+$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/closeveto.hxx,unotools/closeveto.hxx))
$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/cmdoptions.hxx,unotools/cmdoptions.hxx))
$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/collatorwrapper.hxx,unotools/collatorwrapper.hxx))
$(eval $(call gb_Package_add_file,unotools_inc,inc/unotools/compatibility.hxx,unotools/compatibility.hxx))
diff --git a/unotools/inc/unotools/closeveto.hxx b/unotools/inc/unotools/closeveto.hxx
new file mode 100644
index 000000000000..1fddd439ca04
--- /dev/null
+++ b/unotools/inc/unotools/closeveto.hxx
@@ -0,0 +1,70 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef UNOTOOLS_CLOSEVETO_HXX
+#define UNOTOOLS_CLOSEVETO_HXX
+
+#include "unotools/unotoolsdllapi.h"
+
+/** === begin UNO includes === **/
+#include <com/sun/star/uno/XInterface.hpp>
+/** === end UNO includes === **/
+
+#include <boost/scoped_ptr.hpp>
+
+//......................................................................................................................
+namespace utl
+{
+//......................................................................................................................
+
+ //==================================================================================================================
+ //= CloseVeto
+ //==================================================================================================================
+ struct CloseVeto_Data;
+ /** will add a XCloseListener to a given component, and veto its closing as long as the <code>CloseVeto</code>
+ instance is alive.
+
+ If closing has been requested and vetoed while the <code>CloseVeto</code> instance is alive, and the ownership
+ went to the <code>CloseVeto</code> instance, then it will close the component in its dtor.
+ */
+ class UNOTOOLS_DLLPUBLIC CloseVeto
+ {
+ public:
+ CloseVeto( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_closeable );
+ ~CloseVeto();
+
+ private:
+ ::boost::scoped_ptr< CloseVeto_Data > m_pData;
+ };
+
+//......................................................................................................................
+} // namespace dbaui
+//......................................................................................................................
+
+#endif // UNOTOOLS_CLOSEVETO_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/unotools/source/misc/closeveto.cxx b/unotools/source/misc/closeveto.cxx
new file mode 100644
index 000000000000..7a61a891fbd5
--- /dev/null
+++ b/unotools/source/misc/closeveto.cxx
@@ -0,0 +1,183 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_unotools.hxx"
+
+#include <unotools/closeveto.hxx>
+
+/** === begin UNO includes === **/
+#include <com/sun/star/util/XCloseable.hpp>
+/** === end UNO includes === **/
+
+#include <cppuhelper/implbase1.hxx>
+#include <rtl/ref.hxx>
+#include <tools/diagnose_ex.h>
+
+//......................................................................................................................
+namespace utl
+{
+//......................................................................................................................
+
+ /** === begin UNO using === **/
+ using ::com::sun::star::uno::Reference;
+ using ::com::sun::star::uno::XInterface;
+ using ::com::sun::star::uno::UNO_QUERY;
+ using ::com::sun::star::uno::UNO_QUERY_THROW;
+ using ::com::sun::star::uno::UNO_SET_THROW;
+ using ::com::sun::star::uno::Exception;
+ using ::com::sun::star::uno::RuntimeException;
+ using ::com::sun::star::uno::Any;
+ using ::com::sun::star::uno::makeAny;
+ using ::com::sun::star::uno::Sequence;
+ using ::com::sun::star::uno::Type;
+ using ::com::sun::star::util::XCloseable;
+ using ::com::sun::star::util::XCloseListener;
+ using ::com::sun::star::util::CloseVetoException;
+ using ::com::sun::star::lang::EventObject;
+ /** === end UNO using === **/
+
+ //==================================================================================================================
+ //= CloseListener_Impl
+ //==================================================================================================================
+ typedef ::cppu::WeakImplHelper1 < XCloseListener
+ > CloseListener_Base;
+ class SAL_DLLPRIVATE CloseListener_Impl : public CloseListener_Base
+ {
+ public:
+ CloseListener_Impl()
+ :m_bHasOwnership( false )
+ {
+ }
+
+ // XCloseListener
+ virtual void SAL_CALL queryClosing( const EventObject& Source, ::sal_Bool GetsOwnership ) throw (CloseVetoException, RuntimeException);
+ virtual void SAL_CALL notifyClosing( const EventObject& Source ) throw (RuntimeException);
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const EventObject& Source) throw (RuntimeException);
+
+ bool hasOwnership() const { return m_bHasOwnership; }
+
+ protected:
+ ~CloseListener_Impl()
+ {
+ }
+
+ private:
+ bool m_bHasOwnership;
+ };
+
+ //------------------------------------------------------------------------------------------------------------------
+ void SAL_CALL CloseListener_Impl::queryClosing( const EventObject& i_source, ::sal_Bool i_deliverOwnership ) throw (CloseVetoException, RuntimeException)
+ {
+ (void)i_source;
+
+ if ( !m_bHasOwnership )
+ m_bHasOwnership = i_deliverOwnership;
+
+ throw CloseVetoException();
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ void SAL_CALL CloseListener_Impl::notifyClosing( const EventObject& i_source ) throw (RuntimeException)
+ {
+ (void)i_source;
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ void SAL_CALL CloseListener_Impl::disposing( const EventObject& i_source ) throw (RuntimeException)
+ {
+ (void)i_source;
+ }
+
+ //==================================================================================================================
+ //= CloseVeto_Data
+ //==================================================================================================================
+ struct SAL_DLLPRIVATE CloseVeto_Data
+ {
+ Reference< XCloseable > xCloseable;
+ ::rtl::Reference< CloseListener_Impl > pListener;
+ };
+
+ //==================================================================================================================
+ //= operations
+ //==================================================================================================================
+ namespace
+ {
+ //--------------------------------------------------------------------------------------------------------------
+ void lcl_init( CloseVeto_Data& i_data, const Reference< XInterface >& i_closeable )
+ {
+ i_data.xCloseable.set( i_closeable, UNO_QUERY );
+ ENSURE_OR_RETURN_VOID( i_data.xCloseable.is(), "CloseVeto: the component is not closeable!" );
+
+ i_data.pListener = new CloseListener_Impl;
+ i_data.xCloseable->addCloseListener( i_data.pListener.get() );
+ }
+
+ //--------------------------------------------------------------------------------------------------------------
+ void lcl_deinit( CloseVeto_Data& i_data )
+ {
+ if ( !i_data.xCloseable.is() )
+ return;
+
+ i_data.xCloseable->removeCloseListener( i_data.pListener.get() );
+ if ( i_data.pListener->hasOwnership() )
+ {
+ try
+ {
+ i_data.xCloseable->close( sal_True );
+ }
+ catch( const CloseVetoException& ) { }
+ catch( const Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION();
+ }
+ }
+ }
+ }
+
+ //==================================================================================================================
+ //= CloseVeto
+ //==================================================================================================================
+ //------------------------------------------------------------------------------------------------------------------
+ CloseVeto::CloseVeto( const Reference< XInterface >& i_closeable )
+ :m_pData( new CloseVeto_Data )
+ {
+ lcl_init( *m_pData, i_closeable );
+ }
+
+ //------------------------------------------------------------------------------------------------------------------
+ CloseVeto::~CloseVeto()
+ {
+ lcl_deinit( *m_pData );
+ }
+
+//......................................................................................................................
+} // namespace utl
+//......................................................................................................................
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */