blob: 85d49af05ae59b78ce130b580662b90b8de02db6 [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"
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 Milaret3e6aefe2015-06-05 16:07:26 -040043 connect(ui->lrcfg_tlsCaListCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
44 connect(ui->lrcfg_tlsCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
45 connect(ui->lrcfg_tlsPrivateKeyCertificate, SIGNAL(clicked(bool)), this, SLOT(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 });
Edric Milaret627500d2015-03-27 16:41:40 -040060}
61
62AccountDetails::~AccountDetails()
63{
64 delete ui;
65}
66
67void
Edric Milaret627500d2015-03-27 16:41:40 -040068AccountDetails::setAccount(Account* currentAccount) {
69
Edric Milaret3e6aefe2015-06-05 16:07:26 -040070 if (currentAccount_) {
Edric Milaretdda49b62016-02-05 14:27:38 -050071 stopRingtone();
72 save();
Edric Milaret3e6aefe2015-06-05 16:07:26 -040073 }
74
Edric Milaret627500d2015-03-27 16:41:40 -040075 currentAccount_ = currentAccount;
76
Edric Milareted0b2802015-10-01 15:10:02 -040077 ui->lrcfg_username->setReadOnly(currentAccount_->protocol() == Account::Protocol::RING);
78
Edric Milaret627500d2015-03-27 16:41:40 -040079 codecModel_ = currentAccount->codecModel();
Edric Milarete5313852015-11-09 13:06:00 -050080 ui->audioCodecView->setModel(codecModel_->audioCodecs());
81 ui->videoCodecView->setModel(codecModel_->videoCodecs());
82 connect(ui->audioCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
83 this, SLOT(audioCodecSelectionChanged(QItemSelection,QItemSelection)));
84 connect(ui->videoCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
85 this, SLOT(videoCodecSelectionChanged(QItemSelection,QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -040086
Edric Milaret3e6aefe2015-06-05 16:07:26 -040087 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
88 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -040089
Edric Milaret3e6aefe2015-06-05 16:07:26 -040090 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -040091
Edric Milaret3e6aefe2015-06-05 16:07:26 -040092 if (currentAccount_->isPublishedSameAsLocal())
93 ui->puslishedSameAsLocalRadio->setChecked(true);
94 else
95 ui->customPublishedRadio->setChecked(true);
96
97 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
98 ui->publishGroup->setId(ui->customPublishedRadio, 0);
99 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
100 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
101
102 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
103 [=](int id) {
104 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
105 });
106
107 switch (currentAccount_->DTMFType()) {
108 case DtmfType::OverRtp:
109 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400110 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400111 case DtmfType::OverSip:
112 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400113 break;
114 }
115
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400116 ui->dtmfGroup->disconnect();
117 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
118 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400119
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400120 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
121 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
122
123 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
124 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
125
126 if (currentAccount_->tlsCaListCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400127 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400128 if (currentAccount_->tlsCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400129 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path());
130 if (not currentAccount_->tlsPrivateKey().isEmpty())
131 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKey());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400132
Edric Milaret36587362016-02-04 12:30:52 -0500133#ifdef Q_OS_WIN
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400134 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
135 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400136 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKey;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400137#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400138
139 ui->srtpEnabled->disconnect();
140 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
141 currentAccount_->setSrtpEnabled(checked);
142 ui->lrcfg_srtpRtpFallback->setEnabled(checked);
143 ui->keyExchangeModelCombo->setEnabled(checked);
144 });
145
146 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
147
148 if (currentAccount_->cipherModel()->useDefault())
149 ui->defaultCipherRadio->setChecked(true);
150 else
151 ui->customCipherRadio->setChecked(true);
152
153 connect(ui->defaultCipherRadio, &QRadioButton::toggled, [=](bool checked) {
154 currentAccount_->cipherModel()->setUseDefault(checked);
155 });
156
157 ui->cipherListView->setModel(currentAccount_->cipherModel());
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500158
159 disconnect(ui->ringtonesBox);
160 ui->ringtonesBox->setModel(&RingtoneModel::instance());
161 ui->ringtonesBox->setCurrentIndex(RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex().row());
162 connect(ui->ringtonesBox, SIGNAL(currentIndexChanged(int)), this, SLOT(ringtonesBoxCurrentIndexChanged(int)));
Edric Milaret627500d2015-03-27 16:41:40 -0400163}
164
165void
Edric Milarete5313852015-11-09 13:06:00 -0500166AccountDetails::on_upAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400167 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400168}
169
170void
Edric Milarete5313852015-11-09 13:06:00 -0500171AccountDetails::on_downAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400172 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400173}
174
175void
Edric Milarete5313852015-11-09 13:06:00 -0500176AccountDetails::on_upVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400177 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400178}
179
180void
Edric Milarete5313852015-11-09 13:06:00 -0500181AccountDetails::on_downVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400182 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400183}
184
185void
186AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400187 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400188}
189
190void
Edric Milarete5313852015-11-09 13:06:00 -0500191AccountDetails::onCertButtonClicked() {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400192 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
193 "",
194 tr("Files (*)"));
195
196 auto sender = QObject::sender();
197
198 (currentAccount_->*certMap_[sender->objectName()])(fileName);
Edric Milaret9f6b5192016-02-02 15:14:27 -0500199 if (not fileName.isEmpty())
200 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400201}
Edric Milarete5313852015-11-09 13:06:00 -0500202
203void
204AccountDetails::audioCodecSelectionChanged(const QItemSelection& selected,
205 const QItemSelection& deselected) {
206 Q_UNUSED(deselected)
207 if (not codecModel_ || selected.empty())
208 return;
209 auto idx = codecModel_->audioCodecs()->mapToSource(selected.indexes().at(0));
210 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
211}
212
213void
214AccountDetails::videoCodecSelectionChanged(const QItemSelection& selected,
215 const QItemSelection& deselected) {
216 Q_UNUSED(deselected)
217 if (not codecModel_ || selected.empty())
218 return;
219 auto idx = codecModel_->videoCodecs()->mapToSource(selected.indexes().at(0));
220 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
221}
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500222
223void
224AccountDetails::ringtonesBoxCurrentIndexChanged(int index)
225{
226 RingtoneModel::instance().selectionModel(currentAccount_)->setCurrentIndex(
227 RingtoneModel::instance().index(index, 0), QItemSelectionModel::ClearAndSelect);
228}
229
230void
231AccountDetails::on_playButton_clicked()
232{
233 RingtoneModel::instance().play(RingtoneModel::instance().index(
234 ui->ringtonesBox->currentIndex(), 0));
235}
Edric Milaretdda49b62016-02-05 14:27:38 -0500236
237void
238AccountDetails::stopRingtone() {
239 if (not currentAccount_)
240 return;
241 auto idx = RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex();
242 if (RingtoneModel::instance().isPlaying())
243 RingtoneModel::instance().play(idx);
244}
Nicolas Jager74fe46f2016-02-29 14:55:09 -0500245
246QPushButton*
247AccountDetails::getDeleteAccountButton()
248{
249 return ui->deleteAccountButton;
250}
251