WIP chunk signals
This commit is contained in:
parent
38b075873f
commit
0b006195fe
|
@ -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;
|
||||
|
|
|
@ -147,11 +147,12 @@ public class Database : Qlite.Database {
|
|||
public Column<int> state = new Column.Integer("state");
|
||||
public Column<int> provider = new Column.Integer("provider");
|
||||
public Column<string> info = new Column.Text("info");
|
||||
public Column<int> progress = new Column.Integer("progress");
|
||||
|
||||
internal FileTransferTable(Database db) {
|
||||
base(db, "file_transfer");
|
||||
init({id, account_id, counterpart_id, counterpart_resource, our_resource, direction, time, local_time,
|
||||
encryption, file_name, path, mime_type, size, state, provider, info});
|
||||
encryption, file_name, path, mime_type, size, state, provider, info, progress});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user