#include <QValidator>
#include <QIntValidator>
#include <QHostAddress>
#include <QPushButton>
#include "multicastConfigDialog.h"
#include <src/net/mcast/McastConfiguration.h>
// #include "multicastValidators.h"
MulticastConfigDialog::MulticastConfigDialog(QWidget* parent) :
QDialog(parent)
{
setupUi();
}
MulticastConfigDialog::MulticastConfigDialog(McastConfiguration* config,
QWidget *parent) :
QDialog(parent)
{
setupUi();
_config = config;
_ui.groupAddressEdit->setText(config->multicastAddress());
_ui.dataPortEdit->setText(QString::number(config->multicastUDPPortBase()));
connect(_ui.buttonBox, SIGNAL(accepted()), this, SLOT(dialogAccepted()));
connect(_ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
}
void MulticastConfigDialog::setupUi()
{
_ui.setupUi(this);
QIntValidator* portValidator = new QIntValidator(1024, 65535, this);
_ui.dataPortEdit->setValidator(portValidator);
connect(_ui.groupAddressEdit, SIGNAL(textChanged(QString const&)), this,
SLOT(validateGroupAddress(QString const&)));
connect(_ui.dataPortEdit, SIGNAL(textChanged(QString const&)), this,
SLOT(validateDataPort(QString const&)));
connect(_ui.buttonBox, SIGNAL(accepted()), this, SLOT(dialogAccepted()));
connect(_ui.buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
validateGroupAddress(_ui.groupAddressEdit->text());
validateDataPort(_ui.dataPortEdit->text());
}
MulticastConfigDialog::~MulticastConfigDialog()
{
}
void MulticastConfigDialog::dialogAccepted()
{
QHostAddress addr;
bool addressParses = addr.setAddress(_ui.groupAddressEdit->text());
_config->multicastAddress(_ui.groupAddressEdit->text());
quint16 port = _ui.dataPortEdit->text().toInt();
_config->multicastUDPPortBase(port);
_config->multicastDPort(port + 1);
_config->multicastSPort(port + 2);
_config->multicastRate(_ui.rateSpinbox->value() * 1024);
accept();
}
void MulticastConfigDialog::setError(QWidget* widget,
QLabel* errorMessageLabel, QString text)
{
if (errorMessageLabel)
errorMessageLabel->setText(QString(
"<span style=\"font-weight: 600; color: #880000;\">") + text
+ "</span>");
if (widget)
widget->setStyleSheet("background-color: #ffcccc;");
}
void MulticastConfigDialog::setOK(QWidget* widget, QLabel* errorMessageLabel)
{
if (errorMessageLabel)
errorMessageLabel->setText(QString(
"<span style=\"font-weight: 600; color: #008800;\">")
+ tr("OK") + "</span>");
if (widget)
widget->setStyleSheet("background-color: #ccffcc;");
}
void MulticastConfigDialog::validateGroupAddress(QString const& input)
{
QHostAddress a;
_isAddressValid = false;
if (!a.setAddress(input))
{
setError(_ui.groupAddressEdit, _ui.groupAddressMessage, tr(
"Not a valid IP Address"));
revalidateButtons();
return;
}
// check if it is IPv4
if (a.protocol() != QAbstractSocket::IPv4Protocol)
{
setError(_ui.groupAddressEdit, _ui.groupAddressMessage, tr(
"Not a valid IPv4 Address"));
revalidateButtons();
return;
}
// check if it is a valid multicast address
quint32 addr = a.toIPv4Address();
if ((addr & 0xf0000000) != 0xe0000000)
{
setError(_ui.groupAddressEdit, _ui.groupAddressMessage, tr(
"Not an IPv4 multicast address"));
revalidateButtons();
return;
}
_isAddressValid = true;
setOK(_ui.groupAddressEdit, _ui.groupAddressMessage);
revalidateButtons();
}
void MulticastConfigDialog::validateDataPort(QString const& input)
{
bool ok;
int p = input.toInt(&ok, 0);
_isPortValid = false;
if (!ok)
{
setError(_ui.dataPortEdit, _ui.dataPortMessage, tr("Not a number"));
revalidateButtons();
return;
}
if (p < 0)
{
setError(_ui.dataPortEdit, _ui.dataPortMessage, tr("Must be positive"));
revalidateButtons();
return;
}
if (p < 1024)
{
setError(_ui.dataPortEdit, _ui.dataPortMessage, tr(
"Must not be a privileged port"));
revalidateButtons();
return;
}
if (p > 65535)
{
setError(_ui.dataPortEdit, _ui.dataPortMessage, tr(
"Port number too large"));
revalidateButtons();
return;
}
_isPortValid = true;
setOK(_ui.dataPortEdit, _ui.dataPortMessage);
revalidateButtons();
}
void MulticastConfigDialog::revalidateButtons()
{
_ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(_isAddressValid
&& _isPortValid);
}