blob: 850d6329ff99b419340f84bea537e0d755743c8b [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 Milaret627500d2015-03-27 16:41:40 -040055}
56
57AccountDetails::~AccountDetails()
58{
59 delete ui;
60}
61
62void
Edric Milaret627500d2015-03-27 16:41:40 -040063AccountDetails::setAccount(Account* currentAccount) {
64
Edric Milaret3e6aefe2015-06-05 16:07:26 -040065 if (currentAccount_) {
66 currentAccount_->performAction(Account::EditAction::SAVE);
67 }
68
Edric Milaret627500d2015-03-27 16:41:40 -040069 currentAccount_ = currentAccount;
70
Edric Milareted0b2802015-10-01 15:10:02 -040071 ui->lrcfg_username->setReadOnly(currentAccount_->protocol() == Account::Protocol::RING);
72
Edric Milaret627500d2015-03-27 16:41:40 -040073 codecModel_ = currentAccount->codecModel();
Edric Milarete5313852015-11-09 13:06:00 -050074 ui->audioCodecView->setModel(codecModel_->audioCodecs());
75 ui->videoCodecView->setModel(codecModel_->videoCodecs());
76 connect(ui->audioCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
77 this, SLOT(audioCodecSelectionChanged(QItemSelection,QItemSelection)));
78 connect(ui->videoCodecView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
79 this, SLOT(videoCodecSelectionChanged(QItemSelection,QItemSelection)));
Edric Milaret627500d2015-03-27 16:41:40 -040080
Edric Milaret3e6aefe2015-06-05 16:07:26 -040081 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
82 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -040083
Edric Milaret3e6aefe2015-06-05 16:07:26 -040084 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -040085
Edric Milaret3e6aefe2015-06-05 16:07:26 -040086 if (currentAccount_->isPublishedSameAsLocal())
87 ui->puslishedSameAsLocalRadio->setChecked(true);
88 else
89 ui->customPublishedRadio->setChecked(true);
90
91 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
92 ui->publishGroup->setId(ui->customPublishedRadio, 0);
93 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
94 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
95
96 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
97 [=](int id) {
98 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
99 });
100
101 switch (currentAccount_->DTMFType()) {
102 case DtmfType::OverRtp:
103 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400104 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400105 case DtmfType::OverSip:
106 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400107 break;
108 }
109
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400110 ui->dtmfGroup->disconnect();
111 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
112 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400113
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400114 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
115 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
116
117 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
118 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
119
120 if (currentAccount_->tlsCaListCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400121 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400122 if (currentAccount_->tlsCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400123 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path());
124 if (not currentAccount_->tlsPrivateKey().isEmpty())
125 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKey());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400126
Edric Milaret36587362016-02-04 12:30:52 -0500127#ifdef Q_OS_WIN
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400128 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
129 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400130 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKey;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400131#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400132
133 ui->srtpEnabled->disconnect();
134 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
135 currentAccount_->setSrtpEnabled(checked);
136 ui->lrcfg_srtpRtpFallback->setEnabled(checked);
137 ui->keyExchangeModelCombo->setEnabled(checked);
138 });
139
140 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
141
142 if (currentAccount_->cipherModel()->useDefault())
143 ui->defaultCipherRadio->setChecked(true);
144 else
145 ui->customCipherRadio->setChecked(true);
146
147 connect(ui->defaultCipherRadio, &QRadioButton::toggled, [=](bool checked) {
148 currentAccount_->cipherModel()->setUseDefault(checked);
149 });
150
151 ui->cipherListView->setModel(currentAccount_->cipherModel());
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500152
153 disconnect(ui->ringtonesBox);
154 ui->ringtonesBox->setModel(&RingtoneModel::instance());
155 ui->ringtonesBox->setCurrentIndex(RingtoneModel::instance().selectionModel(currentAccount_)->currentIndex().row());
156 connect(ui->ringtonesBox, SIGNAL(currentIndexChanged(int)), this, SLOT(ringtonesBoxCurrentIndexChanged(int)));
Edric Milaret627500d2015-03-27 16:41:40 -0400157}
158
159void
Edric Milarete5313852015-11-09 13:06:00 -0500160AccountDetails::on_upAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400161 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400162}
163
164void
Edric Milarete5313852015-11-09 13:06:00 -0500165AccountDetails::on_downAudioButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400166 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400167}
168
169void
Edric Milarete5313852015-11-09 13:06:00 -0500170AccountDetails::on_upVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400171 codecModel_->moveUp();
Edric Milaret627500d2015-03-27 16:41:40 -0400172}
173
174void
Edric Milarete5313852015-11-09 13:06:00 -0500175AccountDetails::on_downVideoButton_clicked() {
Edric Milaret627500d2015-03-27 16:41:40 -0400176 codecModel_->moveDown();
Edric Milaret627500d2015-03-27 16:41:40 -0400177}
178
179void
180AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400181 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400182}
183
184void
Edric Milarete5313852015-11-09 13:06:00 -0500185AccountDetails::onCertButtonClicked() {
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400186 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
187 "",
188 tr("Files (*)"));
189
190 auto sender = QObject::sender();
191
192 (currentAccount_->*certMap_[sender->objectName()])(fileName);
Edric Milaret9f6b5192016-02-02 15:14:27 -0500193 if (not fileName.isEmpty())
194 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400195}
Edric Milarete5313852015-11-09 13:06:00 -0500196
197void
198AccountDetails::audioCodecSelectionChanged(const QItemSelection& selected,
199 const QItemSelection& deselected) {
200 Q_UNUSED(deselected)
201 if (not codecModel_ || selected.empty())
202 return;
203 auto idx = codecModel_->audioCodecs()->mapToSource(selected.indexes().at(0));
204 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
205}
206
207void
208AccountDetails::videoCodecSelectionChanged(const QItemSelection& selected,
209 const QItemSelection& deselected) {
210 Q_UNUSED(deselected)
211 if (not codecModel_ || selected.empty())
212 return;
213 auto idx = codecModel_->videoCodecs()->mapToSource(selected.indexes().at(0));
214 codecModel_->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
215}
Edric Milaretb1b00ce2016-02-03 14:10:05 -0500216
217void
218AccountDetails::ringtonesBoxCurrentIndexChanged(int index)
219{
220 RingtoneModel::instance().selectionModel(currentAccount_)->setCurrentIndex(
221 RingtoneModel::instance().index(index, 0), QItemSelectionModel::ClearAndSelect);
222}
223
224void
225AccountDetails::on_playButton_clicked()
226{
227 RingtoneModel::instance().play(RingtoneModel::instance().index(
228 ui->ringtonesBox->currentIndex(), 0));
229}