diff options
Diffstat (limited to 'libdino/src')
| -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)"); } |
