From b5d5d98645b84875b8903c3d52ea634e5e681132 Mon Sep 17 00:00:00 2001 From: "B. Petersen" Date: Mon, 4 Nov 2019 17:00:50 +0100 Subject: [PATCH] implement add_device_msg() --- deltachat-ffi/src/lib.rs | 17 +++++++++++++++++ src/chat.rs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 36190f393..8771e4a0c 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -811,6 +811,23 @@ pub unsafe extern "C" fn dc_set_draft( .unwrap_or(()) } +#[no_mangle] +pub unsafe extern "C" fn dc_add_device_msg(context: *mut dc_context_t, msg: *mut dc_msg_t) -> u32 { + if context.is_null() || msg.is_null() { + eprintln!("ignoring careless call to dc_add_device_msg()"); + return 0; + } + let ffi_context = &mut *context; + let ffi_msg = &mut *msg; + ffi_context + .with_inner(|ctx| { + chat::add_device_msg(ctx, &mut ffi_msg.message) + .unwrap_or_log_default(ctx, "Failed to add device message") + }) + .map(|msg_id| msg_id.to_u32()) + .unwrap_or(0) +} + #[no_mangle] pub unsafe extern "C" fn dc_get_draft(context: *mut dc_context_t, chat_id: u32) -> *mut dc_msg_t { if context.is_null() { diff --git a/src/chat.rs b/src/chat.rs index 11ae5fee2..c98be6328 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1914,6 +1914,37 @@ pub fn get_chat_id_by_grpid(context: &Context, grpid: impl AsRef) -> (u32, .unwrap_or((0, false, Blocked::Not)) } +pub fn add_device_msg(context: &Context, msg: &mut Message) -> Result { + let (chat_id, _blocked) = + create_or_lookup_by_contact_id(context, DC_CONTACT_ID_DEVICE, Blocked::Not)?; + let rfc724_mid = dc_create_outgoing_rfc724_mid(None, "@device"); + + prepare_msg_blob(context, msg)?; + unarchive(context, chat_id)?; + + context.sql.execute( + "INSERT INTO msgs (chat_id,from_id,to_id, timestamp,type,state, txt,param,rfc724_mid) \ + VALUES (?,?,?, ?,?,?, ?,?,?);", + params![ + chat_id, + DC_CONTACT_ID_DEVICE, + DC_CONTACT_ID_SELF, + dc_create_smeared_timestamp(context), + msg.type_0, + MessageState::InFresh, + msg.text.as_ref().map_or("", String::as_str), + msg.param.to_string(), + rfc724_mid, + ], + )?; + + let row_id = sql::get_rowid(context, &context.sql, "msgs", "rfc724_mid", &rfc724_mid); + let msg_id = MsgId::new(row_id); + context.call_cb(Event::IncomingMsg { chat_id, msg_id }); + + Ok(msg_id) +} + pub fn add_info_msg(context: &Context, chat_id: u32, text: impl AsRef) { let rfc724_mid = dc_create_outgoing_rfc724_mid(None, "@device");