blob: 78a2532e8f49a16fc69170b70fb29d5dc62ea7cb [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
40 ui->audioCodecView->setColumnCount(4);
41 QStringList audioHeader {"Enabled", "Name", "Bitrate", "Samplerate"};
42 ui->audioCodecView->setHorizontalHeaderLabels(audioHeader);
43 ui->audioCodecView->verticalHeader()->hide();
44 ui->audioCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
45 ui->audioCodecView->setShowGrid(false);
46
47 ui->videoCodecView->setColumnCount(3);
48 QStringList videoHeader {"Enabled", "Name", "Bitrate"};
49 ui->videoCodecView->setHorizontalHeaderLabels(videoHeader);
50 ui->videoCodecView->verticalHeader()->hide();
51 ui->videoCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
52 ui->videoCodecView->setShowGrid(false);
53
Edric Milaret3e6aefe2015-06-05 16:07:26 -040054 ui->lrcfg_username->setAlignment(Qt::AlignCenter);
Edric Milaret627500d2015-03-27 16:41:40 -040055
Edric Milaret3e6aefe2015-06-05 16:07:26 -040056 connect(ui->lrcfg_tlsCaListCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
57 connect(ui->lrcfg_tlsCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
58 connect(ui->lrcfg_tlsPrivateKeyCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
Edric Milaret627500d2015-03-27 16:41:40 -040059}
60
61AccountDetails::~AccountDetails()
62{
63 delete ui;
64}
65
66void
67AccountDetails::reloadCodec(CodecType type)
68{
Edric Milaret15a009a2015-08-10 12:00:32 -040069 ui->audioCodecView->disconnect();
70 ui->videoCodecView->disconnect();
71
Edric Milaret627500d2015-03-27 16:41:40 -040072 auto selectedIdx = codecModel_->selectionModel()->currentIndex();
73
74 if (type != CodecType::VIDEO) {
75 ui->audioCodecView->clearContents();
76 ui->audioCodecView->setRowCount(codecModel_->audioCodecs()->rowCount());
77
78 for (int i = 0; i < codecModel_->audioCodecs()->rowCount(); i++) {
79
80 auto idx = codecModel_->audioCodecs()->index(i, 0);
81
82 auto checkBoxItem = new QTableWidgetItem();
83 checkBoxItem->setCheckState(
84 codecModel_->audioCodecs()->data(idx ,
85 Qt::CheckStateRole).toBool()
86 ? Qt::Checked : Qt::Unchecked);
87 ui->audioCodecView->setItem(i, 0, checkBoxItem);
88
89 auto item = new QTableWidgetItem(
90 codecModel_->audioCodecs()->data(idx).toString());
91 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
92 ui->audioCodecView->setItem(i, 1, item);
93
94 item = new QTableWidgetItem(
95 codecModel_->audioCodecs()->
96 data(idx,CodecModel::Role::BITRATE).toString());
97 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
98 ui->audioCodecView->setItem(i, 2, item);
99
100 item = new QTableWidgetItem(
101 codecModel_->audioCodecs()->
102 data(idx, CodecModel::Role::SAMPLERATE).toString());
103 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
104 ui->audioCodecView->setItem(i, 3, item);
105
106 if (codecModel_->audioCodecs()->mapToSource(idx) == selectedIdx) {
107 ui->audioCodecView->setCurrentCell(i, 0);
108 }
109 }
110 }
111 if (type != CodecType::AUDIO) {
112 ui->videoCodecView->clearContents();
113 ui->videoCodecView->setRowCount(codecModel_->videoCodecs()->rowCount());
114 for (int i = 0; i < codecModel_->videoCodecs()->rowCount(); i++) {
115
116 auto idx = codecModel_->videoCodecs()->index(i, 0);
117
118 auto checkBoxItem = new QTableWidgetItem();
119 checkBoxItem->setCheckState(codecModel_->videoCodecs()->
120 data(idx , Qt::CheckStateRole).toBool()
121 ? Qt::Checked : Qt::Unchecked);
122 ui->videoCodecView->setItem(i, 0, checkBoxItem);
123
124 auto item = new QTableWidgetItem(
125 codecModel_->videoCodecs()->data(idx).toString());
126 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
127 ui->videoCodecView->setItem(i, 1, item);
128
129 item = new QTableWidgetItem(codecModel_->videoCodecs()->
130 data(idx,CodecModel::Role::BITRATE).toString());
131 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
132 ui->videoCodecView->setItem(i, 2, item);
133
134 if (codecModel_->videoCodecs()->mapToSource(idx) == selectedIdx) {
135 ui->videoCodecView->setCurrentCell(i, 0);
136 }
137 }
138 }
Edric Milaret15a009a2015-08-10 12:00:32 -0400139 connect(ui->audioCodecView, SIGNAL(cellChanged(int,int)),
140 this, SLOT(audio_codec_checked(int, int)));
141 connect(ui->videoCodecView, SIGNAL(cellChanged(int,int)),
142 this, SLOT(video_codec_checked(int,int)));
Edric Milaret627500d2015-03-27 16:41:40 -0400143}
144
145void
146AccountDetails::setAccount(Account* currentAccount) {
147
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400148 if (currentAccount_) {
149 currentAccount_->performAction(Account::EditAction::SAVE);
150 }
151
Edric Milaret627500d2015-03-27 16:41:40 -0400152 currentAccount_ = currentAccount;
153
Edric Milaret627500d2015-03-27 16:41:40 -0400154 codecModel_ = currentAccount->codecModel();
155
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400156 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
157 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -0400158
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400159 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -0400160
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400161 if (currentAccount_->isPublishedSameAsLocal())
162 ui->puslishedSameAsLocalRadio->setChecked(true);
163 else
164 ui->customPublishedRadio->setChecked(true);
165
166 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
167 ui->publishGroup->setId(ui->customPublishedRadio, 0);
168 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
169 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
170
171 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
172 [=](int id) {
173 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
174 });
175
176 switch (currentAccount_->DTMFType()) {
177 case DtmfType::OverRtp:
178 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400179 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400180 case DtmfType::OverSip:
181 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400182 break;
183 }
184
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400185 ui->dtmfGroup->disconnect();
186 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
187 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400188
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400189 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
190 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
191
192 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
193 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
194
195 if (currentAccount_->tlsCaListCertificate())
196 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path().fileName());
197 if (currentAccount_->tlsCertificate())
198 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path().fileName());
199 if (currentAccount_->tlsPrivateKeyCertificate())
200 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKeyCertificate()->path().fileName());
201
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400202#ifdef Q_OS_WIN32
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400203 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
204 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
205 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKeyCertificate;
Edric Milaretb37aa1f2015-07-09 16:39:04 -0400206#endif
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400207
208 ui->srtpEnabled->disconnect();
209 connect(ui->srtpEnabled, &QCheckBox::toggled, [=](bool checked) {
210 currentAccount_->setSrtpEnabled(checked);
211 ui->lrcfg_srtpRtpFallback->setEnabled(checked);
212 ui->keyExchangeModelCombo->setEnabled(checked);
213 });
214
215 ui->srtpEnabled->setChecked(currentAccount_->isSrtpEnabled());
216
217 if (currentAccount_->cipherModel()->useDefault())
218 ui->defaultCipherRadio->setChecked(true);
219 else
220 ui->customCipherRadio->setChecked(true);
221
222 connect(ui->defaultCipherRadio, &QRadioButton::toggled, [=](bool checked) {
223 currentAccount_->cipherModel()->setUseDefault(checked);
224 });
225
226 ui->cipherListView->setModel(currentAccount_->cipherModel());
227
228 reloadCodec();
Edric Milaret627500d2015-03-27 16:41:40 -0400229}
230
231void
232AccountDetails::audio_codec_checked(int row, int column) {
233 if (column != 0)
234 return;
235 auto item = ui->audioCodecView->item(row, 0);
236 auto idx = codecModel_->audioCodecs()->index(row, 0);
237 codecModel_->audioCodecs()->setData(idx, item->checkState(),
238 Qt::CheckStateRole);
Edric Milaret627500d2015-03-27 16:41:40 -0400239}
240
241void
242AccountDetails::video_codec_checked(int row, int column) {
243 if (column != 0)
244 return;
245 auto item = ui->videoCodecView->item(row, 0);
246 auto idx = codecModel_->videoCodecs()->index(row, 0);
247 codecModel_->videoCodecs()->setData(idx, item->checkState(),
248 Qt::CheckStateRole);
Edric Milaret627500d2015-03-27 16:41:40 -0400249}
250
251void
Edric Milaret627500d2015-03-27 16:41:40 -0400252AccountDetails::on_upAudioButton_clicked()
253{
254 codecModel_->moveUp();
255 reloadCodec(CodecType::AUDIO);
Edric Milaret627500d2015-03-27 16:41:40 -0400256}
257
258void
259AccountDetails::on_downAudioButton_clicked()
260{
261 codecModel_->moveDown();
262 reloadCodec(CodecType::AUDIO);
Edric Milaret627500d2015-03-27 16:41:40 -0400263}
264
265void
266AccountDetails::on_upVideoButton_clicked()
267{
268 codecModel_->moveUp();
269 reloadCodec(CodecType::VIDEO);
Edric Milaret627500d2015-03-27 16:41:40 -0400270}
271
272void
273AccountDetails::on_downVideoButton_clicked()
274{
275 codecModel_->moveDown();
276 reloadCodec(CodecType::VIDEO);
Edric Milaret627500d2015-03-27 16:41:40 -0400277}
278
279void
280AccountDetails::on_audioCodecView_itemSelectionChanged()
281{
282 int row = ui->audioCodecView->currentRow();
283 auto idx = codecModel_->audioCodecs()->index(row, 0);
284 auto srcIdx = codecModel_->audioCodecs()->mapToSource(idx);
285 codecModel_->selectionModel()->setCurrentIndex(srcIdx,
286 QItemSelectionModel::Select);
287}
288
289void
290AccountDetails::on_videoCodecView_itemSelectionChanged()
291{
292 int row = ui->videoCodecView->currentRow();
293 auto idx = codecModel_->videoCodecs()->index(row, 0);
294 auto srcIdx = codecModel_->videoCodecs()->mapToSource(idx);
295 codecModel_->selectionModel()->setCurrentIndex(srcIdx,
296 QItemSelectionModel::Select);
297}
298
299void
300AccountDetails::save() {
Edric Milaret2d03da42015-07-15 15:36:43 -0400301 codecModel_->performAction(CodecModel::EditAction::SAVE);
Edric Milaret627500d2015-03-27 16:41:40 -0400302}
303
304void
Edric Milaret627500d2015-03-27 16:41:40 -0400305AccountDetails::on_usernameEdit_editingFinished()
306{
307 currentAccount_->setUsername(ui->usernameEdit->text());
308}
309
310void
Edric Milaret627500d2015-03-27 16:41:40 -0400311AccountDetails::on_tabWidget_currentChanged(int index)
312{
313 if (index == 1) {
314 ui->audioCodecView->setCurrentItem(ui->audioCodecView->item(0, 0));
315 } else if (index == 2) {
316 ui->videoCodecView->setCurrentItem(ui->videoCodecView->item(0, 0));
317 }
318}
Edric Milarete6538792015-05-08 11:51:01 -0400319
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400320
321void
322AccountDetails::onCertButtonClicked()
Edric Milarete6538792015-05-08 11:51:01 -0400323{
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400324 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
325 "",
326 tr("Files (*)"));
327
328 auto sender = QObject::sender();
329
330 (currentAccount_->*certMap_[sender->objectName()])(fileName);
331
332 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400333}