blob: d21f67374f8c28a55969e1799163c03741880af7 [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Nicolas Jager74fe46f2016-02-29 14:55:09 -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"
Edric Milarete82782e2016-03-21 12:14:17 -040027#include "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
Nicolas Jager584a80e2016-03-18 16:10:00 -040043 connect(ui->lrcfg_tlsCaListCertificate, &RingButton::clicked, this, &AccountDetails::onCertButtonClicked);
44 connect(ui->lrcfg_tlsCertificate, &RingButton::clicked, this, &AccountDetails::onCertButtonClicked);
45 connect(ui->lrcfg_tlsPrivateKeyCertificate, &RingButton::clicked, this, &AccountDetails::onCertButtonClicked);
Edric Milaretdda49b62016-02-05 14:27:38 -050046
47 connect(&RingtoneModel::instance(),
48 &RingtoneModel::dataChanged,
49 [=](const QModelIndex& topLeft, const QModelIndex& bottomRight) {
50 Q_UNUSED(topLeft)
51 Q_UNUSED(bottomRight)
52 if (not currentAccount_)
53 return;
54 if (RingtoneModel::instance().isPlaying())
55 ui->playButton->setText(tr("Pause"));
56 else
57 ui->playButton->setText(tr("Play"));
58
59 });
Nicolas Jagere6384052016-03-10 13:13:24 -050060
61 connect(ui->lrcfg_tlsEnabled, &QCheckBox::stateChanged, [=] (int state) {
62 if(state == Qt::Checked) {
63 ui->negoEncry_1->setVisible(currentAccount_->protocol() != Account::Protocol::RING);
64 ui->negoEncry_2->setVisible(true);
65 ui->defaultCipherCheckBox->setVisible(currentAccount_->protocol() != Account::Protocol::RING);
66 ui->cipherListView->setVisible(!ui->defaultCipherCheckBox->isChecked()
67 && currentAccount_->protocol() != Account::Protocol::RING);
68 } else {
69 ui->negoEncry_1->setVisible(false);
70 ui->negoEncry_2->setVisible(false);
71 ui->defaultCipherCheckBox->setVisible(false);
72 ui->cipherListView->setVisible(false);
73 }
74 });
75
76 connect(ui->defaultCipherCheckBox, &QCheckBox::stateChanged, [=] (int state) {
77 if (state == Qt::Checked) {
78 ui->cipherListView->setVisible(false);
79 currentAccount_->cipherModel()->setUseDefault(true);
80 } else {
81 ui->cipherListView->setVisible(true);
82 currentAccount_->cipherModel()->setUseDefault(false);
83 }
84 });
Edric Milaret13438312016-03-18 13:27:46 -040085
86 connect(ui->lrcfg_alias, &QLineEdit::textEdited, [=](const QString& newAlias) {
87 if (currentAccount_ && currentAccount_->protocol() == Account::Protocol::RING)
88 currentAccount_->setDisplayName(newAlias);
89 });
Edric Milaret627500d2015-03-27 16:41:40 -040090}
91
92AccountDetails::~AccountDetails()
93{
94 delete ui;
95}
96
97void
Edric Milaret627500d2015-03-27 16:41:40 -040098AccountDetails::setAccount(Account* currentAccount) {
99
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400100 if (currentAccount_) {
Edric Milaretdda49b62016-02-05 14:27:38 -0500101 stopRingtone();
102 save();
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400103 }
104
Edric Milaret627500d2015-03-27 16:41:40 -0400105 currentAccount_ = currentAccount;
106
Edric Milaretce0ea472016-04-12 10:16:56 -0400107 if (currentAccount_ == nullptr)
108 return;
109
Edric Milareted0b2802015-10-01 15:10:02 -0400110 ui->lrcfg_username->setReadOnly(currentAccount_->protocol() == Account::Protocol::RING);
111
Edric Milaret627500d2015-03-27 16:41:40 -0400112 codecModel_ = currentAccount->codecModel();
Edric Milarete5313852015-11-09 13:06:00 -0500113 ui->audioCodecView->setModel(codecModel_->audioCodecs());
114 ui->videoCodecView->setModel(codecModel_->videoCodecs());
115 connect(ui->audioCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
116 this, SLOT(audioCodecSelectionChanged(QItemSelection,QItemSelection)));
117 connect(ui->videoCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
118 this, SLOT(videoCodecSelectionChanged(QItemSelection,QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -0400119
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400120 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
121 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -0400122
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400123 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -0400124
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400125 if (currentAccount_->isPublishedSameAsLocal())
126 ui->puslishedSameAsLocalRadio->setChecked(true);
127 else
128 ui->customPublishedRadio->setChecked(true);
129
130 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
131 ui->publishGroup->setId(ui->customPublishedRadio, 0);
132 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
133 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
134
Nicolas Jagere6384052016-03-10 13:13:24 -0500135 connect(ui->publishGroup,
136 static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
137 [=](int id) {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400138 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
139 });
140
141 switch (currentAccount_->DTMFType()) {
142 case DtmfType::OverRtp:
143 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400144 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400145 case DtmfType::OverSip:
146 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400147 break;
148 }
149
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400150 ui->dtmfGroup->disconnect();
151 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
152 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400153
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400154 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
Nicolas Jagere6384052016-03-10 13:13:24 -0500155 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400156
157 if (currentAccount_->tlsCaListCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400158 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400159 if (currentAccount_->tlsCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400160 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path());
161 if (not currentAccount_->tlsPrivateKey().isEmpty())
162 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKey());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400163
Edric Milaret36587362016-02-04 12:30:52 -0500164#ifdef Q_OS_WIN
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400165 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
166 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400167 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKey;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400168#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400169
170 ui->srtpEnabled->disconnect();
171 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
172 currentAccount_->setSrtpEnabled(checked);
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400173 });
174
175 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
176
177 if (currentAccount_->cipherModel()->useDefault())
Nicolas Jagere6384052016-03-10 13:13:24 -0500178 ui->defaultCipherCheckBox->setChecked(true);
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400179 else
Nicolas Jagere6384052016-03-10 13:13:24 -0500180 ui->defaultCipherCheckBox->setChecked(false);
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400181
182 ui->cipherListView->setModel(currentAccount_->cipherModel());
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500183
184 disconnect(ui->ringtonesBox);
185 ui->ringtonesBox->setModel(&RingtoneModel::instance());
186 ui->ringtonesBox->setCurrentIndex(RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex().row());
187 connect(ui->ringtonesBox, SIGNAL(currentIndexChanged(int)), this, SLOT(ringtonesBoxCurrentIndexChanged(int)));
Nicolas Jagere6384052016-03-10 13:13:24 -0500188
189 auto accountProtocol = currentAccount_->protocol();
190 if (accountProtocol == Account::Protocol::RING) {
191 ui->medStreaEncry->setVisible(false);
192 ui->lrcfg_tlsEnabled->setVisible(false);
193 } else if (accountProtocol == Account::Protocol::SIP) {
194 ui->medStreaEncry->setVisible(true);
195 ui->lrcfg_tlsEnabled->setVisible(true);
196 }
197
198 if (ui->lrcfg_tlsEnabled->checkState() == Qt::Checked) {
199 ui->negoEncry_1->setVisible(true);
200 ui->negoEncry_2->setVisible(true);
201 ui->defaultCipherCheckBox->setVisible(currentAccount_->protocol() != Account::Protocol::RING);
202 } else {
203 ui->negoEncry_1->setVisible(false);
204 ui->negoEncry_2->setVisible(false);
205 ui->defaultCipherCheckBox->setVisible(false);
206 ui->cipherListView->setVisible(false);
207 }
208
209 if (ui->defaultCipherCheckBox->checkState() == Qt::Checked)
210 ui->cipherListView->setVisible(false);
211 else
212 ui->cipherListView->setVisible(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400213}
214
215void
Edric Milarete5313852015-11-09 13:06:00 -0500216AccountDetails::on_upAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400217 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400218}
219
220void
Edric Milarete5313852015-11-09 13:06:00 -0500221AccountDetails::on_downAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400222 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400223}
224
225void
Edric Milarete5313852015-11-09 13:06:00 -0500226AccountDetails::on_upVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400227 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400228}
229
230void
Edric Milarete5313852015-11-09 13:06:00 -0500231AccountDetails::on_downVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400232 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400233}
234
235void
236AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400237 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400238}
239
240void
Edric Milarete5313852015-11-09 13:06:00 -0500241AccountDetails::onCertButtonClicked() {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400242 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
Nicolas Jagere6384052016-03-10 13:13:24 -0500243 "",
244 tr("Files (*)"));
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400245
246 auto sender = QObject::sender();
247
248 (currentAccount_->*certMap_[sender->objectName()])(fileName);
Edric Milaret9f6b5192016-02-02 15:14:27 -0500249 if (not fileName.isEmpty())
250 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400251}
Edric Milarete5313852015-11-09 13:06:00 -0500252
253void
254AccountDetails::audioCodecSelectionChanged(const QItemSelection& selected,
255 const QItemSelection& deselected) {
256 Q_UNUSED(deselected)
257 if (not codecModel_ || selected.empty())
258 return;
259 auto idx = codecModel_->audioCodecs()->mapToSource(selected.indexes().at(0));
260 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
261}
262
263void
264AccountDetails::videoCodecSelectionChanged(const QItemSelection& selected,
265 const QItemSelection& deselected) {
266 Q_UNUSED(deselected)
267 if (not codecModel_ || selected.empty())
268 return;
269 auto idx = codecModel_->videoCodecs()->mapToSource(selected.indexes().at(0));
270 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
271}
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500272
273void
274AccountDetails::ringtonesBoxCurrentIndexChanged(int index)
275{
276 RingtoneModel::instance().selectionModel(currentAccount_)->setCurrentIndex(
277 RingtoneModel::instance().index(index, 0), QItemSelectionModel::ClearAndSelect);
278}
279
280void
281AccountDetails::on_playButton_clicked()
282{
283 RingtoneModel::instance().play(RingtoneModel::instance().index(
284 ui->ringtonesBox->currentIndex(), 0));
285}
Edric Milaretdda49b62016-02-05 14:27:38 -0500286
287void
288AccountDetails::stopRingtone() {
289 if (not currentAccount_)
290 return;
291 auto idx = RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex();
292 if (RingtoneModel::instance().isPlaying())
293 RingtoneModel::instance().play(idx);
294}
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500295
296QPushButton*
297AccountDetails::getDeleteAccountButton()
298{
299 return ui->deleteAccountButton;
300}
301