diff --git a/deltachat-jsonrpc/src/api.rs b/deltachat-jsonrpc/src/api.rs index 5c34a554c9..8120d3ba31 100644 --- a/deltachat-jsonrpc/src/api.rs +++ b/deltachat-jsonrpc/src/api.rs @@ -49,7 +49,7 @@ use types::chat::FullChat; use types::contact::{ContactObject, VcardContact}; use types::events::Event; use types::http::HttpResponse; -use types::message::{MessageData, MessageObject, MessageReadReceipt}; +use types::message::{LateFilingMediaSize, MessageData, MessageObject, MessageReadReceipt}; use types::provider_info::ProviderInfo; use types::reactions::JSONRPCReactions; use types::webxdc::WebxdcMessageInfo; @@ -1262,6 +1262,31 @@ impl CommandApi { MsgId::new(message_id).download_full(&ctx).await } + /// Late filing information to a message. + /// Changes the message width, height or duration, and stores it into the database. + /// + /// Sometimes, the core cannot find out the width, the height or the duration + /// of an image, an audio or a video. + /// + /// If, in these cases, the frontend can provide the information, it can save + /// them together with the message object for later usage. + /// + /// This function should only be used if `Message.dimensions_width`, `Message.dimensions_height` or `Message.duration` + /// do not provide the expected values. + /// + /// To get the stored values later, use `Message.dimensions_width`, `Message.dimensions_height` or `Message.duration`. + async fn late_file_message_mediasize( + &self, + account_id: u32, + message_id: u32, + new_size: LateFilingMediaSize, + ) -> Result<()> { + let ctx = self.get_context(account_id).await?; + new_size + .apply_to_message(&ctx, MsgId::new(message_id)) + .await + } + /// Search messages containing the given query string. /// Searching can be done globally (chat_id=None) or in a specified chat only (chat_id set). /// diff --git a/deltachat-jsonrpc/src/api/types/message.rs b/deltachat-jsonrpc/src/api/types/message.rs index efe7b66ca6..72e98a9c10 100644 --- a/deltachat-jsonrpc/src/api/types/message.rs +++ b/deltachat-jsonrpc/src/api/types/message.rs @@ -712,3 +712,38 @@ impl From<deltachat::ephemeral::Timer> for EphemeralTimer { } } } + +#[derive(Deserialize, TypeDef, schemars::JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct LateFilingMediaSize { + // The new width and height to store in the message object. None if you don't want to change the dimensions. + pub wh: Option<(u32, u32)>, + // The new duration to store in the message object. None if you don't want to change it. + pub duration: Option<u32>, +} + +impl LateFilingMediaSize { + pub async fn apply_to_message( + &self, + context: &Context, + message_id: MsgId, + ) -> anyhow::Result<()> { + let mut message = deltachat::message::Message::load_from_db(context, message_id).await?; + let (width, height) = match self.wh { + Some((w, h)) => ( + w.to_i32().context("conversion to i32 failed")?, + h.to_i32().context("conversion to i32 failed")?, + ), + None => (0, 0), + }; + let duration = self + .duration + .unwrap_or(0) + .to_i32() + .context("conversion to i32 failed")?; + message + .latefiling_mediasize(context, width, height, duration) + .await?; + Ok(()) + } +}