diff options
Diffstat (limited to 'src/corelib/kernel/qobjectcleanuphandler.cpp')
-rw-r--r-- | src/corelib/kernel/qobjectcleanuphandler.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/src/corelib/kernel/qobjectcleanuphandler.cpp b/src/corelib/kernel/qobjectcleanuphandler.cpp new file mode 100644 index 0000000..d2241ad --- /dev/null +++ b/src/corelib/kernel/qobjectcleanuphandler.cpp @@ -0,0 +1,148 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the QtCore module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qobjectcleanuphandler.h" + +QT_BEGIN_NAMESPACE + +/*! + \class QObjectCleanupHandler + \brief The QObjectCleanupHandler class watches the lifetime of multiple QObjects. + + \ingroup objectmodel + + A QObjectCleanupHandler is useful whenever you need to know when a + number of \l{QObject}s that are owned by someone else have been + deleted. This is important, for example, when referencing memory + in an application that has been allocated in a shared library. + + To keep track of some \l{QObject}s, create a + QObjectCleanupHandler, and add() the objects you are interested + in. If you are no longer interested in tracking a particular + object, use remove() to remove it from the cleanup handler. If an + object being tracked by the cleanup handler gets deleted by + someone else it will automatically be removed from the cleanup + handler. You can delete all the objects in the cleanup handler + with clear(), or by destroying the cleanup handler. isEmpty() + returns true if the QObjectCleanupHandler has no objects to keep + track of. + + \sa QPointer +*/ + +/*! + Constructs an empty QObjectCleanupHandler. +*/ +QObjectCleanupHandler::QObjectCleanupHandler() +{ +} + +/*! + Destroys the cleanup handler. All objects in this cleanup handler + will be deleted. + + \sa clear() +*/ +QObjectCleanupHandler::~QObjectCleanupHandler() +{ + clear(); +} + +/*! + Adds \a object to this cleanup handler and returns the pointer to + the object. + + \sa remove() +*/ +QObject *QObjectCleanupHandler::add(QObject* object) +{ + if (!object) + return 0; + + connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*))); + cleanupObjects.insert(0, object); + return object; +} + +/*! + Removes the \a object from this cleanup handler. The object will + not be destroyed. + + \sa add() +*/ +void QObjectCleanupHandler::remove(QObject *object) +{ + int index; + if ((index = cleanupObjects.indexOf(object)) != -1) { + cleanupObjects.removeAt(index); + disconnect(object, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*))); + } +} + +/*! + Returns true if this cleanup handler is empty or if all objects in + this cleanup handler have been destroyed; otherwise return false. + + \sa add() remove() clear() +*/ +bool QObjectCleanupHandler::isEmpty() const +{ + return cleanupObjects.isEmpty(); +} + +/*! + Deletes all objects in this cleanup handler. The cleanup handler + becomes empty. + + \sa isEmpty() +*/ +void QObjectCleanupHandler::clear() +{ + while (!cleanupObjects.isEmpty()) + delete cleanupObjects.takeFirst(); +} + +void QObjectCleanupHandler::objectDestroyed(QObject *object) +{ + remove(object); +} + +QT_END_NAMESPACE |