summaryrefslogblamecommitdiffstats
path: root/src/gui/multicastConfigDialog.cpp
blob: ff370c76eef2bcbb0d91538d3b9705c95e440a83 (plain) (tree)









































































































































































                                                                                            
#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);
}