blob: 800437396e79fd0c85d2b92493af498138ff04fd [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaret5f316da2015-09-28 11:57:42 -04002 * Copyright (C) 2015 by Savoir-faire Linux *
Edric Milaret627500d2015-03-27 16:41:40 -04003 * Author: Edric Ladent Milaret <edric.ladent-milaret@savoirfairelinux.com>*
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 3 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
17 **************************************************************************/
18
19#include "accountdetails.h"
20#include "ui_accountdetails.h"
21
22#include <QSortFilterProxyModel>
Edric Milaret3e6aefe2015-06-05 16:07:26 -040023#include <QFileDialog>
24#include <QPushButton>
Edric Milaret627500d2015-03-27 16:41:40 -040025
Edric Milaret627500d2015-03-27 16:41:40 -040026#include "accountdetails.h"
27#include "audio/codecmodel.h"
Edric Milaret3e6aefe2015-06-05 16:07:26 -040028#include "protocolmodel.h"
29#include "certificate.h"
30#include "ciphermodel.h"
Edric Milaret627500d2015-03-27 16:41:40 -040031
32AccountDetails::AccountDetails(QWidget *parent) :
33 QWidget(parent),
34 ui(new Ui::AccountDetails),
35 codecModel_(nullptr),
Edric Milaret2d03da42015-07-15 15:36:43 -040036 currentAccount_(nullptr)
Edric Milaret627500d2015-03-27 16:41:40 -040037{
38 ui->setupUi(this);
39
Edric Milaretc9d3e412015-08-11 15:43:04 -040040 setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
41
Edric Milaret627500d2015-03-27 16:41:40 -040042 ui->audioCodecView->setShowGrid(false);
Edric Milarete5313852015-11-09 13:06:00 -050043 ui->audioCodecView->verticalHeader()->hide();
44 ui->audioCodecView->horizontalHeader()->hide();
Edric Milaret627500d2015-03-27 16:41:40 -040045 ui->videoCodecView->setShowGrid(false);
Edric Milarete5313852015-11-09 13:06:00 -050046 ui->videoCodecView->verticalHeader()->hide();
47 ui->audioCodecView->horizontalHeader()->hide();
Edric Milaret627500d2015-03-27 16:41:40 -040048
Edric Milaret3e6aefe2015-06-05 16:07:26 -040049 ui->lrcfg_username->setAlignment(Qt::AlignCenter);
Edric Milaret627500d2015-03-27 16:41:40 -040050
Edric Milaret3e6aefe2015-06-05 16:07:26 -040051 connect(ui->lrcfg_tlsCaListCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
52 connect(ui->lrcfg_tlsCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
53 connect(ui->lrcfg_tlsPrivateKeyCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
Edric Milaret627500d2015-03-27 16:41:40 -040054}
55
56AccountDetails::~AccountDetails()
57{
58 delete ui;
59}
60
61void
Edric Milaret627500d2015-03-27 16:41:40 -040062AccountDetails::setAccount(Account* currentAccount) {
63
Edric Milaret3e6aefe2015-06-05 16:07:26 -040064 if (currentAccount_) {
65 currentAccount_->performAction(Account::EditAction::SAVE);
66 }
67
Edric Milaret627500d2015-03-27 16:41:40 -040068 currentAccount_ = currentAccount;
69
Edric Milareted0b2802015-10-01 15:10:02 -040070 ui->lrcfg_username->setReadOnly(currentAccount_->protocol() == Account::Protocol::RING);
71
Edric Milaret627500d2015-03-27 16:41:40 -040072 codecModel_ = currentAccount->codecModel();
Edric Milarete5313852015-11-09 13:06:00 -050073 ui->audioCodecView->setModel(codecModel_->audioCodecs());
74 ui->videoCodecView->setModel(codecModel_->videoCodecs());
75 connect(ui->audioCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
76 this, SLOT(audioCodecSelectionChanged(QItemSelection,QItemSelection)));
77 connect(ui->videoCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
78 this, SLOT(videoCodecSelectionChanged(QItemSelection,QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -040079
Edric Milaret3e6aefe2015-06-05 16:07:26 -040080 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
81 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -040082
Edric Milaret3e6aefe2015-06-05 16:07:26 -040083 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -040084
Edric Milaret3e6aefe2015-06-05 16:07:26 -040085 if (currentAccount_->isPublishedSameAsLocal())
86 ui->puslishedSameAsLocalRadio->setChecked(true);
87 else
88 ui->customPublishedRadio->setChecked(true);
89
90 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
91 ui->publishGroup->setId(ui->customPublishedRadio, 0);
92 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
93 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
94
95 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
96 [=](int id) {
97 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
98 });
99
100 switch (currentAccount_->DTMFType()) {
101 case DtmfType::OverRtp:
102 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400103 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400104 case DtmfType::OverSip:
105 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400106 break;
107 }
108
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400109 ui->dtmfGroup->disconnect();
110 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
111 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400112
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400113 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
114 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
115
116 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
117 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
118
119 if (currentAccount_->tlsCaListCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400120 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400121 if (currentAccount_->tlsCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400122 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path());
123 if (not currentAccount_->tlsPrivateKey().isEmpty())
124 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKey());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400125
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400126#ifdef Q_OS_WIN32
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400127 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
128 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400129 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKey;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400130#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400131
132 ui->srtpEnabled->disconnect();
133 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
134 currentAccount_->setSrtpEnabled(checked);
135 ui->lrcfg_srtpRtpFallback->setEnabled(checked);
136 ui->keyExchangeModelCombo->setEnabled(checked);
137 });
138
139 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
140
141 if (currentAccount_->cipherModel()->useDefault())
142 ui->defaultCipherRadio->setChecked(true);
143 else
144 ui->customCipherRadio->setChecked(true);
145
146 connect(ui->defaultCipherRadio, &QRadioButton::toggled, [=](bool checked) {
147 currentAccount_->cipherModel()->setUseDefault(checked);
148 });
149
150 ui->cipherListView->setModel(currentAccount_->cipherModel());
Edric Milaret627500d2015-03-27 16:41:40 -0400151}
152
153void
Edric Milarete5313852015-11-09 13:06:00 -0500154AccountDetails::on_upAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400155 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400156}
157
158void
Edric Milarete5313852015-11-09 13:06:00 -0500159AccountDetails::on_downAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400160 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400161}
162
163void
Edric Milarete5313852015-11-09 13:06:00 -0500164AccountDetails::on_upVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400165 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400166}
167
168void
Edric Milarete5313852015-11-09 13:06:00 -0500169AccountDetails::on_downVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400170 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400171}
172
173void
174AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400175 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400176}
177
178void
Edric Milarete5313852015-11-09 13:06:00 -0500179AccountDetails::onCertButtonClicked() {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400180 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
181 "",
182 tr("Files (*)"));
183
184 auto sender = QObject::sender();
185
186 (currentAccount_->*certMap_[sender->objectName()])(fileName);
187
188 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400189}
Edric Milarete5313852015-11-09 13:06:00 -0500190
191void
192AccountDetails::audioCodecSelectionChanged(const QItemSelection& selected,
193 const QItemSelection& deselected) {
194 Q_UNUSED(deselected)
195 if (not codecModel_ || selected.empty())
196 return;
197 auto idx = codecModel_->audioCodecs()->mapToSource(selected.indexes().at(0));
198 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
199}
200
201void
202AccountDetails::videoCodecSelectionChanged(const QItemSelection& selected,
203 const QItemSelection& deselected) {
204 Q_UNUSED(deselected)
205 if (not codecModel_ || selected.empty())
206 return;
207 auto idx = codecModel_->videoCodecs()->mapToSource(selected.indexes().at(0));
208 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
209}