summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2014-07-04 01:03:36 +0000
committerme_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac>2014-07-04 01:03:36 +0000
commit3e1c3cd989180d2085ce5af7f4db2b156d5df578 (patch)
treeeb3a0d178b9ba41133558fdd416a3e3471c2f4d2
parentaf3c479447078c889b1bbb7a5e405c6f61620e82 (diff)
downloadpica-pica-3e1c3cd989180d2085ce5af7f4db2b156d5df578.tar.gz
pica-pica-3e1c3cd989180d2085ce5af7f4db2b156d5df578.zip
implemented file transfer cancellation
git-svn-id: svn://localhost/project_picapica/trunk@315 fb96df88-216d-11de-830c-f3023f12d8ac
-rwxr-xr-xPICA_client.c33
-rwxr-xr-xPICA_client.h1
-rw-r--r--pica-client/dialogs/filetransferdialog.cpp9
-rw-r--r--pica-client/dialogs/filetransferdialog.h2
-rw-r--r--pica-client/filetransfercontroller.cpp18
-rw-r--r--pica-client/skynet.cpp18
-rw-r--r--pica-client/skynet.h1
7 files changed, 81 insertions, 1 deletions
diff --git a/PICA_client.c b/PICA_client.c
index 6d428e4..50751d4 100755
--- a/PICA_client.c
+++ b/PICA_client.c
@@ -1827,6 +1827,39 @@ if (sending)
return PICA_send_filecontrol(chan, senderctl, receiverctl);
}
+int PICA_cancel_file(struct PICA_chaninfo *chan, int sending)
+{
+int senderctl = PICA_PROTO_FILECONTROL_VOID;
+int receiverctl = PICA_PROTO_FILECONTROL_VOID;
+
+if (sending)
+ {
+ if (chan->sendfilestate != PICA_CHANSENDFILESTATE_SENDING
+ && chan->sendfilestate != PICA_CHANSENDFILESTATE_PAUSED)
+ return PICA_ERRINVARG;
+
+ fclose(chan->sendfile_stream);
+ chan->sendfile_stream = NULL;
+ chan->sendfilestate = PICA_CHANSENDFILESTATE_IDLE;
+
+ senderctl = PICA_PROTO_FILECONTROL_CANCEL;
+ }
+ else
+ {
+ if (chan->recvfilestate != PICA_CHANRECVFILESTATE_RECEIVING
+ && chan->recvfilestate != PICA_CHANRECVFILESTATE_PAUSED)
+ return PICA_ERRINVARG;
+
+ fclose(chan->recvfile_stream);
+ chan->recvfile_stream = NULL;
+ chan->recvfilestate = PICA_CHANRECVFILESTATE_IDLE;
+
+ receiverctl = PICA_PROTO_FILECONTROL_CANCEL;
+ }
+
+return PICA_send_filecontrol(chan, senderctl, receiverctl);
+}
+
int PICA_send_filecontrol(struct PICA_chaninfo *chan, int senderctl, int receiverctl)
{
struct PICA_proto_msg *mp;
diff --git a/PICA_client.h b/PICA_client.h
index 81aec89..db1a52d 100755
--- a/PICA_client.h
+++ b/PICA_client.h
@@ -249,6 +249,7 @@ int PICA_deny_file(struct PICA_chaninfo *chan);
// if sending != 0 then pause sending file, else pause receiving of file
int PICA_pause_file(struct PICA_chaninfo *chan, int sending);
int PICA_resume_file(struct PICA_chaninfo *chan, int sending);
+int PICA_cancel_file(struct PICA_chaninfo *chan, int sending);
void PICA_close_channel(struct PICA_chaninfo *chn);
void PICA_close_connection(struct PICA_conninfo *cid);
diff --git a/pica-client/dialogs/filetransferdialog.cpp b/pica-client/dialogs/filetransferdialog.cpp
index bd442c8..41ebcdb 100644
--- a/pica-client/dialogs/filetransferdialog.cpp
+++ b/pica-client/dialogs/filetransferdialog.cpp
@@ -1,6 +1,7 @@
#include "filetransferdialog.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
+#include <QMessageBox>
#include <stdlib.h>
FileTransferDialog::FileTransferDialog(QByteArray peer_id, QString filename, quint64 size,
@@ -188,13 +189,21 @@ void FileTransferDialog::rightbuttonclick()
if (rightbutton->text() == tr("Deny"))
{
emit deniedFile(peer_id_);
+ setTransferStatus(DENIED);
return;
}
}
if (rightbutton->text() == tr("Cancel"))
{
+
+ if (QMessageBox::No == QMessageBox::question(this, tr("Cancel File Transfer"),
+ tr("Are you sure you want to cancel file transfer?"),
+ QMessageBox::Yes | QMessageBox::No, QMessageBox::No))
+ return;
+
emit cancelledFile(peer_id_, this);
+ setTransferStatus(CANCELLED);
}
}
diff --git a/pica-client/dialogs/filetransferdialog.h b/pica-client/dialogs/filetransferdialog.h
index 2511651..2f42e6d 100644
--- a/pica-client/dialogs/filetransferdialog.h
+++ b/pica-client/dialogs/filetransferdialog.h
@@ -26,6 +26,8 @@ public:
RECEIVINGFILE,
PAUSED,
CANCELLED,
+ PEERDISCONNECTED,
+ IOERROR,
FINISHED
};
diff --git a/pica-client/filetransfercontroller.cpp b/pica-client/filetransfercontroller.cpp
index ca1fa44..62d0285 100644
--- a/pica-client/filetransfercontroller.cpp
+++ b/pica-client/filetransfercontroller.cpp
@@ -96,6 +96,7 @@ void FileTransferController::file_resumed_incoming(QByteArray peer_id)
void FileTransferController::file_cancelled_incoming(QByteArray peer_id)
{
ftdialogs_in[peer_id]->cancelledByPeer();
+ ftdialogs_in.remove(peer_id);
}
void FileTransferController::file_ioerror_incoming(QByteArray peer_id)
@@ -111,11 +112,13 @@ void FileTransferController::file_paused_outgoing(QByteArray peer_id)
void FileTransferController::file_resumed_outgoing(QByteArray peer_id)
{
ftdialogs_out[peer_id]->resumedByPeer();
+
}
void FileTransferController::file_cancelled_outgoing(QByteArray peer_id)
{
ftdialogs_out[peer_id]->cancelledByPeer();
+ ftdialogs_out.remove(peer_id);
}
void FileTransferController::file_ioerror_outgoing(QByteArray peer_id)
@@ -147,14 +150,27 @@ void FileTransferController::file_denied_by_me(QByteArray peer_id)
{
skynet->DenyFile(peer_id);
- delete ftdialogs_in[peer_id];
+ //delete ftdialogs_in[peer_id];
ftdialogs_in.remove(peer_id);
}
void FileTransferController::file_cancelled_by_me(QByteArray peer_id, FileTransferDialog *from)
{
+ bool sending = true;
+
+ if (from->getTransferDirection() == FileTransferDialog::RECEIVING)
+ {
+ ftdialogs_in.remove(peer_id);
+
+ sending = false;
+ }
+ else
+ {
+ ftdialogs_out.remove(peer_id);
+ }
+ skynet->CancelFile(peer_id, sending);
}
void FileTransferController::file_paused_by_me(QByteArray peer_id, FileTransferDialog *from)
diff --git a/pica-client/skynet.cpp b/pica-client/skynet.cpp
index aba41d7..f4a3c2b 100644
--- a/pica-client/skynet.cpp
+++ b/pica-client/skynet.cpp
@@ -355,6 +355,24 @@ if ( (iptr = find_active_chan(peer_id)) )
write_mutex.unlock();//>>
}
+void SkyNet::CancelFile(QByteArray peer_id, bool cancel_sending)
+{
+int ret = PICA_OK;
+struct PICA_chaninfo *iptr;
+
+write_mutex.lock();//<<
+if ( (iptr = find_active_chan(peer_id)) )
+ {
+ ret = PICA_cancel_file(iptr, (int)cancel_sending );
+
+ if (ret != PICA_OK)
+ {
+ //show error somewhere somehow
+ }
+ }
+write_mutex.unlock();//>>
+}
+
void SkyNet::SendMessage(QByteArray to, QString msg)
{
int ret = PICA_OK;
diff --git a/pica-client/skynet.h b/pica-client/skynet.h
index 91eb2f1..4361b50 100644
--- a/pica-client/skynet.h
+++ b/pica-client/skynet.h
@@ -26,6 +26,7 @@ public:
void DenyFile(QByteArray from);
void PauseFile(QByteArray peer_id, bool pause_sending);
void ResumeFile(QByteArray peer_id, bool resume_sending);
+ void CancelFile(QByteArray peer_id, bool cancel_sending);
Accounts::AccountRecord CurrentAccount() {return skynet_account;};