summaryrefslogtreecommitdiffstats
path: root/src/pvs.cpp
diff options
context:
space:
mode:
authorSebastien Braun2010-07-17 16:43:08 +0200
committerSebastien Braun2010-07-17 16:58:25 +0200
commit2ad0ca683dfade47078a2aafce9921ca238a9436 (patch)
tree1a0d8f8ef5c4b52c9016077ba0ea7b0f2609143e /src/pvs.cpp
parentMake McastSender work with a pre-opened socket (diff)
downloadpvs-2ad0ca683dfade47078a2aafce9921ca238a9436.tar.gz
pvs-2ad0ca683dfade47078a2aafce9921ca238a9436.tar.xz
pvs-2ad0ca683dfade47078a2aafce9921ca238a9436.zip
Implement UI and pvsDaemon components for outgoing Multicast Transfer
Diffstat (limited to 'src/pvs.cpp')
-rw-r--r--src/pvs.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/pvs.cpp b/src/pvs.cpp
index 2069e36..c7fe5ce 100644
--- a/src/pvs.cpp
+++ b/src/pvs.cpp
@@ -15,6 +15,8 @@
#include "src/net/pvsMsg.h"
#include "src/net/pvsServiceDiscovery.h"
#include "src/net/pvsDiscoveredServer.h"
+#include "src/net/mcast/McastConfiguration.h"
+#include "src/net/pvsOutgoingMulticastTransfer.h"
// D-Bus
#include "pvsadaptor.h"
@@ -38,6 +40,7 @@ PVS::PVS() :
loadCommands();
_blankScreen = NULL;
_vncPort = -1;
+ _masterMcastConfig = new McastConfiguration(this);
// add a notify to the allow file, so we get informed when the file is changed
QString watchPath("/home/");
@@ -176,6 +179,17 @@ void PVS::onCommand(PVSMsg cmdMessage)
unlock();
return;
}
+ if (ident.compare("MCASTFTRETRY") == 0)
+ {
+ QStringList fields = message.split(':');
+ if (fields[0].compare(getUserName()) == 0)
+ {
+ quint64 id = fields[0].toULongLong();
+ PVSOutgoingMulticastTransfer* transfer = _outgoingTransfers.value(id, 0);
+ if (transfer)
+ transfer->retry();
+ }
+ }
#ifdef never
// prototype
@@ -627,3 +641,49 @@ void PVS::signalHandler(int signal)
}
+bool PVS::createMulticastTransfer(QString const& objectPath, quint64& transferID, QString& errorReason)
+{
+ transferID = generateMcastTransferID();
+
+ PVSOutgoingMulticastTransfer* transfer = new PVSOutgoingMulticastTransfer(getUserName(), transferID, objectPath, this);
+ if (transfer->isError())
+ {
+ errorReason = transfer->reason();
+ delete transfer;
+ return false;
+ }
+
+ _outgoingTransfers.insert(transferID, transfer);
+ connect(transfer, SIGNAL(started(qulonglong)), SIGNAL(outgoingMulticastTransferStarted(qulonglong)));
+ connect(transfer, SIGNAL(finished(qulonglong)), SIGNAL(outgoingMulticastTransferFinished(qulonglong)));
+ connect(transfer, SIGNAL(failed(qulonglong, QString const)), SIGNAL(outgoingMulticastTransferFailed(qulonglong, QString const)));
+ connect(transfer, SIGNAL(progress(qulonglong, qulonglong, qulonglong)), SIGNAL(outgoingMulticastTransferProgress(qulonglong, qulonglong, qulonglong)));
+ connect(transfer, SIGNAL(announce(PVSMsg)), _pvsServerConnection, SLOT(sendMessage(PVSMsg)));
+ QTimer::singleShot(0, transfer, SLOT(start()));
+ errorReason = "";
+ return true;
+}
+
+void PVS::cancelOutgoingMulticastTransfer(quint64 transferID)
+{
+ PVSOutgoingMulticastTransfer* transfer = _outgoingTransfers.value(transferID, 0);
+
+ if (transfer)
+ {
+ delete transfer;
+ }
+}
+
+quint64 PVS::generateMcastTransferID()
+{
+ static quint64 nodeID = 0;
+ static quint16 counter = 0;
+
+ if (!nodeID)
+ {
+ QDataStream(QCryptographicHash::hash(getUserName().toLocal8Bit(), QCryptographicHash::Md5)) >> nodeID;
+ }
+
+ return (nodeID & Q_UINT64_C(0xffffffffffff0000)) | (quint64)(++counter);
+}
+