diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2010-01-15 00:44:58 (GMT) |
---|---|---|
committer | Michael Brasser <michael.brasser@nokia.com> | 2010-01-15 00:46:42 (GMT) |
commit | 18a5a096c9020c7b1b10b82009c912b4b97335a3 (patch) | |
tree | 60123844147877907e714bc310aa8bbe9b7cd0d2 | |
parent | 277f133520b1c62d939223b856cc2291ce8fa5f0 (diff) | |
download | Qt-18a5a096c9020c7b1b10b82009c912b4b97335a3.zip Qt-18a5a096c9020c7b1b10b82009c912b4b97335a3.tar.gz Qt-18a5a096c9020c7b1b10b82009c912b4b97335a3.tar.bz2 |
QmlGuard the list of objects in a Package.
Don't crash if those objects are deleted before the Package.
-rw-r--r-- | src/declarative/util/qmlpackage.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/declarative/util/qmlpackage.cpp b/src/declarative/util/qmlpackage.cpp index f9238ca..3214dc8 100644 --- a/src/declarative/util/qmlpackage.cpp +++ b/src/declarative/util/qmlpackage.cpp @@ -42,6 +42,7 @@ #include "qmlpackage_p.h" #include <private/qobject_p.h> +#include "private/qmlguard_p.h" QT_BEGIN_NAMESPACE @@ -50,7 +51,28 @@ class QmlPackagePrivate : public QObjectPrivate public: QmlPackagePrivate() {} - QmlConcreteList<QObject *> dataList; + class DataList; + struct DataGuard : public QmlGuard<QObject> + { + DataGuard(QObject *obj, DataList *l) : list(l) { (QmlGuard<QObject>&)*this = obj; } + DataList *list; + void objectDestroyed(QObject *) { + // we assume priv will always be destroyed after objectDestroyed calls + list->removeOne(*this); + } + }; + + class DataList : public QList<DataGuard>, public QmlList<QObject*> + { + public: + virtual void append(QObject* v) { QList<DataGuard>::append(DataGuard(v, this)); } + virtual void insert(int i, QObject* v) { QList<DataGuard>::insert(i, DataGuard(v, this)); } + virtual void clear() { QList<DataGuard>::clear(); } + virtual QObject* at(int i) const { return QList<DataGuard>::at(i); } + virtual void removeAt(int i) { QList<DataGuard>::removeAt(i); } + virtual int count() const { return QList<DataGuard>::count(); } + }; + DataList dataList; }; class QmlPackageAttached : public QObject |