WIP chunk signals

This commit is contained in:
Xavier Del Campo Romero 2023-10-04 01:23:11 +02:00
parent 38b075873f
commit ef9d52d99b
Signed by: xavi
GPG Key ID: 84FF3612A9BF43F2
7 changed files with 54 additions and 7 deletions

View File

@ -3,7 +3,7 @@ using Xmpp;
namespace Dino.Entities {
public class FileTransfer : Object {
public signal void progress_updated(int progress);
public const bool DIRECTION_SENT = true;
public const bool DIRECTION_RECEIVED = false;
@ -70,6 +70,14 @@ public class FileTransfer : Object {
public State state { get; set; default=State.NOT_STARTED; }
public int provider { get; set; }
public string info { get; set; }
public int progress_ { get; set; }
public int progress {
get {return progress_;}
set {
progress_ = value;
progress_updated(progress_);
}
}
public Cancellable cancellable { get; default=new Cancellable(); }
private Database? db;

View File

@ -119,7 +119,19 @@ public class FileManager : StreamInteractionModule, Object {
file_send_data = file_encryptor.preprocess_send_file(conversation, file_transfer, file_send_data, file_meta);
}
size_t sent_bytes = 0;
file_sender.progress.connect((length) => {
if (file_transfer.size != 0) {
sent_bytes += length;
file_transfer.progress =
(int)(((uint64)sent_bytes * (uint64)100)
/ (uint64)file_transfer.size);
debug(@"length=$(length), sent_bytes=$(sent_bytes), progress=$(file_transfer.progress)");
}
});
yield file_sender.send_file(conversation, file_transfer, file_send_data, file_meta);
file_transfer.state = FileTransfer.State.COMPLETE;
} catch (Error e) {
warning("Send file error: %s", e.message);
@ -292,6 +304,7 @@ public class FileManager : StreamInteractionModule, Object {
file_transfer.file_name = file_meta.file_name;
file_transfer.size = (int)file_meta.size;
file_transfer.info = info;
file_transfer.progress = 0;
var encryption = file_provider.get_encryption(file_transfer, receive_data, file_meta);
if (encryption != Encryption.NONE) file_transfer.encryption = encryption;
@ -328,7 +341,7 @@ public class FileManager : StreamInteractionModule, Object {
File file = File.new_for_path(Path.build_filename(get_storage_dir(), filename));
OutputStream os = file.create(FileCreateFlags.REPLACE_DESTINATION);
yield os.splice_async(file_transfer.input_stream, OutputStreamSpliceFlags.CLOSE_SOURCE|OutputStreamSpliceFlags.CLOSE_TARGET);
file_transfer.state = FileTransfer.State.COMPLETE;
file_transfer.state = FileTransfer.State.IN_PROGRESS;
file_transfer.path = filename;
file_transfer.input_stream = yield file.read_async();
} catch (Error e) {
@ -391,6 +404,7 @@ public interface FileProvider : Object {
public interface FileSender : Object {
public signal void upload_available(Account account);
public signal void progress(size_t length);
public abstract async bool is_upload_available(Conversation conversation);
public abstract async long get_file_size_limit(Conversation conversation);

View File

@ -31,7 +31,8 @@ public class FileDefaultWidget : EventBox {
cancel_button = new ModelButton() { text=_("Cancel"), visible=true };
}
public void update_file_info(string? mime_type, FileTransfer.State state, long size) {
public void update_file_info(string? mime_type, int progress,
bool direction, FileTransfer.State state, long size) {
this.state = state;
spinner.active = false; // A hidden spinning spinner still uses CPU. Deactivate asap
@ -58,7 +59,12 @@ public class FileDefaultWidget : EventBox {
popover_menu.closed.connect(on_pointer_left);
break;
case FileTransfer.State.IN_PROGRESS:
mime_label.label = _("Downloading %s…").printf(get_size_string(size));
if (direction == FileTransfer.DIRECTION_SENT) {
mime_label.label = _("Uploading %s (%d%%)…").printf(get_size_string(size), progress);
}
else {
mime_label.label = _("Downloading %s (%d)…").printf(get_size_string(size), progress);
}
spinner.active = true;
image_stack.set_visible_child_name("spinner");

View File

@ -148,6 +148,7 @@ public class FileDefaultWidgetController : Object {
this.notify["file-transfer-state"].connect(update_file_info);
this.notify["file-transfer-mime-type"].connect(update_file_info);
file_transfer.progress_updated.connect(update_file_info);
update_file_info();
}
@ -155,13 +156,15 @@ public class FileDefaultWidgetController : Object {
file_uri = file.get_uri();
state = FileTransfer.State.COMPLETE;
widget.name_label.label = this.file_name = file_name;
widget.update_file_info(mime_type, state, -1);
widget.update_file_info(mime_type, 0, false, state, -1);
}
private void update_file_info() {
file_uri = file_transfer.get_file().get_uri();
state = file_transfer.state;
widget.update_file_info(file_transfer.mime_type, file_transfer.state, file_transfer.size);
widget.update_file_info(file_transfer.mime_type,
file_transfer.progress,
file_transfer.direction, file_transfer.state, file_transfer.size);
}
private void open_file() {

View File

@ -74,7 +74,8 @@ public class FileSendOverlay : Gtk.EventBox {
if (widget == null) {
FileDefaultWidget default_widget = new FileDefaultWidget() { visible=true };
default_widget.name_label.label = file_name;
default_widget.update_file_info(mime_type, FileTransfer.State.COMPLETE, (long)file_info.get_size());
default_widget.update_file_info(mime_type, 100, FileTransfer.DIRECTION_SENT,
FileTransfer.State.COMPLETE, (long)file_info.get_size());
widget = default_widget;
}

View File

@ -136,6 +136,17 @@ public class FileProvider : Dino.FileProvider, Object {
var session = new Soup.Session();
session.user_agent = @"Dino/$(Dino.get_short_version()) ";
var get_message = new Soup.Message("GET", http_receive_data.url);
size_t received_bytes = 0;
get_message.wrote_body_data.connect((chunk) => {
debug(@"length=$(chunk.length), received_bytes=$(received_bytes), progress=$(file_transfer.progress)");
if (file_transfer.size != 0) {
received_bytes += chunk.length;
file_transfer.progress =
(int)(((uint64)received_bytes * (uint64)100)
/ (uint64)file_transfer.size);
debug(@"length=$(chunk.length), received_bytes=$(received_bytes), progress=$(file_transfer.progress)");
}
});
try {
#if SOUP_3_0

View File

@ -105,6 +105,10 @@ public class HttpFileSender : FileSender, Object {
put_message.request_body.set_accumulate(false);
put_message.wrote_headers.connect(() => transfer_more_bytes(file_transfer.input_stream, put_message.request_body));
put_message.wrote_chunk.connect(() => transfer_more_bytes(file_transfer.input_stream, put_message.request_body));
put_message.wrote_body_data.connect((chunk) => {
debug(@"wrote_body_data: chunk.length=$(chunk.length)");
progress(chunk.length);
});
#endif
foreach (var entry in file_send_data.headers.entries) {
put_message.request_headers.append(entry.key, entry.value);