Private
Public Access
1
0

core: implement get_attachment_fd event for dbus, message limit for get_messages

This commit is contained in:
2026-02-21 23:26:00 -08:00
parent f38702bc95
commit f0ec6b8cb4
5 changed files with 153 additions and 75 deletions

View File

@@ -1,6 +1,9 @@
use dbus::arg;
use dbus_tree::MethodErr;
use std::fs::OpenOptions;
use std::os::fd::{FromRawFd, IntoRawFd};
use std::sync::Arc;
use std::time::Instant;
use std::{future::Future, thread};
use tokio::sync::{mpsc, oneshot, Mutex};
@@ -277,6 +280,7 @@ impl DbusRepository for DBusAgent {
conversation_id: String,
last_message_id: String,
) -> Result<Vec<arg::PropMap>, MethodErr> {
let started = Instant::now();
let last_message_id_opt = if last_message_id.is_empty() {
None
} else {
@@ -286,6 +290,9 @@ impl DbusRepository for DBusAgent {
let messages =
self.send_event_sync(|r| Event::GetMessages(conversation_id, last_message_id_opt, r))?;
let mut attachment_count: usize = 0;
let mut text_bytes: usize = 0;
let mapped: Vec<arg::PropMap> = messages
.into_iter()
.map(|msg| {
@@ -294,6 +301,7 @@ impl DbusRepository for DBusAgent {
// Remove the attachment placeholder here.
let text = msg.text.replace("\u{FFFC}", "");
text_bytes += text.len();
map.insert("text".into(), arg::Variant(Box::new(text)));
map.insert(
@@ -305,10 +313,12 @@ impl DbusRepository for DBusAgent {
arg::Variant(Box::new(msg.sender.display_name())),
);
let attachments: Vec<arg::PropMap> = msg
.attachments
.into_iter()
.map(|attachment| {
if !msg.attachments.is_empty() {
let attachments: Vec<arg::PropMap> = msg
.attachments
.into_iter()
.map(|attachment| {
attachment_count += 1;
let mut attachment_map = arg::PropMap::new();
attachment_map.insert(
"guid".into(),
@@ -351,17 +361,26 @@ impl DbusRepository for DBusAgent {
arg::Variant(Box::new(metadata_map)),
);
}
attachment_map
})
.collect();
attachment_map
})
.collect();
map.insert("attachments".into(), arg::Variant(Box::new(attachments)));
map.insert("attachments".into(), arg::Variant(Box::new(attachments)));
}
map
})
.collect();
log::debug!(
target: "dbus",
"GetMessages mapped in {}ms: {} messages, {} attachments, {} text-bytes",
started.elapsed().as_millis(),
mapped.len(),
attachment_count,
text_bytes
);
Ok(mapped)
}
@@ -406,6 +425,23 @@ impl DbusRepository for DBusAgent {
self.send_event_sync(|r| Event::DownloadAttachment(attachment_id, preview, r))
}
fn open_attachment_fd(
&mut self,
attachment_id: String,
preview: bool,
) -> Result<arg::OwnedFd, MethodErr> {
let attachment = self.send_event_sync(|r| Event::GetAttachment(attachment_id, r))?;
let path = attachment.get_path_for_preview(preview);
let file = OpenOptions::new()
.read(true)
.open(&path)
.map_err(|e| MethodErr::failed(&format!("Failed to open attachment: {}", e)))?;
let fd = file.into_raw_fd();
Ok(unsafe { arg::OwnedFd::from_raw_fd(fd) })
}
fn upload_attachment(&mut self, path: String) -> Result<String, MethodErr> {
use std::path::PathBuf;
let path = PathBuf::from(path);