blob: 29ddbbede481023f8e4b0f914fde190fc24f9984 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaretbab169d2016-01-07 15:13:33 -05002 * Copyright (C) 2015-2016 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 Milaretb1b00ce2016-02-03 14:10:05 -050031#include "ringtonemodel.h"
Edric Milaret627500d2015-03-27 16:41:40 -040032
33AccountDetails::AccountDetails(QWidget *parent) :
34 QWidget(parent),
35 ui(new Ui::AccountDetails),
36 codecModel_(nullptr),
Edric Milaret2d03da42015-07-15 15:36:43 -040037 currentAccount_(nullptr)
Edric Milaret627500d2015-03-27 16:41:40 -040038{
39 ui->setupUi(this);
40
Edric Milaretc9d3e412015-08-11 15:43:04 -040041 setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
42
Edric Milaret627500d2015-03-27 16:41:40 -040043 ui->audioCodecView->setShowGrid(false);
Edric Milarete5313852015-11-09 13:06:00 -050044 ui->audioCodecView->verticalHeader()->hide();
45 ui->audioCodecView->horizontalHeader()->hide();
Edric Milaret627500d2015-03-27 16:41:40 -040046 ui->videoCodecView->setShowGrid(false);
Edric Milarete5313852015-11-09 13:06:00 -050047 ui->videoCodecView->verticalHeader()->hide();
Edric Milaretfb5b4382015-11-09 13:53:27 -050048 ui->videoCodecView->horizontalHeader()->hide();
Edric Milaret627500d2015-03-27 16:41:40 -040049
Edric Milaret3e6aefe2015-06-05 16:07:26 -040050 ui->lrcfg_username->setAlignment(Qt::AlignCenter);
Edric Milaret627500d2015-03-27 16:41:40 -040051
Edric Milaret3e6aefe2015-06-05 16:07:26 -040052 connect(ui->lrcfg_tlsCaListCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
53 connect(ui->lrcfg_tlsCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
54 connect(ui->lrcfg_tlsPrivateKeyCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
Edric Milaretdda49b62016-02-05 14:27:38 -050055
56 connect(&RingtoneModel::instance(),
57 &RingtoneModel::dataChanged,
58 [=](const QModelIndex& topLeft, const QModelIndex& bottomRight) {
59 Q_UNUSED(topLeft)
60 Q_UNUSED(bottomRight)
61 if (not currentAccount_)
62 return;
63 if (RingtoneModel::instance().isPlaying())
64 ui->playButton->setText(tr("Pause"));
65 else
66 ui->playButton->setText(tr("Play"));
67
68 });
Edric Milaret627500d2015-03-27 16:41:40 -040069}
70
71AccountDetails::~AccountDetails()
72{
73 delete ui;
74}
75
76void
Edric Milaret627500d2015-03-27 16:41:40 -040077AccountDetails::setAccount(Account* currentAccount) {
78
Edric Milaret3e6aefe2015-06-05 16:07:26 -040079 if (currentAccount_) {
Edric Milaretdda49b62016-02-05 14:27:38 -050080 stopRingtone();
81 save();
Edric Milaret3e6aefe2015-06-05 16:07:26 -040082 }
83
Edric Milaret627500d2015-03-27 16:41:40 -040084 currentAccount_ = currentAccount;
85
Edric Milareted0b2802015-10-01 15:10:02 -040086 ui->lrcfg_username->setReadOnly(currentAccount_->protocol() == Account::Protocol::RING);
87
Edric Milaret627500d2015-03-27 16:41:40 -040088 codecModel_ = currentAccount->codecModel();
Edric Milarete5313852015-11-09 13:06:00 -050089 ui->audioCodecView->setModel(codecModel_->audioCodecs());
90 ui->videoCodecView->setModel(codecModel_->videoCodecs());
91 connect(ui->audioCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
92 this, SLOT(audioCodecSelectionChanged(QItemSelection,QItemSelection)));
93 connect(ui->videoCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
94 this, SLOT(videoCodecSelectionChanged(QItemSelection,QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -040095
Edric Milaret3e6aefe2015-06-05 16:07:26 -040096 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
97 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -040098
Edric Milaret3e6aefe2015-06-05 16:07:26 -040099 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -0400100
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400101 if (currentAccount_->isPublishedSameAsLocal())
102 ui->puslishedSameAsLocalRadio->setChecked(true);
103 else
104 ui->customPublishedRadio->setChecked(true);
105
106 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
107 ui->publishGroup->setId(ui->customPublishedRadio, 0);
108 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
109 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
110
111 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
112 [=](int id) {
113 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
114 });
115
116 switch (currentAccount_->DTMFType()) {
117 case DtmfType::OverRtp:
118 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400119 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400120 case DtmfType::OverSip:
121 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400122 break;
123 }
124
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400125 ui->dtmfGroup->disconnect();
126 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
127 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400128
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400129 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
130 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
131
132 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
133 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
134
135 if (currentAccount_->tlsCaListCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400136 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400137 if (currentAccount_->tlsCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400138 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path());
139 if (not currentAccount_->tlsPrivateKey().isEmpty())
140 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKey());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400141
Edric Milaret36587362016-02-04 12:30:52 -0500142#ifdef Q_OS_WIN
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400143 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
144 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400145 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKey;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400146#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400147
148 ui->srtpEnabled->disconnect();
149 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
150 currentAccount_->setSrtpEnabled(checked);
151 ui->lrcfg_srtpRtpFallback->setEnabled(checked);
152 ui->keyExchangeModelCombo->setEnabled(checked);
153 });
154
155 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
156
157 if (currentAccount_->cipherModel()->useDefault())
158 ui->defaultCipherRadio->setChecked(true);
159 else
160 ui->customCipherRadio->setChecked(true);
161
162 connect(ui->defaultCipherRadio, &QRadioButton::toggled, [=](bool checked) {
163 currentAccount_->cipherModel()->setUseDefault(checked);
164 });
165
166 ui->cipherListView->setModel(currentAccount_->cipherModel());
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500167
168 disconnect(ui->ringtonesBox);
169 ui->ringtonesBox->setModel(&RingtoneModel::instance());
170 ui->ringtonesBox->setCurrentIndex(RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex().row());
171 connect(ui->ringtonesBox, SIGNAL(currentIndexChanged(int)), this, SLOT(ringtonesBoxCurrentIndexChanged(int)));
Edric Milaret627500d2015-03-27 16:41:40 -0400172}
173
174void
Edric Milarete5313852015-11-09 13:06:00 -0500175AccountDetails::on_upAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400176 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400177}
178
179void
Edric Milarete5313852015-11-09 13:06:00 -0500180AccountDetails::on_downAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400181 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400182}
183
184void
Edric Milarete5313852015-11-09 13:06:00 -0500185AccountDetails::on_upVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400186 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400187}
188
189void
Edric Milarete5313852015-11-09 13:06:00 -0500190AccountDetails::on_downVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400191 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400192}
193
194void
195AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400196 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400197}
198
199void
Edric Milarete5313852015-11-09 13:06:00 -0500200AccountDetails::onCertButtonClicked() {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400201 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
202 "",
203 tr("Files (*)"));
204
205 auto sender = QObject::sender();
206
207 (currentAccount_->*certMap_[sender->objectName()])(fileName);
Edric Milaret9f6b5192016-02-02 15:14:27 -0500208 if (not fileName.isEmpty())
209 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400210}
Edric Milarete5313852015-11-09 13:06:00 -0500211
212void
213AccountDetails::audioCodecSelectionChanged(const QItemSelection& selected,
214 const QItemSelection& deselected) {
215 Q_UNUSED(deselected)
216 if (not codecModel_ || selected.empty())
217 return;
218 auto idx = codecModel_->audioCodecs()->mapToSource(selected.indexes().at(0));
219 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
220}
221
222void
223AccountDetails::videoCodecSelectionChanged(const QItemSelection& selected,
224 const QItemSelection& deselected) {
225 Q_UNUSED(deselected)
226 if (not codecModel_ || selected.empty())
227 return;
228 auto idx = codecModel_->videoCodecs()->mapToSource(selected.indexes().at(0));
229 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
230}
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500231
232void
233AccountDetails::ringtonesBoxCurrentIndexChanged(int index)
234{
235 RingtoneModel::instance().selectionModel(currentAccount_)->setCurrentIndex(
236 RingtoneModel::instance().index(index, 0), QItemSelectionModel::ClearAndSelect);
237}
238
239void
240AccountDetails::on_playButton_clicked()
241{
242 RingtoneModel::instance().play(RingtoneModel::instance().index(
243 ui->ringtonesBox->currentIndex(), 0));
244}
Edric Milaretdda49b62016-02-05 14:27:38 -0500245
246void
247AccountDetails::stopRingtone() {
248 if (not currentAccount_)
249 return;
250 auto idx = RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex();
251 if (RingtoneModel::instance().isPlaying())
252 RingtoneModel::instance().play(idx);
253}