diff options
author | Sebastien Braun | 2010-07-19 11:53:55 +0200 |
---|---|---|
committer | Sebastien Braun | 2010-07-19 11:53:55 +0200 |
commit | 755f07b1a25c414b0c7cbe28db4a7ecbc32975c7 (patch) | |
tree | a9dc99869865bc0f1f0b3e19c488459b3bc8a7fd /src/pvs.cpp | |
parent | Remember to delete outgoing transfers when they are finished or failed (diff) | |
download | pvs-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.cpp | 85 |
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(); +} |