diff --git a/linphone-desktop/src/components/settings/AccountSettingsModel.cpp b/linphone-desktop/src/components/settings/AccountSettingsModel.cpp index 995a90da2..0c5e63ef6 100644 --- a/linphone-desktop/src/components/settings/AccountSettingsModel.cpp +++ b/linphone-desktop/src/components/settings/AccountSettingsModel.cpp @@ -64,7 +64,7 @@ void AccountSettingsModel::removeProxyConfig (const shared_ptr &proxy_config, const QVariantMap &data ) { @@ -78,7 +78,7 @@ void AccountSettingsModel::addOrUpdateProxyConfig ( ); if (!address) { qWarning() << QStringLiteral("Unable to create sip address object from: `%1`.").arg(literal); - return; + return false; } proxy_config->setIdentityAddress(address); @@ -86,28 +86,11 @@ void AccountSettingsModel::addOrUpdateProxyConfig ( // Server address. { - QString q_server_address = data["serverAddress"].toString(); - string s_server_address = ::Utils::qStringToLinphoneString(q_server_address); + QString server_address = data["serverAddress"].toString(); - if (!proxy_config->setServerAddr(s_server_address)) { - shared_ptr address = linphone::Factory::get()->createAddress(s_server_address); - if (!address) { - qWarning() << QStringLiteral("Unable to add server address: `%1`.").arg(q_server_address); - return; - } - - QString transport = data["transport"].toString(); - if (transport == "TCP") - address->setTransport(linphone::TransportType::TransportTypeTcp); - else if (transport == "UDP") - address->setTransport(linphone::TransportType::TransportTypeTcp); - else - address->setTransport(linphone::TransportType::TransportTypeTls); - - if (!proxy_config->setServerAddr(address->asString())) { - qWarning() << QStringLiteral("Unable to add server address: `%1`.").arg(q_server_address); - return; - } + if (proxy_config->setServerAddr(::Utils::qStringToLinphoneString(server_address))) { + qWarning() << QStringLiteral("Unable to add server address: `%1`.").arg(server_address); + return false; } } @@ -126,43 +109,22 @@ void AccountSettingsModel::addOrUpdateProxyConfig ( if (find(proxy_configs.cbegin(), proxy_configs.cend(), proxy_config) != proxy_configs.cend()) { if (proxy_config->done() == -1) { qWarning() << QStringLiteral("Unable to update proxy config: `%1`.").arg(literal); - return; + return false; } } else if (core->addProxyConfig(proxy_config) == -1) { qWarning() << QStringLiteral("Unable to add proxy config: `%1`.").arg(literal); - return; + return false; } emit accountSettingsUpdated(); + + return true; } std::shared_ptr AccountSettingsModel::createProxyConfig () { return CoreManager::getInstance()->getCore()->createProxyConfig(); } -QString AccountSettingsModel::getTransportFromServerAddress (const QString &server_address) { - const shared_ptr address = linphone::Factory::get()->createAddress( - ::Utils::qStringToLinphoneString(server_address) - ); - - if (!address) - return QStringLiteral(""); - - switch (address->getTransport()) { - case linphone::TransportTypeUdp: - return QStringLiteral("UDP"); - case linphone::TransportTypeTcp: - return QStringLiteral("TCP"); - case linphone::TransportTypeTls: - return QStringLiteral("TLS"); - - case linphone::TransportTypeDtls: - break; - } - - return QStringLiteral(""); -} - // ----------------------------------------------------------------------------- QString AccountSettingsModel::getUsername () const { diff --git a/linphone-desktop/src/components/settings/AccountSettingsModel.hpp b/linphone-desktop/src/components/settings/AccountSettingsModel.hpp index 52d827ecd..6253e34e5 100644 --- a/linphone-desktop/src/components/settings/AccountSettingsModel.hpp +++ b/linphone-desktop/src/components/settings/AccountSettingsModel.hpp @@ -47,13 +47,11 @@ public: Q_INVOKABLE void setDefaultProxyConfig (const std::shared_ptr &proxy_config); - Q_INVOKABLE void addOrUpdateProxyConfig (const std::shared_ptr &proxy_config, const QVariantMap &data); + Q_INVOKABLE bool addOrUpdateProxyConfig (const std::shared_ptr &proxy_config, const QVariantMap &data); Q_INVOKABLE void removeProxyConfig (const std::shared_ptr &proxy_config); Q_INVOKABLE std::shared_ptr createProxyConfig (); - Q_INVOKABLE QString getTransportFromServerAddress (const QString &server_address); - signals: void accountSettingsUpdated (); diff --git a/linphone-desktop/src/components/sip-addresses/SipAddressesModel.cpp b/linphone-desktop/src/components/sip-addresses/SipAddressesModel.cpp index b4f649b0c..de65df6d8 100644 --- a/linphone-desktop/src/components/sip-addresses/SipAddressesModel.cpp +++ b/linphone-desktop/src/components/sip-addresses/SipAddressesModel.cpp @@ -140,6 +140,57 @@ QString SipAddressesModel::interpretUrl (const QString &sip_address) const { return l_address ? ::Utils::linphoneStringToQString(l_address->asStringUriOnly()) : ""; } +QString SipAddressesModel::getTransportFromSipAddress (const QString &sip_address) const { + const shared_ptr address = linphone::Factory::get()->createAddress( + ::Utils::qStringToLinphoneString(sip_address) + ); + + if (!address) + return QStringLiteral(""); + + switch (address->getTransport()) { + case linphone::TransportTypeUdp: + return QStringLiteral("UDP"); + case linphone::TransportTypeTcp: + return QStringLiteral("TCP"); + case linphone::TransportTypeTls: + return QStringLiteral("TLS"); + case linphone::TransportTypeDtls: + return QStringLiteral("DTLS"); + } + + return QStringLiteral(""); +} + +QString SipAddressesModel::addTransportToSipAddress (const QString &sip_address, const QString &transport) const { + shared_ptr address = linphone::Factory::get()->createAddress( + ::Utils::qStringToLinphoneString(sip_address) + ); + + if (!address) + return ""; + + QString _transport = transport.toUpper(); + if (_transport == "TCP") + address->setTransport(linphone::TransportType::TransportTypeTcp); + else if (_transport == "UDP") + address->setTransport(linphone::TransportType::TransportTypeUdp); + else if (_transport == "TLS") + address->setTransport(linphone::TransportType::TransportTypeTls); + else + address->setTransport(linphone::TransportType::TransportTypeDtls); + + return ::Utils::linphoneStringToQString(address->asString()); +} + +bool SipAddressesModel::sipAddressIsValid (const QString &sip_address) const { + shared_ptr address = linphone::Factory::get()->createAddress( + ::Utils::qStringToLinphoneString(sip_address) + ); + + return !!address; +} + // ----------------------------------------------------------------------------- bool SipAddressesModel::removeRow (int row, const QModelIndex &parent) { @@ -309,9 +360,7 @@ void SipAddressesModel::addOrUpdateSipAddress (QVariantMap &map, const shared_pt } void SipAddressesModel::addOrUpdateSipAddress (QVariantMap &map, const shared_ptr &message) { - // FIXME: Bug in the core, count is incremented after this function call. - // So... +1! - int count = message->getChatRoom()->getUnreadMessagesCount() + 1; + int count = message->getChatRoom()->getUnreadMessagesCount(); map["timestamp"] = QDateTime::fromMSecsSinceEpoch(message->getTime() * 1000); map["unreadMessagesCount"] = count; diff --git a/linphone-desktop/src/components/sip-addresses/SipAddressesModel.hpp b/linphone-desktop/src/components/sip-addresses/SipAddressesModel.hpp index f5e1bc2c3..7876d12b1 100644 --- a/linphone-desktop/src/components/sip-addresses/SipAddressesModel.hpp +++ b/linphone-desktop/src/components/sip-addresses/SipAddressesModel.hpp @@ -50,8 +50,18 @@ public: Q_INVOKABLE ContactModel *mapSipAddressToContact (const QString &sip_address) const; Q_INVOKABLE SipAddressObserver *getSipAddressObserver (const QString &sip_address); + // --------------------------------------------------------------------------- + // Sip addresses helpers. + // --------------------------------------------------------------------------- + Q_INVOKABLE QString interpretUrl (const QString &sip_address) const; + Q_INVOKABLE QString getTransportFromSipAddress (const QString &sip_address) const; + Q_INVOKABLE QString addTransportToSipAddress (const QString &sip_address, const QString &transport) const; + Q_INVOKABLE bool sipAddressIsValid (const QString &sip_address) const; + + // --------------------------------------------------------------------------- + private: bool removeRow (int row, const QModelIndex &parent = QModelIndex()); bool removeRows (int row, int count, const QModelIndex &parent = QModelIndex()) override; diff --git a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js index aa4ab51c9..46aab78c4 100644 --- a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js +++ b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js @@ -36,20 +36,23 @@ function initForm (account) { registerEnabled.checked = config.registerEnabled publishPresence.checked = config.publishPresence avpfEnabled.checked = config.avpfEnabled + + if (account) { + dialog._sipAddressOk = true + dialog._serverAddressOk = true + } + + dialog._routeOk = true } -function handleServerAddressChanged (address) { - var newTransport = Linphone.AccountSettingsModel.getTransportFromServerAddress(address) - if (newTransport.length > 0) { - transport.currentIndex = Utils.findIndex(transport.model, function (value) { - return value === newTransport - }) - } +function formIsValid () { + return dialog._sipAddressOk && dialog._serverAddressOk && dialog._routeOk } +// ----------------------------------------------------------------------------- + function validProxyConfig () { - // TODO: Display errors on the form (if necessary). - Linphone.AccountSettingsModel.addOrUpdateProxyConfig(proxyConfig, { + if (Linphone.AccountSettingsModel.addOrUpdateProxyConfig(proxyConfig, { sipAddress: sipAddress.text, serverAddress: serverAddress.text, registrationDuration: registrationDuration.text, @@ -60,5 +63,48 @@ function validProxyConfig () { registerEnabled: registerEnabled.checked, publishPresence: publishPresence.checked, avpfEnabled: avpfEnabled.checked - }) + })) { + dialog.exit(1) + } else { + // TODO: Display errors on the form (if necessary). + } +} + +// ----------------------------------------------------------------------------- + +function handleRouteChanged (route) { + dialog._routeOk = route.length === 0 || Linphone.SipAddressesModel.sipAddressIsValid(route) +} + +function handleServerAddressChanged (address) { + if (address.length === 0) { + dialog._serverAddressOk = false + return + } + + var newTransport = Linphone.SipAddressesModel.getTransportFromSipAddress(address) + + if (newTransport.length > 0) { + transport.currentIndex = Utils.findIndex(transport.model, function (value) { + return value === newTransport + }) + dialog._serverAddressOk = true + } else { + dialog._serverAddressOk = false + } +} + +function handleSipAddressChanged (address) { + dialog._sipAddressOk = address.length > 0 && + Linphone.SipAddressesModel.sipAddressIsValid(address) +} + +function handleTransportChanged (transport) { + var newServerAddress = Linphone.SipAddressesModel.addTransportToSipAddress(serverAddress.text, transport) + if (newServerAddress.length > 0) { + serverAddress.text = newServerAddress + dialog._serverAddressOk = true + } else { + dialog._serverAddressOk = false + } } diff --git a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml index 837cddf06..0d71ec5f7 100644 --- a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml +++ b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml @@ -1,8 +1,6 @@ import QtQuick 2.7 import Common 1.0 -import Linphone 1.0 -import Utils 1.0 import App.Styles 1.0 @@ -15,6 +13,10 @@ DialogPlus { property var account // Optional. + property bool _sipAddressOk: false + property bool _serverAddressOk: false + property bool _routeOk: false + buttons: [ TextButtonA { text: qsTr('cancel') @@ -22,13 +24,10 @@ DialogPlus { onClicked: exit(0) }, TextButtonB { - enabled: sipAddress.length > 0 && serverAddress.length > 0 + enabled: Logic.formIsValid() text: qsTr('confirm') - onClicked: { - Logic.validProxyConfig() - exit(1) - } + onClicked: Logic.validProxyConfig() } ] @@ -57,6 +56,8 @@ DialogPlus { TextField { id: sipAddress + + onTextChanged: Logic.handleSipAddressChanged(text) } } } @@ -90,7 +91,10 @@ DialogPlus { ComboBox { id: transport - model: [ 'UDP', 'TCP', 'TLS' ] + enabled: dialog._serverAddressOk + model: [ 'UDP', 'TCP', 'TLS', 'DTLS' ] + + onActivated: Logic.handleTransportChanged(model[index]) } } } @@ -101,6 +105,8 @@ DialogPlus { TextField { id: route + + onTextChanged: Logic.handleRouteChanged(text) } } } diff --git a/submodules/belle-sip b/submodules/belle-sip index 3bd0d610e..fd7a289c8 160000 --- a/submodules/belle-sip +++ b/submodules/belle-sip @@ -1 +1 @@ -Subproject commit 3bd0d610e68c6282a470339b82e1e75d937e050d +Subproject commit fd7a289c80d3285684ac7bdfd6528d93f94d895f diff --git a/submodules/linphone b/submodules/linphone index f40bc26db..5e02b53ee 160000 --- a/submodules/linphone +++ b/submodules/linphone @@ -1 +1 @@ -Subproject commit f40bc26db4e92e61e617517c672f9a92e62f21a6 +Subproject commit 5e02b53ee66b73e64bfc41e6ac2ed74296f42f60