aboutsummaryrefslogtreecommitdiff
path: root/libdino/src/service/file_manager.vala
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2026-08-14 11:45:08 +0200
committerfiaxh <git@lightrise.org>2026-08-21 18:18:03 +0200
commit8d49d83b3b45ab22d7b9d945c4b32296b07cb49e (patch)
tree5a0bf3d777c4efd806388163fc9dc74c87edd07b /libdino/src/service/file_manager.vala
parent6d0706bcaa6d54354e416174e3d2654a2bff81fe (diff)
Add initial support for multi-file transfers
Diffstat (limited to 'libdino/src/service/file_manager.vala')
-rw-r--r--libdino/src/service/file_manager.vala44
1 files changed, 11 insertions, 33 deletions
diff --git a/libdino/src/service/file_manager.vala b/libdino/src/service/file_manager.vala
index 964278a5..60b7fafa 100644
--- a/libdino/src/service/file_manager.vala
+++ b/libdino/src/service/file_manager.vala
@@ -16,17 +16,22 @@ public class FileManager : StreamInteractionModule, Object {
private StreamInteractor stream_interactor;
private Database db;
- private Gee.List<FileSender> file_senders = new ArrayList<FileSender>();
+ public Gee.List<FileSender> file_senders = new ArrayList<FileSender>();
private Gee.List<FileEncryptor> file_encryptors = new ArrayList<FileEncryptor>();
- private Gee.List<FileDecryptor> file_decryptors = new ArrayList<FileDecryptor>();
+ public Gee.List<FileDecryptor> file_decryptors = new ArrayList<FileDecryptor>();
private Gee.List<FileProvider> file_providers = new ArrayList<FileProvider>();
- private Gee.List<FileMetadataProvider> file_metadata_providers = new ArrayList<FileMetadataProvider>();
+ public Gee.List<FileMetadataProvider> file_metadata_providers = new ArrayList<FileMetadataProvider>();
public StatelessFileSharing sfs {
owned get { return stream_interactor.get_module(StatelessFileSharing.IDENTITY); }
private set { }
}
+ public FileManager2 fm2 {
+ owned get { return stream_interactor.get_module(FileManager2.IDENTITY); }
+ private set { }
+ }
+
public static void start(StreamInteractor stream_interactor, Database db) {
FileManager m = new FileManager(stream_interactor, db);
stream_interactor.add_module(m);
@@ -97,7 +102,7 @@ public class FileManager : StreamInteractionModule, Object {
try {
file_transfer.input_stream = yield file.read_async();
- yield save_file(file_transfer);
+ yield fm2.save_file(file_transfer);
stream_interactor.get_module(FileTransferStorage.IDENTITY).add_file(file_transfer);
conversation.last_active = file_transfer.time;
@@ -151,7 +156,7 @@ public class FileManager : StreamInteractionModule, Object {
file_transfer.state = FileTransfer.State.IN_PROGRESS;
- // Update current download progress in the FileTransfer
+ // Update current upload progress in the FileTransfer
LimitInputStream? limit_stream = file_transfer.input_stream as LimitInputStream;
if (limit_stream == null) {
limit_stream = new LimitInputStream(file_transfer.input_stream, file_meta.size);
@@ -216,19 +221,6 @@ public class FileManager : StreamInteractionModule, Object {
file_metadata_providers.add(file_metadata_provider);
}
- public bool is_sender_trustworthy(FileTransfer file_transfer, Conversation conversation) {
- if (file_transfer.direction == FileTransfer.DIRECTION_SENT) return true;
-
- Jid relevant_jid = conversation.counterpart;
- if (conversation.type_ == Conversation.Type.GROUPCHAT) {
- relevant_jid = stream_interactor.get_module(MucManager.IDENTITY).get_real_jid(file_transfer.from, conversation.account);
- }
- if (relevant_jid == null) return false;
-
- bool in_roster = stream_interactor.get_module(RosterManager.IDENTITY).get_roster_item(conversation.account, relevant_jid) != null;
- return in_roster;
- }
-
private async FileMeta get_file_meta(FileProvider file_provider, FileTransfer file_transfer, Conversation conversation, FileReceiveData receive_data_) throws FileReceiveError {
FileReceiveData receive_data = receive_data_;
FileMeta file_meta = file_provider.get_file_meta(file_transfer);
@@ -390,7 +382,7 @@ public class FileManager : StreamInteractionModule, Object {
FileTransfer file_transfer = create_file_transfer_from_provider_incoming(file_provider, info, from, time, local_time, conversation, receive_data, file_meta);
stream_interactor.get_module(FileTransferStorage.IDENTITY).add_file(file_transfer);
- if (is_sender_trustworthy(file_transfer, conversation)) {
+ if (fm2.is_sender_trustworthy(file_transfer, conversation)) {
try {
yield get_file_meta(file_provider, file_transfer, conversation, receive_data);
} catch (Error e) {
@@ -408,20 +400,6 @@ public class FileManager : StreamInteractionModule, Object {
received_file(file_transfer, conversation);
}
- private async void save_file(FileTransfer file_transfer) throws FileSendError {
- try {
- string filename = Random.next_int().to_string("%x") + "_" + file_transfer.file_name;
- 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.path = filename;
- file_transfer.input_stream = new LimitInputStream(yield file.read_async(), file_transfer.size);
- } catch (Error e) {
- throw new FileSendError.SAVE_FAILED("Saving file error: %s".printf(e.message));
- }
- }
-
public Message? get_message_for_file_transfer(FileTransfer file_transfer, Conversation conversation) {
if ((file_transfer.provider == 0 || file_transfer.provider == 2) && file_transfer.info != null) {
return stream_interactor.get_module(MessageStorage.IDENTITY).get_message_by_id(int.parse(file_transfer.info), conversation);