blob: e6e8fc14e29a4af1732a9836b61d02542f674d6a [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 Milaret3e6aefe2015-06-05 16:07:26 -040036 currentAccount_(nullptr),
Edric Milaret627500d2015-03-27 16:41:40 -040037 codecModelModified(false)
38{
39 ui->setupUi(this);
40
41 ui->audioCodecView->setColumnCount(4);
42 QStringList audioHeader {"Enabled", "Name", "Bitrate", "Samplerate"};
43 ui->audioCodecView->setHorizontalHeaderLabels(audioHeader);
44 ui->audioCodecView->verticalHeader()->hide();
45 ui->audioCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
46 ui->audioCodecView->setShowGrid(false);
47
48 ui->videoCodecView->setColumnCount(3);
49 QStringList videoHeader {"Enabled", "Name", "Bitrate"};
50 ui->videoCodecView->setHorizontalHeaderLabels(videoHeader);
51 ui->videoCodecView->verticalHeader()->hide();
52 ui->videoCodecView->setSelectionBehavior(QAbstractItemView::SelectRows);
53 ui->videoCodecView->setShowGrid(false);
54
Edric Milaret3e6aefe2015-06-05 16:07:26 -040055 ui->lrcfg_username->setAlignment(Qt::AlignCenter);
Edric Milaret627500d2015-03-27 16:41:40 -040056
57 connect(ui->audioCodecView, SIGNAL(cellChanged(int,int)),
58 this, SLOT(audio_codec_checked(int, int)));
59 connect(ui->videoCodecView, SIGNAL(cellChanged(int,int)),
60 this, SLOT(video_codec_checked(int,int)));
Edric Milaret3e6aefe2015-06-05 16:07:26 -040061
62 connect(ui->lrcfg_tlsCaListCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
63 connect(ui->lrcfg_tlsCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
64 connect(ui->lrcfg_tlsPrivateKeyCertificate, SIGNAL(clicked(bool)), this, SLOT(onCertButtonClicked()));
Edric Milaret627500d2015-03-27 16:41:40 -040065}
66
67AccountDetails::~AccountDetails()
68{
69 delete ui;
70}
71
72void
73AccountDetails::reloadCodec(CodecType type)
74{
75 auto selectedIdx = codecModel_->selectionModel()->currentIndex();
76
77 if (type != CodecType::VIDEO) {
78 ui->audioCodecView->clearContents();
79 ui->audioCodecView->setRowCount(codecModel_->audioCodecs()->rowCount());
80
81 for (int i = 0; i < codecModel_->audioCodecs()->rowCount(); i++) {
82
83 auto idx = codecModel_->audioCodecs()->index(i, 0);
84
85 auto checkBoxItem = new QTableWidgetItem();
86 checkBoxItem->setCheckState(
87 codecModel_->audioCodecs()->data(idx ,
88 Qt::CheckStateRole).toBool()
89 ? Qt::Checked : Qt::Unchecked);
90 ui->audioCodecView->setItem(i, 0, checkBoxItem);
91
92 auto item = new QTableWidgetItem(
93 codecModel_->audioCodecs()->data(idx).toString());
94 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
95 ui->audioCodecView->setItem(i, 1, item);
96
97 item = new QTableWidgetItem(
98 codecModel_->audioCodecs()->
99 data(idx,CodecModel::Role::BITRATE).toString());
100 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
101 ui->audioCodecView->setItem(i, 2, item);
102
103 item = new QTableWidgetItem(
104 codecModel_->audioCodecs()->
105 data(idx, CodecModel::Role::SAMPLERATE).toString());
106 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
107 ui->audioCodecView->setItem(i, 3, item);
108
109 if (codecModel_->audioCodecs()->mapToSource(idx) == selectedIdx) {
110 ui->audioCodecView->setCurrentCell(i, 0);
111 }
112 }
113 }
114 if (type != CodecType::AUDIO) {
115 ui->videoCodecView->clearContents();
116 ui->videoCodecView->setRowCount(codecModel_->videoCodecs()->rowCount());
117 for (int i = 0; i < codecModel_->videoCodecs()->rowCount(); i++) {
118
119 auto idx = codecModel_->videoCodecs()->index(i, 0);
120
121 auto checkBoxItem = new QTableWidgetItem();
122 checkBoxItem->setCheckState(codecModel_->videoCodecs()->
123 data(idx , Qt::CheckStateRole).toBool()
124 ? Qt::Checked : Qt::Unchecked);
125 ui->videoCodecView->setItem(i, 0, checkBoxItem);
126
127 auto item = new QTableWidgetItem(
128 codecModel_->videoCodecs()->data(idx).toString());
129 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
130 ui->videoCodecView->setItem(i, 1, item);
131
132 item = new QTableWidgetItem(codecModel_->videoCodecs()->
133 data(idx,CodecModel::Role::BITRATE).toString());
134 item->setFlags(item->flags() ^ Qt::ItemIsEditable);
135 ui->videoCodecView->setItem(i, 2, item);
136
137 if (codecModel_->videoCodecs()->mapToSource(idx) == selectedIdx) {
138 ui->videoCodecView->setCurrentCell(i, 0);
139 }
140 }
141 }
142}
143
144void
145AccountDetails::setAccount(Account* currentAccount) {
146
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400147 if (currentAccount_) {
148 currentAccount_->performAction(Account::EditAction::SAVE);
149 }
150
Edric Milaret627500d2015-03-27 16:41:40 -0400151 currentAccount_ = currentAccount;
152
153 if (codecModel_ && codecModelModified)
154 codecModel_->save();
155
156 codecModel_ = currentAccount->codecModel();
157
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400158 ui->typeValueLabel->setText(currentAccount_->protocolModel()->
159 selectionModel()->currentIndex().data().value<QString>());
Edric Milaret627500d2015-03-27 16:41:40 -0400160
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400161 ui->publishGroup->disconnect();
Edric Milaret627500d2015-03-27 16:41:40 -0400162
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400163 if (currentAccount_->isPublishedSameAsLocal())
164 ui->puslishedSameAsLocalRadio->setChecked(true);
165 else
166 ui->customPublishedRadio->setChecked(true);
167
168 ui->publishGroup->setId(ui->puslishedSameAsLocalRadio, 1);
169 ui->publishGroup->setId(ui->customPublishedRadio, 0);
170 ui->lrcfg_publishedAddress->setEnabled(!currentAccount_->isPublishedSameAsLocal());
171 ui->lrcfg_publishedPort->setEnabled(!currentAccount_->isPublishedSameAsLocal());
172
173 connect(ui->publishGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
174 [=](int id) {
175 currentAccount_->setPublishedSameAsLocal(static_cast<bool>(id));
176 });
177
178 switch (currentAccount_->DTMFType()) {
179 case DtmfType::OverRtp:
180 ui->rtpRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400181 break;
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400182 case DtmfType::OverSip:
183 ui->sipRadio->setChecked(true);
Edric Milaret627500d2015-03-27 16:41:40 -0400184 break;
185 }
186
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400187 ui->dtmfGroup->disconnect();
188 ui->dtmfGroup->setId(ui->rtpRadio, DtmfType::OverRtp);
189 ui->dtmfGroup->setId(ui->sipRadio, DtmfType::OverSip);
Edric Milaret627500d2015-03-27 16:41:40 -0400190
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400191 connect(ui->dtmfGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked),
192 [=](int id){ currentAccount_->setDTMFType(static_cast<DtmfType>(id)); });
193
194 ui->keyExchangeModelCombo->setModel(currentAccount_->keyExchangeModel());
195 ui->tlsProtocoCombo->setModel(currentAccount_->tlsMethodModel());
196
197 if (currentAccount_->tlsCaListCertificate())
198 ui->lrcfg_tlsCaListCertificate->setText(currentAccount_->tlsCaListCertificate()->path().fileName());
199 if (currentAccount_->tlsCertificate())
200 ui->lrcfg_tlsCertificate->setText(currentAccount_->tlsCertificate()->path().fileName());
201 if (currentAccount_->tlsPrivateKeyCertificate())
202 ui->lrcfg_tlsPrivateKeyCertificate->setText(currentAccount_->tlsPrivateKeyCertificate()->path().fileName());
203
204 certMap_[ui->lrcfg_tlsCaListCertificate->objectName()] = &currentAccount_->setTlsCaListCertificate;
205 certMap_[ui->lrcfg_tlsCertificate->objectName()] = &currentAccount_->setTlsCertificate;
206 certMap_[ui->lrcfg_tlsPrivateKeyCertificate->objectName()] = &currentAccount_->setTlsPrivateKeyCertificate;
207
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);
239 codecModelModified = true;
240}
241
242void
243AccountDetails::video_codec_checked(int row, int column) {
244 if (column != 0)
245 return;
246 auto item = ui->videoCodecView->item(row, 0);
247 auto idx = codecModel_->videoCodecs()->index(row, 0);
248 codecModel_->videoCodecs()->setData(idx, item->checkState(),
249 Qt::CheckStateRole);
250 codecModelModified = true;
251}
252
253void
Edric Milaret627500d2015-03-27 16:41:40 -0400254AccountDetails::on_upAudioButton_clicked()
255{
256 codecModel_->moveUp();
257 reloadCodec(CodecType::AUDIO);
258 codecModelModified = true;
259}
260
261void
262AccountDetails::on_downAudioButton_clicked()
263{
264 codecModel_->moveDown();
265 reloadCodec(CodecType::AUDIO);
266 codecModelModified = true;
267}
268
269void
270AccountDetails::on_upVideoButton_clicked()
271{
272 codecModel_->moveUp();
273 reloadCodec(CodecType::VIDEO);
274 codecModelModified = true;
275}
276
277void
278AccountDetails::on_downVideoButton_clicked()
279{
280 codecModel_->moveDown();
281 reloadCodec(CodecType::VIDEO);
282 codecModelModified = true;
283}
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() {
307 if (codecModelModified)
308 codecModel_->save();
309}
310
311void
Edric Milaret627500d2015-03-27 16:41:40 -0400312AccountDetails::on_usernameEdit_editingFinished()
313{
314 currentAccount_->setUsername(ui->usernameEdit->text());
315}
316
317void
Edric Milaret627500d2015-03-27 16:41:40 -0400318AccountDetails::on_tabWidget_currentChanged(int index)
319{
320 if (index == 1) {
321 ui->audioCodecView->setCurrentItem(ui->audioCodecView->item(0, 0));
322 } else if (index == 2) {
323 ui->videoCodecView->setCurrentItem(ui->videoCodecView->item(0, 0));
324 }
325}
Edric Milarete6538792015-05-08 11:51:01 -0400326
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400327
328void
329AccountDetails::onCertButtonClicked()
Edric Milarete6538792015-05-08 11:51:01 -0400330{
Edric Milaret3e6aefe2015-06-05 16:07:26 -0400331 QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"),
332 "",
333 tr("Files (*)"));
334
335 auto sender = QObject::sender();
336
337 (currentAccount_->*certMap_[sender->objectName()])(fileName);
338
339 static_cast<QPushButton*>(sender)->setText(fileName);
Edric Milarete6538792015-05-08 11:51:01 -0400340}