From 0b193de0bb03e21e42027aa071c156e2b5a6a459 Mon Sep 17 00:00:00 2001 From: Julien Wadel Date: Wed, 27 Nov 2024 16:31:13 +0100 Subject: [PATCH] Fix ldap results: do not synchronized ldap list if already exist in local to avoid losing data on SDK merge. Prioritize app_friends list in results. Update SDK. --- Linphone/core/search/MagicSearchProxy.cpp | 2 +- Linphone/model/search/MagicSearchModel.cpp | 41 ++++++++++++++-------- external/linphone-sdk | 2 +- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/Linphone/core/search/MagicSearchProxy.cpp b/Linphone/core/search/MagicSearchProxy.cpp index d954b4137..b1d959293 100644 --- a/Linphone/core/search/MagicSearchProxy.cpp +++ b/Linphone/core/search/MagicSearchProxy.cpp @@ -197,7 +197,7 @@ bool MagicSearchProxy::SortFilterList::filterAcceptsRow(int sourceRow, const QMo // if (!toShow) return false; } if (!toShow && (mFilterType & (int)FilteringTypes::App) > 0) { - toShow = friendCore->getIsStored(); + toShow = friendCore->getIsStored() && !friendCore->isLdap(); // if (!toShow) return false; } if (!toShow && (mFilterType & (int)FilteringTypes::Other) > 0) { diff --git a/Linphone/model/search/MagicSearchModel.cpp b/Linphone/model/search/MagicSearchModel.cpp index 7ec1898d0..d50987460 100644 --- a/Linphone/model/search/MagicSearchModel.cpp +++ b/Linphone/model/search/MagicSearchModel.cpp @@ -74,24 +74,34 @@ void MagicSearchModel::setMaxResults(int maxResults) { } void MagicSearchModel::onSearchResultsReceived(const std::shared_ptr &magicSearch) { - qDebug() << log().arg("SDK send callback: onSearchResultsReceived"); auto results = magicSearch->getLastSearch(); + qDebug() << log().arg("SDK send callback: onSearchResultsReceived : %1 results.").arg(results.size()); auto appFriends = ToolModel::getAppFriendList(); + auto ldapFriends = ToolModel::getLdapFriendList(); std::list> finalResults; - for (auto it : results) { - bool isLdap = (it->getSourceFlags() & (int)LinphoneEnums::MagicSearchSource::LdapServers) != 0; - bool toAdd = true; - if (isLdap && it->getFriend()) { - updateLdapFriendListWithFriend(it->getFriend()); - if (appFriends->findFriendByAddress(it->getFriend()->getAddress())) { // Already exist in app list - toAdd = false; - } + for (auto result : results) { + auto f = result->getFriend(); + auto fList = f ? f->getFriendList() : nullptr; + + qDebug() << log().arg("") << (f ? f->getName().c_str() : "NoFriend") << ", " + << (result->getAddress() ? result->getAddress()->asString().c_str() : "NoAddr") << " / " + << (fList ? fList->getDisplayName().c_str() : "NoList") << result->getSourceFlags() << " / " + << (f ? f.get() : nullptr); + + bool isLdap = (result->getSourceFlags() & (int)LinphoneEnums::MagicSearchSource::LdapServers) != 0; + // Do not add it into ldap_friends if it already exists in app_friends. + if (isLdap && f && (!fList || fList->getDisplayName() != "app_friends") && + !ToolModel::friendIsInFriendList(appFriends, f)) { // Double check because of SDK merging that lead to + // use a ldap result as of app_friends/ldap_friends. + updateLdapFriendListWithFriend(f); } - if (toAdd && - std::find_if(finalResults.begin(), finalResults.end(), [it](std::shared_ptr r) { - return r->getAddress()->weakEqual(it->getAddress()); - }) == finalResults.end()) - finalResults.push_back(it); + + auto resultIt = + std::find_if(finalResults.begin(), finalResults.end(), [result](std::shared_ptr r) { + return r->getAddress()->weakEqual(result->getAddress()); + }); + if (resultIt == finalResults.end()) finalResults.push_back(result); + else if (fList && fList->getDisplayName() == "app_friends") *resultIt = result; // replace if local friend } emit searchResultsReceived(finalResults); } @@ -110,6 +120,8 @@ void MagicSearchModel::updateLdapFriendListWithFriend(const std::shared_ptrgetCore(); auto ldapFriendList = ToolModel::getLdapFriendList(); + if (ToolModel::friendIsInFriendList(ldapFriendList, linphoneFriend)) + return; // Already exist. We don't need to manipulate list. for (auto address : linphoneFriend->getAddresses()) { auto existingFriend = ldapFriendList->findFriendByAddress(address); if (existingFriend) { @@ -126,6 +138,7 @@ void MagicSearchModel::updateLdapFriendListWithFriend(const std::shared_ptraddFriend(linphoneFriend); emit CoreModel::getInstance()->friendCreated(linphoneFriend); } diff --git a/external/linphone-sdk b/external/linphone-sdk index b9b42aff8..bc6747f61 160000 --- a/external/linphone-sdk +++ b/external/linphone-sdk @@ -1 +1 @@ -Subproject commit b9b42aff89f650a5a1bd67d45bddb7dcc1b60481 +Subproject commit bc6747f61ebc40ab1432966414cfce0e2b832206