summaryrefslogtreecommitdiffstats
path: root/pica-client
diff options
context:
space:
mode:
authorAnton <anton@picapica>2019-03-04 20:06:51 +0400
committerAnton <anton@picapica>2019-03-04 20:06:51 +0400
commitd1e06b9877096c848a8660bb476377b85cabcbbd (patch)
tree8bc55d6a90f63d3d18e2f41b8bfb8082d1a1cce2 /pica-client
parent0f7e68383a797309c382710567c76a469c8d0904 (diff)
downloadpica-pica-d1e06b9877096c848a8660bb476377b85cabcbbd.tar.gz
pica-pica-d1e06b9877096c848a8660bb476377b85cabcbbd.zip
pica-client: start timer with zero interval when file transfer is active
Diffstat (limited to 'pica-client')
-rw-r--r--pica-client/skynet.cpp53
-rw-r--r--pica-client/skynet.h5
2 files changed, 56 insertions, 2 deletions
diff --git a/pica-client/skynet.cpp b/pica-client/skynet.cpp
index c07d6a9..906e673 100644
--- a/pica-client/skynet.cpp
+++ b/pica-client/skynet.cpp
@@ -31,7 +31,7 @@
#include "../PICA_netconf.h"
SkyNet::SkyNet()
- : nodes(config_dbname), QObject(0)
+ : nodes(config_dbname), QObject(0), active_filetransfers(0)
{
self_aware = false;
@@ -69,9 +69,44 @@ SkyNet::SkyNet()
connect(this, SIGNAL(MultiloginMessageReceived(quint64,QString,quint16)), this, SLOT(multilogin_event(quint64,QString,quint16)), Qt::QueuedConnection);
event_loop_timer_id = startTimer(100);
+ file_transfer_timer_id = 0;
}
+void SkyNet::active_filetransfers_up()
+{
+ active_filetransfers++;
+
+ if (active_filetransfers > 0 && file_transfer_timer_id == 0)
+ {
+ file_transfer_timer_id = startTimer(0);
+ }
+}
+
+void SkyNet::active_filetransfers_down()
+{
+ active_filetransfers--;
+
+ Q_ASSERT(active_filetransfers >= 0);
+
+ if (active_filetransfers == 0 && file_transfer_timer_id != 0)
+ {
+ killTimer(file_transfer_timer_id);
+ file_transfer_timer_id = 0;
+ }
+}
+
+void SkyNet::active_filetransfers_reset()
+{
+ active_filetransfers = 0;
+
+ if (file_transfer_timer_id != 0)
+ {
+ killTimer(file_transfer_timer_id);
+ file_transfer_timer_id = 0;
+ }
+}
+
void SkyNet::nodelink_activated(PICA_c2n *c2n)
{
for (int i = 0; i < connecting_nodes.size(); i++)
@@ -266,7 +301,7 @@ void SkyNet::verify_peer_cert(QByteArray peer_id, QString cert_pem, bool *verifi
void SkyNet::timerEvent(QTimerEvent *e)
{
- if (e->timerId() == event_loop_timer_id)
+ if (e->timerId() == file_transfer_timer_id || e->timerId() == event_loop_timer_id)
{
if (connecting_nodes.size() > 0 || self_aware)
{
@@ -467,6 +502,7 @@ void SkyNet::Exit()
self_aware = false;
+ active_filetransfers_reset();
killTimer(retry_timer_id);
msgqueues.clear();
@@ -542,6 +578,8 @@ void SkyNet::AcceptFile(QByteArray from, QString filepath)
{
//show error somewhere somehow
}
+ else
+ active_filetransfers_up();
}
}
@@ -935,6 +973,7 @@ void SkyNet::accepted_file_cb(const unsigned char *peer_id)
{
qDebug() << "FILE: file was accepted by remote side\n";
+ skynet->active_filetransfers_up();
skynet->emit_OutgoingFileRequestAccepted(QByteArray((const char *)peer_id, PICA_ID_SIZE));
}
@@ -959,18 +998,22 @@ void SkyNet::file_control(const unsigned char *peer_id, unsigned int sender_cmd,
switch(sender_cmd)
{
case PICA_PROTO_FILECONTROL_PAUSE:
+ skynet->active_filetransfers_down();
skynet->emit_IncomingFilePaused(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
case PICA_PROTO_FILECONTROL_RESUME:
+ skynet->active_filetransfers_up();
skynet->emit_IncomingFileResumed(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
case PICA_PROTO_FILECONTROL_CANCEL:
+ skynet->active_filetransfers_down();
skynet->emit_IncomingFileCancelled(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
case PICA_PROTO_FILECONTROL_IOERROR:
+ skynet->active_filetransfers_down();
skynet->emit_IncomingFileIoError(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
}
@@ -980,18 +1023,22 @@ void SkyNet::file_control(const unsigned char *peer_id, unsigned int sender_cmd,
switch(receiver_cmd)
{
case PICA_PROTO_FILECONTROL_PAUSE:
+ skynet->active_filetransfers_down();
skynet->emit_OutgoingFilePaused(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
case PICA_PROTO_FILECONTROL_RESUME:
+ skynet->active_filetransfers_up();
skynet->emit_OutgoingFileResumed(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
case PICA_PROTO_FILECONTROL_CANCEL:
+ skynet->active_filetransfers_down();
skynet->emit_OutgoingFileCancelled(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
case PICA_PROTO_FILECONTROL_IOERROR:
+ skynet->active_filetransfers_down();
skynet->emit_OutgoingFileIoError(QByteArray((const char *)peer_id, PICA_ID_SIZE));
break;
}
@@ -1002,6 +1049,8 @@ void SkyNet::file_finished(const unsigned char *peer_id, int sending)
{
qDebug() << "file_finished callback\n";
+ skynet->active_filetransfers_down();
+
if (sending)
skynet->emit_OutgoingFileFinished(QByteArray((const char *)peer_id, PICA_ID_SIZE));
else
diff --git a/pica-client/skynet.h b/pica-client/skynet.h
index cb948e0..32b574f 100644
--- a/pica-client/skynet.h
+++ b/pica-client/skynet.h
@@ -93,6 +93,7 @@ private:
QMap<QByteArray, QList<QString> > sndfilequeues;
int retry_timer_id;
int event_loop_timer_id;
+ int file_transfer_timer_id;
void timerEvent(QTimerEvent * e);
@@ -100,6 +101,10 @@ private:
struct PICA_c2c *find_active_chan(QByteArray peer_id);
QList<QByteArray> filter_existing_chans(QList<QByteArray> peer_ids);
bool open_account();
+ void active_filetransfers_up();
+ void active_filetransfers_down();
+ void active_filetransfers_reset();
+ quint32 active_filetransfers;
void emit_MessageReceived(QByteArray from, QString msg);
void emit_UnableToDeliver(QByteArray to, QString msg);