streamline dc_add_device_msg_once|unlabelled() to one function

This commit is contained in:
B. Petersen
2019-11-19 11:49:02 +01:00
parent 1534a07ded
commit d3fa289f27
5 changed files with 30 additions and 73 deletions

View File

@@ -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.

View File

@@ -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)

View File

@@ -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.");

View File

@@ -1952,19 +1952,7 @@ pub fn get_chat_id_by_grpid(context: &Context, grpid: impl AsRef<str>) -> (u32,
.unwrap_or((0, false, Blocked::Not))
}
pub fn add_device_msg_unlabelled(context: &Context, msg: &mut Message) -> Result<MsgId, Error> {
add_device_msg_maybe_labelled(context, None, msg)
}
pub fn add_device_msg_once(
context: &Context,
label: &str,
msg: &mut Message,
) -> Result<MsgId, Error> {
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;

View File

@@ -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(())
}