try to remove ffmpeg dependency #LINQT-2015

Clean friends manager maps when restarting app as the linphone core will be reset (fix #LINQT-1933)

only show error message once when linphone restarts if remote configuration failed #LINQT-2030

auto update contact list on carddav synchronized (fix #LINQT-1983)
This commit is contained in:
Gaelle Braud 2025-10-16 12:50:10 +02:00
parent af373148e3
commit 4e81981c07
19 changed files with 89 additions and 19 deletions

View file

@ -36,7 +36,7 @@ ubuntu2004-ninja-clang:
- !reference [.rules-merge-request-manual, rules]
- if: $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_DOC=ON -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DENABLE_DOC=ON -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
@ -59,7 +59,7 @@ ubuntu2004-makefile-gcc:
- if: $NIGHTLY_MASTER
- if: $DEPLOY_PLUGINS
variables:
CMAKE_OPTIONS: -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
@ -105,7 +105,7 @@ ubuntu2004-makefile-gcc-package:
- if: $PACKAGE_LINUX
- if: $DEPLOY_LINUX
variables:
CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$LINUX_PLATFORM/$APP_FOLDER -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$LINUX_PLATFORM/$APP_FOLDER -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++

View file

@ -36,7 +36,7 @@ ubuntu2204-ninja-clang:
- !reference [.rules-merge-request-manual, rules]
- if: $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_DOC=ON -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DENABLE_DOC=ON -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
@ -59,7 +59,7 @@ ubuntu2204-makefile-gcc:
- if: $NIGHTLY_MASTER
- if: $DEPLOY_PLUGINS
variables:
CMAKE_OPTIONS: -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
@ -105,7 +105,7 @@ ubuntu2204-makefile-gcc-package:
- if: $PACKAGE_LINUX
- if: $DEPLOY_LINUX
variables:
CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$LINUX_PLATFORM/$APP_FOLDER -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DLINPHONE_BUILDER_SIGNING_IDENTITY=$GPG_SIGNING_KEYID -DENABLE_G729=ON -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$LINUX_PLATFORM/$APP_FOLDER -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++

View file

@ -102,7 +102,7 @@ macosx-ninja-package:
- if: $PACKAGE_MACOSX
- if: $DEPLOY_MACOSX
variables:
CMAKE_OPTIONS: -DPython3_ROOT_DIR=/opt/bc/pip-packages/ -DENABLE_APP_PACKAGING=ON -DENABLE_GPL_THIRD_PARTIES=ON -DENABLE_G729=ON
CMAKE_OPTIONS: -DPython3_ROOT_DIR=/opt/bc/pip-packages/ -DENABLE_APP_PACKAGING=ON -DENABLE_GPL_THIRD_PARTIES=OFF -DENABLE_G729=ON
RELEASE_FILE: -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$MACOSX_PLATFORM/$APP_FOLDER
extends: macosx-ninja
script:

View file

@ -9,7 +9,7 @@
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $DOCKER_UPDATE == null && $SKIP_WINDOWS == null
- if: $CI_PIPELINE_SOURCE == "schedule" && $DOCKER_UPDATE == null && $SKIP_WINDOWS == null
variables:
CMAKE_OPTIONS: -DENABLE_UNIT_TESTS=ON -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DENABLE_UNIT_TESTS=ON -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
LINPHONESDK_PLATFORM: Desktop
OUTPUT_ZIP_FOLDER: win64
MINGW_TYPE: mingw64
@ -185,7 +185,7 @@ win64-ninja-vs2022-scheduled-windows:
- if: $PACKAGE_WINDOWS
- if: $DEPLOY_WINDOWS
variables:
CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=ON
CMAKE_OPTIONS: -DENABLE_APP_PACKAGING=YES -DENABLE_G729=ON -DENABLE_PQCRYPTO=ON -DENABLE_GPL_THIRD_PARTIES=OFF
RELEASE_FILE: -DLINPHONE_SDK_MAKE_RELEASE_FILE_URL=$MAKE_RELEASE_FILE_URL/$WINDOWS_PLATFORM/$APP_FOLDER
win64-ninja-vs2022-package-windows:

View file

@ -93,6 +93,7 @@
#include "core/translator/DefaultTranslatorCore.hpp"
#include "core/variant/VariantList.hpp"
#include "core/videoSource/VideoSourceDescriptorGui.hpp"
#include "model/friend/FriendsManager.hpp"
#include "model/object/VariantObject.hpp"
#include "model/tool/ToolModel.hpp"
#include "tool/Constants.hpp"
@ -635,7 +636,8 @@ void App::initCore() {
} else lInfo() << log().arg("Stay minimized");
firstOpen = false;
lInfo() << log().arg("Checking remote provisioning");
if (CoreModel::getInstance()->mConfigStatus == linphone::ConfiguringState::Failed) {
if (CoreModel::getInstance()->mConfigStatus == linphone::ConfiguringState::Failed &&
mIsRestarting) {
QMetaObject::invokeMethod(thread(), [this]() {
auto message = CoreModel::getInstance()->mConfigMessage;
//: not reachable
@ -648,6 +650,7 @@ void App::initCore() {
tr("info_popup_configuration_failed_message").arg(message), false);
});
}
mIsRestarting = false;
//---------------------------------------------------------------------------------------------
lDebug() << log().arg("Creating KeyboardShortcuts");
@ -883,8 +886,10 @@ void App::clean() {
}
void App::restart() {
mCoreModelConnection->invokeToModel([this]() {
FriendsManager::getInstance()->clearMaps();
CoreModel::getInstance()->getCore()->stop();
mCoreModelConnection->invokeToCore([this]() {
mIsRestarting = true;
closeCallsWindow();
setMainWindow(nullptr);
mEngine->clearComponentCache();

View file

@ -207,6 +207,7 @@ private:
QSharedPointer<SafeConnection<App, CliModel>> mCliModelConnection;
bool mAutoStart = false;
bool mCoreStarted = false;
bool mIsRestarting = false;
QLocale mLocale = QLocale::system();
DefaultTranslatorCore *mTranslatorCore = nullptr;
DefaultTranslatorCore *mDefaultTranslatorCore = nullptr;

View file

@ -74,7 +74,10 @@ void CarddavCore::remove() {
void CarddavCore::setSelf(QSharedPointer<CarddavCore> me) {
mCarddavModelConnection = SafeConnection<CarddavCore, CarddavModel>::create(me, mCarddavModel);
mCarddavModelConnection->makeConnectToModel(&CarddavModel::saved, [this](bool success) {
mCarddavModelConnection->invokeToCore([this, success]() { emit saved(success); });
mCarddavModelConnection->invokeToCore([this, success]() {
if (success) emit App::getInstance()->getSettings()->cardDAVAddressBookSynchronized();
emit saved(success);
});
});
}

View file

@ -392,6 +392,11 @@ void SettingsCore::setSelf(QSharedPointer<SettingsCore> me) {
mSettingsModelConnection->invokeToCore([this, value]() { setDndEnabled(value); });
});
// CardDAV
mSettingsModelConnection->makeConnectToModel(&SettingsModel::cardDAVMinCharResearchChanged, [this](int min) {
mSettingsModelConnection->invokeToCore([this, min]() { setCardDAVMinCharForResearch(min); });
});
auto settingsModel = SettingsModel::getInstance();
DEFINE_CORE_GETSET_CONNECT(mSettingsModelConnection, SettingsCore, SettingsModel, settingsModel, bool,
@ -547,6 +552,7 @@ void SettingsCore::reset(const SettingsCore &settingsCore) {
setAutoStart(settingsCore.mAutoStart);
setExitOnClose(settingsCore.mExitOnClose);
setSyncLdapContacts(settingsCore.mSyncLdapContacts);
setCardDAVMinCharForResearch(settingsCore.mCardDAVMinCharForResearch);
setIpv6Enabled(settingsCore.mIpv6Enabled);
setConfigLocale(settingsCore.mConfigLocale);
setDownloadFolder(settingsCore.mDownloadFolder);
@ -1004,6 +1010,17 @@ bool SettingsCore::getSyncLdapContacts() const {
return mSyncLdapContacts;
}
bool SettingsCore::getCardDAVMinCharForResearch() const {
return mCardDAVMinCharForResearch;
}
void SettingsCore::setCardDAVMinCharForResearch(int min) {
if (mCardDAVMinCharForResearch != min) {
mCardDAVMinCharForResearch = min;
emit cardDAVMinCharForResearchChanged(mCardDAVMinCharForResearch);
}
}
QString SettingsCore::getConfigLocale() const {
return mConfigLocale;
}
@ -1148,6 +1165,7 @@ void SettingsCore::writeFromModel(const std::shared_ptr<SettingsModel> &model) {
mAutoStart = model->getAutoStart();
mExitOnClose = model->getExitOnClose();
mSyncLdapContacts = model->getSyncLdapContacts();
mCardDAVMinCharForResearch = model->getCardDAVMinCharResearch();
mIpv6Enabled = model->getIpv6Enabled();
mConfigLocale = model->getConfigLocale();
mDownloadFolder = model->getDownloadFolder();

View file

@ -215,6 +215,9 @@ public:
bool showAccountDevices() const;
void setShowAccountDevices(bool show);
bool getCardDAVMinCharForResearch() const;
void setCardDAVMinCharForResearch(int min);
Q_INVOKABLE void save();
Q_INVOKABLE void undo();
@ -282,6 +285,9 @@ signals:
void conferenceLayoutsChanged(const QVariantList &layouts);
void mediaEncryptionsChanged(const QVariantList &encryptions);
void cardDAVMinCharForResearchChanged(int min);
void cardDAVAddressBookSynchronized();
void lSetCaptureDevice(QVariantMap device);
void captureDeviceChanged(const QVariantMap &device);
@ -392,6 +398,9 @@ private:
QString mDefaultDomain;
bool mShowAccountDevices = false;
// CardDAV
int mCardDAVMinCharForResearch = 0;
DECLARE_ABSTRACT_OBJECT
};
#endif

View file

@ -100,7 +100,7 @@ void CarddavModel::onSyncStatusChanged(const std::shared_ptr<linphone::FriendLis
if (status == linphone::FriendList::SyncStatus::Successful) {
lInfo() << log().arg("Successfully synchronized:") << mCarddavFriendList->getUri();
setMonitor(nullptr);
if (mStoreNewFriendsInIt) SettingsModel::setCardDAVListForNewFriends(friendList->getDisplayName());
SettingsModel::setCardDAVListForNewFriends(mStoreNewFriendsInIt ? friendList->getDisplayName() : "");
emit saved(true);
}
if (status == linphone::FriendList::SyncStatus::Failure) {

View file

@ -74,6 +74,7 @@ FriendsManager::FriendsManager(QObject *parent) : QObject(parent) {
}
FriendsManager::~FriendsManager() {
clearMaps();
}
std::shared_ptr<FriendsManager> FriendsManager::create(QObject *parent) {
@ -98,6 +99,12 @@ QStringList FriendsManager::getOtherAddresses() const {
return mOtherAddresses;
}
void FriendsManager::clearMaps() {
mKnownFriends.clear();
mUnknownFriends.clear();
mOtherAddresses.clear();
}
std::shared_ptr<linphone::Friend> FriendsManager::getKnownFriendAtKey(const QString &key) {
if (isInKnownFriends(key)) {
return mKnownFriends.value(key).value<std::shared_ptr<linphone::Friend>>();

View file

@ -41,6 +41,8 @@ public:
QVariantMap getUnknownFriends() const;
QStringList getOtherAddresses() const;
void clearMaps();
std::shared_ptr<linphone::Friend> getKnownFriendAtKey(const QString &key);
std::shared_ptr<linphone::Friend> getUnknownFriendAtKey(const QString &key);

View file

@ -50,8 +50,10 @@ void MagicSearchModel::search(QString filter,
if (((sourceFlags & (int)LinphoneEnums::MagicSearchSource::LdapServers) > 0) &&
!SettingsModel::getInstance()->getSyncLdapContacts())
sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::LdapServers;
if (((sourceFlags & (int)LinphoneEnums::MagicSearchSource::RemoteCardDAV) > 0))
if (((sourceFlags & (int)LinphoneEnums::MagicSearchSource::RemoteCardDAV) > 0) &&
SettingsModel::getInstance()->getCardDAVMinCharResearch() > 0) {
sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::RemoteCardDAV;
}
// For complete search, we search only on local contacts.
// sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::CallLogs;
// sourceFlags &= ~(int)LinphoneEnums::MagicSearchSource::ChatRooms;
@ -104,7 +106,7 @@ void MagicSearchModel::onSearchResultsReceived(const std::shared_ptr<linphone::M
// << (fList ? fList->getDisplayName().c_str() : "NoList") << result->getSourceFlags() << " /
//"
// << (f ? f.get() : nullptr);
bool isLdap = (result->getSourceFlags() & (int)linphone::MagicSearch::Source::LdapServers) != 0;
bool isLdap = result->hasSourceFlag(linphone::MagicSearch::Source::LdapServers) != 0;
// Do not add it into ldap_friends if it already exists in app_friends.
if (isLdap && (!fList || fList->getDisplayName() !=
"app_friends")) { // Double check because of SDK merging that lead to

View file

@ -34,6 +34,7 @@ using namespace std;
const std::string SettingsModel::UiSection("ui");
const std::string SettingsModel::AppSection("app");
const std::string SettingsModel::CardDAVSection("carddav_0");
std::shared_ptr<SettingsModel> SettingsModel::gSettingsModel;
SettingsModel::SettingsModel() {
@ -698,6 +699,19 @@ void SettingsModel::setCardDAVListForNewFriends(std::string name) {
}
}
// CardDAV min characters for research
int SettingsModel::getCardDAVMinCharResearch() const {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
return mConfig->getInt(SettingsModel::CardDAVSection, "min_characters", 0);
}
void SettingsModel::setCardDAVMinCharResearch(int min) {
mustBeInLinphoneThread(log().arg(Q_FUNC_INFO));
mConfig->setInt(SettingsModel::CardDAVSection, "min_characters", min);
emit cardDAVMinCharResearchChanged(min);
}
// =============================================================================
// Device name.
// =============================================================================

View file

@ -46,6 +46,7 @@ public:
static const std::string UiSection;
static const std::string AppSection;
static const std::string CardDAVSection;
std::shared_ptr<linphone::Config> mConfig;
bool getVfsEnabled() const;
@ -110,6 +111,9 @@ public:
bool getCreateEndToEndEncryptedMeetingsAndGroupCalls() const;
void setCreateEndToEndEncryptedMeetingsAndGroupCalls(bool endtoend);
int getCardDAVMinCharResearch() const;
void setCardDAVMinCharResearch(int min);
QVariantMap getRingerDevice() const;
void setRingerDevice(QVariantMap device);
@ -247,6 +251,8 @@ signals:
void mediaEncryptionMandatoryChanged();
void createEndToEndEncryptedMeetingsAndGroupCallsChanged(bool endtoend);
void cardDAVMinCharResearchChanged(int min);
void echoCancellationEnabledChanged(bool enabled);
void automaticallyRecordCallsEnabledChanged(bool enabled);

View file

@ -118,10 +118,14 @@ ListView {
Connections {
target: SettingsCpp
onLdapConfigChanged: {
function onLdapConfigChanged() {
if (SettingsCpp.syncLdapContacts)
magicSearchProxy.forceUpdate()
}
function onCardDAVAddressBookSynchronized() {
console.log("card dav synchro update")
magicSearchProxy.forceUpdate()
}
}
// Workaround: itemAtIndex and count are decorellated and are not enough to know when the ListView has load all its children.
// So when itemAtIndex is not available, start this timer along count changed signal.

View file

@ -298,9 +298,8 @@ FriendGui{
| LinphoneEnums.MagicSearchSource.RemoteCardDAV
onHighlightedContactChanged: mainItem.selectedContact = highlightedContact
onContactDeletionRequested: contact => {
mainItem.deleteContact(
contact)
}
mainItem.deleteContact(contact)
}
onLoadingChanged: {
if (!loading && initialFriendToDisplay.length !== 0) {
Qt.callLater(function () {

View file

@ -56,7 +56,7 @@ RUN apt-get update && \
# Install linphone & flexisip dependencies development packages
RUN apt-get update && \
apt-get install -y libasound2-dev libavcodec-dev libavutil-dev libbsd-dev libegl1-mesa-dev libglew-dev libgsm1-dev libjansson-dev libmariadb-dev-compat libmbedtls-dev libopus-dev libpq-dev libprotobuf-dev libpulse-dev libqt5svg5-dev libsnmp-dev libspeex-dev libspeexdsp-dev libsqlite3-dev libsrtp2-dev libssl-dev libswscale-dev libturbojpeg0-dev libv4l-dev libvpx-dev libxerces-c-dev libxml2-dev libxv-dev libxinerama-dev protobuf-compiler qttools5-dev qttools5-dev-tools xsdcxx cmake nasm && \
apt-get install -y libasound2-dev libbsd-dev libegl1-mesa-dev libglew-dev libgsm1-dev libjansson-dev libmariadb-dev-compat libmbedtls-dev libopus-dev libpq-dev libprotobuf-dev libpulse-dev libqt5svg5-dev libsnmp-dev libspeex-dev libspeexdsp-dev libsqlite3-dev libsrtp2-dev libssl-dev libswscale-dev libturbojpeg0-dev libv4l-dev libvpx-dev libxerces-c-dev libxml2-dev libxv-dev libxinerama-dev protobuf-compiler qttools5-dev qttools5-dev-tools xsdcxx cmake nasm && \
apt-get clean
# Install signing tools

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB