diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 22a544b3c..f24de72ca 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -1096,8 +1096,8 @@ void dc_set_draft (dc_context_t* context, uint32_t ch * Add a message to the device-chat. * Device-messages usually contain update information * and some hints that are added during the program runs, multi-device etc. - * The device-message is defined by a label; - * If a message with the same label was added or skipped before, + * The device-message may be defined by a label; + * if a message with the same label was added or skipped before, * the message is not added again, even if the message was deleted in between. * If needed, the device-chat is created before. * @@ -1109,6 +1109,7 @@ void dc_set_draft (dc_context_t* context, uint32_t ch * @param label A unique name for the message to add. * The label is typically not displayed to the user and * must be created from the characters `A-Z`, `a-z`, `0-9`, `_` or `-`. + * If you pass NULL here, the message is added unconditionally. * @param msg Message to be added to the device-chat. * The message appears to the user as an incoming message. * @return The ID of the added message, @@ -1122,39 +1123,23 @@ void dc_set_draft (dc_context_t* context, uint32_t ch * dc_msg_t* changelog_msg = dc_msg_new(DC_MSG_TEXT); * dc_msg_set_text(changelog_msg, "we have added 3 new emojis :)"); * - * if (dc_add_device_msg_once(context, "welcome", welcome_msg)) { + * if (dc_add_device_msg(context, "welcome", welcome_msg)) { * // do not add the changelog on a new installations - * // not now and not when this code is executed again * dc_skip_device_msg(context, "update-123"); * } else { * // welcome message was not added now, this is an oder installation, * // add a changelog - * dc_add_device_msg_once(context, "update-123", changelog_msg); + * dc_add_device_msg(context, "update-123", changelog_msg); * } * ~~~ */ -uint32_t dc_add_device_msg_once (dc_context_t* context, const char* label, dc_msg_t* msg); - - -/** - * Add a message to the device-chat unconditionally. - * As this skips the test if the message was added before, - * normally, you should prefer dc_add_device_msg_once() over this function - * - * Sends the event #DC_EVENT_MSGS_CHANGED on success. - * - * @memberof dc_context_t - * @param context The context as created by dc_context_new(). - * @param msg Message to be added to the device-chat. - * The message appears to the user as an incoming message. - * @return The ID of the added message. - */ -uint32_t dc_add_device_msg_unlabelled(dc_context_t* context, dc_msg_t* msg); +uint32_t dc_add_device_msg (dc_context_t* context, const char* label, dc_msg_t* msg); /** * Skip a device-message permanently. - * Subsequent calls to dc_add_device_msg_once() with the same label + * Subsequent calls to dc_add_device_msg() with the same label * won't add the device-message then. * This might be handy if you want to add * eg. different messages for first-install and updates. @@ -1175,7 +1160,7 @@ void dc_skip_device_msg (dc_context_t* context, const char* /** * Check if a device-message was ever added or skipped. * Device-messages can be added or skipped - * using dc_add_device_msg_once() or dc_skip_device_msg(). + * using dc_add_device_msg() or dc_skip_device_msg(). * * @memberof dc_context_t * @param context The context as created by dc_context_new(). @@ -2811,7 +2796,7 @@ int dc_chat_is_self_talk (const dc_chat_t* chat); * From the ui view, device-talks are not very special, * the user can delete and forward messages, archive the chat, set notifications etc. * - * Messages can be added to the device-talk using dc_add_device_msg_once() + * Messages can be added to the device-talk using dc_add_device_msg() * * @memberof dc_chat_t * @param chat The chat object. diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index c0bbb5dff..37062f422 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -812,41 +812,25 @@ pub unsafe extern "C" fn dc_set_draft( } #[no_mangle] -pub unsafe extern "C" fn dc_add_device_msg_unlabelled( - 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_unlabelled()"); - return 0; - } - let ffi_context = &mut *context; - let ffi_msg = &mut *msg; - ffi_context - .with_inner(|ctx| { - chat::add_device_msg_unlabelled(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_add_device_msg_once( +pub unsafe extern "C" fn dc_add_device_msg( context: *mut dc_context_t, label: *const libc::c_char, msg: *mut dc_msg_t, ) -> u32 { if context.is_null() || label.is_null() || msg.is_null() { - eprintln!("ignoring careless call to dc_add_device_msg_once()"); + 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_once(ctx, &to_string_lossy(label), &mut ffi_msg.message) - .unwrap_or_log_default(ctx, "Failed to add device message once") + chat::add_device_msg( + ctx, + to_opt_string_lossy(label).as_ref().map(|x| x.as_str()), + &mut ffi_msg.message, + ) + .unwrap_or_log_default(ctx, "Failed to add device message") }) .map(|msg_id| msg_id.to_u32()) .unwrap_or(0) diff --git a/examples/repl/cmdline.rs b/examples/repl/cmdline.rs index 179f60499..09cd3c3cf 100644 --- a/examples/repl/cmdline.rs +++ b/examples/repl/cmdline.rs @@ -837,7 +837,7 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E ); let mut msg = Message::new(Viewtype::Text); msg.set_text(Some(arg1.to_string())); - chat::add_device_msg_unlabelled(context, &mut msg)?; + chat::add_device_msg(context, None, &mut msg)?; } "listmedia" => { ensure!(sel_chat.is_some(), "No chat selected."); diff --git a/src/chat.rs b/src/chat.rs index 6bb0b40dc..7df2bd3b1 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1952,19 +1952,7 @@ pub fn get_chat_id_by_grpid(context: &Context, grpid: impl AsRef) -> (u32, .unwrap_or((0, false, Blocked::Not)) } -pub fn add_device_msg_unlabelled(context: &Context, msg: &mut Message) -> Result { - add_device_msg_maybe_labelled(context, None, msg) -} - -pub fn add_device_msg_once( - context: &Context, - label: &str, - msg: &mut Message, -) -> Result { - add_device_msg_maybe_labelled(context, Some(label), msg) -} - -fn add_device_msg_maybe_labelled( +pub fn add_device_msg( context: &Context, label: Option<&str>, msg: &mut Message, @@ -2161,12 +2149,12 @@ mod tests { // add two device-messages let mut msg1 = Message::new(Viewtype::Text); msg1.text = Some("first message".to_string()); - let msg1_id = add_device_msg_unlabelled(&t.ctx, &mut msg1); + let msg1_id = add_device_msg(&t.ctx, None, &mut msg1); assert!(msg1_id.is_ok()); let mut msg2 = Message::new(Viewtype::Text); msg2.text = Some("second message".to_string()); - let msg2_id = add_device_msg_unlabelled(&t.ctx, &mut msg2); + let msg2_id = add_device_msg(&t.ctx, None, &mut msg2); assert!(msg2_id.is_ok()); assert_ne!(msg1_id.as_ref().unwrap(), msg2_id.as_ref().unwrap()); @@ -2190,19 +2178,19 @@ mod tests { } #[test] - fn test_add_device_msg_once() { + fn test_add_device_msg_labelled() { let t = test_context(Some(Box::new(logging_cb))); // add two device-messages with the same label (second attempt is not added) let mut msg1 = Message::new(Viewtype::Text); msg1.text = Some("first message".to_string()); - let msg1_id = add_device_msg_once(&t.ctx, "any-label", &mut msg1); + let msg1_id = add_device_msg(&t.ctx, Some("any-label"), &mut msg1); assert!(msg1_id.is_ok()); assert!(!msg1_id.as_ref().unwrap().is_unset()); let mut msg2 = Message::new(Viewtype::Text); msg2.text = Some("second message".to_string()); - let msg2_id = add_device_msg_once(&t.ctx, "any-label", &mut msg2); + let msg2_id = add_device_msg(&t.ctx, Some("any-label"), &mut msg2); assert!(msg2_id.is_ok()); assert!(msg2_id.as_ref().unwrap().is_unset()); @@ -2234,7 +2222,7 @@ mod tests { message::delete_msgs(&t.ctx, &[*msg1_id.as_ref().unwrap()]); let msg1 = message::Message::load_from_db(&t.ctx, *msg1_id.as_ref().unwrap()); assert!(msg1.is_err() || msg1.unwrap().chat_id == DC_CHAT_ID_TRASH); - let msg3_id = add_device_msg_once(&t.ctx, "any-label", &mut msg2); + let msg3_id = add_device_msg(&t.ctx, Some("any-label"), &mut msg2); assert!(msg3_id.is_ok()); assert!(msg2_id.as_ref().unwrap().is_unset()); } @@ -2250,11 +2238,11 @@ mod tests { let mut msg = Message::new(Viewtype::Text); msg.text = Some("message text".to_string()); - let msg_id = add_device_msg_once(&t.ctx, "some-label", &mut msg); + let msg_id = add_device_msg(&t.ctx, Some("some-label"), &mut msg); assert!(msg_id.is_ok()); assert!(msg_id.as_ref().unwrap().is_unset()); - let msg_id = add_device_msg_once(&t.ctx, "unused-label", &mut msg); + let msg_id = add_device_msg(&t.ctx, Some("unused-label"), &mut msg); assert!(msg_id.is_ok()); assert!(!msg_id.as_ref().unwrap().is_unset()); } @@ -2267,7 +2255,7 @@ mod tests { let mut msg = Message::new(Viewtype::Text); msg.text = Some("message text".to_string()); - add_device_msg_once(&t.ctx, "another-label", &mut msg).ok(); + add_device_msg(&t.ctx, Some("another-label"), &mut msg).ok(); assert!(has_device_msg(&t.ctx, "another-label").unwrap()); assert!(!has_device_msg(&t.ctx, "unused-label").unwrap()); @@ -2287,7 +2275,7 @@ mod tests { let t = dummy_context(); let mut msg = Message::new(Viewtype::Text); msg.text = Some("foo".to_string()); - let msg_id = add_device_msg_unlabelled(&t.ctx, &mut msg).unwrap(); + let msg_id = add_device_msg(&t.ctx, None, &mut msg).unwrap(); let chat_id1 = message::Message::load_from_db(&t.ctx, msg_id) .unwrap() .chat_id; diff --git a/src/imex.rs b/src/imex.rs index 8248cb3a6..e16d2b839 100644 --- a/src/imex.rs +++ b/src/imex.rs @@ -247,7 +247,7 @@ fn maybe_add_bcc_self_device_msg(context: &Context) -> Result<()> { go to the settings and enable \"Send copy to self\"." .to_string(), ); - chat::add_device_msg_once(context, "bcc-self-hint", &mut msg)?; + chat::add_device_msg(context, Some("bcc-self-hint"), &mut msg)?; } Ok(()) }