summaryrefslogtreecommitdiff
path: root/comphelper
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2011-05-10 16:10:42 +0100
committerCaolán McNamara <caolanm@redhat.com>2011-05-20 15:23:38 +0100
commit071d42a6434027c783cd6d1cc947e6406a91964d (patch)
treebf7869eedf37dc7bce70f6f75b3d74a7169aabe5 /comphelper
parent38365b338ef1130fcaf761cd0ea92877193951df (diff)
config leaks: add a template to handle tricky globals
Diffstat (limited to 'comphelper')
-rw-r--r--comphelper/Package_inc.mk1
-rw-r--r--comphelper/inc/comphelper/scoped_disposing_ptr.hxx126
2 files changed, 127 insertions, 0 deletions
diff --git a/comphelper/Package_inc.mk b/comphelper/Package_inc.mk
index fb6538e4700c..a02bde6b7475 100644
--- a/comphelper/Package_inc.mk
+++ b/comphelper/Package_inc.mk
@@ -38,6 +38,7 @@ $(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/stillreadwritein
$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/anycompare.hxx,comphelper/anycompare.hxx))
$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/propagg.hxx,comphelper/propagg.hxx))
$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/scopeguard.hxx,comphelper/scopeguard.hxx))
+$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/scoped_disposing_ptr.hxx,comphelper/scoped_disposing_ptr.hxx))
$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/asyncnotification.hxx,comphelper/asyncnotification.hxx))
$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/namedvaluecollection.hxx,comphelper/namedvaluecollection.hxx))
$(eval $(call gb_Package_add_file,comphelper_inc,inc/comphelper/composedprops.hxx,comphelper/composedprops.hxx))
diff --git a/comphelper/inc/comphelper/scoped_disposing_ptr.hxx b/comphelper/inc/comphelper/scoped_disposing_ptr.hxx
new file mode 100644
index 000000000000..5e63f1db6cfa
--- /dev/null
+++ b/comphelper/inc/comphelper/scoped_disposing_ptr.hxx
@@ -0,0 +1,126 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * Version: MPL 1.1 / GPLv3+ / LGPLv3+
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Initial Developer of the Original Code is
+ * Caolán McNamara <caolanm@redhat.com> (Red Hat, Inc.)
+ * Portions created by the Initial Developer are Copyright (C) 2011 the
+ * Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s): Caolán McNamara <caolanm@redhat.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
+ * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
+ * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
+ * instead of those above.
+ */
+#ifndef _SCOPED_DISPOSING_PTR
+#define _SCOPED_DISPOSING_PTR
+
+#include <cppuhelper/implbase1.hxx>
+#include <boost/utility.hpp>
+#include <boost/scoped_ptr.hpp>
+
+#include <com/sun/star/lang/XComponent.hpp>
+
+#include <stdio.h>
+
+namespace comphelper
+{
+//Similar to boost::scoped_ptr, except additionally releases the ptr on rComponent::disposing
+template<class T> class scoped_disposing_ptr : private boost::noncopyable
+{
+private:
+ boost::scoped_ptr<T> m_aItem;
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener> m_xDisposingListener;
+public:
+ scoped_disposing_ptr( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > &rComponent, T * p = 0 )
+ : m_aItem(p)
+ {
+ m_xDisposingListener = new DisposingListener(rComponent, m_aItem);
+ }
+
+ void reset(T * p = 0)
+ {
+ m_aItem.reset(p);
+ }
+
+ T & operator*() const
+ {
+ return *m_aItem;
+ }
+
+ T * get() const
+ {
+ return m_aItem.get();
+ }
+
+ T * operator->() const
+ {
+ return m_aItem.get();
+ }
+
+ operator bool () const
+ {
+ return m_aItem;
+ }
+
+ virtual ~scoped_disposing_ptr()
+ {
+ reset();
+ }
+private:
+ class DisposingListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
+ {
+ private:
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > m_xComponent;
+ boost::scoped_ptr<T>& m_rItem;
+ public:
+ DisposingListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XComponent > &rComponent,
+ boost::scoped_ptr<T>& rItem) : m_xComponent(rComponent), m_rItem(rItem)
+ {
+ if (m_xComponent.is())
+ m_xComponent->addEventListener( this );
+ }
+
+ ~DisposingListener()
+ {
+ if ( m_xComponent.is() )
+ m_xComponent->removeEventListener( this );
+ }
+
+ private:
+ // XEventListener
+ virtual void SAL_CALL disposing( ::com::sun::star::lang::EventObject const & rEvt )
+ throw (::com::sun::star::uno::RuntimeException)
+ {
+ bool shutDown = (rEvt.Source == m_xComponent);
+
+ if ( shutDown && m_xComponent.is() )
+ {
+ m_xComponent->removeEventListener( this );
+ m_xComponent.clear();
+ }
+
+ if ( shutDown )
+ m_rItem.reset();
+ }
+ };
+};
+
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */