From 228b922d3e41f419d891b0dee391e75b5b487e77 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Mon, 30 Sep 2024 10:49:49 +0200 Subject: [PATCH] Fix crash at exit: Do not use QSharedPointer on object managed by GUI. Use Proxies to propagate list. --- Linphone/core/search/MagicSearchList.cpp | 8 +--- Linphone/core/search/MagicSearchList.hpp | 1 - Linphone/core/search/MagicSearchProxy.cpp | 38 ++++++++++--------- Linphone/core/search/MagicSearchProxy.hpp | 7 +++- .../Display/Contact/ContactListView.qml | 4 +- .../view/Page/Main/Contact/ContactPage.qml | 6 +-- 6 files changed, 31 insertions(+), 33 deletions(-) diff --git a/Linphone/core/search/MagicSearchList.cpp b/Linphone/core/search/MagicSearchList.cpp index 186ea1a6..18690aca 100644 --- a/Linphone/core/search/MagicSearchList.cpp +++ b/Linphone/core/search/MagicSearchList.cpp @@ -37,13 +37,6 @@ QSharedPointer MagicSearchList::create() { return model; } -QSharedPointer MagicSearchList::create(MagicSearchList *magicSearchList) { - auto model = QSharedPointer(magicSearchList, &QObject::deleteLater); - model->moveToThread(App::getInstance()->thread()); - model->setSelf(model); - return model; -} - MagicSearchList::MagicSearchList(QObject *parent) : ListProxy(parent) { mustBeInMainThread(getClassName()); mSourceFlags = (int)linphone::MagicSearch::Source::Friends | (int)linphone::MagicSearch::Source::LdapServers; @@ -130,6 +123,7 @@ void MagicSearchList::setSelf(QSharedPointer me) { delete contacts; }); }); + qDebug() << log().arg("Initialized"); emit initialized(); }); }); diff --git a/Linphone/core/search/MagicSearchList.hpp b/Linphone/core/search/MagicSearchList.hpp index 39514651..7403fbf0 100644 --- a/Linphone/core/search/MagicSearchList.hpp +++ b/Linphone/core/search/MagicSearchList.hpp @@ -36,7 +36,6 @@ class MagicSearchList : public ListProxy, public AbstractObject { Q_OBJECT public: static QSharedPointer create(); - static QSharedPointer create(MagicSearchList *magicSearchList); MagicSearchList(QObject *parent = Q_NULLPTR); ~MagicSearchList(); diff --git a/Linphone/core/search/MagicSearchProxy.cpp b/Linphone/core/search/MagicSearchProxy.cpp index c67106eb..f4caad83 100644 --- a/Linphone/core/search/MagicSearchProxy.cpp +++ b/Linphone/core/search/MagicSearchProxy.cpp @@ -25,11 +25,10 @@ MagicSearchProxy::MagicSearchProxy(QObject *parent) : SortFilterProxy(parent) { mSourceFlags = (int)LinphoneEnums::MagicSearchSource::Friends | (int)LinphoneEnums::MagicSearchSource::LdapServers; mAggregationFlag = LinphoneEnums::MagicSearchAggregation::Friend; - setSourceModel(new MagicSearchList()); + setList(MagicSearchList::create()); sort(0); connect(this, &MagicSearchProxy::forceUpdate, [this] { - auto magicSearchList = qobject_cast(sourceModel()); - if (magicSearchList) emit magicSearchList->lSearch(mSearchText); + if (mList) emit mList->lSearch(mSearchText); }); } @@ -37,28 +36,26 @@ MagicSearchProxy::~MagicSearchProxy() { setSourceModel(nullptr); } -void MagicSearchProxy::setSourceModel(QAbstractItemModel *model) { - auto oldMagicSearchList = dynamic_cast(sourceModel()); - if (oldMagicSearchList) { - disconnect(oldMagicSearchList); +void MagicSearchProxy::setList(QSharedPointer newList) { + if (mList == newList) return; + if (mList) { + disconnect(mList.get()); } - auto newMagicSearchList = dynamic_cast(model); - if (newMagicSearchList) { - mList = MagicSearchList::create(newMagicSearchList); - connect(newMagicSearchList, &MagicSearchList::sourceFlagsChanged, this, &MagicSearchProxy::sourceFlagsChanged); - connect(newMagicSearchList, &MagicSearchList::aggregationFlagChanged, this, - &MagicSearchProxy::aggregationFlagChanged); - connect(newMagicSearchList, &MagicSearchList::friendCreated, this, [this](int index) { + mList = newList; + if (mList) { + connect(mList.get(), &MagicSearchList::sourceFlagsChanged, this, &MagicSearchProxy::sourceFlagsChanged); + connect(mList.get(), &MagicSearchList::aggregationFlagChanged, this, &MagicSearchProxy::aggregationFlagChanged); + connect(mList.get(), &MagicSearchList::friendCreated, this, [this](int index) { auto proxyIndex = mapFromSource(sourceModel()->index(index, 0)); emit friendCreated(proxyIndex.row()); }); - connect(newMagicSearchList, &MagicSearchList::initialized, this, [this, newMagicSearchList] { - emit newMagicSearchList->lSetSourceFlags(mSourceFlags); - emit newMagicSearchList->lSetAggregationFlag(mAggregationFlag); + connect(mList.get(), &MagicSearchList::initialized, this, [this, newList = mList.get()] { + emit newList->lSetSourceFlags(mSourceFlags); + emit newList->lSetAggregationFlag(mAggregationFlag); emit initialized(); }); } - QSortFilterProxyModel::setSourceModel(model); + setSourceModel(mList.get()); } int MagicSearchProxy::findFriendIndexByAddress(const QString &address) { @@ -101,6 +98,11 @@ void MagicSearchProxy::setShowFavoritesOnly(bool show) { } } +void MagicSearchProxy::setParentProxy(MagicSearchProxy *proxy) { + setList(proxy->mList); + emit parentProxyChanged(); +} + LinphoneEnums::MagicSearchAggregation MagicSearchProxy::getAggregationFlag() const { return mAggregationFlag; } diff --git a/Linphone/core/search/MagicSearchProxy.hpp b/Linphone/core/search/MagicSearchProxy.hpp index 12a01831..f5ccbee7 100644 --- a/Linphone/core/search/MagicSearchProxy.hpp +++ b/Linphone/core/search/MagicSearchProxy.hpp @@ -35,6 +35,7 @@ class MagicSearchProxy : public SortFilterProxy { Q_PROPERTY(LinphoneEnums::MagicSearchAggregation aggregationFlag READ getAggregationFlag WRITE setAggregationFlag NOTIFY aggregationFlagChanged) Q_PROPERTY(bool showFavoritesOnly READ showFavoritesOnly WRITE setShowFavoritesOnly NOTIFY showFavoriteOnlyChanged) + Q_PROPERTY(MagicSearchProxy *parentProxy WRITE setParentProxy NOTIFY parentProxyChanged) public: MagicSearchProxy(QObject *parent = Q_NULLPTR); @@ -52,7 +53,8 @@ public: bool showFavoritesOnly() const; void setShowFavoritesOnly(bool show); - void setSourceModel(QAbstractItemModel *sourceModel) override; + void setList(QSharedPointer list); + Q_INVOKABLE void setParentProxy(MagicSearchProxy *proxy); // Q_INVOKABLE forceUpdate(); Q_INVOKABLE int findFriendIndexByAddress(const QString &address); @@ -64,7 +66,8 @@ signals: void forceUpdate(); void friendCreated(int index); void showFavoriteOnlyChanged(); - void initialized(); + void parentProxyChanged(); + void initialized(); protected: QString mSearchText; diff --git a/Linphone/view/Control/Display/Contact/ContactListView.qml b/Linphone/view/Control/Display/Contact/ContactListView.qml index d8bf8d08..a73d3a06 100644 --- a/Linphone/view/Control/Display/Contact/ContactListView.qml +++ b/Linphone/view/Control/Display/Contact/ContactListView.qml @@ -27,7 +27,7 @@ ListView { property bool showFavoritesOnly: false property bool showDefaultAddress: false - property var sourceModel: MagicSearchList{} + property var listProxy: MagicSearchProxy{} // Model properties // set searchBarText without specifying a model to bold @@ -97,7 +97,7 @@ ListView { mainItem.currentIndex = index } aggregationFlag: mainItem.aggregationFlag - sourceModel: mainItem.sourceModel + parentProxy: mainItem.listProxy sourceFlags: LinphoneEnums.MagicSearchSource.Friends | ((mainItem.searchText.length > 0 && mainItem.searchText != "*") || SettingsCpp.syncLdapContacts ? LinphoneEnums.MagicSearchSource.LdapServers : 0) onInitialized: { magicSearchProxy.forceUpdate() diff --git a/Linphone/view/Page/Main/Contact/ContactPage.qml b/Linphone/view/Page/Main/Contact/ContactPage.qml index b697f7aa..69430a37 100644 --- a/Linphone/view/Page/Main/Contact/ContactPage.qml +++ b/Linphone/view/Page/Main/Contact/ContactPage.qml @@ -59,7 +59,7 @@ AbstractMainPage { showDefaultItem: contactList.model.sourceModel.count === 0 - MagicSearchList { + MagicSearchProxy { id: allFriends } @@ -281,7 +281,7 @@ AbstractMainPage { showFavoritesOnly: true contactMenuVisible: true searchBarText: searchBar.text - sourceModel: allFriends + listProxy: allFriends onSelectedContactChanged: { if (selectedContact) { contactList.currentIndex = -1 @@ -338,7 +338,7 @@ AbstractMainPage { contactMenuVisible: true highlightFollowsCurrentItem: true searchBarText: searchBar.text - sourceModel: allFriends + listProxy: allFriends Connections { target: contactList.model function onFriendCreated(index) {