diff options
| author | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2014-07-04 01:03:36 +0000 |
|---|---|---|
| committer | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2014-07-04 01:03:36 +0000 |
| commit | 3e1c3cd989180d2085ce5af7f4db2b156d5df578 (patch) | |
| tree | eb3a0d178b9ba41133558fdd416a3e3471c2f4d2 | |
| parent | af3c479447078c889b1bbb7a5e405c6f61620e82 (diff) | |
| download | pica-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-x | PICA_client.c | 33 | ||||
| -rwxr-xr-x | PICA_client.h | 1 | ||||
| -rw-r--r-- | pica-client/dialogs/filetransferdialog.cpp | 9 | ||||
| -rw-r--r-- | pica-client/dialogs/filetransferdialog.h | 2 | ||||
| -rw-r--r-- | pica-client/filetransfercontroller.cpp | 18 | ||||
| -rw-r--r-- | pica-client/skynet.cpp | 18 | ||||
| -rw-r--r-- | pica-client/skynet.h | 1 |
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;}; |
