summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastien Braun2010-10-03 23:27:39 +0200
committerSebastien Braun2010-10-05 22:12:25 +0200
commit5bcf831e1734be78d9468631926e875a5b05e11f (patch)
tree9424928fc4a25bc1ec60598d05db709773c7e438
parentAssorted Multicast Fixes: (diff)
downloadpvs-5bcf831e1734be78d9468631926e875a5b05e11f.tar.gz
pvs-5bcf831e1734be78d9468631926e875a5b05e11f.tar.xz
pvs-5bcf831e1734be78d9468631926e875a5b05e11f.zip
Implement Network-wide Configuration Interface for Multicast File Transfer
-rw-r--r--CMakeLists.txt6
-rw-r--r--pvsmgr.qrc1
-rw-r--r--src/gui/mainWindow.cpp17
-rw-r--r--src/gui/mainWindow.h1
-rw-r--r--src/gui/multicastConfigDialog.cpp170
-rw-r--r--src/gui/multicastConfigDialog.h38
-rw-r--r--src/gui/ui/mainwindow.ui15
-rw-r--r--src/gui/ui/mainwindowtouch.ui11
-rw-r--r--src/gui/ui/multicastConfigDialog.ui156
-rw-r--r--src/net/mcast/McastConfiguration.h17
-rw-r--r--src/net/pvsListenServer.cpp60
-rw-r--r--src/net/pvsListenServer.h10
-rw-r--r--src/pvs.cpp58
-rw-r--r--src/pvs.h1
14 files changed, 559 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3f2089a..0899bdf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -80,6 +80,7 @@ SET( PVSMGR_SRCS
src/util/TextFile.cpp
src/util/serviceDiscoveryUtil.cpp
src/gui/aboutDialog.cpp
+ src/gui/multicastConfigDialog.cpp
)
# pvs
@@ -131,6 +132,7 @@ SET( PVSMGR_UIS
src/gui/ui/aboutDialog.ui
src/gui/ui/serverChatDialog.ui
src/gui/ui/clientFileSendDialog.ui
+ src/gui/ui/multicastConfigDialog.ui
)
SET( PVSMGRTOUCH_UIS
@@ -140,6 +142,7 @@ SET( PVSMGRTOUCH_UIS
src/gui/ui/projectionDialog.ui
src/gui/ui/aboutDialog.ui
src/gui/ui/serverChatDialog.ui
+ src/gui/ui/multicastConfigDialog.ui
)
SET( PVSGUI_UIS
@@ -186,6 +189,7 @@ SET( PVSMGR_MOC_HDRS
src/net/pvsServiceBroadcast.h
src/net/SslServer.h
src/gui/aboutDialog.h
+ src/gui/multicastConfigDialog.h
)
SET( PVS_MOC_HDRS
@@ -317,12 +321,14 @@ TARGET_LINK_LIBRARIES( pvsmgr
${QT_LIBRARIES}
${VNC_LIBRARIES}
${X11_LIBRARIES}
+ pvsmcast
)
TARGET_LINK_LIBRARIES( pvsmgrtouch
${QT_LIBRARIES}
${VNC_LIBRARIES}
${X11_LIBRARIES}
+ pvsmcast
)
TARGET_LINK_LIBRARIES( pvs
diff --git a/pvsmgr.qrc b/pvsmgr.qrc
index 171412e..e0b6b51 100644
--- a/pvsmgr.qrc
+++ b/pvsmgr.qrc
@@ -19,6 +19,7 @@
<file alias="dozent2" >icons/dozent.png</file>
<file alias="chat" >icons/chat.png</file>
<file alias="cam32" >icons/cam32.svg</file>
+ <file alias="netconf" >icons/network_configure.png</file>
<file alias="AUTHORS">AUTHORS</file>
<file alias="TRANSLATION">TRANSLATION</file>
</qresource>
diff --git a/src/gui/mainWindow.cpp b/src/gui/mainWindow.cpp
index eb15e82..c911721 100644
--- a/src/gui/mainWindow.cpp
+++ b/src/gui/mainWindow.cpp
@@ -16,7 +16,10 @@
#include <QtGui>
#include <QFileDialog>
+#include <QBuffer>
+#include <QDataStream>
#include <src/gui/mainWindow.h>
+#include <src/net/mcast/McastConfiguration.h>
using namespace std;
// setting the IF-DEF Block for the touchgui and the normal gui, for later use
@@ -34,6 +37,7 @@ using namespace std;
#include <src/gui/profileDialog.h>
//#include <src/gui/dialog.h>
#include <src/core/pvsConnectionManager.h>
+#include <src/gui/multicastConfigDialog.h>
#include <iostream>
MainWindow::MainWindow(QWidget *parent) :
@@ -129,6 +133,7 @@ MainWindow::MainWindow(QWidget *parent) :
ui->actionFoto->setStatusTip(tr("Make a screenshot for the selected client(s)"));
ui->actionLock->setStatusTip(tr("Lock or Unlock all Clients"));
connect(ui->actionCreate_profile, SIGNAL(triggered()), this, SLOT(createProfile()));
+ connect(ui->actionConfigure_Network, SIGNAL(triggered()), this, SLOT(configureNetwork()));
connect(ui->actionShow_Username, SIGNAL(triggered()), this, SLOT(showusername()));
connect(ui->actionShow_Hostname_IP, SIGNAL(triggered()), this, SLOT(showip()));
@@ -1197,7 +1202,17 @@ void MainWindow::startChatDialog()
sChatDialog.raise();//show the chat dialog on top level
}
-
+void MainWindow::configureNetwork()
+{
+ PVSServer* server = PVSConnectionManager::getManager()->getServer();
+ McastConfiguration mc(*(server->getMulticastConfiguration()));
+ MulticastConfigDialog* mcd = new MulticastConfigDialog(&mc, this);
+ int result = mcd->exec();
+ if(result == QDialog::Accepted)
+ {
+ server->multicastReconfigure(&mc);
+ }
+}
MainWindow* MainWindow::myself = NULL;
ConnectionList* MainWindow::conList = NULL;
diff --git a/src/gui/mainWindow.h b/src/gui/mainWindow.h
index 00bd927..41d9cfa 100644
--- a/src/gui/mainWindow.h
+++ b/src/gui/mainWindow.h
@@ -194,6 +194,7 @@ private slots:
void setPasswordForConnection(int enabled);
void combobox1(int menuindex1); // Funktion um index der combobox auszulesen und weiterzuverarbeiten s. Ticker 671
//void combobox2(int menuindex2); // Funktion um index der combobox auszulesen und weiterzuverarbeiten
+ void configureNetwork();
};
diff --git a/src/gui/multicastConfigDialog.cpp b/src/gui/multicastConfigDialog.cpp
new file mode 100644
index 0000000..ff370c7
--- /dev/null
+++ b/src/gui/multicastConfigDialog.cpp
@@ -0,0 +1,170 @@
+#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);
+}
diff --git a/src/gui/multicastConfigDialog.h b/src/gui/multicastConfigDialog.h
new file mode 100644
index 0000000..6421813
--- /dev/null
+++ b/src/gui/multicastConfigDialog.h
@@ -0,0 +1,38 @@
+#ifndef MULTICASTCONFIGDIALOG_H
+#define MULTICASTCONFIGDIALOG_H
+
+#include <QtGui/QDialog>
+#include <QPointer>
+#include "ui_multicastConfigDialog.h"
+#include <pvsinterface.h>
+
+class McastConfiguration;
+
+class MulticastConfigDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ MulticastConfigDialog(QWidget* parent = 0);
+ MulticastConfigDialog(McastConfiguration* dbusIface, QWidget *parent = 0);
+ ~MulticastConfigDialog();
+
+private:
+ Ui::MulticastConfigDialogClass _ui;
+ McastConfiguration* _config;
+ bool _isAddressValid;
+ bool _isPortValid;
+
+ void setupUi();
+
+ void setError(QWidget* input, QLabel* messageLabel, QString text);
+ void setOK(QWidget* input, QLabel* messageLabel);
+ void revalidateButtons();
+
+private slots:
+ void dialogAccepted();
+ void validateGroupAddress(QString const&);
+ void validateDataPort(QString const&);
+};
+
+#endif // MULTICASTCONFIGDIALOG_H
diff --git a/src/gui/ui/mainwindow.ui b/src/gui/ui/mainwindow.ui
index eb49d1b..7b8f2b4 100644
--- a/src/gui/ui/mainwindow.ui
+++ b/src/gui/ui/mainwindow.ui
@@ -243,9 +243,16 @@
</property>
<addaction name="actionAbout_pvs"/>
</widget>
+ <widget class="QMenu" name="menuNetwork">
+ <property name="title">
+ <string>Network</string>
+ </property>
+ <addaction name="actionConfigure_Network"/>
+ </widget>
<addaction name="menu_File"/>
<addaction name="menuClients"/>
<addaction name="menuLogging"/>
+ <addaction name="menuNetwork"/>
<addaction name="menu_Help"/>
</widget>
<widget class="QStatusBar" name="statusBar"/>
@@ -531,6 +538,14 @@
<string>-</string>
</property>
</action>
+ <action name="actionConfigure_Network">
+ <property name="text">
+ <string>&amp;Configure...</string>
+ </property>
+ <property name="toolTip">
+ <string>Configure Network Parameters</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
diff --git a/src/gui/ui/mainwindowtouch.ui b/src/gui/ui/mainwindowtouch.ui
index 9030b17..cf7e411 100644
--- a/src/gui/ui/mainwindowtouch.ui
+++ b/src/gui/ui/mainwindowtouch.ui
@@ -365,6 +365,8 @@
<addaction name="actionresetall"/>
<addaction name="separator"/>
<addaction name="actionDozent"/>
+ <addaction name="separator"/>
+ <addaction name="actionConfigure_Network"/>
</widget>
<action name="actionShow_Username">
<property name="checkable">
@@ -636,6 +638,15 @@
<string>Ctrl+D</string>
</property>
</action>
+ <action name="actionConfigure_Network">
+ <property name="icon">
+ <iconset resource="../../../pvsmgr.qrc">
+ <normaloff>:/netconf</normaloff>:/netconf</iconset>
+ </property>
+ <property name="text">
+ <string>Configure Network...</string>
+ </property>
+ </action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
diff --git a/src/gui/ui/multicastConfigDialog.ui b/src/gui/ui/multicastConfigDialog.ui
new file mode 100644
index 0000000..1ddf02c
--- /dev/null
+++ b/src/gui/ui/multicastConfigDialog.ui
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MulticastConfigDialogClass</class>
+ <widget class="QDialog" name="MulticastConfigDialogClass">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>331</width>
+ <height>314</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="windowTitle">
+ <string>PVS - Multicast Configuration</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;table style=&quot;-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;&quot;&gt;
+&lt;tr&gt;
+&lt;td style=&quot;border: none;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;You need to specify connection parameters for multicast messaging on your network. These parameters will automatically be distributed to client computers, so you need to assign them only once.&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;You will probably want to assign an address from the &lt;span style=&quot; text-decoration: underline;&quot;&gt;239.0.0.0/8&lt;/span&gt; &amp;quot;Administratively Scoped&amp;quot; range.&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Do not assign arbitrary numbers without checking with your network administrator!&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Multicast Group Address</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="groupAddressEdit">
+ <property name="inputMask">
+ <string notr="true">009.009.009.009; </string>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QLabel" name="groupAddressMessage">
+ <property name="text">
+ <string>&lt;span style=&quot; font-weight:600; color:#008800;&quot;&gt;OK&lt;/span&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Data Port (1024-65535)</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLineEdit" name="dataPortEdit">
+ <property name="inputMask">
+ <string notr="true">00009; </string>
+ </property>
+ <property name="maxLength">
+ <number>5</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QLabel" name="dataPortMessage">
+ <property name="text">
+ <string>&lt;span style=&quot; font-weight:600; color:#008800;&quot;&gt;OK&lt;/span&gt;</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Transmission Rate</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QSpinBox" name="rateSpinbox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix">
+ <string> KiB/s</string>
+ </property>
+ <property name="maximum">
+ <number>10240</number>
+ </property>
+ <property name="singleStep">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/net/mcast/McastConfiguration.h b/src/net/mcast/McastConfiguration.h
index 6884036..53f7a54 100644
--- a/src/net/mcast/McastConfiguration.h
+++ b/src/net/mcast/McastConfiguration.h
@@ -166,6 +166,23 @@ public:
emit changed();
}
+ McastConfiguration& operator=(McastConfiguration const& source)
+ {
+ if(this != &source)
+ {
+ _multicastInterface = source._multicastInterface;
+ _multicastAddress = source._multicastAddress;
+ _multicastRate = source._multicastRate;
+ _multicastSPort = source._multicastSPort;
+ _multicastDPort = source._multicastDPort;
+ _multicastWinSize = source._multicastWinSize;
+ _multicastMTU = source._multicastMTU;
+ _multicastUDPPortBase = source._multicastUDPPortBase;
+ _multicastUseUDP = source._multicastUseUDP;
+ }
+ return *this;
+ }
+
void loadFrom(QSettings* settings, char const* group = 0);
void writeTo(QSettings* settings, char const* group = 0) const;
diff --git a/src/net/pvsListenServer.cpp b/src/net/pvsListenServer.cpp
index f21303e..1c1387b 100644
--- a/src/net/pvsListenServer.cpp
+++ b/src/net/pvsListenServer.cpp
@@ -21,9 +21,13 @@
#include "pvsClientConnection.h"
#include "src/util/consoleLogger.h"
#include <QtNetwork/QSslSocket>
+#include <QBuffer>
+#include <QByteArray>
+#include <QSettings>
#include "SslServer.h"
#include <cassert>
//#define verbose
+#include "mcast/McastConfiguration.h"
// Create listener
PVSListenServer::PVSListenServer(int port, int clients)
@@ -36,6 +40,7 @@ PVSListenServer::PVSListenServer(int port, int clients)
else
_clientsMax = clients;
_port = port;
+ _mcastConfig = 0;
init();
}
@@ -178,6 +183,7 @@ void PVSListenServer::onClientConnected(PVSClientConnection* connected)
{
connected->setServerID(_id);
connected->setID(generateID());
+ connected->push_back_send(mcastConfigMessage());
}
void PVSListenServer::onClientDisconnected(PVSClientConnection* disconnected)
@@ -227,6 +233,11 @@ PVSClientConnection* PVSListenServer::getConnectionFromID(int id)
// Initialize listening socket
bool PVSListenServer::init()
{
+ if (_mcastConfig)
+ delete _mcastConfig;
+ _mcastConfig = new McastConfiguration(this);
+ loadMcastConfig();
+
if (_listenSocket != NULL)
shutdown();
@@ -306,3 +317,52 @@ bool PVSListenServer::isListening()
{
return _listenSocket != NULL && _listenSocket->isListening();
}
+
+void PVSListenServer::loadMcastConfig()
+{
+ QSettings settings;
+ _mcastConfig->loadFrom(&settings, "multicast-filetransfer");
+}
+
+void PVSListenServer::saveMcastConfig()
+{
+ QSettings settings;
+ _mcastConfig->writeTo(&settings, "multicast-filetransfer");
+ settings.sync();
+}
+
+PVSMsg PVSListenServer::mcastConfigMessage()
+{
+ // If anything is changed here, do not forget to
+ // 1. assign a new version number
+ // 2. adapt PVS::onCommand(PVSMsg) in pvs.cpp
+ QByteArray ba;
+ QDataStream strm(&ba, QIODevice::WriteOnly);
+ strm << (quint16)1 // version
+ << _mcastConfig->multicastAddress()
+ << _mcastConfig->multicastUDPPortBase()
+ << _mcastConfig->multicastDPort()
+ << _mcastConfig->multicastSPort()
+ << _mcastConfig->multicastMTU()
+ << _mcastConfig->multicastWinSize()
+ << _mcastConfig->multicastRate()
+ << _mcastConfig->multicastUseUDP();
+
+ QByteArray b64 = ba.toBase64();
+ QString message = QString::fromAscii(b64.constData(), b64.length());
+ PVSMsg msg(PVSCOMMAND, "MCASTFTCONFIG", message);
+ return msg;
+}
+
+void PVSListenServer::multicastReconfigure(McastConfiguration const* source)
+{
+ _mcastConfig->multicastAddress(source->multicastAddress());
+ *_mcastConfig = *source;
+ saveMcastConfig();
+ sendToAll(mcastConfigMessage());
+}
+
+McastConfiguration const* PVSListenServer::getMulticastConfiguration()
+{
+ return _mcastConfig;
+}
diff --git a/src/net/pvsListenServer.h b/src/net/pvsListenServer.h
index ab021c7..90d2a77 100644
--- a/src/net/pvsListenServer.h
+++ b/src/net/pvsListenServer.h
@@ -10,6 +10,7 @@ class SslServer;
class PVSClientConnection;
class PVSMsg;
+class McastConfiguration;
class PVSListenServer : public QObject
{
@@ -40,6 +41,12 @@ private:
bool init();
unsigned int generateID();
+ McastConfiguration* _mcastConfig;
+
+ void loadMcastConfig();
+ void saveMcastConfig();
+ PVSMsg mcastConfigMessage();
+
protected:
void timerEvent(QTimerEvent *event);
@@ -60,6 +67,9 @@ public:
bool disconnectClient(PVSClientConnection* delinquent);
void onConnectionRemoved(PVSClientConnection* delinquent);
+ void multicastReconfigure(McastConfiguration const* source);
+ McastConfiguration const* getMulticastConfiguration();
+
std::list<PVSClientConnection*>* getClientListPtr()
{
return &_clients;
diff --git a/src/pvs.cpp b/src/pvs.cpp
index 9bd36d6..df21468 100644
--- a/src/pvs.cpp
+++ b/src/pvs.cpp
@@ -45,7 +45,10 @@ PVS::PVS() :
loadCommands();
_blankScreen = NULL;
_vncPort = -1;
+
+ QSettings settings;
_masterMcastConfig = new McastConfiguration(this);
+ _masterMcastConfig->loadFrom(&settings);
// add a notify to the allow file, so we get informed when the file is changed
QString watchPath("/home/");
@@ -234,6 +237,11 @@ void PVS::onCommand(PVSMsg cmdMessage)
qDebug() << "Ignoring malformed MCASTFTANNOUNCE command: " << message;
return;
}
+ if (ident.compare("MCASTFTCONFIG") == 0)
+ {
+ loadMcastConfig(message);
+ return;
+ }
#ifdef never
// prototype
@@ -735,7 +743,8 @@ void PVS::cancelIncomingMulticastTransfer(qulonglong transferID)
void PVS::setMulticastInterface(QString const& interfaceName)
{
QSettings settings;
- settings.setValue("multicast/interface", interfaceName);
+ _masterMcastConfig->multicastInterface(interfaceName);
+ _masterMcastConfig->writeTo(&settings, "multicast");
settings.sync();
}
@@ -814,3 +823,50 @@ void PVS::incomingMulticastTransferDelete(qulonglong transferID)
_incomingTransfers.remove(transferID);
transfer->deleteLater();
}
+
+void PVS::loadMcastConfig(QString const& message)
+{
+ QByteArray ba = QByteArray::fromBase64(message.toAscii());
+ QDataStream d(&ba, QIODevice::ReadOnly);
+ quint16 ver, udpp, dp, sp, mtu, wsz;
+ quint32 rate;
+ QString addr;
+ bool useudp;
+
+ d >> ver;
+ if(ver != 1)
+ {
+ ConsoleLog writeLine(QString("Unable to decode multicast configuration message: Unknown version %1").arg(ver));
+ return;
+ }
+
+ d >> addr
+ >> udpp
+ >> dp
+ >> sp
+ >> mtu
+ >> wsz
+ >> rate
+ >> useudp;
+ if(d.status() != QDataStream::Ok)
+ {
+ ConsoleLog writeLine(QString("Unable to decode multicast configuration message: There was an error reading"));
+ return;
+ }
+
+ _masterMcastConfig->multicastUDPPortBase(udpp);
+ _masterMcastConfig->multicastDPort(dp);
+ _masterMcastConfig->multicastSPort(sp);
+ _masterMcastConfig->multicastMTU(mtu);
+ _masterMcastConfig->multicastWinSize(wsz);
+ _masterMcastConfig->multicastRate(rate);
+ _masterMcastConfig->multicastAddress(addr);
+ _masterMcastConfig->multicastUseUDP(useudp);
+
+ QSettings settings;
+ _masterMcastConfig->writeTo(&settings, "multicast");
+ settings.sync();
+
+ ConsoleLog writeLine(QString("Reconfigured multicast filetransfer to IP %1, UDP port base %2, destination port %3, source port %4, MTU %5, Window Size %6, rate %7, %8using UDP")
+ .arg(addr).arg(udpp).arg(dp).arg(sp).arg(mtu).arg(wsz).arg(rate).arg(useudp ? "" : "not "));
+}
diff --git a/src/pvs.h b/src/pvs.h
index 4c61ffd..3b3365c 100644
--- a/src/pvs.h
+++ b/src/pvs.h
@@ -88,6 +88,7 @@ public Q_SLOTS:
void cancelOutgoingMulticastTransfer(quint64 transferID);
void cancelIncomingMulticastTransfer(qulonglong transferID);
void setMulticastInterface(QString const& interfaceName);
+ void loadMcastConfig(QString const& encoded);
Q_SIGNALS:
void project(QString host, int port, QString passwd, bool fullscreen,