X-Git-Url: https://vaikene.ee/gitweb/pswgen09.html?a=blobdiff_plain;f=src%2Flibs%2FCommon%2Fregistry.cpp;h=c3bc2bef251e08c2d0a96a891d845d50fa0ec1a1;hb=4c0329c5c2690bde28212c89029015a5da4c7e34;hp=661d2c7d6717d2ad9bd1f43768a3679fb38b96d3;hpb=8e0779e2e5a9f947f79c28e2ff121f6ffdd78b3f;p=evaf diff --git a/src/libs/Common/registry.cpp b/src/libs/Common/registry.cpp index 661d2c7..c3bc2be 100644 --- a/src/libs/Common/registry.cpp +++ b/src/libs/Common/registry.cpp @@ -3,7 +3,7 @@ * @brief Common registry implementation * @author Enar Vaikene * - * Copyright (c) 2011 Enar Vaikene + * Copyright (c) 2011-2019 Enar Vaikene * * This file is part of the eVaf C++ cross-platform application development framework. * @@ -54,13 +54,32 @@ Registry::~Registry() bool Registry::registerInterface(QString const & name, QObject * obj) { - mInterfaces.insert(name, QWeakPointer(obj)); + // Add the interface to the list of registered interfaces and connect to + // the destroyed() signal. + mInterfaces.insert(name, obj); + connect(obj, SIGNAL(destroyed(QObject *)), this, SLOT(interfaceDestroyed(QObject *))); return true; } QObject * Registry::queryInterface(QString const & name) const { - QHash >::const_iterator it = mInterfaces.constFind(name); - return it != mInterfaces.constEnd() ? (*it).data() : 0; + Interfaces::const_iterator it = mInterfaces.constFind(name); + return it != mInterfaces.constEnd() ? *it : nullptr; +} + +void Registry::interfaceDestroyed(QObject * obj) +{ + // Interface object destroyed. Remove it from the list of registered + // interfaces. + Interfaces::iterator it = mInterfaces.begin(); + Interfaces::const_iterator e = mInterfaces.end(); + while (it != e) { + if (*it == obj) { + it = mInterfaces.erase(it); + } + else { + ++it; + } + } }