summaryrefslogtreecommitdiffstats
path: root/src/pvs.cpp
diff options
context:
space:
mode:
authorSebastien Braun2010-07-19 11:53:55 +0200
committerSebastien Braun2010-07-19 11:53:55 +0200
commit755f07b1a25c414b0c7cbe28db4a7ecbc32975c7 (patch)
treea9dc99869865bc0f1f0b3e19c488459b3bc8a7fd /src/pvs.cpp
parentRemember to delete outgoing transfers when they are finished or failed (diff)
downloadpvs-755f07b1a25c414b0c7cbe28db4a7ecbc32975c7.tar.gz
pvs-755f07b1a25c414b0c7cbe28db4a7ecbc32975c7.tar.xz
pvs-755f07b1a25c414b0c7cbe28db4a7ecbc32975c7.zip
Implement initial multicast receive functionality in PVS daemon
Diffstat (limited to 'src/pvs.cpp')
-rw-r--r--src/pvs.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/pvs.cpp b/src/pvs.cpp
index af5958e..8f06f74 100644
--- a/src/pvs.cpp
+++ b/src/pvs.cpp
@@ -17,6 +17,7 @@
#include "src/net/pvsDiscoveredServer.h"
#include "src/net/mcast/McastConfiguration.h"
#include "src/net/pvsOutgoingMulticastTransfer.h"
+#include "src/net/pvsIncomingMulticastTransfer.h"
// D-Bus
#include "pvsadaptor.h"
@@ -190,6 +191,45 @@ void PVS::onCommand(PVSMsg cmdMessage)
transfer->retry();
}
}
+ if (ident.compare("MCASTFTANNOUNCE") == 0)
+ {
+ QStringList fields = message.split(':');
+ bool ok;
+ QString sender;
+ qulonglong transferID;
+ QString basename;
+ qulonglong size;
+ ushort port;
+
+ if (!fields.size() == 5)
+ {
+ goto malformedAnnounce;
+ }
+ sender = fields[0];
+ transferID = fields[1].toULongLong(&ok);
+ if (!ok)
+ {
+ goto malformedAnnounce;
+ }
+ basename = fields[2];
+ size = fields[3].toULongLong(&ok);
+ if (!ok)
+ {
+ goto malformedAnnounce;
+ }
+ port = fields[4].toUShort(&ok);
+ if (!ok)
+ {
+ goto malformedAnnounce;
+ }
+
+ onIncomingMulticastTransfer(sender, transferID, basename, size, port);
+ return;
+
+ malformedAnnounce:
+ qDebug() << "Ignoring malformed MCASTFTANNOUNCE command: " << message;
+ return;
+ }
#ifdef never
// prototype
@@ -676,6 +716,39 @@ void PVS::cancelOutgoingMulticastTransfer(quint64 transferID)
}
}
+void PVS::onIncomingMulticastTransfer(QString const& sender, qulonglong transferID,
+ QString const& basename, qulonglong size, ushort port)
+{
+ PVSIncomingMulticastTransfer* transfer;
+ if (_incomingTransfers.value(transferID, 0))
+ {
+ transfer->updatePort(port);
+ QTimer::singleShot(0, transfer, SLOT(start()));
+ }
+ else
+ {
+ transfer = new PVSIncomingMulticastTransfer(sender, transferID, size, port, _masterMcastConfig, this);
+ _incomingTransfers.insert(transferID, transfer);
+
+ connect(transfer, SIGNAL(retry(QString const&, qulonglong)), SLOT(onIncomingMulticastTransferRetry(QString const&, qulonglong)));
+ connect(transfer, SIGNAL(started(qulonglong)), SIGNAL(incomingMulticastTransferStarted(qulonglong)));
+ connect(transfer, SIGNAL(progress(qulonglong, qulonglong, qulonglong)), SIGNAL(incomingMulticastTransferProgress(qulonglong, qulonglong, qulonglong)));
+ connect(transfer, SIGNAL(finished(qulonglong)), SIGNAL(incomingMulticastTransferFinished(qulonglong)));
+ connect(transfer, SIGNAL(failed(qulonglong, QString const&)), SIGNAL(incomingMulticastTransferFailed(qulonglong, QString)));
+ connect(transfer, SIGNAL(finished(qulonglong)), SLOT(incomingMulticastTransferDelete(qulonglong)));
+ connect(transfer, SIGNAL(failed(qulonglong, QString const&)), SLOT(incomingMulticastTransferDelete(qulonglong)));
+
+ emit incomingMulticastTransferNew(transferID, sender, basename, size);
+ QTimer::singleShot(0, transfer, SLOT(start()));
+ }
+}
+
+void PVS::onIncomingMulticastTransferRetry(QString const& sender, qulonglong transferID)
+{
+ PVSMsg retryMessage(PVSCOMMAND, "MCASTFTRETRY", QString("%1:%2").arg(sender).arg(transferID));
+ _pvsServerConnection->sendMessage(retryMessage);
+}
+
quint64 PVS::generateMcastTransferID()
{
static quint64 nodeID = 0;
@@ -698,3 +771,15 @@ void PVS::outgoingMulticastTransferDelete(qulonglong transferID)
_outgoingTransfers.remove(transferID);
transfer->deleteLater();
}
+
+void PVS::incomingMulticastTransferDelete(qulonglong transferID)
+{
+ PVSIncomingMulticastTransfer* transfer = _incomingTransfers.value(transferID, 0);
+ if (!transfer)
+ {
+ return;
+ }
+
+ _incomingTransfers.remove(transferID);
+ transfer->deleteLater();
+}