From af9ae153aef1ef75b6249e3e8903ca77e2af214b Mon Sep 17 00:00:00 2001 From: holger krekel Date: Wed, 9 Oct 2019 09:48:24 +0200 Subject: [PATCH] introduce set_stock_translation and remove call to DC_EVENT_GET_STRING --- deltachat-ffi/deltachat.h | 13 ++++++++- deltachat-ffi/src/lib.rs | 23 ++++++++++++++++ src/context.rs | 2 ++ src/stock.rs | 56 +++++++++++++++++++-------------------- 4 files changed, 64 insertions(+), 30 deletions(-) diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 9a3563624..c52cce2d6 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -402,6 +402,16 @@ int dc_set_config (dc_context_t* context, const char* */ char* dc_get_config (dc_context_t* context, const char* key); +/** + * Set (translated) stock string + * + * @param context The context object + * @param stock_id the integer id of the stock message + * @param stock_msg the message to be used + * @return void + */ +int dc_set_stock_translation(dc_context_t* context, uint32_t, const char* value); + /** * Get information about the context. @@ -4316,7 +4326,8 @@ void dc_array_add_id (dc_array_t*, uint32_t); // depreca #define DC_STR_MSGLOCATIONENABLED 64 #define DC_STR_MSGLOCATIONDISABLED 65 #define DC_STR_LOCATION 66 -#define DC_STR_COUNT 66 +#define DC_STR_STICKER 67 +#define DC_STR_COUNT 67 void dc_str_unref (char*); diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 3a51867b1..f73bcf0b2 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -342,6 +342,29 @@ pub unsafe extern "C" fn dc_get_config( } } +#[no_mangle] +pub unsafe extern "C" fn dc_set_stock_translation( + context: *mut dc_context_t, + stock_id: u32, + stock_msg: *mut libc::c_char, +) -> libc::c_int { + if context.is_null() || stock_msg.is_null() { + eprintln!("ignoring careless call to dc_set_stock_string"); + return; + } + let msg = as_str(stock_msg); + let ffi_context = &*context; + ffi_context + .with_inner(|ctx| match ctx.set_stock_translation(stock_id, msg) { + Ok(()) => 1, + Err(err) => { + warn!(ctx, "could not set translation: {}", err); + 0 + } + }) + .unwrap_or(()) +} + #[no_mangle] pub unsafe extern "C" fn dc_get_info(context: *mut dc_context_t) -> *mut libc::c_char { if context.is_null() { diff --git a/src/context.rs b/src/context.rs index 3412015e7..d85e0c16d 100644 --- a/src/context.rs +++ b/src/context.rs @@ -63,6 +63,7 @@ pub struct Context { pub running_state: Arc>, /// Mutex to avoid generating the key for the user more than once. pub generating_key_mutex: Mutex<()>, + pub translated_stockstrings: HashMap, } #[derive(Debug, PartialEq, Eq)] @@ -145,6 +146,7 @@ impl Context { probe_imap_network: Arc::new(RwLock::new(false)), perform_inbox_jobs_needed: Arc::new(RwLock::new(false)), generating_key_mutex: Mutex::new(()), + translated_stockstrings: HashMap::new(), }; ensure!( diff --git a/src/stock.rs b/src/stock.rs index 4ef072927..347bb949e 100644 --- a/src/stock.rs +++ b/src/stock.rs @@ -5,8 +5,7 @@ use strum_macros::EnumProperty; use crate::contact::*; use crate::context::Context; -use crate::dc_tools::*; -use crate::events::Event; +use crate::error::Error; /// Stock strings /// @@ -123,19 +122,26 @@ impl StockMessage { } impl Context { + /// Set the stock string for the [StockMessage]. + /// + pub fn set_stock_translation( + &mut self, + id: StockMessage, + stockstring: String, + ) -> Result<(), Error> { + self.translated_stockstrings + .insert(id as usize, stockstring); + Ok(()) + } + /// Return the stock string for the [StockMessage]. /// - /// If the context callback responds with a string to use, e.g. a - /// translation, then this string will be returned. Otherwise a - /// default (English) string is returned. + /// Return a translation (if it was set with set_stock_translation before) + /// or a default (English) string. pub fn stock_str(&self, id: StockMessage) -> Cow { - let ptr = self.call_cb(Event::GetString { id, count: 0 }) as *mut libc::c_char; - if ptr.is_null() { - Cow::Borrowed(id.fallback()) - } else { - let ret = to_string_lossy(ptr); - unsafe { libc::free(ptr as *mut libc::c_void) }; - Cow::Owned(ret) + match self.translated_stockstrings.get(&(id as usize)) { + Some(x) => Cow::Borrowed(x), + None => Cow::Borrowed(id.fallback()), } } @@ -239,7 +245,6 @@ mod tests { use crate::test_utils::*; use crate::constants::DC_CONTACT_ID_SELF; - use libc::uintptr_t; use num_traits::ToPrimitive; @@ -255,25 +260,18 @@ mod tests { } #[test] - fn test_stock_str() { - let t = dummy_context(); - assert_eq!(t.ctx.stock_str(StockMessage::NoMessages), "No messages."); - } - - fn test_stock_str_no_fallback_cb(_ctx: &Context, evt: Event) -> uintptr_t { - match evt { - Event::GetString { - id: StockMessage::NoMessages, - .. - } => unsafe { "Hello there".strdup() as usize }, - _ => 0, - } + fn test_set_stock_translation() { + let mut t = dummy_context(); + t.ctx + .set_stock_translation(StockMessage::NoMessages, "xyz".to_string()) + .unwrap(); + assert_eq!(t.ctx.stock_str(StockMessage::NoMessages), "xyz") } #[test] - fn test_stock_str_no_fallback() { - let t = test_context(Some(Box::new(test_stock_str_no_fallback_cb))); - assert_eq!(t.ctx.stock_str(StockMessage::NoMessages), "Hello there"); + fn test_stock_str() { + let t = dummy_context(); + assert_eq!(t.ctx.stock_str(StockMessage::NoMessages), "No messages."); } #[test]