summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSebastien Braun2010-08-04 17:24:21 +0200
committerSebastien Braun2010-08-04 17:24:21 +0200
commit88dbb997a823ff77f752ac08105d12474345dfcb (patch)
tree19ff443503d1501b4033658d2185ea0e6aca7e53 /src
parentForward MCASTFTANNOUNCE and MCASTFTRETRY messages in pvsmgr and pvsmgrtouch. (diff)
downloadpvs-88dbb997a823ff77f752ac08105d12474345dfcb.tar.gz
pvs-88dbb997a823ff77f752ac08105d12474345dfcb.tar.xz
pvs-88dbb997a823ff77f752ac08105d12474345dfcb.zip
Implement GUI for receiving incoming multicast transfers
Diffstat (limited to 'src')
-rw-r--r--src/gui/clientFileReceiveDialog.cpp83
-rw-r--r--src/gui/clientFileReceiveDialog.h14
-rw-r--r--src/gui/ui/clientFileReceiveDialog.ui11
-rw-r--r--src/net/pvsIncomingMulticastTransfer.cpp37
-rw-r--r--src/net/pvsIncomingMulticastTransfer.h6
-rw-r--r--src/pvs.cpp19
-rw-r--r--src/pvs.h5
-rw-r--r--src/pvsgui.cpp7
-rw-r--r--src/pvsgui.h1
9 files changed, 154 insertions, 29 deletions
diff --git a/src/gui/clientFileReceiveDialog.cpp b/src/gui/clientFileReceiveDialog.cpp
index 669ca81..ff3226a 100644
--- a/src/gui/clientFileReceiveDialog.cpp
+++ b/src/gui/clientFileReceiveDialog.cpp
@@ -16,6 +16,9 @@
*/
#include "clientFileReceiveDialog.h"
+#include <pvsinterface.h>
+#include <QFileInfo>
+#include <limits.h>
ClientFileReceiveDialog::ClientFileReceiveDialog(QTcpSocket *socket, QWidget *parent) :
QDialog(parent)
@@ -37,9 +40,44 @@ ClientFileReceiveDialog::ClientFileReceiveDialog(QTcpSocket *socket, QWidget *pa
connect(this, SIGNAL(finished(int)), this, SLOT(deleteLater()));
}
+ClientFileReceiveDialog::ClientFileReceiveDialog(QString const& sender, qulonglong transferID,
+ QString const& filename, qulonglong size, OrgOpenslxPvsInterface* ifaceDBus, QWidget* parent)
+{
+ setupUi(this);
+
+ _transferID = transferID;
+ _filename = filename;
+ _ifaceDBus = ifaceDBus;
+ _bytesToRead = size;
+ _socket = 0;
+ _file = 0;
+ div = 1;
+ while((size / div) > INT_MAX)
+ {
+ div <<= 1;
+ }
+
+ connect(ifaceDBus, SIGNAL(incomingMulticastTransferStarted(qulonglong)), SLOT(mcastTransferStarted(qulonglong)));
+ connect(ifaceDBus, SIGNAL(incomingMulticastTransferProgress(qulonglong, qulonglong, qulonglong)),
+ SLOT(mcastTransferProgress(qulonglong, qulonglong, qulonglong)));
+ connect(ifaceDBus, SIGNAL(incomingMulticastTransferFinished(qulonglong)), SLOT(mcastTransferFinished(qulonglong)));
+ connect(ifaceDBus, SIGNAL(incomingMulticastTransferFailed(qulonglong, QString)), SLOT(mcastTransferFailed(qulonglong, QString)));
+ connect(cancelButton, SIGNAL(clicked()), SLOT(cancelTransfer()));
+
+ qDebug("[%s] New multicast incoming transfer: %s from %s", metaObject()->className(),
+ filename.toLocal8Bit().constData(), sender.toLocal8Bit().constData());
+
+
+ filenameLabel->setText(QFileInfo(filename).baseName());
+ labelNick->setText(sender);
+ progressBar->setRange(0, 0);
+}
+
+
ClientFileReceiveDialog::~ClientFileReceiveDialog()
{
- _socket->deleteLater();
+ if(_socket)
+ _socket->deleteLater();
qDebug("[%s] Deleted!", metaObject()->className());
}
@@ -168,6 +206,49 @@ void ClientFileReceiveDialog::error(QAbstractSocket::SocketError error)
close();
}
+void ClientFileReceiveDialog::mcastTransferStarted(qulonglong transferID)
+{
+ if(transferID != _transferID)
+ return;
+}
+
+void ClientFileReceiveDialog::mcastTransferProgress(qulonglong transferID, qulonglong bytes, qulonglong of)
+{
+ if(transferID != _transferID)
+ return;
+
+ progressBar->setRange(0, of);
+ progressBar->setValue(bytes);
+}
+
+void ClientFileReceiveDialog::mcastTransferFinished(qulonglong transferID)
+{
+ if(transferID != _transferID)
+ return;
+
+ QString filename = QFileDialog::getSaveFileName(this, tr("Where should I save %1?").arg(_filename), _filename);
+ QFile* file = new QFile(_filename);
+ if(!file->rename(filename))
+ {
+ QMessageBox::warning(this, tr("Could not rename file"), tr("Failed to rename %1 to %2").arg(_filename).arg(filename));
+ }
+ accept();
+}
+
+void ClientFileReceiveDialog::mcastTransferFailed(qulonglong transferID, QString reason)
+{
+ if(transferID != _transferID)
+ return;
+
+ QMessageBox::warning(this, tr("File transfer failed"), tr("File transfer failed for the following reason:\n%1").arg(reason));
+ reject();
+}
+
+void ClientFileReceiveDialog::cancelTransfer()
+{
+ _ifaceDBus->cancelIncomingMulticastTransfer(_transferID);
+}
+
QString ClientFileReceiveDialog::formatSize(qint64 size)
{
if (size >= 1000000000) // GB
diff --git a/src/gui/clientFileReceiveDialog.h b/src/gui/clientFileReceiveDialog.h
index c13d7b7..c9ed220 100644
--- a/src/gui/clientFileReceiveDialog.h
+++ b/src/gui/clientFileReceiveDialog.h
@@ -18,6 +18,8 @@
#include <QtNetwork>
#include "ui_clientFileReceiveDialog.h"
+class OrgOpenslxPvsInterface;
+
class ClientFileReceiveDialog: public QDialog,
private Ui::ClientFileReceiveDialogClass
{
@@ -25,6 +27,7 @@ Q_OBJECT
public:
ClientFileReceiveDialog(QTcpSocket *socket, QWidget *parent = 0);
+ ClientFileReceiveDialog(QString const& sender, qulonglong transferID, QString const& basename, qulonglong size, OrgOpenslxPvsInterface* ifaceDBus, QWidget* parent = 0);
~ClientFileReceiveDialog();
private Q_SLOTS:
@@ -33,6 +36,13 @@ private Q_SLOTS:
void close();
void error(QAbstractSocket::SocketError error);
+ // multicast:
+ void mcastTransferStarted(qulonglong transferID);
+ void mcastTransferProgress(qulonglong transferID, qulonglong bytes, qulonglong of);
+ void mcastTransferFinished(qulonglong transferID);
+ void mcastTransferFailed(qulonglong transferID, QString reason);
+ void cancelTransfer();
+
private:
void sendAck(bool b);
QString formatSize(qint64 size);
@@ -42,6 +52,10 @@ private:
qint64 _bytesToRead;
int div;
+ // multicast:
+ OrgOpenslxPvsInterface* _ifaceDBus;
+ QString _filename;
+ qulonglong _transferID;
};
#endif /* CLIENTFILERECEIVEDIALOG_H_ */
diff --git a/src/gui/ui/clientFileReceiveDialog.ui b/src/gui/ui/clientFileReceiveDialog.ui
index af3a135..a137def 100644
--- a/src/gui/ui/clientFileReceiveDialog.ui
+++ b/src/gui/ui/clientFileReceiveDialog.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>208</width>
- <height>108</height>
+ <width>528</width>
+ <height>117</height>
</rect>
</property>
<property name="windowTitle">
@@ -61,6 +61,13 @@
</property>
</spacer>
</item>
+ <item>
+ <widget class="QLabel" name="labelStatus">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
</layout>
</item>
<item>
diff --git a/src/net/pvsIncomingMulticastTransfer.cpp b/src/net/pvsIncomingMulticastTransfer.cpp
index 01507a9..10b5307 100644
--- a/src/net/pvsIncomingMulticastTransfer.cpp
+++ b/src/net/pvsIncomingMulticastTransfer.cpp
@@ -21,7 +21,7 @@
#include "pvsIncomingMulticastTransfer.h"
#include <src/net/mcast/McastReceiver.h>
-PVSIncomingMulticastTransfer::PVSIncomingMulticastTransfer(QString const& sender, qulonglong transferID, qulonglong size,
+PVSIncomingMulticastTransfer::PVSIncomingMulticastTransfer(QString const& sender, qulonglong transferID, qulonglong size, QString const& filename,
ushort port, McastConfiguration const* configTemplate, QObject* parent) :
QObject(parent),
_sender(sender),
@@ -29,19 +29,21 @@ PVSIncomingMulticastTransfer::PVSIncomingMulticastTransfer(QString const& sender
_bytes(0),
_size(size),
_port(port),
- _temporaryFile(new QTemporaryFile(QFileInfo(QDir::homePath(), "incoming.mcastft.XXXXXX").absolutePath(), this)),
- _finalFile(0),
+ _file(new QFile(filename, this)),
_receiver(0),
_config(configTemplate ?
new McastConfiguration(*configTemplate) :
new McastConfiguration()),
_progressTimer(new QTimer(this))
{
+ _file->open(QIODevice::WriteOnly);
+
_config->multicastUDPPortBase(port);
- _config->multicastDPort(port);
- _config->multicastSPort(port);
+ // _config->multicastDPort(port+1);
+ // _config->multicastSPort(port+2);
connect(_progressTimer, SIGNAL(timeout()), SLOT(updateProgress()));
+ connect(this, SIGNAL(failed(qulonglong, QString const&)), SLOT(removeFile()));
}
PVSIncomingMulticastTransfer::~PVSIncomingMulticastTransfer()
@@ -51,10 +53,10 @@ PVSIncomingMulticastTransfer::~PVSIncomingMulticastTransfer()
bool PVSIncomingMulticastTransfer::start()
{
- QFile *dest = _finalFile ? _finalFile : _temporaryFile;
- _receiver = new McastReceiver(dest, new McastConfiguration(*_config), this);
+ _file->open(QIODevice::WriteOnly);
+ _receiver = new McastReceiver(_file, new McastConfiguration(*_config), this);
connect(_receiver, SIGNAL(finished(int)), SLOT(receiverFinished(int)));
- connect(_receiver, SIGNAL(progress(quint64)), SLOT(receiverProgress(quint64)));
+ connect(_receiver, SIGNAL(progress(quint64)), SLOT(receiverProgressed(quint64)));
if (!_receiver->start())
{
@@ -76,17 +78,8 @@ void PVSIncomingMulticastTransfer::abort()
delete _progressTimer;
_progressTimer = 0;
- if (_temporaryFile)
- {
- _temporaryFile->remove();
- }
- delete _temporaryFile;
-
- if (_finalFile)
- {
- _finalFile->remove();
- }
- delete _finalFile;
+ if(_file)
+ delete _file;
}
void PVSIncomingMulticastTransfer::updatePort(ushort port)
@@ -124,6 +117,12 @@ void PVSIncomingMulticastTransfer::receiverFinished(int how)
}
}
+void PVSIncomingMulticastTransfer::removeFile()
+{
+ if(_file)
+ _file->remove();
+}
+
void PVSIncomingMulticastTransfer::updateProgress()
{
if (!_started)
diff --git a/src/net/pvsIncomingMulticastTransfer.h b/src/net/pvsIncomingMulticastTransfer.h
index 9a33348..f96e176 100644
--- a/src/net/pvsIncomingMulticastTransfer.h
+++ b/src/net/pvsIncomingMulticastTransfer.h
@@ -31,7 +31,7 @@ class PVSIncomingMulticastTransfer : public QObject
{
Q_OBJECT
public:
- PVSIncomingMulticastTransfer(QString const& sender, qulonglong transferID, qulonglong size, ushort port,
+ PVSIncomingMulticastTransfer(QString const& sender, qulonglong transferID, qulonglong size, QString const& filename, ushort port,
McastConfiguration const* configTemplate, QObject* parent = 0);
virtual ~PVSIncomingMulticastTransfer();
@@ -53,6 +53,7 @@ private slots:
void receiverProgressed(quint64 bytes);
void receiverFinished(int reason);
void updateProgress();
+ void removeFile();
private:
QString _sender;
@@ -60,8 +61,7 @@ private:
qulonglong _bytes;
qulonglong _size;
ushort _port;
- QFile* _temporaryFile;
- QFile* _finalFile;
+ QFile* _file;
McastReceiver* _receiver;
McastConfiguration* _config;
bool _started;
diff --git a/src/pvs.cpp b/src/pvs.cpp
index 0e5aaf5..852c9f4 100644
--- a/src/pvs.cpp
+++ b/src/pvs.cpp
@@ -716,9 +716,23 @@ void PVS::cancelOutgoingMulticastTransfer(quint64 transferID)
}
}
+void PVS::cancelIncomingMulticastTransfer(qulonglong transferID)
+{
+ PVSIncomingMulticastTransfer* transfer = _incomingTransfers.value(transferID, 0);
+
+ if(transfer)
+ {
+ _incomingTransfers.remove(transferID);
+ delete transfer;
+ }
+}
+
void PVS::onIncomingMulticastTransfer(QString const& sender, qulonglong transferID,
QString const& basename, qulonglong size, ushort port)
{
+ if (_outgoingTransfers.contains(transferID))
+ return;
+
PVSIncomingMulticastTransfer* transfer;
if (_incomingTransfers.value(transferID, 0))
{
@@ -727,7 +741,8 @@ void PVS::onIncomingMulticastTransfer(QString const& sender, qulonglong transfer
}
else
{
- transfer = new PVSIncomingMulticastTransfer(sender, transferID, size, port, _masterMcastConfig, this);
+ QString filename = QFileInfo(QDir::home(), QString("%1.part.%2").arg(basename).arg(transferID, 0, 16)).absoluteFilePath();
+ transfer = new PVSIncomingMulticastTransfer(sender, transferID, size, filename, port, _masterMcastConfig, this);
_incomingTransfers.insert(transferID, transfer);
connect(transfer, SIGNAL(retry(QString const&, qulonglong)), SLOT(onIncomingMulticastTransferRetry(QString const&, qulonglong)));
@@ -738,7 +753,7 @@ void PVS::onIncomingMulticastTransfer(QString const& sender, qulonglong transfer
connect(transfer, SIGNAL(finished(qulonglong)), SLOT(incomingMulticastTransferDelete(qulonglong)));
connect(transfer, SIGNAL(failed(qulonglong, QString const&)), SLOT(incomingMulticastTransferDelete(qulonglong)));
- emit incomingMulticastTransferNew(transferID, sender, basename, size);
+ emit incomingMulticastTransferNew(transferID, sender, filename, size);
QTimer::singleShot(0, transfer, SLOT(start()));
}
}
diff --git a/src/pvs.h b/src/pvs.h
index dc272f0..ef6454e 100644
--- a/src/pvs.h
+++ b/src/pvs.h
@@ -86,6 +86,7 @@ public Q_SLOTS:
// Multicast File Transfer
bool createMulticastTransfer(QString const& objectPath, quint64& transferID, QString& errorReason);
void cancelOutgoingMulticastTransfer(quint64 transferID);
+ void cancelIncomingMulticastTransfer(qulonglong transferID);
Q_SIGNALS:
@@ -106,7 +107,7 @@ Q_SIGNALS:
void outgoingMulticastTransferProgress(qulonglong transferID, qulonglong bytes, qulonglong of);
void outgoingMulticastTransferFinished(qulonglong transferID);
void outgoingMulticastTransferFailed(qulonglong transferID, QString reason);
- void incomingMulticastTransferNew(qulonglong transferID, QString sender, QString basename, qulonglong size);
+ void incomingMulticastTransferNew(qulonglong transferID, QString sender, QString filename, qulonglong size);
void incomingMulticastTransferStarted(qulonglong transferID);
void incomingMulticastTransferProgress(qulonglong transferID, qulonglong bytes, qulonglong of);
void incomingMulticastTransferFinished(qulonglong transferID);
@@ -166,12 +167,12 @@ private:
QHash<quint64, PVSIncomingMulticastTransfer*> _incomingTransfers;
void onIncomingMulticastTransfer(QString const& sender, qulonglong transferID, QString const& basename, qulonglong size, ushort port);
- void onIncomingMulticastTransferRetry(QString const& sender, qulonglong transferID);
static quint64 generateMcastTransferID();
private Q_SLOTS:
// housekeeping
void outgoingMulticastTransferDelete(qulonglong transferID);
void incomingMulticastTransferDelete(qulonglong transferID);
+ void onIncomingMulticastTransferRetry(QString const& sender, qulonglong transferID);
};
#endif /* PVSCLIENT_H_ */
diff --git a/src/pvsgui.cpp b/src/pvsgui.cpp
index 25f1cd6..e949d5b 100644
--- a/src/pvsgui.cpp
+++ b/src/pvsgui.cpp
@@ -119,6 +119,7 @@ PVSGUI::PVSGUI(QWidget *parent) :
connect(_ifaceDBus, SIGNAL(disconnected()), this, SLOT(disconnected()));
connect(_ifaceDBus, SIGNAL(addHost(QString)), this, SLOT(addHost(QString)));
connect(_ifaceDBus, SIGNAL(delHost(QString)), this, SLOT(delHost(QString)));
+ connect(_ifaceDBus, SIGNAL(incomingMulticastTransferNew(qulonglong, QString, QString, qulonglong)), SLOT(incomingMulticastFile(qulonglong, QString, QString, qulonglong)));
// show toolbar
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
@@ -421,6 +422,12 @@ void PVSGUI::receiveFile()
d->open();
}
+void PVSGUI::incomingMulticastFile(qulonglong transferID, QString sender, QString basename, qulonglong size)
+{
+ ClientFileReceiveDialog *d = new ClientFileReceiveDialog(sender, transferID, basename, size, _ifaceDBus, this);
+ d->open();
+}
+
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
diff --git a/src/pvsgui.h b/src/pvsgui.h
index f9a0ab8..2883b60 100644
--- a/src/pvsgui.h
+++ b/src/pvsgui.h
@@ -65,6 +65,7 @@ private Q_SLOTS:
void setVncAllow(int i);
void sendFile();
void receiveFile();
+ void incomingMulticastFile(qulonglong, QString sender, QString basename, qulonglong size);
private:
void setupMenu();