diff --git a/linphone-desktop/assets/languages/en.ts b/linphone-desktop/assets/languages/en.ts
index ae6ea3725..558d67614 100644
--- a/linphone-desktop/assets/languages/en.ts
+++ b/linphone-desktop/assets/languages/en.ts
@@ -864,6 +864,14 @@ Server url not configured.
avpfEnabledLabel
Enable AVPF
+
+ cancel
+ CANCEL
+
+
+ confirm
+ CONFIRM
+
SettingsUi
diff --git a/linphone-desktop/assets/languages/fr.ts b/linphone-desktop/assets/languages/fr.ts
index a560b405f..853887279 100644
--- a/linphone-desktop/assets/languages/fr.ts
+++ b/linphone-desktop/assets/languages/fr.ts
@@ -864,6 +864,14 @@ Url du serveur non configurée.
avpfEnabledLabel
Activer AVPF
+
+ cancel
+ ANNULER
+
+
+ confirm
+ CONFIRMER
+
SettingsUi
diff --git a/linphone-desktop/src/components/settings/AccountSettingsModel.cpp b/linphone-desktop/src/components/settings/AccountSettingsModel.cpp
index 4eb63e490..995a90da2 100644
--- a/linphone-desktop/src/components/settings/AccountSettingsModel.cpp
+++ b/linphone-desktop/src/components/settings/AccountSettingsModel.cpp
@@ -34,7 +34,13 @@ QVariantMap AccountSettingsModel::getProxyConfigDescription (const std::shared_p
QVariantMap map;
- map["sipAddress"] = ::Utils::linphoneStringToQString(proxy_config->getIdentityAddress()->asStringUriOnly());
+ {
+ const shared_ptr address = proxy_config->getIdentityAddress();
+ map["sipAddress"] = address
+ ? ::Utils::linphoneStringToQString(proxy_config->getIdentityAddress()->asStringUriOnly())
+ : "";
+ }
+
map["serverAddress"] = ::Utils::linphoneStringToQString(proxy_config->getServerAddr());
map["registrationDuration"] = proxy_config->getPublishExpires();
map["transport"] = ::Utils::linphoneStringToQString(proxy_config->getTransport());
@@ -58,6 +64,105 @@ void AccountSettingsModel::removeProxyConfig (const shared_ptr &proxy_config,
+ const QVariantMap &data
+) {
+ shared_ptr core = CoreManager::getInstance()->getCore();
+ QString literal = data["sipAddress"].toString();
+
+ // Sip address.
+ {
+ shared_ptr address = linphone::Factory::get()->createAddress(
+ ::Utils::qStringToLinphoneString(literal)
+ );
+ if (!address) {
+ qWarning() << QStringLiteral("Unable to create sip address object from: `%1`.").arg(literal);
+ return;
+ }
+
+ proxy_config->setIdentityAddress(address);
+ }
+
+ // Server address.
+ {
+ QString q_server_address = data["serverAddress"].toString();
+ string s_server_address = ::Utils::qStringToLinphoneString(q_server_address);
+
+ 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;
+ }
+ }
+ }
+
+ proxy_config->setPublishExpires(data["registrationDuration"].toInt());
+ proxy_config->setRoute(::Utils::qStringToLinphoneString(data["route"].toString()));
+ proxy_config->setContactParameters(::Utils::qStringToLinphoneString(data["contactParams"].toString()));
+ proxy_config->setAvpfRrInterval(data["contactParams"].toInt());
+ proxy_config->enableRegister(data["registerEnabled"].toBool());
+ proxy_config->enablePublish(data["publishEnabled"].toBool());
+ proxy_config->setAvpfMode(data["avpfEnabled"].toBool()
+ ? linphone::AVPFMode::AVPFModeEnabled
+ : linphone::AVPFMode::AVPFModeDefault
+ );
+
+ list > proxy_configs = core->getProxyConfigList();
+ 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;
+ }
+ } else if (core->addProxyConfig(proxy_config) == -1) {
+ qWarning() << QStringLiteral("Unable to add proxy config: `%1`.").arg(literal);
+ return;
+ }
+
+ emit accountSettingsUpdated();
+}
+
+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 dfe7f7a6e..52d827ecd 100644
--- a/linphone-desktop/src/components/settings/AccountSettingsModel.hpp
+++ b/linphone-desktop/src/components/settings/AccountSettingsModel.hpp
@@ -44,9 +44,16 @@ public:
AccountSettingsModel (QObject *parent = Q_NULLPTR) : QObject(parent) {}
Q_INVOKABLE QVariantMap getProxyConfigDescription (const std::shared_ptr &proxy_config);
+
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 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/ui/modules/Common/Dialog/ConfirmDialog.qml b/linphone-desktop/ui/modules/Common/Dialog/ConfirmDialog.qml
index 016f4d34d..7a88e8a82 100644
--- a/linphone-desktop/ui/modules/Common/Dialog/ConfirmDialog.qml
+++ b/linphone-desktop/ui/modules/Common/Dialog/ConfirmDialog.qml
@@ -12,7 +12,7 @@ DialogPlus {
onClicked: exit(0)
},
- TextButtonA {
+ TextButtonB {
text: qsTr('confirm')
onClicked: exit(1)
diff --git a/linphone-desktop/ui/views/App/Settings/SettingsSipAccounts.qml b/linphone-desktop/ui/views/App/Settings/SettingsSipAccounts.qml
index f3ea06df5..f4c378be6 100644
--- a/linphone-desktop/ui/views/App/Settings/SettingsSipAccounts.qml
+++ b/linphone-desktop/ui/views/App/Settings/SettingsSipAccounts.qml
@@ -121,6 +121,8 @@ TabContainer {
TextButtonB {
text: qsTr('addAccount')
+
+ onClicked: Logic.editAccount()
}
}
}
diff --git a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js
index e7f3db53a..aa4ab51c9 100644
--- a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js
+++ b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.js
@@ -8,21 +8,27 @@
// =============================================================================
-function initForm (account) {
- if (!account) {
- return
- }
+var proxyConfig
- var config = Linphone.AccountSettingsModel.getProxyConfigDescription(account.proxyConfig)
+function initForm (account) {
+ var AccountSettingsModel = Linphone.AccountSettingsModel
+
+ proxyConfig = account
+ ? account.proxyConfig
+ : AccountSettingsModel.createProxyConfig()
+
+ var config = AccountSettingsModel.getProxyConfigDescription(proxyConfig)
sipAddress.text = config.sipAddress
serverAddress.text = config.serverAddress
registrationDuration.text = config.registrationDuration
var currentTransport = config.transport.toUpperCase()
- transport.currentIndex = Utils.findIndex(transport.model, function (value) {
- return value === currentTransport
- })
+ transport.currentIndex = Number(
+ Utils.findIndex(transport.model, function (value) {
+ return value === currentTransport
+ })
+ )
route.text = config.route
contactParams.text = config.contactParams
@@ -31,3 +37,28 @@ function initForm (account) {
publishPresence.checked = config.publishPresence
avpfEnabled.checked = config.avpfEnabled
}
+
+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 validProxyConfig () {
+ // TODO: Display errors on the form (if necessary).
+ Linphone.AccountSettingsModel.addOrUpdateProxyConfig(proxyConfig, {
+ sipAddress: sipAddress.text,
+ serverAddress: serverAddress.text,
+ registrationDuration: registrationDuration.text,
+ transport: transport.currentText,
+ route: route.text,
+ contactParams: contactParams.text,
+ avpfInterval: avpfInterval.text,
+ registerEnabled: registerEnabled.checked,
+ publishPresence: publishPresence.checked,
+ avpfEnabled: avpfEnabled.checked
+ })
+}
diff --git a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml
index ec79597f0..837cddf06 100644
--- a/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml
+++ b/linphone-desktop/ui/views/App/Settings/SettingsSipAccountsEdit.qml
@@ -10,8 +10,29 @@ import 'SettingsSipAccountsEdit.js' as Logic
// =============================================================================
-ConfirmDialog {
- property var account
+DialogPlus {
+ id: dialog
+
+ property var account // Optional.
+
+ buttons: [
+ TextButtonA {
+ text: qsTr('cancel')
+
+ onClicked: exit(0)
+ },
+ TextButtonB {
+ enabled: sipAddress.length > 0 && serverAddress.length > 0
+ text: qsTr('confirm')
+
+ onClicked: {
+ Logic.validProxyConfig()
+ exit(1)
+ }
+ }
+ ]
+
+ centeredButtons: true
height: SettingsSipAccountsEditStyle.height
width: SettingsSipAccountsEditStyle.width
@@ -25,9 +46,9 @@ ConfirmDialog {
Form {
anchors {
left: parent.left
- leftMargin: ManageAccountsStyle.leftMargin
+ leftMargin: SettingsSipAccountsEditStyle.leftMargin
right: parent.right
- rightMargin: ManageAccountsStyle.rightMargin
+ rightMargin: SettingsSipAccountsEditStyle.rightMargin
}
FormLine {
@@ -46,6 +67,8 @@ ConfirmDialog {
TextField {
id: serverAddress
+
+ onTextChanged: Logic.handleServerAddressChanged(text)
}
}
}
@@ -67,7 +90,7 @@ ConfirmDialog {
ComboBox {
id: transport
- model: [ 'TCP', 'UDP', 'TLS' ]
+ model: [ 'UDP', 'TCP', 'TLS' ]
}
}
}
@@ -98,6 +121,9 @@ ConfirmDialog {
NumericField {
id: avpfInterval
+
+ maxValue: 5
+ minValue: 1
}
}
}
@@ -108,6 +134,8 @@ ConfirmDialog {
Switch {
id: registerEnabled
+
+ onClicked: checked = !checked
}
}
}
@@ -118,6 +146,8 @@ ConfirmDialog {
Switch {
id: publishPresence
+
+ onClicked: checked = !checked
}
}
}
@@ -128,6 +158,8 @@ ConfirmDialog {
Switch {
id: avpfEnabled
+
+ onClicked: checked = !checked
}
}
}
diff --git a/linphone-desktop/ui/views/App/Styles/Settings/SettingsSipAccountsEditStyle.qml b/linphone-desktop/ui/views/App/Styles/Settings/SettingsSipAccountsEditStyle.qml
index 4fabb6450..e9c2c4a56 100644
--- a/linphone-desktop/ui/views/App/Styles/Settings/SettingsSipAccountsEditStyle.qml
+++ b/linphone-desktop/ui/views/App/Styles/Settings/SettingsSipAccountsEditStyle.qml
@@ -5,5 +5,7 @@ import QtQuick 2.7
QtObject {
property int height: 550
+ property int leftMargin: 35
+ property int rightMargin: 35
property int width: 600
}