Skip to content

Commit

Permalink
added resuming file transfers
Browse files Browse the repository at this point in the history
-only works with disconnects (and not client restarts)
  • Loading branch information
notsecure committed May 26, 2014
1 parent 1fdecc1 commit 955b265
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/core/FileTransfer.vala
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ namespace Venom {
PENDING,
SENDING_FAILED,
RECEIVING_FAILED,
SENDING_BROKEN,
RECEIVING_BROKEN,
REJECTED,
IN_PROGRESS,
PAUSED,
Expand Down
24 changes: 23 additions & 1 deletion src/core/ToxSession.vala
Original file line number Diff line number Diff line change
Expand Up @@ -265,8 +265,24 @@ namespace Venom {
Contact contact = _contacts.get(friend_number);
contact.online = (status != 0);
contact.last_seen = new DateTime.now_local();

if(status == 0) {
contact.get_filetransfers().for_each((id, ft) => {
ft.status = (ft.direction == FileTransferDirection.INCOMING) ? FileTransferStatus.RECEIVING_BROKEN : FileTransferStatus.SENDING_BROKEN;
});
} else {
contact.get_filetransfers().for_each((id, ft) => {
if(ft.status == FileTransferStatus.RECEIVING_BROKEN) {
lock(handle) {
uint64[] data = {ft.bytes_processed};
handle.file_send_control(friend_number, 1, id, Tox.FileControlStatus.RESUME_BROKEN, (uint8[])data);
}
}
});
}

on_connection_status(contact);
return false;
return false;
});
}

Expand Down Expand Up @@ -656,6 +672,12 @@ namespace Venom {
}
}

public void accept_file_resume (int friendnumber, uint8 filenumber) {
lock(handle) {
handle.file_send_control(friendnumber, 0, filenumber, Tox.FileControlStatus.ACCEPT, null);
}
}

public void reject_file (int friendnumber, uint8 filenumber) {
lock(handle) {
handle.file_send_control(friendnumber, 1, filenumber, Tox.FileControlStatus.KILL, null);
Expand Down
23 changes: 19 additions & 4 deletions src/ui/ContactListWindow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -808,15 +808,16 @@ namespace Venom {
file_stream = file.read();
var file_info = file.query_info ("*", FileQueryInfoFlags.NONE);
uint64 file_size = file_info.get_size();
uint64 remaining_bytes_to_send = file_size;
uint64 remaining_bytes_to_send = file_size - ft.bytes_processed;
uint8[] bytes = new uint8[chunk_size];
bool read_more = true;
while ( remaining_bytes_to_send > 0 ) {
if(ft.status == FileTransferStatus.SENDING_FAILED || ft.status == FileTransferStatus.CANCELED) {
if(ft.status == FileTransferStatus.SENDING_FAILED || ft.status == FileTransferStatus.CANCELED
|| ft.status == FileTransferStatus.SENDING_BROKEN) {
return;
}
if(ft.status == FileTransferStatus.PAUSED) {
Thread.usleep(2500);
Thread.usleep(1000);
continue;
}
if(remaining_bytes_to_send < chunk_size) {
Expand All @@ -836,7 +837,7 @@ namespace Venom {
read_more = true;
} else {
read_more = false;
Thread.usleep(25000);
Thread.usleep(1000);
}
}
session.send_filetransfer_end(friendnumber,filenumber);
Expand Down Expand Up @@ -866,6 +867,11 @@ namespace Venom {
send_file(friendnumber,filenumber);return true;
});
}

if(status == Tox.FileControlStatus.ACCEPT && receive_send == 0) {
ft.status = FileTransferStatus.IN_PROGRESS;
}

if(status == Tox.FileControlStatus.KILL && receive_send == 1) {
if(ft.status == FileTransferStatus.PENDING) {
ft.status = FileTransferStatus.REJECTED;
Expand All @@ -880,6 +886,15 @@ namespace Venom {
ft.status = FileTransferStatus.DONE;
stderr.printf("File transfer finished for file number %u",filenumber);
}

if(status == Tox.FileControlStatus.RESUME_BROKEN && receive_send == 1) {
ft.bytes_processed = ((uint64[])data)[0];
ft.status = FileTransferStatus.IN_PROGRESS;
session.accept_file_resume(friendnumber, filenumber);
new Thread<bool>(null, () => {
send_file(friendnumber,filenumber);return true;
});
}
}

private void on_file_data(int friendnumber,uint8 filenumber,uint8[] data) {
Expand Down
11 changes: 11 additions & 0 deletions src/ui/FileTransferChatEntry.vala
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ namespace Venom {
} break;
case FileTransferStatus.IN_PROGRESS: {
save_as_button.visible = false;
size_or_status_label.set_text( UITools.format_filesize( ft.file_size ) );
cancel_button.visible = true;
} break;
case FileTransferStatus.PAUSED: {
size_or_status_label.set_text("Paused");
Expand All @@ -116,6 +118,15 @@ namespace Venom {
progress_bar.visible = false;
disable_buttons();
} break;

case FileTransferStatus.SENDING_BROKEN: {
size_or_status_label.set_text("Disconnected");
} break;

case FileTransferStatus.RECEIVING_BROKEN: {
size_or_status_label.set_text("Disconnected");
} break;

default:
GLib.assert_not_reached();
}
Expand Down

0 comments on commit 955b265

Please sign in to comment.