From 6ff3cc0ae7b216b32ea0c070fae6fcd7390f20aa Mon Sep 17 00:00:00 2001 From: Christophe Deschamps Date: Thu, 5 Jun 2025 15:04:44 +0200 Subject: [PATCH] Fix crash with CardDav --- Linphone/model/friend/FriendModel.cpp | 6 ++ Linphone/model/friend/FriendsManager.cpp | 95 +++++++++++++----------- 2 files changed, 58 insertions(+), 43 deletions(-) diff --git a/Linphone/model/friend/FriendModel.cpp b/Linphone/model/friend/FriendModel.cpp index 9f5091835..95954169f 100644 --- a/Linphone/model/friend/FriendModel.cpp +++ b/Linphone/model/friend/FriendModel.cpp @@ -22,6 +22,7 @@ #include "core/path/Paths.hpp" #include "model/core/CoreModel.hpp" +#include "model/setting/SettingsModel.hpp" #include "model/tool/ToolModel.hpp" #include "tool/Utils.hpp" #include "tool/providers/AvatarProvider.hpp" @@ -394,6 +395,11 @@ bool FriendModel::isThisFriend(const std::shared_ptr &data) { void FriendModel::remove() { if (!mMonitor) return; + auto friendList = mMonitor->getFriendList(); + if (friendList && friendList == SettingsModel::getCardDAVListForNewFriends()) { + friendList->removeFriend(mMonitor); + friendList->synchronizeFriendsFromServer(); + } auto temp = mMonitor; temp->remove(); // mMonitor become null emit CoreModel::getInstance()->friendRemoved(temp); diff --git a/Linphone/model/friend/FriendsManager.cpp b/Linphone/model/friend/FriendsManager.cpp index 72ea49fe4..3bce51fbc 100644 --- a/Linphone/model/friend/FriendsManager.cpp +++ b/Linphone/model/friend/FriendsManager.cpp @@ -30,38 +30,47 @@ std::shared_ptr FriendsManager::gFriendsManager; FriendsManager::FriendsManager(QObject *parent) : QObject(parent) { moveToThread(CoreModel::getInstance()->thread()); - connect(CoreModel::getInstance().get(), &CoreModel::friendRemoved, this, [this] (const std::shared_ptr &f) { - auto key = mKnownFriends.key(QVariant::fromValue(f), nullptr); - if (key != nullptr) { - mKnownFriends.remove(key); - } - auto unknown = mUnknownFriends.key(QVariant::fromValue(f), nullptr); - if (unknown != nullptr) { - mUnknownFriends.remove(unknown); - } - auto address = QString::fromStdString(f->getAddress()->asStringUriOnly()); - mOtherAddresses.removeAll(address); - }); - connect(CoreModel::getInstance().get(), &CoreModel::friendCreated, this, [this] (const std::shared_ptr &f) { - auto unknown = mUnknownFriends.key(QVariant::fromValue(f), nullptr); - if (unknown != nullptr) { - mUnknownFriends.remove(unknown); - } - auto address = QString::fromStdString(f->getAddress()->asStringUriOnly()); - mOtherAddresses.removeAll(address); - }); - connect(CoreModel::getInstance().get(), &CoreModel::friendUpdated, this, [this] (const std::shared_ptr &f) { - auto key = mKnownFriends.key(QVariant::fromValue(f), nullptr); - if (key != nullptr) { - mKnownFriends.remove(key); - } - auto unknown = mUnknownFriends.key(QVariant::fromValue(f), nullptr); - if (unknown != nullptr) { - mUnknownFriends.remove(unknown); - } - auto address = QString::fromStdString(f->getAddress()->asStringUriOnly()); - mOtherAddresses.removeAll(address); - }); + connect(CoreModel::getInstance().get(), &CoreModel::friendRemoved, this, + [this](const std::shared_ptr &f) { + auto key = mKnownFriends.key(QVariant::fromValue(f), nullptr); + if (key != nullptr) { + mKnownFriends.remove(key); + } + auto unknown = mUnknownFriends.key(QVariant::fromValue(f), nullptr); + if (unknown != nullptr) { + mUnknownFriends.remove(unknown); + } + if (f->getAddress()) { + auto address = QString::fromStdString(f->getAddress()->asStringUriOnly()); + mOtherAddresses.removeAll(address); + } + }); + connect(CoreModel::getInstance().get(), &CoreModel::friendCreated, this, + [this](const std::shared_ptr &f) { + auto unknown = mUnknownFriends.key(QVariant::fromValue(f), nullptr); + if (unknown != nullptr) { + mUnknownFriends.remove(unknown); + } + if (f->getAddress()) { + auto address = QString::fromStdString(f->getAddress()->asStringUriOnly()); + mOtherAddresses.removeAll(address); + } + }); + connect(CoreModel::getInstance().get(), &CoreModel::friendUpdated, this, + [this](const std::shared_ptr &f) { + auto key = mKnownFriends.key(QVariant::fromValue(f), nullptr); + if (key != nullptr) { + mKnownFriends.remove(key); + } + auto unknown = mUnknownFriends.key(QVariant::fromValue(f), nullptr); + if (unknown != nullptr) { + mUnknownFriends.remove(unknown); + } + if (f->getAddress()) { + auto address = QString::fromStdString(f->getAddress()->asStringUriOnly()); + mOtherAddresses.removeAll(address); + } + }); } FriendsManager::~FriendsManager() { @@ -89,31 +98,32 @@ QStringList FriendsManager::getOtherAddresses() const { return mOtherAddresses; } -std::shared_ptr FriendsManager::getKnownFriendAtKey(const QString& key) { +std::shared_ptr FriendsManager::getKnownFriendAtKey(const QString &key) { if (isInKnownFriends(key)) { return mKnownFriends.value(key).value>(); } else return nullptr; } -std::shared_ptr FriendsManager::getUnknownFriendAtKey(const QString& key) { +std::shared_ptr FriendsManager::getUnknownFriendAtKey(const QString &key) { if (isInUnknownFriends(key)) { return mUnknownFriends.value(key).value>(); } else return nullptr; } -bool FriendsManager::isInKnownFriends(const QString& key) { +bool FriendsManager::isInKnownFriends(const QString &key) { return mKnownFriends.contains(key); } -bool FriendsManager::isInUnknownFriends(const QString& key) { +bool FriendsManager::isInUnknownFriends(const QString &key) { return mUnknownFriends.contains(key); } -bool FriendsManager::isInOtherAddresses(const QString& key) { +bool FriendsManager::isInOtherAddresses(const QString &key) { return mOtherAddresses.contains(key); } -void FriendsManager::appendKnownFriend(std::shared_ptr address, std::shared_ptr f) { +void FriendsManager::appendKnownFriend(std::shared_ptr address, + std::shared_ptr f) { auto key = Utils::coreStringToAppString(address->asStringUriOnly()); if (mKnownFriends.contains(key)) { qDebug() << "friend is already in konwn list, return"; @@ -122,8 +132,8 @@ void FriendsManager::appendKnownFriend(std::shared_ptr addres mKnownFriends.insert(key, QVariant::fromValue(f)); } - -void FriendsManager::appendUnknownFriend(std::shared_ptr address, std::shared_ptr f) { +void FriendsManager::appendUnknownFriend(std::shared_ptr address, + std::shared_ptr f) { auto key = Utils::coreStringToAppString(address->asStringUriOnly()); if (mUnknownFriends.contains(key)) { qDebug() << "friend is already in unkonwn list, return"; @@ -132,7 +142,6 @@ void FriendsManager::appendUnknownFriend(std::shared_ptr addr mUnknownFriends.insert(key, QVariant::fromValue(f)); } - void FriendsManager::appendOtherAddress(QString address) { if (mOtherAddresses.contains(address)) { qDebug() << "friend is already in other addresses, return"; @@ -141,10 +150,10 @@ void FriendsManager::appendOtherAddress(QString address) { mOtherAddresses.append(address); } -void FriendsManager::removeUnknownFriend(const QString& key) { +void FriendsManager::removeUnknownFriend(const QString &key) { mUnknownFriends.remove(key); } -void FriendsManager::removeOtherAddress(const QString& key) { +void FriendsManager::removeOtherAddress(const QString &key) { mOtherAddresses.removeAll(key); }