diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-10-04 01:23:11 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2023-10-09 16:38:02 +0200 |
| commit | 6d3aef271875eba7a3867259f2089e3801141b19 (patch) | |
| tree | fb8d639dd84c3c0242cd8bf5ea8f73b83a4c0bc8 /libdino | |
| parent | f3c50f07395f0e3331c4389015fe26ef53213c83 (diff) | |
Show file upload/download progress
Fixes upstream issue #1350.
Notes:
Image uploads were incorrectly handled by Dino, as they were always
reported as completed even if they were not, maybe so as to show the
image preview from the start. Now, Dino shows the upload progress for
all file types, and the image is only shown when completed.
Diffstat (limited to 'libdino')
| -rw-r--r-- | libdino/src/entity/file_transfer.vala | 1 | ||||
| -rw-r--r-- | libdino/src/service/file_manager.vala | 5 | ||||
| -rw-r--r-- | libdino/src/service/jingle_file_transfers.vala | 14 |
3 files changed, 18 insertions, 2 deletions
diff --git a/libdino/src/entity/file_transfer.vala b/libdino/src/entity/file_transfer.vala index 20bc1a7a..b58348a0 100644 --- a/libdino/src/entity/file_transfer.vala +++ b/libdino/src/entity/file_transfer.vala @@ -70,6 +70,7 @@ public class FileTransfer : Object { public State state { get; set; default=State.NOT_STARTED; } public int provider { get; set; } public string info { get; set; } + public uint64 transferred_bytes {get; set; } public Cancellable cancellable { get; default=new Cancellable(); } private Database? db; diff --git a/libdino/src/service/file_manager.vala b/libdino/src/service/file_manager.vala index 2ef79d84..a83af2d5 100644 --- a/libdino/src/service/file_manager.vala +++ b/libdino/src/service/file_manager.vala @@ -120,6 +120,7 @@ public class FileManager : StreamInteractionModule, Object { } 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); @@ -253,6 +254,7 @@ public class FileManager : StreamInteractionModule, Object { ssize_t read; while ((read = yield input_stream.read_async(buffer, Priority.LOW, file_transfer.cancellable)) > 0) { buffer.length = (int) read; + file_transfer.transferred_bytes += (uint64)read; yield os.write_async(buffer, Priority.LOW, file_transfer.cancellable); buffer.length = 1024; } @@ -288,6 +290,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.transferred_bytes = 0; var encryption = file_provider.get_encryption(file_transfer, receive_data, file_meta); if (encryption != Encryption.NONE) file_transfer.encryption = encryption; @@ -324,7 +327,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) { diff --git a/libdino/src/service/jingle_file_transfers.vala b/libdino/src/service/jingle_file_transfers.vala index 624be607..733376ba 100644 --- a/libdino/src/service/jingle_file_transfers.vala +++ b/libdino/src/service/jingle_file_transfers.vala @@ -220,7 +220,19 @@ public class JingleFileSender : FileSender, Object { } } try { - yield stream.get_module(Xep.JingleFileTransfer.Module.IDENTITY).offer_file_stream(stream, full_jid, file_transfer.input_stream, file_transfer.server_file_name, file_meta.size, precondition_name, precondition_options); + var? module = stream.get_module(Xep.JingleFileTransfer.Module.IDENTITY); + + if (module == null) + throw new FileSendError.UPLOAD_FAILED("unexpected null module"); + + module.transferred_bytes.connect((bytes) => { + file_transfer.transferred_bytes += bytes; + }); + + yield module.offer_file_stream(stream, full_jid, + file_transfer.cancellable, file_transfer.input_stream, + file_transfer.server_file_name, file_meta.size, + precondition_name, precondition_options); } catch (Error e) { throw new FileSendError.UPLOAD_FAILED(@"offer_file_stream failed: $(e.message)"); } |
