core: implement get_attachment_fd event for dbus, message limit for get_messages
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user