diff --git a/deltachat-ffi/src/lib.rs b/deltachat-ffi/src/lib.rs index 18188c94c..1fd78b42c 100644 --- a/deltachat-ffi/src/lib.rs +++ b/deltachat-ffi/src/lib.rs @@ -13,6 +13,7 @@ extern crate num_traits; use num_traits::{FromPrimitive, ToPrimitive}; use std::convert::TryInto; +use std::ptr; use std::str::FromStr; use deltachat::contact::Contact; @@ -603,7 +604,7 @@ pub unsafe extern "C" fn dc_create_group_chat( return 0; }; - chat::create_group_chat(context, verified, name) + chat::create_group_chat(context, verified, as_str(name)) .unwrap_or_log_default(context, "Failed to create group chat") } @@ -667,7 +668,7 @@ pub unsafe extern "C" fn dc_set_chat_profile_image( assert!(chat_id > constants::DC_CHAT_ID_LAST_SPECIAL as u32); let context = &*context; - chat::set_chat_profile_image(context, chat_id, image) + chat::set_chat_profile_image(context, chat_id, as_str(image)) } #[no_mangle] @@ -1325,7 +1326,10 @@ pub unsafe extern "C" fn dc_chat_get_profile_image(chat: *mut dc_chat_t) -> *mut assert!(!chat.is_null()); let chat = &*chat; - chat.get_profile_image() + match chat.get_profile_image() { + Some(i) => i.strdup(), + None => ptr::null_mut(), + } } #[no_mangle] diff --git a/examples/repl/cmdline.rs b/examples/repl/cmdline.rs index ed4e2e2b1..2a7d9ab01 100644 --- a/examples/repl/cmdline.rs +++ b/examples/repl/cmdline.rs @@ -726,13 +726,13 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E } "creategroup" => { ensure!(!arg1.is_empty(), "Argument missing."); - let chat_id = chat::create_group_chat(context, VerifiedStatus::Unverified, arg1_c)?; + let chat_id = chat::create_group_chat(context, VerifiedStatus::Unverified, arg1)?; println!("Group#{} created successfully.", chat_id); } "createverified" => { ensure!(!arg1.is_empty(), "Argument missing."); - let chat_id = chat::create_group_chat(context, VerifiedStatus::Verified, arg1_c)?; + let chat_id = chat::create_group_chat(context, VerifiedStatus::Verified, arg1)?; println!("VerifiedGroup#{} created successfully.", chat_id); } @@ -778,15 +778,8 @@ pub unsafe fn dc_cmdline(context: &Context, line: &str) -> Result<(), failure::E ensure!(sel_chat.is_some(), "No chat selected."); ensure!(!arg1.is_empty(), "Argument missing."); - if 0 != chat::set_chat_profile_image( - context, - sel_chat.as_ref().unwrap().get_id(), - if !arg1.is_empty() { - arg1_c - } else { - std::ptr::null_mut() - }, - ) { + if 0 != chat::set_chat_profile_image(context, sel_chat.as_ref().unwrap().get_id(), arg1) + { println!("Chat image set"); } else { bail!("Failed to set chat image"); diff --git a/src/chat.rs b/src/chat.rs index 5117a8595..211ee18f8 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -219,25 +219,21 @@ impl<'a> Chat<'a> { Ok(()) } - pub unsafe fn get_profile_image(&self) -> *mut libc::c_char { - let mut image_abs: *mut libc::c_char = 0 as *mut libc::c_char; - + pub unsafe fn get_profile_image(&self) -> Option { if let Some(image_rel) = self.param.get(Param::ProfileImage) { if !image_rel.is_empty() { - image_abs = dc_get_abs_path(self.context, image_rel); + return Some(to_string(dc_get_abs_path(self.context, image_rel))); } } else if self.typ == Chattype::Single { let contacts = get_chat_contacts(self.context, self.id); if !contacts.is_empty() { if let Ok(contact) = Contact::get_by_id(self.context, contacts[0]) { - if let Some(img) = contact.get_profile_image() { - image_abs = img.strdup(); - } + return contact.get_profile_image(); } } } - image_abs + None } pub fn get_color(&self) -> u32 { @@ -1391,15 +1387,12 @@ pub fn get_chat_contacts(context: &Context, chat_id: u32) -> Vec { pub unsafe fn create_group_chat( context: &Context, verified: VerifiedStatus, - chat_name: *const libc::c_char, + chat_name: impl AsRef, ) -> Result { - ensure!( - !chat_name.is_null() && *chat_name.offset(0) as libc::c_int != 0, - "Invalid chat name" - ); + ensure!(!chat_name.as_ref().is_empty(), "Invalid chat name"); let draft_txt = - CString::new(context.stock_string_repl_str(StockMessage::NewGroupDraft, as_str(chat_name))) + CString::new(context.stock_string_repl_str(StockMessage::NewGroupDraft, &chat_name)) .unwrap(); let grpid = dc_create_id(); @@ -1413,7 +1406,7 @@ pub unsafe fn create_group_chat( } else { Chattype::Group }, - as_str(chat_name), + chat_name.as_ref(), grpid ], )?; @@ -1785,7 +1778,7 @@ pub unsafe fn set_chat_name( pub unsafe fn set_chat_profile_image( context: &Context, chat_id: u32, - new_image: *const libc::c_char, + new_image: impl AsRef, ) -> libc::c_int { let mut OK_TO_CONTINUE = true; let mut success: libc::c_int = 0i32; @@ -1809,8 +1802,8 @@ pub unsafe fn set_chat_profile_image( ); } else { /* we should respect this - whatever we send to the group, it gets discarded anyway! */ - if !new_image.is_null() { - let mut img = to_string(new_image); + if !new_image.as_ref().is_empty() { + let mut img = new_image.as_ref().to_string(); if !dc_make_rel_and_copy(context, &mut img) { OK_TO_CONTINUE = false; } @@ -1991,7 +1984,7 @@ pub fn get_chat_cnt(context: &Context) -> usize { pub unsafe fn get_chat_id_by_grpid( context: &Context, - grpid: *const libc::c_char, + grpid: impl AsRef, ret_blocked: Option<&mut Blocked>, ret_verified: *mut libc::c_int, ) -> u32 { @@ -2003,7 +1996,7 @@ pub unsafe fn get_chat_id_by_grpid( .sql .query_row( "SELECT id, blocked, type FROM chats WHERE grpid=?;", - params![as_str(grpid)], + params![grpid.as_ref()], |row| { let chat_id = row.get(0)?; @@ -2020,10 +2013,7 @@ pub unsafe fn get_chat_id_by_grpid( .unwrap_or_default() } -pub fn add_device_msg(context: &Context, chat_id: u32, text: *const libc::c_char) { - if text.is_null() { - return; - } +pub fn add_device_msg(context: &Context, chat_id: u32, text: impl AsRef) { let rfc724_mid = unsafe { dc_create_outgoing_rfc724_mid( ptr::null(), @@ -2040,7 +2030,7 @@ pub fn add_device_msg(context: &Context, chat_id: u32, text: *const libc::c_char dc_create_smeared_timestamp(context), Viewtype::Text, DC_STATE_IN_NOTICED, - as_str(text), + text.as_ref(), as_str(rfc724_mid), ] ).is_err() { diff --git a/src/dc_location.rs b/src/dc_location.rs index 9dd402960..86a23908e 100644 --- a/src/dc_location.rs +++ b/src/dc_location.rs @@ -1,5 +1,3 @@ -use std::ffi::CString; - use quick_xml; use quick_xml::events::{BytesEnd, BytesStart, BytesText}; @@ -106,14 +104,9 @@ pub unsafe fn dc_send_locations_to_chat( (*msg).param.set_int(Param::Cmd, 8); chat::send_msg(context, chat_id, msg).unwrap(); } else if 0 == seconds && is_sending_locations_before { - let stock_str = CString::new(context.stock_system_msg( - StockMessage::MsgLocationDisabled, - "", - "", - 0, - )) - .unwrap(); - chat::add_device_msg(context, chat_id, stock_str.as_ptr()); + let stock_str = + context.stock_system_msg(StockMessage::MsgLocationDisabled, "", "", 0); + chat::add_device_msg(context, chat_id, stock_str); } context.call_cb( Event::CHAT_MODIFIED, @@ -736,8 +729,8 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED(context: &Context, job: &mut "UPDATE chats SET locations_send_begin=0, locations_send_until=0 WHERE id=?", params![chat_id as i32], ).is_ok() { - let stock_str = CString::new(context.stock_system_msg(StockMessage::MsgLocationDisabled, "", "", 0)).unwrap(); - chat::add_device_msg(context, chat_id, stock_str.as_ptr()); + let stock_str = context.stock_system_msg(StockMessage::MsgLocationDisabled, "", "", 0); + chat::add_device_msg(context, chat_id, stock_str); context.call_cb( Event::CHAT_MODIFIED, chat_id as usize, diff --git a/src/dc_qr.rs b/src/dc_qr.rs index dbcff7a2e..82951c021 100644 --- a/src/dc_qr.rs +++ b/src/dc_qr.rs @@ -35,7 +35,7 @@ pub unsafe fn dc_check_qr(context: &Context, qr: *const libc::c_char) -> *mut dc let mut auth: *mut libc::c_char = 0 as *mut libc::c_char; let mut qr_parsed: *mut dc_lot_t = dc_lot_new(); let mut chat_id: uint32_t = 0i32 as uint32_t; - let mut device_msg: *mut libc::c_char = 0 as *mut libc::c_char; + let mut device_msg = "".to_string(); let mut grpid: *mut libc::c_char = 0 as *mut libc::c_char; let mut grpname: *mut libc::c_char = 0 as *mut libc::c_char; (*qr_parsed).state = 0i32; @@ -238,13 +238,10 @@ pub unsafe fn dc_check_qr(context: &Context, qr: *const libc::c_char) -> *mut dc ) .unwrap_or_default(); chat_id = id; - device_msg = dc_mprintf( - b"%s verified.\x00" as *const u8 as *const libc::c_char, - peerstate.addr, - ) + device_msg = format!("{} verified.", peerstate.addr.unwrap_or_default()); } else { (*qr_parsed).text1 = dc_format_fingerprint_c(fingerprint); - (*qr_parsed).state = 230i32 + (*qr_parsed).state = 230i32; } } else { if !grpid.is_null() && !grpname.is_null() { @@ -287,7 +284,7 @@ pub unsafe fn dc_check_qr(context: &Context, qr: *const libc::c_char) -> *mut dc (*qr_parsed).state = 330i32; (*qr_parsed).text1 = dc_strdup(qr) } - if !device_msg.is_null() { + if !device_msg.is_empty() { chat::add_device_msg(context, chat_id, device_msg); } } @@ -298,7 +295,6 @@ pub unsafe fn dc_check_qr(context: &Context, qr: *const libc::c_char) -> *mut dc free(name as *mut libc::c_void); free(invitenumber as *mut libc::c_void); free(auth as *mut libc::c_void); - free(device_msg as *mut libc::c_void); free(grpname as *mut libc::c_void); free(grpid as *mut libc::c_void); diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 548dbd924..bce036626 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -1045,7 +1045,7 @@ unsafe fn create_or_lookup_group( let mut chat_id = 0; let mut chat_id_blocked = Blocked::Not; let mut chat_id_verified = 0; - let mut grpid = std::ptr::null_mut(); + let mut grpid = "".to_string(); let mut grpname = std::ptr::null_mut(); let to_ids_cnt = to_ids.len(); let mut recreate_member_list = 0; @@ -1059,14 +1059,12 @@ unsafe fn create_or_lookup_group( let mut better_msg: String = From::from(""); let mut failure_reason = std::ptr::null_mut(); - let cleanup = |grpid: *mut libc::c_char, - grpname: *mut libc::c_char, + let cleanup = |grpname: *mut libc::c_char, failure_reason: *mut libc::c_char, ret_chat_id: *mut uint32_t, ret_chat_id_blocked: &mut Blocked, chat_id: u32, chat_id_blocked: Blocked| { - free(grpid.cast()); free(grpname.cast()); free(failure_reason.cast()); @@ -1089,40 +1087,44 @@ unsafe fn create_or_lookup_group( // search the grpid in the header let optional_field = dc_mimeparser_lookup_optional_field(mime_parser, "Chat-Group-ID"); if !optional_field.is_null() { - grpid = dc_strdup((*optional_field).fld_value) + grpid = to_string((*optional_field).fld_value) } - if grpid.is_null() { + if grpid.is_empty() { if let Some(field) = lookup_field(mime_parser, "Message-ID", MAILIMF_FIELD_MESSAGE_ID) { let fld_message_id = (*field).fld_data.fld_message_id; if !fld_message_id.is_null() { if let Some(extracted_grpid) = dc_extract_grpid_from_rfc724_mid(as_str((*fld_message_id).mid_value)) { - grpid = extracted_grpid.strdup(); + grpid = extracted_grpid.to_string(); } else { - grpid = std::ptr::null_mut(); + grpid = "".to_string(); } } } - if grpid.is_null() { + if grpid.is_empty() { if let Some(field) = lookup_field(mime_parser, "In-Reply-To", MAILIMF_FIELD_IN_REPLY_TO) { let fld_in_reply_to = (*field).fld_data.fld_in_reply_to; if !fld_in_reply_to.is_null() { - grpid = dc_extract_grpid_from_rfc724_mid_list((*fld_in_reply_to).mid_list) + grpid = to_string(dc_extract_grpid_from_rfc724_mid_list( + (*fld_in_reply_to).mid_list, + )); } } - if grpid.is_null() { + if grpid.is_empty() { if let Some(field) = lookup_field(mime_parser, "References", MAILIMF_FIELD_REFERENCES) { let fld_references = (*field).fld_data.fld_references; if !fld_references.is_null() { - grpid = dc_extract_grpid_from_rfc724_mid_list((*fld_references).mid_list) + grpid = to_string(dc_extract_grpid_from_rfc724_mid_list( + (*fld_references).mid_list, + )); } } - if grpid.is_null() { + if grpid.is_empty() { create_or_lookup_adhoc_group( context, mime_parser, @@ -1134,7 +1136,6 @@ unsafe fn create_or_lookup_group( &mut chat_id_blocked, ); cleanup( - grpid, grpname, failure_reason, ret_chat_id, @@ -1227,7 +1228,7 @@ unsafe fn create_or_lookup_group( // check, if we have a chat with this group ID chat_id = chat::get_chat_id_by_grpid( context, - grpid, + &grpid, Some(&mut chat_id_blocked), &mut chat_id_verified, ); @@ -1252,8 +1253,7 @@ unsafe fn create_or_lookup_group( } // check if the group does not exist but should be created - group_explicitly_left = - chat::is_group_explicitly_left(context, as_str(grpid)).unwrap_or_default(); + group_explicitly_left = chat::is_group_explicitly_left(context, &grpid).unwrap_or_default(); let self_addr = context .sql @@ -1261,7 +1261,7 @@ unsafe fn create_or_lookup_group( .unwrap_or_default(); if chat_id == 0 && 0 == dc_mimeparser_is_mailinglist_message(mime_parser) - && !grpid.is_null() + && !grpid.is_empty() && !grpname.is_null() // otherwise, a pending "quit" message may pop up && X_MrRemoveFromGrp.is_null() @@ -1269,9 +1269,9 @@ unsafe fn create_or_lookup_group( && (!group_explicitly_left || !X_MrAddToGrp.is_null() && addr_cmp(&self_addr, as_str(X_MrAddToGrp))) { - let mut create_verified: libc::c_int = 0; + let mut create_verified = VerifiedStatus::Unverified; if !dc_mimeparser_lookup_field(mime_parser, "Chat-Verified").is_null() { - create_verified = 1; + create_verified = VerifiedStatus::Verified; if 0 == check_verified_properties( context, mime_parser, @@ -1284,7 +1284,6 @@ unsafe fn create_or_lookup_group( } if 0 == allow_creation { cleanup( - grpid, grpname, failure_reason, ret_chat_id, @@ -1294,7 +1293,7 @@ unsafe fn create_or_lookup_group( ); return; } - chat_id = create_group_record(context, grpid, grpname, create_blocked, create_verified); + chat_id = create_group_record(context, &grpid, grpname, create_blocked, create_verified); chat_id_blocked = create_blocked; recreate_member_list = 1; } @@ -1317,7 +1316,6 @@ unsafe fn create_or_lookup_group( ); } cleanup( - grpid, grpname, failure_reason, ret_chat_id, @@ -1457,7 +1455,6 @@ unsafe fn create_or_lookup_group( } cleanup( - grpid, grpname, failure_reason, ret_chat_id, @@ -1482,16 +1479,13 @@ unsafe fn create_or_lookup_adhoc_group( // group matching the to-list or if we can create one let mut chat_id = 0; let mut chat_id_blocked = Blocked::Not; - let mut grpid = 0 as *mut libc::c_char; let mut grpname = 0 as *mut libc::c_char; - let cleanup = |grpid: *mut libc::c_char, - grpname: *mut libc::c_char, + let cleanup = |grpname: *mut libc::c_char, ret_chat_id: *mut uint32_t, ret_chat_id_blocked: &mut Blocked, chat_id: u32, chat_id_blocked: Blocked| { - free(grpid as *mut libc::c_void); free(grpname as *mut libc::c_void); if !ret_chat_id.is_null() { @@ -1504,7 +1498,6 @@ unsafe fn create_or_lookup_adhoc_group( if to_ids.is_empty() || 0 != dc_mimeparser_is_mailinglist_message(mime_parser) { // too few contacts or a mailinglist cleanup( - grpid, grpname, ret_chat_id, ret_chat_id_blocked, @@ -1524,7 +1517,6 @@ unsafe fn create_or_lookup_adhoc_group( if member_ids.len() < 3 { // too few contacts given cleanup( - grpid, grpname, ret_chat_id, ret_chat_id_blocked, @@ -1554,7 +1546,6 @@ unsafe fn create_or_lookup_adhoc_group( chat_id_blocked = id_blocked; /* success, chat found */ cleanup( - grpid, grpname, ret_chat_id, ret_chat_id_blocked, @@ -1567,7 +1558,6 @@ unsafe fn create_or_lookup_adhoc_group( if 0 == allow_creation { cleanup( - grpid, grpname, ret_chat_id, ret_chat_id_blocked, @@ -1581,10 +1571,9 @@ unsafe fn create_or_lookup_adhoc_group( // create a new ad-hoc group // - there is no need to check if this group exists; otherwise we would have caught it above - grpid = create_adhoc_grp_id(context, &member_ids); - if grpid.is_null() { + let grpid = create_adhoc_grp_id(context, &member_ids); + if grpid.is_empty() { cleanup( - grpid, grpname, ret_chat_id, ret_chat_id_blocked, @@ -1604,7 +1593,13 @@ unsafe fn create_or_lookup_adhoc_group( } // create group record - chat_id = create_group_record(context, grpid, grpname, create_blocked, 0); + chat_id = create_group_record( + context, + &grpid, + grpname, + create_blocked, + VerifiedStatus::Unverified, + ); chat_id_blocked = create_blocked; for &member_id in &member_ids { chat::add_to_chat_contacts_table(context, chat_id, member_id); @@ -1613,7 +1608,6 @@ unsafe fn create_or_lookup_adhoc_group( context.call_cb(Event::CHAT_MODIFIED, chat_id as uintptr_t, 0 as uintptr_t); cleanup( - grpid, grpname, ret_chat_id, ret_chat_id_blocked, @@ -1624,19 +1618,23 @@ unsafe fn create_or_lookup_adhoc_group( fn create_group_record( context: &Context, - grpid: *const libc::c_char, + grpid: impl AsRef, grpname: *const libc::c_char, create_blocked: Blocked, - create_verified: libc::c_int, + create_verified: VerifiedStatus, ) -> u32 { if sql::execute( context, &context.sql, "INSERT INTO chats (type, name, grpid, blocked) VALUES(?, ?, ?, ?);", params![ - if 0 != create_verified { 130 } else { 120 }, + if VerifiedStatus::Unverified != create_verified { + Chattype::VerifiedGroup + } else { + Chattype::Group + }, as_str(grpname), - as_str(grpid), + grpid.as_ref(), create_blocked, ], ) @@ -1645,10 +1643,10 @@ fn create_group_record( return 0; } - sql::get_rowid(context, &context.sql, "chats", "grpid", as_str(grpid)) + sql::get_rowid(context, &context.sql, "chats", "grpid", grpid.as_ref()) } -unsafe fn create_adhoc_grp_id(context: &Context, member_ids: &Vec) -> *mut libc::c_char { +fn create_adhoc_grp_id(context: &Context, member_ids: &Vec) -> String { /* algorithm: - sort normalized, lowercased, e-mail addresses alphabetically - put all e-mail addresses into a single string, separate the address by a single comma @@ -1684,14 +1682,13 @@ unsafe fn create_adhoc_grp_id(context: &Context, member_ids: &Vec) -> *mut ) .unwrap_or_else(|_| member_cs); - hex_hash(&members) as *mut _ + hex_hash(&members) } -fn hex_hash(s: impl AsRef) -> *const libc::c_char { +fn hex_hash(s: impl AsRef) -> String { let bytes = s.as_ref().as_bytes(); let result = Sha256::digest(bytes); - let result_hex = hex::encode(&result[..8]); - unsafe { result_hex.strdup() as *const _ } + hex::encode(&result[..8]) } #[allow(non_snake_case)] @@ -2168,8 +2165,7 @@ mod tests { fn test_hex_hash() { let data = "hello world"; - let res_c = hex_hash(data); - let res = to_string(res_c); + let res = hex_hash(data); assert_eq!(res, "b94d27b9934d3e08"); } } diff --git a/src/dc_securejoin.rs b/src/dc_securejoin.rs index 512872f2d..11a162e2b 100644 --- a/src/dc_securejoin.rs +++ b/src/dc_securejoin.rs @@ -1,5 +1,3 @@ -use std::ffi::CString; - use mmime::mailimf_types::*; use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; @@ -187,9 +185,9 @@ pub unsafe fn dc_join_securejoin(context: &Context, qr: *const libc::c_char) -> (*qr_scan).auth, own_fingerprint, if 0 != join_vg { - (*qr_scan).text2 + as_str((*qr_scan).text2) } else { - 0 as *mut libc::c_char + "" }, ); free(own_fingerprint as *mut libc::c_void); @@ -205,7 +203,7 @@ pub unsafe fn dc_join_securejoin(context: &Context, qr: *const libc::c_char) -> }, (*qr_scan).invitenumber, 0 as *const libc::c_char, - 0 as *const libc::c_char, + "", ); } @@ -228,9 +226,12 @@ pub unsafe fn dc_join_securejoin(context: &Context, qr: *const libc::c_char) -> bob.expects = 0; if bob.status == 1 { if 0 != join_vg { - ret_chat_id = - chat::get_chat_id_by_grpid(context, (*qr_scan).text2, None, 0 as *mut libc::c_int) - as libc::c_int + ret_chat_id = chat::get_chat_id_by_grpid( + context, + to_string((*qr_scan).text2), + None, + 0 as *mut libc::c_int, + ) as libc::c_int } else { ret_chat_id = contact_chat_id as libc::c_int } @@ -250,7 +251,7 @@ unsafe fn send_handshake_msg( step: *const libc::c_char, param2: *const libc::c_char, fingerprint: *const libc::c_char, - grpid: *const libc::c_char, + grpid: impl AsRef, ) { let mut msg: *mut dc_msg_t = dc_msg_new_untyped(context); (*msg).type_0 = Viewtype::Text; @@ -268,8 +269,8 @@ unsafe fn send_handshake_msg( if !fingerprint.is_null() { (*msg).param.set(Param::Arg3, as_str(fingerprint)); } - if !grpid.is_null() { - (*msg).param.set(Param::Arg4, as_str(grpid)); + if !grpid.as_ref().is_empty() { + (*msg).param.set(Param::Arg4, grpid.as_ref()); } if strcmp(step, b"vg-request\x00" as *const u8 as *const libc::c_char) == 0i32 || strcmp(step, b"vc-request\x00" as *const u8 as *const libc::c_char) == 0i32 @@ -339,7 +340,7 @@ pub unsafe fn dc_handle_securejoin_handshake( let mut own_fingerprint: *mut libc::c_char = 0 as *mut libc::c_char; let contact_chat_id: u32; let contact_chat_id_blocked: Blocked; - let mut grpid: *mut libc::c_char = 0 as *mut libc::c_char; + let mut grpid = "".to_string(); let mut ret: libc::c_int = 0i32; if !(contact_id <= 9i32 as libc::c_uint) { @@ -399,7 +400,7 @@ pub unsafe fn dc_handle_securejoin_handshake( }, 0 as *const libc::c_char, 0 as *const libc::c_char, - 0 as *const libc::c_char, + "", ); current_block = 10256747982273457880; } @@ -429,7 +430,7 @@ pub unsafe fn dc_handle_securejoin_handshake( scanned_fingerprint_of_alice = dc_strdup((*scan).fingerprint); auth = dc_strdup((*scan).auth); if 0 != join_vg { - grpid = dc_strdup((*scan).text2) + grpid = to_string((*scan).text2); } } if !encrypted_and_signed(mimeparser, scanned_fingerprint_of_alice) { @@ -569,15 +570,15 @@ pub unsafe fn dc_handle_securejoin_handshake( 600i32 as uintptr_t, ); if 0 != join_vg { - grpid = dc_strdup(lookup_field(mimeparser, "Secure-Join-Group")); + grpid = to_string(lookup_field(mimeparser, "Secure-Join-Group")); let group_chat_id: uint32_t = chat::get_chat_id_by_grpid( context, - grpid, + &grpid, None, 0 as *mut libc::c_int, ); if group_chat_id == 0i32 as libc::c_uint { - error!(context, 0, "Chat {} not found.", as_str(grpid),); + error!(context, 0, "Chat {} not found.", &grpid); current_block = 4378276786830486580; } else { chat::add_contact_to_chat_ex( @@ -595,7 +596,7 @@ pub unsafe fn dc_handle_securejoin_handshake( b"vc-contact-confirm\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, 0 as *const libc::c_char, - 0 as *const libc::c_char, + "", ); context.call_cb( Event::SECUREJOIN_INVITER_PROGRESS, @@ -637,7 +638,7 @@ pub unsafe fn dc_handle_securejoin_handshake( let scan = context.bob.clone().read().unwrap().qr_scan; scanned_fingerprint_of_alice = dc_strdup((*scan).fingerprint); if 0 != join_vg { - grpid = dc_strdup((*scan).text2) + grpid = to_string((*scan).text2); } } let mut vg_expect_encrypted: libc::c_int = 1i32; @@ -725,7 +726,7 @@ pub unsafe fn dc_handle_securejoin_handshake( as *const libc::c_char, 0 as *const libc::c_char, 0 as *const libc::c_char, - 0 as *const libc::c_char, + "", ); } end_bobs_joining(context, 1i32); @@ -784,7 +785,6 @@ pub unsafe fn dc_handle_securejoin_handshake( free(scanned_fingerprint_of_alice as *mut libc::c_void); free(auth as *mut libc::c_void); free(own_fingerprint as *mut libc::c_void); - free(grpid as *mut libc::c_void); ret } @@ -802,9 +802,8 @@ unsafe fn secure_connection_established(context: &Context, contact_chat_id: uint } else { "?" }; - let msg = - CString::new(context.stock_string_repl_str(StockMessage::ContactVerified, addr)).unwrap(); - chat::add_device_msg(context, contact_chat_id, msg.as_ptr()); + let msg = context.stock_string_repl_str(StockMessage::ContactVerified, addr); + chat::add_device_msg(context, contact_chat_id, msg); context.call_cb( Event::CHAT_MODIFIED, contact_chat_id as uintptr_t, @@ -844,9 +843,9 @@ unsafe fn could_not_establish_secure_connection( "?" }, ); - let msg_c = CString::new(msg.as_str()).unwrap(); - chat::add_device_msg(context, contact_chat_id, msg_c.as_ptr()); - error!(context, 0, "{} ({})", msg, as_str(details)); + + chat::add_device_msg(context, contact_chat_id, &msg); + error!(context, 0, "{} ({})", &msg, as_str(details)); } unsafe fn mark_peer_as_verified( @@ -931,11 +930,9 @@ pub unsafe fn dc_handle_degrade_event(context: &Context, peerstate: &Peerstate) Some(ref addr) => &addr, None => "", }; - let msg = CString::new( - context.stock_string_repl_str(StockMessage::ContactSetupChanged, peeraddr), - ) - .unwrap(); - chat::add_device_msg(context, contact_chat_id, msg.as_ptr()); + let msg = context.stock_string_repl_str(StockMessage::ContactSetupChanged, peeraddr); + + chat::add_device_msg(context, contact_chat_id, msg); context.call_cb( Event::CHAT_MODIFIED, contact_chat_id as uintptr_t,