Resultify Message::get_filebytes()

This commit is contained in:
link2xt
2023-01-06 19:22:57 +00:00
parent 087b4289e5
commit 58ba107d01
8 changed files with 18 additions and 16 deletions

View File

@@ -19,6 +19,7 @@
- jsonrpc: add python API for webxdc updates #3872 - jsonrpc: add python API for webxdc updates #3872
- jsonrpc: add fresh message count to ChatListItemFetchResult::ArchiveLink - jsonrpc: add fresh message count to ChatListItemFetchResult::ArchiveLink
- Add ffi functions to retrieve `verified by` information #3786 - Add ffi functions to retrieve `verified by` information #3786
- resultify `Message::get_filebytes()` #3925
### Fixes ### Fixes
- Do not add an error if the message is encrypted but not signed #3860 - Do not add an error if the message is encrypted but not signed #3860

View File

@@ -3309,6 +3309,8 @@ pub unsafe extern "C" fn dc_msg_get_filebytes(msg: *mut dc_msg_t) -> u64 {
let ctx = &*ffi_msg.context; let ctx = &*ffi_msg.context;
block_on(ffi_msg.message.get_filebytes(ctx)) block_on(ffi_msg.message.get_filebytes(ctx))
.unwrap_or_log_default(ctx, "Cannot get file size")
.unwrap_or_default()
} }
#[no_mangle] #[no_mangle]

View File

@@ -105,7 +105,7 @@ impl MessageObject {
let sender_contact = Contact::load_from_db(context, message.get_from_id()).await?; let sender_contact = Contact::load_from_db(context, message.get_from_id()).await?;
let sender = ContactObject::try_from_dc_contact(context, sender_contact).await?; let sender = ContactObject::try_from_dc_contact(context, sender_contact).await?;
let file_bytes = message.get_filebytes(context).await; let file_bytes = message.get_filebytes(context).await?.unwrap_or_default();
let override_sender_name = message.get_override_sender_name(); let override_sender_name = message.get_override_sender_name();
let webxdc_info = if message.get_viewtype() == Viewtype::Webxdc { let webxdc_info = if message.get_viewtype() == Viewtype::Webxdc {

View File

@@ -5202,7 +5202,7 @@ mod tests {
assert_eq!(msg.get_filename(), Some(filename.to_string())); assert_eq!(msg.get_filename(), Some(filename.to_string()));
assert_eq!(msg.get_width(), w); assert_eq!(msg.get_width(), w);
assert_eq!(msg.get_height(), h); assert_eq!(msg.get_height(), h);
assert!(msg.get_filebytes(&bob).await > 250); assert!(msg.get_filebytes(&bob).await?.unwrap() > 250);
Ok(()) Ok(())
} }

View File

@@ -494,11 +494,12 @@ impl Message {
.map(|name| name.to_string_lossy().to_string()) .map(|name| name.to_string_lossy().to_string())
} }
pub async fn get_filebytes(&self, context: &Context) -> u64 { /// Returns the size of the file in bytes, if applicable.
match self.param.get_path(Param::File, context) { pub async fn get_filebytes(&self, context: &Context) -> Result<Option<u64>> {
Ok(Some(path)) => get_filebytes(context, &path).await, if let Some(path) = self.param.get_path(Param::File, context)? {
Ok(None) => 0, Ok(Some(get_filebytes(context, &path).await?))
Err(_) => 0, } else {
Ok(None)
} }
} }
@@ -1102,7 +1103,7 @@ pub async fn get_msg_info(context: &Context, msg_id: MsgId) -> Result<String> {
} }
if let Some(path) = msg.get_file(context) { if let Some(path) = msg.get_file(context) {
let bytes = get_filebytes(context, &path).await; let bytes = get_filebytes(context, &path).await?;
ret += &format!("\nFile: {}, {}, bytes\n", path.display(), bytes); ret += &format!("\nFile: {}, {}, bytes\n", path.display(), bytes);
} }

View File

@@ -1432,7 +1432,7 @@ fn recipients_contain_addr(recipients: &[(String, String)], addr: &str) -> bool
async fn is_file_size_okay(context: &Context, msg: &Message) -> Result<bool> { async fn is_file_size_okay(context: &Context, msg: &Message) -> Result<bool> {
match msg.param.get_path(Param::File, context)? { match msg.param.get_path(Param::File, context)? {
Some(path) => { Some(path) => {
let bytes = get_filebytes(context, &path).await; let bytes = get_filebytes(context, &path).await?;
Ok(bytes <= UPPER_LIMIT_FILE_SIZE) Ok(bytes <= UPPER_LIMIT_FILE_SIZE)
} }
None => Ok(false), None => Ok(false),

View File

@@ -3145,7 +3145,7 @@ On 2020-10-25, Bob wrote:
assert_eq!(msg.is_dc_message, MessengerMessage::No); assert_eq!(msg.is_dc_message, MessengerMessage::No);
assert_eq!(msg.chat_blocked, Blocked::Request); assert_eq!(msg.chat_blocked, Blocked::Request);
assert_eq!(msg.state, MessageState::InFresh); assert_eq!(msg.state, MessageState::InFresh);
assert_eq!(msg.get_filebytes(&t).await, 2115); assert_eq!(msg.get_filebytes(&t).await.unwrap().unwrap(), 2115);
assert!(msg.get_file(&t).is_some()); assert!(msg.get_file(&t).is_some());
assert_eq!(msg.get_filename().unwrap(), "avatar64x64.png"); assert_eq!(msg.get_filename().unwrap(), "avatar64x64.png");
assert_eq!(msg.get_width(), 64); assert_eq!(msg.get_width(), 64);

View File

@@ -364,12 +364,10 @@ pub(crate) fn get_abs_path(context: &Context, path: impl AsRef<Path>) -> PathBuf
} }
} }
pub(crate) async fn get_filebytes(context: &Context, path: impl AsRef<Path>) -> u64 { pub(crate) async fn get_filebytes(context: &Context, path: impl AsRef<Path>) -> Result<u64> {
let path_abs = get_abs_path(context, &path); let path_abs = get_abs_path(context, &path);
match fs::metadata(&path_abs).await { let meta = fs::metadata(&path_abs).await?;
Ok(meta) => meta.len(), Ok(meta.len())
Err(_err) => 0,
}
} }
pub(crate) async fn delete_file(context: &Context, path: impl AsRef<Path>) -> bool { pub(crate) async fn delete_file(context: &Context, path: impl AsRef<Path>) -> bool {
@@ -1055,7 +1053,7 @@ DKIM Results: Passed=true, Works=true, Allow_Keychange=true";
.is_ok()); .is_ok());
assert!(file_exist!(context, "$BLOBDIR/foobar")); assert!(file_exist!(context, "$BLOBDIR/foobar"));
assert!(!file_exist!(context, "$BLOBDIR/foobarx")); assert!(!file_exist!(context, "$BLOBDIR/foobarx"));
assert_eq!(get_filebytes(context, "$BLOBDIR/foobar").await, 7); assert_eq!(get_filebytes(context, "$BLOBDIR/foobar").await.unwrap(), 7);
let abs_path = context let abs_path = context
.get_blobdir() .get_blobdir()