From 521c4eeb02b57b07f321edef4cad8e73db5ea50a Mon Sep 17 00:00:00 2001 From: Christophe Deschamps Date: Wed, 29 Jan 2025 12:44:29 +0100 Subject: [PATCH] Fix transport setting in account parameters --- Linphone/core/account/AccountCore.cpp | 24 ++++++++++++++-------- Linphone/model/account/AccountModel.cpp | 27 ++++++++++++++++--------- Linphone/model/account/AccountModel.hpp | 4 ++-- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/Linphone/core/account/AccountCore.cpp b/Linphone/core/account/AccountCore.cpp index bfe080c3f..6f65e81ea 100644 --- a/Linphone/core/account/AccountCore.cpp +++ b/Linphone/core/account/AccountCore.cpp @@ -60,8 +60,8 @@ AccountCore::AccountCore(const std::shared_ptr &account) : QO mRegisterEnabled = params->registerEnabled(); mMwiServerAddress = params->getMwiServerAddress() ? Utils::coreStringToAppString(params->getMwiServerAddress()->asString()) : ""; - mTransports << "TCP" - << "UDP" + mTransports << "UDP" + << "TCP" << "TLS" << "DTLS"; mTransport = LinphoneEnums::toString(LinphoneEnums::fromLinphone(params->getTransport())); @@ -521,16 +521,24 @@ void AccountCore::setVoicemailAddress(QString value) { void AccountCore::setTransport(QString value) { if (mTransport != value) { - mTransport = value; - emit transportChanged(); + mAccountModelConnection->invokeToModel([this, value] { + mustBeInLinphoneThread(getClassName() + Q_FUNC_INFO); + LinphoneEnums::TransportType transport; + LinphoneEnums::fromString(value, &transport); + mAccountModel->setTransport(LinphoneEnums::toLinphone(transport), false); + }); setIsSaved(false); } } void AccountCore::setServerAddress(QString value) { if (mServerAddress != value) { - mServerAddress = value; - emit serverAddressChanged(); + mAccountModelConnection->invokeToModel([this, value, transportString = mTransport] { + LinphoneEnums::TransportType transport; + LinphoneEnums::fromString(transportString, &transport); + mustBeInLinphoneThread(getClassName() + Q_FUNC_INFO); + mAccountModel->setServerAddress(value, LinphoneEnums::toLinphone(transport), false); + }); setIsSaved(false); } } @@ -720,8 +728,8 @@ void AccountCore::writeIntoModel(std::shared_ptr model) const { model->setMwiServerAddress(mMwiServerAddress); LinphoneEnums::TransportType transport; LinphoneEnums::fromString(mTransport, &transport); - model->setTransport(LinphoneEnums::toLinphone(transport)); - model->setServerAddress(mServerAddress); + model->setTransport(LinphoneEnums::toLinphone(transport), true); + model->setServerAddress(mServerAddress, LinphoneEnums::toLinphone(transport), true); model->setOutboundProxyEnabled(mOutboundProxyEnabled); model->setStunServer(mStunServer); model->setIceEnabled(mIceEnabled); diff --git a/Linphone/model/account/AccountModel.cpp b/Linphone/model/account/AccountModel.cpp index 7127c093f..4eaae99b0 100644 --- a/Linphone/model/account/AccountModel.cpp +++ b/Linphone/model/account/AccountModel.cpp @@ -92,7 +92,7 @@ void AccountModel::setPictureUri(QString uri) { // Hack because Account doesn't provide callbacks on updated data // emit pictureUriChanged(uri); auto core = CoreModel::getInstance()->getCore(); - emit CoreModel::getInstance()->defaultAccountChanged(core, core->getDefaultAccount()); + emit CoreModel::getInstance() -> defaultAccountChanged(core, core->getDefaultAccount()); } void AccountModel::onDefaultAccountChanged() { @@ -150,7 +150,7 @@ void AccountModel::setDisplayName(QString displayName) { // Hack because Account doesn't provide callbacks on updated data // emit displayNameChanged(displayName); auto core = CoreModel::getInstance()->getCore(); - emit CoreModel::getInstance()->defaultAccountChanged(core, core->getDefaultAccount()); + emit CoreModel::getInstance() -> defaultAccountChanged(core, core->getDefaultAccount()); } void AccountModel::setDialPlan(int index) { @@ -222,26 +222,35 @@ linphone::TransportType AccountModel::getTransport() const { return mMonitor->getParams()->getTransport(); } -void AccountModel::setTransport(linphone::TransportType value) { +void AccountModel::setTransport(linphone::TransportType value, bool save) { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); auto params = mMonitor->getParams()->clone(); - params->setTransport(value); - mMonitor->setParams(params); - emit transportChanged(value); + if (params->getServerAddress()) { + auto addressClone = params->getServerAddress()->clone(); + addressClone->setTransport(value); + params->setServerAddress(addressClone); + if (save) mMonitor->setParams(params); + emit transportChanged(value); + emit serverAddressChanged(Utils::coreStringToAppString(addressClone->asString())); + } } QString AccountModel::getServerAddress() const { - return Utils::coreStringToAppString(mMonitor->getParams()->getServerAddress()->asString()); + if (mMonitor->getParams()->getServerAddress()) + return Utils::coreStringToAppString(mMonitor->getParams()->getServerAddress()->asString()); + else return ""; } -void AccountModel::setServerAddress(QString value) { +void AccountModel::setServerAddress(QString value, linphone::TransportType transport, bool save) { mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); auto params = mMonitor->getParams()->clone(); auto address = CoreModel::getInstance()->getCore()->interpretUrl(Utils::appStringToCoreString(value), false); if (address) { + if (save) address->setTransport(transport); params->setServerAddress(address); - mMonitor->setParams(params); + if (save) mMonitor->setParams(params); emit serverAddressChanged(value); + emit transportChanged(address->getTransport()); } else qWarning() << "Unable to set ServerAddress, failed creating address from" << value; } diff --git a/Linphone/model/account/AccountModel.hpp b/Linphone/model/account/AccountModel.hpp index 13b64f7a5..c31904a64 100644 --- a/Linphone/model/account/AccountModel.hpp +++ b/Linphone/model/account/AccountModel.hpp @@ -57,9 +57,9 @@ public: QString getMwiServerAddress() const; void setMwiServerAddress(QString value); linphone::TransportType getTransport() const; - void setTransport(linphone::TransportType value); + void setTransport(linphone::TransportType value, bool save); QString getServerAddress() const; - void setServerAddress(QString value); + void setServerAddress(QString value, linphone::TransportType transport, bool save); bool getOutboundProxyEnabled() const; void setOutboundProxyEnabled(bool value); QString getStunServer() const;