blob: 89bd8cf7952c05ffcdb428216c77437bfcd3edca [file] [log] [blame]
Edric Milaret627500d2015-03-27 16:41:40 -04001/***************************************************************************
Edric Milaret4bba46d2015-04-29 16:33:38 -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->setColumnCount(4);
Edric Milaret53ac6e52015-09-14 13:37:06 -040043 QStringList audioHeader {tr("Enabled"), tr("Name"), tr("Bitrate"), tr("Samplerate")};
Edric Milaret627500d2015-03-27 16:41:40 -040044 ui->audioCodecView->setHorizontalHeaderLabels(audioHeader);
45 ui->audioCodecView->verticalHeader()->hide();
46 ui->audioCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
47 ui->audioCodecView->setShowGrid(false);
48
49 ui->videoCodecView->setColumnCount(3);
Edric Milaret53ac6e52015-09-14 13:37:06 -040050 QStringList videoHeader {tr("Enabled"), tr("Name"), tr("Bitrate")};
Edric Milaret627500d2015-03-27 16:41:40 -040051 ui->videoCodecView->setHorizontalHeaderLabels(videoHeader);
52 ui->videoCodecView->verticalHeader()->hide();
53 ui->videoCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
54 ui->videoCodecView->setShowGrid(false);
55
Edric Milaret3e6aefe2015-06-05 16:07:26 -040056 ui->lrcfg_username->setAlignment(Qt::AlignCenter);
Edric Milaret627500d2015-03-27 16:41:40 -040057
Edric Milaret3e6aefe2015-06-05 16:07:26 -040058 connect(ui->lrcfg_tlsCaListCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
59 connect(ui->lrcfg_tlsCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
60 connect(ui->lrcfg_tlsPrivateKeyCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
Edric Milaret627500d2015-03-27 16:41:40 -040061}
62
63AccountDetails::~AccountDetails()
64{
65 delete ui;
66}
67
68void
69AccountDetails::reloadCodec(CodecType type)
70{
Edric Milaret15a009a2015-08-10 12:00:32 -040071 ui->audioCodecView->disconnect();
72 ui->videoCodecView->disconnect();
73
Edric Milaret627500d2015-03-27 16:41:40 -040074 auto selectedIdx = codecModel_->selectionModel()->currentIndex();
75
76 if (type != CodecType::VIDEO) {
77 ui->audioCodecView->clearContents();
78 ui->audioCodecView->setRowCount(codecModel_->audioCodecs()->rowCount());
79
80 for (int i = 0; i < codecModel_->audioCodecs()->rowCount(); i++) {
81
82 auto idx = codecModel_->audioCodecs()->index(i, 0);
83
84 auto checkBoxItem = new QTableWidgetItem();
85 checkBoxItem->setCheckState(
86 codecModel_->audioCodecs()->data(idx ,
87 Qt::CheckStateRole).toBool()
88 ? Qt::Checked : Qt::Unchecked);
89 ui->audioCodecView->setItem(i, 0, checkBoxItem);
90
91 auto item = new QTableWidgetItem(
92 codecModel_->audioCodecs()->data(idx).toString());
93 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
94 ui->audioCodecView->setItem(i, 1, item);
95
96 item = new QTableWidgetItem(
97 codecModel_->audioCodecs()->
98 data(idx,CodecModel::Role::BITRATE).toString());
99 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
100 ui->audioCodecView->setItem(i, 2, item);
101
102 item = new QTableWidgetItem(
103 codecModel_->audioCodecs()->
104 data(idx, CodecModel::Role::SAMPLERATE).toString());
105 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
106 ui->audioCodecView->setItem(i, 3, item);
107
108 if (codecModel_->audioCodecs()->mapToSource(idx) == selectedIdx) {
109 ui->audioCodecView->setCurrentCell(i, 0);
110 }
111 }
112 }
113 if (type != CodecType::AUDIO) {
114 ui->videoCodecView->clearContents();
115 ui->videoCodecView->setRowCount(codecModel_->videoCodecs()->rowCount());
116 for (int i = 0; i < codecModel_->videoCodecs()->rowCount(); i++) {
117
118 auto idx = codecModel_->videoCodecs()->index(i, 0);
119
120 auto checkBoxItem = new QTableWidgetItem();
121 checkBoxItem->setCheckState(codecModel_->videoCodecs()->
122 data(idx , Qt::CheckStateRole).toBool()
123 ? Qt::Checked : Qt::Unchecked);
124 ui->videoCodecView->setItem(i, 0, checkBoxItem);
125
126 auto item = new QTableWidgetItem(
127 codecModel_->videoCodecs()->data(idx).toString());
128 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
129 ui->videoCodecView->setItem(i, 1, item);
130
131 item = new QTableWidgetItem(codecModel_->videoCodecs()->
132 data(idx,CodecModel::Role::BITRATE).toString());
133 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
134 ui->videoCodecView->setItem(i, 2, item);
135
136 if (codecModel_->videoCodecs()->mapToSource(idx) == selectedIdx) {
137 ui->videoCodecView->setCurrentCell(i, 0);
138 }
139 }
140 }
Edric Milaret15a009a2015-08-10 12:00:32 -0400141 connect(ui->audioCodecView, SIGNAL(cellChanged(int,int)),
142 this, SLOT(audio_codec_checked(int, int)));
143 connect(ui->videoCodecView, SIGNAL(cellChanged(int,int)),
144 this, SLOT(video_codec_checked(int,int)));
Edric Milaretbd29e562015-09-21 11:53:27 -0400145 connect(ui->audioCodecView, SIGNAL(itemSelectionChanged()),
146 this, SLOT(on_audioCodecView_itemSelectionChanged()));
147 connect(ui->videoCodecView, SIGNAL(itemSelectionChanged()),
148 this, SLOT(on_videoCodecView_itemSelectionChanged()));
Edric Milaret627500d2015-03-27 16:41:40 -0400149}
150
151void
152AccountDetails::setAccount(Account* currentAccount) {
153
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400154 if (currentAccount_) {
155 currentAccount_->performAction(Account::EditAction::SAVE);
156 }
157
Edric Milaret627500d2015-03-27 16:41:40 -0400158 currentAccount_ = currentAccount;
159
Edric Milaret627500d2015-03-27 16:41:40 -0400160 codecModel_ = currentAccount->codecModel();
161
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400162 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
163 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -0400164
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400165 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -0400166
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400167 if (currentAccount_->isPublishedSameAsLocal())
168 ui->puslishedSameAsLocalRadio->setChecked(true);
169 else
170 ui->customPublishedRadio->setChecked(true);
171
172 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
173 ui->publishGroup->setId(ui->customPublishedRadio, 0);
174 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
175 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
176
177 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
178 [=](int id) {
179 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
180 });
181
182 switch (currentAccount_->DTMFType()) {
183 case DtmfType::OverRtp:
184 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400185 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400186 case DtmfType::OverSip:
187 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400188 break;
189 }
190
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400191 ui->dtmfGroup->disconnect();
192 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
193 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400194
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400195 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
196 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
197
198 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
199 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
200
201 if (currentAccount_->tlsCaListCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400202 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400203 if (currentAccount_->tlsCertificate())
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400204 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path());
205 if (not currentAccount_->tlsPrivateKey().isEmpty())
206 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKey());
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400207
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400208#ifdef Q_OS_WIN32
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400209 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
210 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
Edric Milaret4f0b02c2015-08-14 11:40:58 -0400211 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKey;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400212#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400213
214 ui->srtpEnabled->disconnect();
215 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
216 currentAccount_->setSrtpEnabled(checked);
217 ui->lrcfg_srtpRtpFallback->setEnabled(checked);
218 ui->keyExchangeModelCombo->setEnabled(checked);
219 });
220
221 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
222
223 if (currentAccount_->cipherModel()->useDefault())
224 ui->defaultCipherRadio->setChecked(true);
225 else
226 ui->customCipherRadio->setChecked(true);
227
228 connect(ui->defaultCipherRadio, &QRadioButton::toggled, [=](bool checked) {
229 currentAccount_->cipherModel()->setUseDefault(checked);
230 });
231
232 ui->cipherListView->setModel(currentAccount_->cipherModel());
233
234 reloadCodec();
Edric Milaret627500d2015-03-27 16:41:40 -0400235}
236
237void
238AccountDetails::audio_codec_checked(int row, int column) {
239 if (column != 0)
240 return;
241 auto item = ui->audioCodecView->item(row, 0);
242 auto idx = codecModel_->audioCodecs()->index(row, 0);
243 codecModel_->audioCodecs()->setData(idx, item->checkState(),
244 Qt::CheckStateRole);
Edric Milaret627500d2015-03-27 16:41:40 -0400245}
246
247void
248AccountDetails::video_codec_checked(int row, int column) {
249 if (column != 0)
250 return;
251 auto item = ui->videoCodecView->item(row, 0);
252 auto idx = codecModel_->videoCodecs()->index(row, 0);
253 codecModel_->videoCodecs()->setData(idx, item->checkState(),
254 Qt::CheckStateRole);
Edric Milaret627500d2015-03-27 16:41:40 -0400255}
256
257void
Edric Milaret627500d2015-03-27 16:41:40 -0400258AccountDetails::on_upAudioButton_clicked()
259{
260 codecModel_->moveUp();
261 reloadCodec(CodecType::AUDIO);
Edric Milaret627500d2015-03-27 16:41:40 -0400262}
263
264void
265AccountDetails::on_downAudioButton_clicked()
266{
267 codecModel_->moveDown();
268 reloadCodec(CodecType::AUDIO);
Edric Milaret627500d2015-03-27 16:41:40 -0400269}
270
271void
272AccountDetails::on_upVideoButton_clicked()
273{
274 codecModel_->moveUp();
275 reloadCodec(CodecType::VIDEO);
Edric Milaret627500d2015-03-27 16:41:40 -0400276}
277
278void
279AccountDetails::on_downVideoButton_clicked()
280{
281 codecModel_->moveDown();
282 reloadCodec(CodecType::VIDEO);
Edric Milaret627500d2015-03-27 16:41:40 -0400283}
284
285void
286AccountDetails::on_audioCodecView_itemSelectionChanged()
287{
288 int row = ui->audioCodecView->currentRow();
289 auto idx = codecModel_->audioCodecs()->index(row, 0);
290 auto srcIdx = codecModel_->audioCodecs()->mapToSource(idx);
291 codecModel_->selectionModel()->setCurrentIndex(srcIdx,
292 QItemSelectionModel::Select);
293}
294
295void
296AccountDetails::on_videoCodecView_itemSelectionChanged()
297{
298 int row = ui->videoCodecView->currentRow();
299 auto idx = codecModel_->videoCodecs()->index(row, 0);
300 auto srcIdx = codecModel_->videoCodecs()->mapToSource(idx);
301 codecModel_->selectionModel()->setCurrentIndex(srcIdx,
302 QItemSelectionModel::Select);
303}
304
305void
306AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400307 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400308}
309
310void
Edric Milaret627500d2015-03-27 16:41:40 -0400311AccountDetails::on_usernameEdit_editingFinished()
312{
313 currentAccount_->setUsername(ui->usernameEdit->text());
314}
315
316void
Edric Milaret627500d2015-03-27 16:41:40 -0400317AccountDetails::on_tabWidget_currentChanged(int index)
318{
319 if (index == 1) {
320 ui->audioCodecView->setCurrentItem(ui->audioCodecView->item(0, 0));
321 } else if (index == 2) {
322 ui->videoCodecView->setCurrentItem(ui->videoCodecView->item(0, 0));
323 }
324}
Edric Milarete6538792015-05-08 11:51:01 -0400325
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400326
327void
328AccountDetails::onCertButtonClicked()
Edric Milarete6538792015-05-08 11:51:01 -0400329{
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400330 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
331 "",
332 tr("Files (*)"));
333
334 auto sender = QObject::sender();
335
336 (currentAccount_->*certMap_[sender->objectName()])(fileName);
337
338 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400339}