aboutsummaryrefslogtreecommitdiff
path: root/libdino/src
diff options
context:
space:
mode:
Diffstat (limited to 'libdino/src')
-rw-r--r--libdino/src/entity/file_transfer.vala1
-rw-r--r--libdino/src/service/file_manager.vala5
-rw-r--r--libdino/src/service/jingle_file_transfers.vala14
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)");
}