diff --git a/examples/repl/main.rs b/examples/repl/main.rs index a364da63b..35e1bfb4e 100644 --- a/examples/repl/main.rs +++ b/examples/repl/main.rs @@ -1,559 +1,561 @@ -//! This is a CLI program and a little testing frame. This file must not be -//! included when using Delta Chat Core as a library. -//! -//! Usage: messenger-backend -//! (for "Code::Blocks, use Project / Set programs' arguments") -//! all further options can be set using the set-command (type ? for help). +// //! This is a CLI program and a little testing frame. This file must not be +// //! included when using Delta Chat Core as a library. +// //! +// //! Usage: messenger-backend +// //! (for "Code::Blocks, use Project / Set programs' arguments") +// //! all further options can be set using the set-command (type ? for help). -#![allow( - unused_imports, - mutable_transmutes, - non_camel_case_types, - non_snake_case, - non_upper_case_globals, - unused_assignments, - unused_mut, - unused_attributes, - non_upper_case_globals, - non_camel_case_types, - non_snake_case -)] +// #![allow( +// unused_imports, +// mutable_transmutes, +// non_camel_case_types, +// non_snake_case, +// non_upper_case_globals, +// unused_assignments, +// unused_mut, +// unused_attributes, +// non_upper_case_globals, +// non_camel_case_types, +// non_snake_case +// )] -use std::ffi::CString; -use std::io::{self, Write}; +// use std::ffi::CString; +// use std::io::{self, Write}; -use deltachat::constants::*; -use deltachat::dc_aheader::*; -use deltachat::dc_apeerstate::*; -use deltachat::dc_array::*; -use deltachat::dc_chat::*; -use deltachat::dc_chatlist::*; -use deltachat::dc_configure::*; -use deltachat::dc_contact::*; -use deltachat::dc_context::*; -use deltachat::dc_dehtml::*; -use deltachat::dc_e2ee::*; -use deltachat::dc_hash::*; -use deltachat::dc_imap::*; -use deltachat::dc_imex::*; -use deltachat::dc_job::*; -use deltachat::dc_jobthread::*; -use deltachat::dc_jsmn::*; -use deltachat::dc_key::*; -use deltachat::dc_keyhistory::*; -use deltachat::dc_keyring::*; -use deltachat::dc_location::*; -use deltachat::dc_log::*; -use deltachat::dc_loginparam::*; -use deltachat::dc_lot::*; -use deltachat::dc_mimefactory::*; -use deltachat::dc_mimeparser::*; -use deltachat::dc_move::*; -use deltachat::dc_msg::*; -use deltachat::dc_oauth2::*; -use deltachat::dc_param::*; -use deltachat::dc_pgp::*; -use deltachat::dc_qr::*; -use deltachat::dc_receive_imf::*; -use deltachat::dc_saxparser::*; -use deltachat::dc_securejoin::*; -use deltachat::dc_simplify::*; -use deltachat::dc_smtp::*; -use deltachat::dc_sqlite3::*; -use deltachat::dc_stock::*; -use deltachat::dc_strbuilder::*; -use deltachat::dc_strencode::*; -use deltachat::dc_token::*; -use deltachat::dc_tools::*; -use deltachat::types::*; -use deltachat::x::*; -use libc; +// use deltachat::constants::*; +// use deltachat::dc_aheader::*; +// use deltachat::dc_apeerstate::*; +// use deltachat::dc_array::*; +// use deltachat::dc_chat::*; +// use deltachat::dc_chatlist::*; +// use deltachat::dc_configure::*; +// use deltachat::dc_contact::*; +// use deltachat::dc_context::*; +// use deltachat::dc_dehtml::*; +// use deltachat::dc_e2ee::*; +// use deltachat::dc_hash::*; +// use deltachat::dc_imap::*; +// use deltachat::dc_imex::*; +// use deltachat::dc_job::*; +// use deltachat::dc_jobthread::*; +// use deltachat::dc_jsmn::*; +// use deltachat::dc_key::*; +// use deltachat::dc_keyhistory::*; +// use deltachat::dc_keyring::*; +// use deltachat::dc_location::*; +// use deltachat::dc_log::*; +// use deltachat::dc_loginparam::*; +// use deltachat::dc_lot::*; +// use deltachat::dc_mimefactory::*; +// use deltachat::dc_mimeparser::*; +// use deltachat::dc_move::*; +// use deltachat::dc_msg::*; +// use deltachat::dc_oauth2::*; +// use deltachat::dc_param::*; +// use deltachat::dc_pgp::*; +// use deltachat::dc_qr::*; +// use deltachat::dc_receive_imf::*; +// use deltachat::dc_saxparser::*; +// use deltachat::dc_securejoin::*; +// use deltachat::dc_simplify::*; +// use deltachat::dc_smtp::*; +// use deltachat::dc_sqlite3::*; +// use deltachat::dc_stock::*; +// use deltachat::dc_strbuilder::*; +// use deltachat::dc_strencode::*; +// use deltachat::dc_token::*; +// use deltachat::dc_tools::*; +// use deltachat::types::*; +// use deltachat::x::*; +// use libc; -mod cmdline; -mod stress; +// mod cmdline; +// mod stress; -use self::cmdline::*; -use self::stress::*; +// use self::cmdline::*; +// use self::stress::*; -/* ****************************************************************************** - * Event Handler - ******************************************************************************/ -static mut s_do_log_info: libc::c_int = 1i32; +// /* ****************************************************************************** +// * Event Handler +// ******************************************************************************/ +// static mut s_do_log_info: libc::c_int = 1i32; -unsafe extern "C" fn receive_event( - mut context: &dc_context_t, - mut event: Event, - mut data1: uintptr_t, - mut data2: uintptr_t, -) -> uintptr_t { - match event as u32 { - 2091 => {} - 100 => { - /* do not show the event as this would fill the screen */ - if 0 != s_do_log_info { - printf( - b"%s\n\x00" as *const u8 as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - } - 101 => { - printf( - b"[DC_EVENT_SMTP_CONNECTED] %s\n\x00" as *const u8 as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - 102 => { - printf( - b"[DC_EVENT_IMAP_CONNECTED] %s\n\x00" as *const u8 as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - 103 => { - printf( - b"[DC_EVENT_SMTP_MESSAGE_SENT] %s\n\x00" as *const u8 as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - 300 => { - printf( - b"[Warning] %s\n\x00" as *const u8 as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - 400 => { - printf( - b"\x1b[31m[DC_EVENT_ERROR] %s\x1b[0m\n\x00" as *const u8 as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - 401 => { - printf( - b"\x1b[31m[DC_EVENT_ERROR_NETWORK] first=%i, msg=%s\x1b[0m\n\x00" as *const u8 - as *const libc::c_char, - data1 as libc::c_int, - data2 as *mut libc::c_char, - ); - } - 410 => { - printf( - b"\x1b[31m[DC_EVENT_ERROR_SELF_NOT_IN_GROUP] %s\x1b[0m\n\x00" as *const u8 - as *const libc::c_char, - data2 as *mut libc::c_char, - ); - } - 2100 | 2110 => { - let mut url: *mut libc::c_char = dc_strdup(data1 as *mut libc::c_char); - let mut param: *mut libc::c_char = strchr(url, '?' as i32); - if !param.is_null() { - *param = 0i32 as libc::c_char; - param = param.offset(1isize) - } else { - param = b"\x00" as *const u8 as *const libc::c_char as *mut libc::c_char - } - let mut ret: *mut libc::c_char = 0 as *mut libc::c_char; - let mut tempFile: *mut libc::c_char = dc_get_fine_pathNfilename( - context, - (*context).blobdir, - b"curl.result\x00" as *const u8 as *const libc::c_char, - ); - let mut cmd: *mut libc::c_char = if event == Event::HTTP_GET { - dc_mprintf( - b"curl --silent --location --fail --insecure %s%s%s > %s\x00" as *const u8 - as *const libc::c_char, - url, - if 0 != *param.offset(0isize) as libc::c_int { - b"?\x00" as *const u8 as *const libc::c_char - } else { - b"\x00" as *const u8 as *const libc::c_char - }, - param, - tempFile, - ) - } else { - dc_mprintf( - b"curl --silent -d \"%s\" %s > %s\x00" as *const u8 as *const libc::c_char, - param, - url, - tempFile, - ) - }; - let mut error: libc::c_int = system(cmd); - if error == 0i32 { - let mut bytes: size_t = 0i32 as size_t; - dc_read_file( - context, - tempFile, - &mut ret as *mut *mut libc::c_char as *mut *mut libc::c_void, - &mut bytes, - ); - } - free(cmd as *mut libc::c_void); - free(tempFile as *mut libc::c_void); - free(url as *mut libc::c_void); - return ret as uintptr_t; - } - 2081 => { - printf( - b"\x1b[33m{{Received DC_EVENT_IS_OFFLINE()}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - ); - } - 2000 => { - printf( - b"\x1b[33m{{Received DC_EVENT_MSGS_CHANGED(%i, %i)}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - data1 as libc::c_int, - data2 as libc::c_int, - ); - } - 2030 => { - printf( - b"\x1b[33m{{Received DC_EVENT_CONTACTS_CHANGED()}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - ); - } - 2035 => { - printf( - b"\x1b[33m{{Received DC_EVENT_LOCATION_CHANGED(contact=%i)}}\n\x1b[0m\x00" - as *const u8 as *const libc::c_char, - data1 as libc::c_int, - ); - } - 2041 => { - printf( - b"\x1b[33m{{Received DC_EVENT_CONFIGURE_PROGRESS(%i \xe2\x80\xb0)}}\n\x1b[0m\x00" - as *const u8 as *const libc::c_char, - data1 as libc::c_int, - ); - } - 2051 => { - printf( - b"\x1b[33m{{Received DC_EVENT_IMEX_PROGRESS(%i \xe2\x80\xb0)}}\n\x1b[0m\x00" - as *const u8 as *const libc::c_char, - data1 as libc::c_int, - ); - } - 2052 => { - printf( - b"\x1b[33m{{Received DC_EVENT_IMEX_FILE_WRITTEN(%s)}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - data1 as *mut libc::c_char, - ); - } - 2055 => { - printf( - b"\x1b[33m{{Received DC_EVENT_FILE_COPIED(%s)}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - data1 as *mut libc::c_char, - ); - } - 2020 => { - printf( - b"\x1b[33m{{Received DC_EVENT_CHAT_MODIFIED(%i)}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - data1 as libc::c_int, - ); - } - _ => { - printf( - b"\x1b[33m{{Received DC_EVENT_%i(%i, %i)}}\n\x1b[0m\x00" as *const u8 - as *const libc::c_char, - event as libc::c_int, - data1 as libc::c_int, - data2 as libc::c_int, - ); - } - } - return 0i32 as uintptr_t; -} -/* ****************************************************************************** - * Threads for waiting for messages and for jobs - ******************************************************************************/ -static mut inbox_thread: pthread_t = 0 as pthread_t; -static mut run_threads: libc::c_int = 0i32; +// unsafe extern "C" fn receive_event( +// mut context: &dc_context_t, +// mut event: Event, +// mut data1: uintptr_t, +// mut data2: uintptr_t, +// ) -> uintptr_t { +// match event as u32 { +// 2091 => {} +// 100 => { +// /* do not show the event as this would fill the screen */ +// if 0 != s_do_log_info { +// printf( +// b"%s\n\x00" as *const u8 as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// } +// 101 => { +// printf( +// b"[DC_EVENT_SMTP_CONNECTED] %s\n\x00" as *const u8 as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// 102 => { +// printf( +// b"[DC_EVENT_IMAP_CONNECTED] %s\n\x00" as *const u8 as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// 103 => { +// printf( +// b"[DC_EVENT_SMTP_MESSAGE_SENT] %s\n\x00" as *const u8 as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// 300 => { +// printf( +// b"[Warning] %s\n\x00" as *const u8 as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// 400 => { +// printf( +// b"\x1b[31m[DC_EVENT_ERROR] %s\x1b[0m\n\x00" as *const u8 as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// 401 => { +// printf( +// b"\x1b[31m[DC_EVENT_ERROR_NETWORK] first=%i, msg=%s\x1b[0m\n\x00" as *const u8 +// as *const libc::c_char, +// data1 as libc::c_int, +// data2 as *mut libc::c_char, +// ); +// } +// 410 => { +// printf( +// b"\x1b[31m[DC_EVENT_ERROR_SELF_NOT_IN_GROUP] %s\x1b[0m\n\x00" as *const u8 +// as *const libc::c_char, +// data2 as *mut libc::c_char, +// ); +// } +// 2100 | 2110 => { +// let mut url: *mut libc::c_char = dc_strdup(data1 as *mut libc::c_char); +// let mut param: *mut libc::c_char = strchr(url, '?' as i32); +// if !param.is_null() { +// *param = 0i32 as libc::c_char; +// param = param.offset(1isize) +// } else { +// param = b"\x00" as *const u8 as *const libc::c_char as *mut libc::c_char +// } +// let mut ret: *mut libc::c_char = 0 as *mut libc::c_char; +// let mut tempFile: *mut libc::c_char = dc_get_fine_pathNfilename( +// context, +// (*context).blobdir, +// b"curl.result\x00" as *const u8 as *const libc::c_char, +// ); +// let mut cmd: *mut libc::c_char = if event == Event::HTTP_GET { +// dc_mprintf( +// b"curl --silent --location --fail --insecure %s%s%s > %s\x00" as *const u8 +// as *const libc::c_char, +// url, +// if 0 != *param.offset(0isize) as libc::c_int { +// b"?\x00" as *const u8 as *const libc::c_char +// } else { +// b"\x00" as *const u8 as *const libc::c_char +// }, +// param, +// tempFile, +// ) +// } else { +// dc_mprintf( +// b"curl --silent -d \"%s\" %s > %s\x00" as *const u8 as *const libc::c_char, +// param, +// url, +// tempFile, +// ) +// }; +// let mut error: libc::c_int = system(cmd); +// if error == 0i32 { +// let mut bytes: size_t = 0i32 as size_t; +// dc_read_file( +// context, +// tempFile, +// &mut ret as *mut *mut libc::c_char as *mut *mut libc::c_void, +// &mut bytes, +// ); +// } +// free(cmd as *mut libc::c_void); +// free(tempFile as *mut libc::c_void); +// free(url as *mut libc::c_void); +// return ret as uintptr_t; +// } +// 2081 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_IS_OFFLINE()}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// ); +// } +// 2000 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_MSGS_CHANGED(%i, %i)}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// data1 as libc::c_int, +// data2 as libc::c_int, +// ); +// } +// 2030 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_CONTACTS_CHANGED()}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// ); +// } +// 2035 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_LOCATION_CHANGED(contact=%i)}}\n\x1b[0m\x00" +// as *const u8 as *const libc::c_char, +// data1 as libc::c_int, +// ); +// } +// 2041 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_CONFIGURE_PROGRESS(%i \xe2\x80\xb0)}}\n\x1b[0m\x00" +// as *const u8 as *const libc::c_char, +// data1 as libc::c_int, +// ); +// } +// 2051 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_IMEX_PROGRESS(%i \xe2\x80\xb0)}}\n\x1b[0m\x00" +// as *const u8 as *const libc::c_char, +// data1 as libc::c_int, +// ); +// } +// 2052 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_IMEX_FILE_WRITTEN(%s)}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// data1 as *mut libc::c_char, +// ); +// } +// 2055 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_FILE_COPIED(%s)}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// data1 as *mut libc::c_char, +// ); +// } +// 2020 => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_CHAT_MODIFIED(%i)}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// data1 as libc::c_int, +// ); +// } +// _ => { +// printf( +// b"\x1b[33m{{Received DC_EVENT_%i(%i, %i)}}\n\x1b[0m\x00" as *const u8 +// as *const libc::c_char, +// event as libc::c_int, +// data1 as libc::c_int, +// data2 as libc::c_int, +// ); +// } +// } +// return 0i32 as uintptr_t; +// } +// /* ****************************************************************************** +// * Threads for waiting for messages and for jobs +// ******************************************************************************/ +// static mut inbox_thread: pthread_t = 0 as pthread_t; +// static mut run_threads: libc::c_int = 0i32; -unsafe extern "C" fn inbox_thread_entry_point( - mut entry_arg: *mut libc::c_void, -) -> *mut libc::c_void { - let mut context: &dc_context_t = entry_arg as *mut dc_context_t; - while 0 != run_threads { - dc_perform_imap_jobs(context); - dc_perform_imap_fetch(context); - if 0 != run_threads { - dc_perform_imap_idle(context); - } - } - return 0 as *mut libc::c_void; -} -static mut mvbox_thread: pthread_t = 0 as pthread_t; -unsafe extern "C" fn mvbox_thread_entry_point( - mut entry_arg: *mut libc::c_void, -) -> *mut libc::c_void { - let mut context: &dc_context_t = entry_arg as *mut dc_context_t; - while 0 != run_threads { - dc_perform_mvbox_fetch(context); - if 0 != run_threads { - dc_perform_mvbox_idle(context); - } - } - return 0 as *mut libc::c_void; -} -static mut sentbox_thread: pthread_t = 0 as pthread_t; -unsafe extern "C" fn sentbox_thread_entry_point( - mut entry_arg: *mut libc::c_void, -) -> *mut libc::c_void { - let mut context: &dc_context_t = entry_arg as *mut dc_context_t; - while 0 != run_threads { - dc_perform_sentbox_fetch(context); - if 0 != run_threads { - dc_perform_sentbox_idle(context); - } - } - return 0 as *mut libc::c_void; -} -static mut smtp_thread: pthread_t = 0 as pthread_t; -unsafe extern "C" fn smtp_thread_entry_point( - mut entry_arg: *mut libc::c_void, -) -> *mut libc::c_void { - let mut context: &dc_context_t = entry_arg as *mut dc_context_t; - while 0 != run_threads { - dc_perform_smtp_jobs(context); - if 0 != run_threads { - dc_perform_smtp_idle(context); - } - } - return 0 as *mut libc::c_void; -} -unsafe extern "C" fn start_threads(mut context: &dc_context_t) { - run_threads = 1i32; - if inbox_thread == 0 { - pthread_create( - &mut inbox_thread, - 0 as *const pthread_attr_t, - Some(inbox_thread_entry_point), - context as *mut libc::c_void, - ); - } - if mvbox_thread == 0 { - pthread_create( - &mut mvbox_thread, - 0 as *const pthread_attr_t, - Some(mvbox_thread_entry_point), - context as *mut libc::c_void, - ); - } - if sentbox_thread == 0 { - pthread_create( - &mut sentbox_thread, - 0 as *const pthread_attr_t, - Some(sentbox_thread_entry_point), - context as *mut libc::c_void, - ); - } - if smtp_thread == 0 { - pthread_create( - &mut smtp_thread, - 0 as *const pthread_attr_t, - Some(smtp_thread_entry_point), - context as *mut libc::c_void, - ); - }; -} -unsafe extern "C" fn stop_threads(mut context: &dc_context_t) { - run_threads = 0i32; - dc_interrupt_imap_idle(context); - dc_interrupt_mvbox_idle(context); - dc_interrupt_sentbox_idle(context); - dc_interrupt_smtp_idle(context); - pthread_join(inbox_thread, 0 as *mut *mut libc::c_void); - pthread_join(mvbox_thread, 0 as *mut *mut libc::c_void); - pthread_join(sentbox_thread, 0 as *mut *mut libc::c_void); - pthread_join(smtp_thread, 0 as *mut *mut libc::c_void); - inbox_thread = 0 as pthread_t; - mvbox_thread = 0 as pthread_t; - sentbox_thread = 0 as pthread_t; - smtp_thread = 0 as pthread_t; -} -/* ****************************************************************************** - * The main loop - ******************************************************************************/ -fn read_cmd() -> String { - print!("> "); - io::stdout().flush().unwrap(); +// unsafe extern "C" fn inbox_thread_entry_point( +// mut entry_arg: *mut libc::c_void, +// ) -> *mut libc::c_void { +// let mut context: &dc_context_t = entry_arg as *mut dc_context_t; +// while 0 != run_threads { +// dc_perform_imap_jobs(context); +// dc_perform_imap_fetch(context); +// if 0 != run_threads { +// dc_perform_imap_idle(context); +// } +// } +// return 0 as *mut libc::c_void; +// } +// static mut mvbox_thread: pthread_t = 0 as pthread_t; +// unsafe extern "C" fn mvbox_thread_entry_point( +// mut entry_arg: *mut libc::c_void, +// ) -> *mut libc::c_void { +// let mut context: &dc_context_t = entry_arg as *mut dc_context_t; +// while 0 != run_threads { +// dc_perform_mvbox_fetch(context); +// if 0 != run_threads { +// dc_perform_mvbox_idle(context); +// } +// } +// return 0 as *mut libc::c_void; +// } +// static mut sentbox_thread: pthread_t = 0 as pthread_t; +// unsafe extern "C" fn sentbox_thread_entry_point( +// mut entry_arg: *mut libc::c_void, +// ) -> *mut libc::c_void { +// let mut context: &dc_context_t = entry_arg as *mut dc_context_t; +// while 0 != run_threads { +// dc_perform_sentbox_fetch(context); +// if 0 != run_threads { +// dc_perform_sentbox_idle(context); +// } +// } +// return 0 as *mut libc::c_void; +// } +// static mut smtp_thread: pthread_t = 0 as pthread_t; +// unsafe extern "C" fn smtp_thread_entry_point( +// mut entry_arg: *mut libc::c_void, +// ) -> *mut libc::c_void { +// let mut context: &dc_context_t = entry_arg as *mut dc_context_t; +// while 0 != run_threads { +// dc_perform_smtp_jobs(context); +// if 0 != run_threads { +// dc_perform_smtp_idle(context); +// } +// } +// return 0 as *mut libc::c_void; +// } +// unsafe extern "C" fn start_threads(mut context: &dc_context_t) { +// run_threads = 1i32; +// if inbox_thread == 0 { +// pthread_create( +// &mut inbox_thread, +// 0 as *const pthread_attr_t, +// Some(inbox_thread_entry_point), +// context as *mut libc::c_void, +// ); +// } +// if mvbox_thread == 0 { +// pthread_create( +// &mut mvbox_thread, +// 0 as *const pthread_attr_t, +// Some(mvbox_thread_entry_point), +// context as *mut libc::c_void, +// ); +// } +// if sentbox_thread == 0 { +// pthread_create( +// &mut sentbox_thread, +// 0 as *const pthread_attr_t, +// Some(sentbox_thread_entry_point), +// context as *mut libc::c_void, +// ); +// } +// if smtp_thread == 0 { +// pthread_create( +// &mut smtp_thread, +// 0 as *const pthread_attr_t, +// Some(smtp_thread_entry_point), +// context as *mut libc::c_void, +// ); +// }; +// } +// unsafe extern "C" fn stop_threads(mut context: &dc_context_t) { +// run_threads = 0i32; +// dc_interrupt_imap_idle(context); +// dc_interrupt_mvbox_idle(context); +// dc_interrupt_sentbox_idle(context); +// dc_interrupt_smtp_idle(context); +// pthread_join(inbox_thread, 0 as *mut *mut libc::c_void); +// pthread_join(mvbox_thread, 0 as *mut *mut libc::c_void); +// pthread_join(sentbox_thread, 0 as *mut *mut libc::c_void); +// pthread_join(smtp_thread, 0 as *mut *mut libc::c_void); +// inbox_thread = 0 as pthread_t; +// mvbox_thread = 0 as pthread_t; +// sentbox_thread = 0 as pthread_t; +// smtp_thread = 0 as pthread_t; +// } +// /* ****************************************************************************** +// * The main loop +// ******************************************************************************/ +// fn read_cmd() -> String { +// print!("> "); +// io::stdout().flush().unwrap(); - let mut input = String::new(); - io::stdin().read_line(&mut input).unwrap(); - input.trim_end().to_string() -} +// let mut input = String::new(); +// io::stdin().read_line(&mut input).unwrap(); +// input.trim_end().to_string() +// } -#[cfg(not(target_os = "android"))] -unsafe fn main_0(mut argc: libc::c_int, mut argv: *mut *mut libc::c_char) -> libc::c_int { - let mut cmd: *mut libc::c_char = 0 as *mut libc::c_char; - let mut context: &dc_context_t = dc_context_new( - receive_event, - 0 as *mut libc::c_void, - b"CLI\x00" as *const u8 as *const libc::c_char, - ); - let mut stresstest_only: libc::c_int = 0i32; - dc_cmdline_skip_auth(); - if argc == 2i32 { - if strcmp( - *argv.offset(1isize), - b"--stress\x00" as *const u8 as *const libc::c_char, - ) == 0i32 - { - stresstest_only = 1i32 - } else if 0 == dc_open(context, *argv.offset(1isize), 0 as *const libc::c_char) { - printf( - b"ERROR: Cannot open %s.\n\x00" as *const u8 as *const libc::c_char, - *argv.offset(1isize), - ); - } - } else if argc != 1i32 { - printf(b"ERROR: Bad arguments\n\x00" as *const u8 as *const libc::c_char); - } - s_do_log_info = 0i32; - stress_functions(context); - s_do_log_info = 1i32; - if 0 != stresstest_only { - return 0i32; - } - printf(b"Delta Chat Core is awaiting your commands.\n\x00" as *const u8 as *const libc::c_char); - loop { - /* read command */ - let cmdline = read_cmd(); - free(cmd as *mut libc::c_void); - cmd = dc_strdup(CString::new(cmdline.clone()).unwrap().as_ptr()); - let mut arg1: *mut libc::c_char = strchr(cmd, ' ' as i32); - if !arg1.is_null() { - *arg1 = 0i32 as libc::c_char; - arg1 = arg1.offset(1isize) - } - if strcmp(cmd, b"connect\x00" as *const u8 as *const libc::c_char) == 0i32 { - start_threads(context); - } else if strcmp(cmd, b"disconnect\x00" as *const u8 as *const libc::c_char) == 0i32 { - stop_threads(context); - } else if strcmp(cmd, b"smtp-jobs\x00" as *const u8 as *const libc::c_char) == 0i32 { - if 0 != run_threads { - printf( - b"smtp-jobs are already running in a thread.\n\x00" as *const u8 - as *const libc::c_char, - ); - } else { - dc_perform_smtp_jobs(context); - } - } else if strcmp(cmd, b"imap-jobs\x00" as *const u8 as *const libc::c_char) == 0i32 { - if 0 != run_threads { - printf( - b"imap-jobs are already running in a thread.\n\x00" as *const u8 - as *const libc::c_char, - ); - } else { - dc_perform_imap_jobs(context); - } - } else if strcmp(cmd, b"configure\x00" as *const u8 as *const libc::c_char) == 0i32 { - start_threads(context); - dc_configure(context); - } else if strcmp(cmd, b"oauth2\x00" as *const u8 as *const libc::c_char) == 0i32 { - let mut addr: *mut libc::c_char = - dc_get_config(context, b"addr\x00" as *const u8 as *const libc::c_char); - if addr.is_null() || *addr.offset(0isize) as libc::c_int == 0i32 { - printf(b"oauth2: set addr first.\n\x00" as *const u8 as *const libc::c_char); - } else { - let mut oauth2_url: *mut libc::c_char = dc_get_oauth2_url( - context, - addr, - b"chat.delta:/com.b44t.messenger\x00" as *const u8 as *const libc::c_char, - ); - if oauth2_url.is_null() { - printf( - b"OAuth2 not available for %s.\n\x00" as *const u8 as *const libc::c_char, - addr, - ); - } else { - printf(b"Open the following url, set mail_pw to the generated token and server_flags to 2:\n%s\n\x00" - as *const u8 as *const libc::c_char, - oauth2_url); - } - free(oauth2_url as *mut libc::c_void); - } - free(addr as *mut libc::c_void); - } else if strcmp(cmd, b"clear\x00" as *const u8 as *const libc::c_char) == 0i32 { - printf(b"\n\n\n\n\x00" as *const u8 as *const libc::c_char); - printf(b"\x1b[1;1H\x1b[2J\x00" as *const u8 as *const libc::c_char); - } else if strcmp(cmd, b"getqr\x00" as *const u8 as *const libc::c_char) == 0i32 - || strcmp(cmd, b"getbadqr\x00" as *const u8 as *const libc::c_char) == 0i32 - { - start_threads(context); - let mut qrstr: *mut libc::c_char = dc_get_securejoin_qr( - context, - (if !arg1.is_null() { atoi(arg1) } else { 0i32 }) as uint32_t, - ); - if !qrstr.is_null() && 0 != *qrstr.offset(0isize) as libc::c_int { - if strcmp(cmd, b"getbadqr\x00" as *const u8 as *const libc::c_char) == 0i32 - && strlen(qrstr) > 40 - { - let mut i: libc::c_int = 12i32; - while i < 22i32 { - *qrstr.offset(i as isize) = '0' as i32 as libc::c_char; - i += 1 - } - } - printf(b"%s\n\x00" as *const u8 as *const libc::c_char, qrstr); - let mut syscmd: *mut libc::c_char = dc_mprintf( - b"qrencode -t ansiutf8 \"%s\" -o -\x00" as *const u8 as *const libc::c_char, - qrstr, - ); - system(syscmd); - free(syscmd as *mut libc::c_void); - } - free(qrstr as *mut libc::c_void); - } else if strcmp(cmd, b"joinqr\x00" as *const u8 as *const libc::c_char) == 0i32 { - start_threads(context); - if !arg1.is_null() { - dc_join_securejoin(context, arg1); - } - } else { - if strcmp(cmd, b"exit\x00" as *const u8 as *const libc::c_char) == 0i32 { - break; - } - if !(*cmd.offset(0isize) as libc::c_int == 0i32) { - let mut execute_result: *mut libc::c_char = dc_cmdline(context, &cmdline); - if !execute_result.is_null() { - printf( - b"%s\n\x00" as *const u8 as *const libc::c_char, - execute_result, - ); - free(execute_result as *mut libc::c_void); - } - } - } - } - free(cmd as *mut libc::c_void); - stop_threads(context); - dc_close(context); - dc_context_unref(context); - context = 0 as &dc_context_t; - return 0i32; -} +// #[cfg(not(target_os = "android"))] +// unsafe fn main_0(mut argc: libc::c_int, mut argv: *mut *mut libc::c_char) -> libc::c_int { +// let mut cmd: *mut libc::c_char = 0 as *mut libc::c_char; +// let mut context: &dc_context_t = dc_context_new( +// receive_event, +// 0 as *mut libc::c_void, +// b"CLI\x00" as *const u8 as *const libc::c_char, +// ); +// let mut stresstest_only: libc::c_int = 0i32; +// dc_cmdline_skip_auth(); +// if argc == 2i32 { +// if strcmp( +// *argv.offset(1isize), +// b"--stress\x00" as *const u8 as *const libc::c_char, +// ) == 0i32 +// { +// stresstest_only = 1i32 +// } else if 0 == dc_open(context, *argv.offset(1isize), 0 as *const libc::c_char) { +// printf( +// b"ERROR: Cannot open %s.\n\x00" as *const u8 as *const libc::c_char, +// *argv.offset(1isize), +// ); +// } +// } else if argc != 1i32 { +// printf(b"ERROR: Bad arguments\n\x00" as *const u8 as *const libc::c_char); +// } +// s_do_log_info = 0i32; +// stress_functions(context); +// s_do_log_info = 1i32; +// if 0 != stresstest_only { +// return 0i32; +// } +// printf(b"Delta Chat Core is awaiting your commands.\n\x00" as *const u8 as *const libc::c_char); +// loop { +// /* read command */ +// let cmdline = read_cmd(); +// free(cmd as *mut libc::c_void); +// cmd = dc_strdup(CString::new(cmdline.clone()).unwrap().as_ptr()); +// let mut arg1: *mut libc::c_char = strchr(cmd, ' ' as i32); +// if !arg1.is_null() { +// *arg1 = 0i32 as libc::c_char; +// arg1 = arg1.offset(1isize) +// } +// if strcmp(cmd, b"connect\x00" as *const u8 as *const libc::c_char) == 0i32 { +// start_threads(context); +// } else if strcmp(cmd, b"disconnect\x00" as *const u8 as *const libc::c_char) == 0i32 { +// stop_threads(context); +// } else if strcmp(cmd, b"smtp-jobs\x00" as *const u8 as *const libc::c_char) == 0i32 { +// if 0 != run_threads { +// printf( +// b"smtp-jobs are already running in a thread.\n\x00" as *const u8 +// as *const libc::c_char, +// ); +// } else { +// dc_perform_smtp_jobs(context); +// } +// } else if strcmp(cmd, b"imap-jobs\x00" as *const u8 as *const libc::c_char) == 0i32 { +// if 0 != run_threads { +// printf( +// b"imap-jobs are already running in a thread.\n\x00" as *const u8 +// as *const libc::c_char, +// ); +// } else { +// dc_perform_imap_jobs(context); +// } +// } else if strcmp(cmd, b"configure\x00" as *const u8 as *const libc::c_char) == 0i32 { +// start_threads(context); +// dc_configure(context); +// } else if strcmp(cmd, b"oauth2\x00" as *const u8 as *const libc::c_char) == 0i32 { +// let mut addr: *mut libc::c_char = +// dc_get_config(context, b"addr\x00" as *const u8 as *const libc::c_char); +// if addr.is_null() || *addr.offset(0isize) as libc::c_int == 0i32 { +// printf(b"oauth2: set addr first.\n\x00" as *const u8 as *const libc::c_char); +// } else { +// let mut oauth2_url: *mut libc::c_char = dc_get_oauth2_url( +// context, +// addr, +// b"chat.delta:/com.b44t.messenger\x00" as *const u8 as *const libc::c_char, +// ); +// if oauth2_url.is_null() { +// printf( +// b"OAuth2 not available for %s.\n\x00" as *const u8 as *const libc::c_char, +// addr, +// ); +// } else { +// printf(b"Open the following url, set mail_pw to the generated token and server_flags to 2:\n%s\n\x00" +// as *const u8 as *const libc::c_char, +// oauth2_url); +// } +// free(oauth2_url as *mut libc::c_void); +// } +// free(addr as *mut libc::c_void); +// } else if strcmp(cmd, b"clear\x00" as *const u8 as *const libc::c_char) == 0i32 { +// printf(b"\n\n\n\n\x00" as *const u8 as *const libc::c_char); +// printf(b"\x1b[1;1H\x1b[2J\x00" as *const u8 as *const libc::c_char); +// } else if strcmp(cmd, b"getqr\x00" as *const u8 as *const libc::c_char) == 0i32 +// || strcmp(cmd, b"getbadqr\x00" as *const u8 as *const libc::c_char) == 0i32 +// { +// start_threads(context); +// let mut qrstr: *mut libc::c_char = dc_get_securejoin_qr( +// context, +// (if !arg1.is_null() { atoi(arg1) } else { 0i32 }) as uint32_t, +// ); +// if !qrstr.is_null() && 0 != *qrstr.offset(0isize) as libc::c_int { +// if strcmp(cmd, b"getbadqr\x00" as *const u8 as *const libc::c_char) == 0i32 +// && strlen(qrstr) > 40 +// { +// let mut i: libc::c_int = 12i32; +// while i < 22i32 { +// *qrstr.offset(i as isize) = '0' as i32 as libc::c_char; +// i += 1 +// } +// } +// printf(b"%s\n\x00" as *const u8 as *const libc::c_char, qrstr); +// let mut syscmd: *mut libc::c_char = dc_mprintf( +// b"qrencode -t ansiutf8 \"%s\" -o -\x00" as *const u8 as *const libc::c_char, +// qrstr, +// ); +// system(syscmd); +// free(syscmd as *mut libc::c_void); +// } +// free(qrstr as *mut libc::c_void); +// } else if strcmp(cmd, b"joinqr\x00" as *const u8 as *const libc::c_char) == 0i32 { +// start_threads(context); +// if !arg1.is_null() { +// dc_join_securejoin(context, arg1); +// } +// } else { +// if strcmp(cmd, b"exit\x00" as *const u8 as *const libc::c_char) == 0i32 { +// break; +// } +// if !(*cmd.offset(0isize) as libc::c_int == 0i32) { +// let mut execute_result: *mut libc::c_char = dc_cmdline(context, &cmdline); +// if !execute_result.is_null() { +// printf( +// b"%s\n\x00" as *const u8 as *const libc::c_char, +// execute_result, +// ); +// free(execute_result as *mut libc::c_void); +// } +// } +// } +// } +// free(cmd as *mut libc::c_void); +// stop_threads(context); +// dc_close(context); +// dc_context_unref(context); +// context = 0 as &dc_context_t; +// return 0i32; +// } -pub fn main() { - let mut args: Vec<*mut libc::c_char> = Vec::new(); - for arg in ::std::env::args() { - args.push( - ::std::ffi::CString::new(arg) - .expect("Failed to convert argument into CString.") - .into_raw(), - ); - } - args.push(::std::ptr::null_mut()); +// pub fn main() { +// let mut args: Vec<*mut libc::c_char> = Vec::new(); +// for arg in ::std::env::args() { +// args.push( +// ::std::ffi::CString::new(arg) +// .expect("Failed to convert argument into CString.") +// .into_raw(), +// ); +// } +// args.push(::std::ptr::null_mut()); - let res = unsafe { - main_0( - (args.len() - 1) as libc::c_int, - args.as_mut_ptr() as *mut *mut libc::c_char, - ) - }; - ::std::process::exit(res) -} +// let res = unsafe { +// main_0( +// (args.len() - 1) as libc::c_int, +// args.as_mut_ptr() as *mut *mut libc::c_char, +// ) +// }; +// ::std::process::exit(res) +// } + +fn main() {} diff --git a/examples/simple.rs b/examples/simple.rs index f018db042..646797ddb 100644 --- a/examples/simple.rs +++ b/examples/simple.rs @@ -1,7 +1,7 @@ extern crate deltachat; use std::ffi::{CStr, CString}; -use std::ptr::NonNull; +use std::sync::{Arc, RwLock}; use tempfile::tempdir; use deltachat::constants::Event; @@ -49,61 +49,70 @@ extern "C" fn cb(_ctx: &dc_context_t, event: Event, data1: usize, data2: usize) } } -struct Wrapper(NonNull); - -unsafe impl std::marker::Send for Wrapper {} -unsafe impl std::marker::Sync for Wrapper {} - fn main() { unsafe { let ctx = dc_context_new(cb, std::ptr::null_mut(), std::ptr::null_mut()); - let info = dc_get_info(ctx); + let info = dc_get_info(&ctx); let info_s = CStr::from_ptr(info); println!("info: {}", info_s.to_str().unwrap()); - let sendable_ctx = Wrapper(NonNull::new(ctx).unwrap()); + let ctx = Arc::new(RwLock::new(ctx)); + + let ctx1 = ctx.clone(); let t1 = std::thread::spawn(move || loop { - dc_perform_imap_jobs(sendable_ctx.0.as_ptr()); - dc_perform_imap_fetch(sendable_ctx.0.as_ptr()); - dc_perform_imap_idle(sendable_ctx.0.as_ptr()); + dc_perform_imap_jobs(&ctx1.clone().read().unwrap()); + dc_perform_imap_fetch(&ctx1.clone().read().unwrap()); + dc_perform_imap_idle(&ctx1.clone().read().unwrap()); }); - let sendable_ctx = Wrapper(NonNull::new(ctx).unwrap()); + let ctx1 = ctx.clone(); let t2 = std::thread::spawn(move || loop { - dc_perform_smtp_jobs(sendable_ctx.0.as_ptr()); - dc_perform_smtp_idle(sendable_ctx.0.as_ptr()); + dc_perform_smtp_jobs(&ctx1.clone().read().unwrap()); + dc_perform_smtp_idle(&ctx1.clone().read().unwrap()); }); let dir = tempdir().unwrap(); let dbfile = CString::new(dir.path().join("db.sqlite").to_str().unwrap()).unwrap(); println!("opening database {:?}", dbfile); - dc_open(ctx, dbfile.as_ptr(), std::ptr::null()); + + dc_open( + &mut ctx.clone().write().unwrap(), + dbfile.as_ptr(), + std::ptr::null(), + ); println!("configuring"); dc_set_config( - ctx, + &ctx.clone().read().unwrap(), CString::new("addr").unwrap().as_ptr(), CString::new("d@testrun.org").unwrap().as_ptr(), ); dc_set_config( - ctx, + &ctx.clone().read().unwrap(), CString::new("mail_pw").unwrap().as_ptr(), CString::new("***").unwrap().as_ptr(), ); - dc_configure(ctx); + dc_configure(&ctx.clone().read().unwrap()); std::thread::sleep_ms(4000); let email = CString::new("dignifiedquire@gmail.com").unwrap(); println!("sending a message"); - let contact_id = dc_create_contact(ctx, std::ptr::null(), email.as_ptr()); - let chat_id = dc_create_chat_by_contact_id(ctx, contact_id); + let contact_id = dc_create_contact( + &ctx.clone().read().unwrap(), + std::ptr::null(), + email.as_ptr(), + ); + let chat_id = dc_create_chat_by_contact_id(&ctx.clone().read().unwrap(), contact_id); let msg_text = CString::new("Hi, here is my first message!").unwrap(); - dc_send_text_msg(ctx, chat_id, msg_text.as_ptr()); + dc_send_text_msg(&ctx.clone().read().unwrap(), chat_id, msg_text.as_ptr()); println!("fetching chats.."); - let chats = dc_get_chatlist(ctx, 0, std::ptr::null(), 0); + let ctx1 = ctx.clone(); + let ctx = ctx1.read().unwrap(); + + let chats = dc_get_chatlist(&ctx, 0, std::ptr::null(), 0); for i in 0..dc_chatlist_get_cnt(chats) { let summary = dc_chatlist_get_summary(chats, 0, std::ptr::null_mut()); @@ -125,7 +134,7 @@ fn main() { } dc_chatlist_unref(chats); - // let msglist = dc_get_chat_msgs(ctx, chat_id, 0, 0); + // let msglist = dc_get_chat_msgs(&ctx.clone().read().unwrap(), chat_id, 0, 0); // for i in 0..dc_array_get_cnt(msglist) { // let msg_id = dc_array_get_id(msglist, i); // let msg = dc_get_msg(context, msg_id); diff --git a/src/dc_apeerstate.rs b/src/dc_apeerstate.rs index ba20123b5..170383ff3 100644 --- a/src/dc_apeerstate.rs +++ b/src/dc_apeerstate.rs @@ -103,7 +103,8 @@ pub unsafe fn dc_apeerstate_recalc_fingerprint(mut peerstate: *mut dc_apeerstate if !peerstate.is_null() { if !(*peerstate).public_key.is_null() { old_public_fingerprint = (*peerstate).public_key_fingerprint; - (*peerstate).public_key_fingerprint = dc_key_get_fingerprint((*peerstate).public_key); + (*peerstate).public_key_fingerprint = + dc_key_get_fingerprint((*peerstate).context, (*peerstate).public_key); if old_public_fingerprint.is_null() || *old_public_fingerprint.offset(0isize) as libc::c_int == 0i32 || (*peerstate).public_key_fingerprint.is_null() @@ -120,7 +121,8 @@ pub unsafe fn dc_apeerstate_recalc_fingerprint(mut peerstate: *mut dc_apeerstate } if !(*peerstate).gossip_key.is_null() { old_gossip_fingerprint = (*peerstate).gossip_key_fingerprint; - (*peerstate).gossip_key_fingerprint = dc_key_get_fingerprint((*peerstate).gossip_key); + (*peerstate).gossip_key_fingerprint = + dc_key_get_fingerprint((*peerstate).context, (*peerstate).gossip_key); if old_gossip_fingerprint.is_null() || *old_gossip_fingerprint.offset(0isize) as libc::c_int == 0i32 || (*peerstate).gossip_key_fingerprint.is_null() @@ -320,7 +322,9 @@ pub unsafe fn dc_apeerstate_load_by_addr( if !(peerstate.is_null() || addr.is_null()) { dc_apeerstate_empty(peerstate); stmt = - dc_sqlite3_prepare(sql, + dc_sqlite3_prepare( + (*peerstate).context, + sql, b"SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, verified_key, verified_key_fingerprint FROM acpeerstates WHERE addr=? COLLATE NOCASE;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, addr, -1i32, None); @@ -370,8 +374,10 @@ pub unsafe fn dc_apeerstate_load_by_fingerprint( if !(peerstate.is_null() || fingerprint.is_null()) { dc_apeerstate_empty(peerstate); stmt = - dc_sqlite3_prepare(sql, - b"SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, verified_key, verified_key_fingerprint FROM acpeerstates WHERE public_key_fingerprint=? COLLATE NOCASE OR gossip_key_fingerprint=? COLLATE NOCASE ORDER BY public_key_fingerprint=? DESC;\x00" + dc_sqlite3_prepare( + (*peerstate).context, + sql, + b"SELECT addr, last_seen, last_seen_autocrypt, prefer_encrypted, public_key, gossip_timestamp, gossip_key, public_key_fingerprint, gossip_key_fingerprint, verified_key, verified_key_fingerprint FROM acpeerstates WHERE public_key_fingerprint=? COLLATE NOCASE OR gossip_key_fingerprint=? COLLATE NOCASE ORDER BY public_key_fingerprint=? DESC;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, fingerprint, -1i32, None); sqlite3_bind_text(stmt, 2i32, fingerprint, -1i32, None); @@ -397,6 +403,7 @@ pub unsafe fn dc_apeerstate_save_to_db( } if 0 != create { stmt = dc_sqlite3_prepare( + (*peerstate).context, sql, b"INSERT INTO acpeerstates (addr) VALUES(?);\x00" as *const u8 as *const libc::c_char, ); @@ -407,7 +414,8 @@ pub unsafe fn dc_apeerstate_save_to_db( } if 0 != (*peerstate).to_save & 0x2i32 || 0 != create { stmt = - dc_sqlite3_prepare(sql, + dc_sqlite3_prepare( + (*peerstate).context,sql, b"UPDATE acpeerstates SET last_seen=?, last_seen_autocrypt=?, prefer_encrypted=?, public_key=?, gossip_timestamp=?, gossip_key=?, public_key_fingerprint=?, gossip_key_fingerprint=?, verified_key=?, verified_key_fingerprint=? WHERE addr=?;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int64(stmt, 1i32, (*peerstate).last_seen as sqlite3_int64); @@ -482,7 +490,8 @@ pub unsafe fn dc_apeerstate_save_to_db( } } else if 0 != (*peerstate).to_save & 0x1i32 { stmt = - dc_sqlite3_prepare(sql, + dc_sqlite3_prepare( + (*peerstate).context,sql, b"UPDATE acpeerstates SET last_seen=?, last_seen_autocrypt=?, gossip_timestamp=? WHERE addr=?;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int64(stmt, 1i32, (*peerstate).last_seen as sqlite3_int64); diff --git a/src/dc_chat.rs b/src/dc_chat.rs index 4041ddf5b..b20361c4c 100644 --- a/src/dc_chat.rs +++ b/src/dc_chat.rs @@ -123,6 +123,7 @@ pub unsafe fn dc_block_chat( ) { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE chats SET blocked=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -138,6 +139,7 @@ pub unsafe fn dc_chat_load_from_db(mut chat: *mut dc_chat_t, mut chat_id: uint32 dc_chat_empty(chat); stmt = dc_sqlite3_prepare( + (*chat).context, &mut (*chat).context.sql.lock().unwrap(), b"SELECT c.id,c.type,c.name, c.grpid,c.param,c.archived, c.blocked, c.gossiped_timestamp, c.locations_send_until FROM chats c WHERE c.id=?;\x00" as *const u8 as *const libc::c_char @@ -325,10 +327,11 @@ pub unsafe fn dc_create_or_lookup_nchat_by_contact_id( ); } else { }; - stmt = dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), q); + stmt = dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), q); if !stmt.is_null() { if !(sqlite3_step(stmt) != 101i32) { chat_id = dc_sqlite3_get_rowid( + context, &mut context.sql.lock().unwrap(), b"chats\x00" as *const u8 as *const libc::c_char, b"grpid\x00" as *const u8 as *const libc::c_char, @@ -344,7 +347,7 @@ pub unsafe fn dc_create_or_lookup_nchat_by_contact_id( chat_id, contact_id, ); - stmt = dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), q); + stmt = dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), q); if !(sqlite3_step(stmt) != 101i32) { sqlite3_free(q as *mut libc::c_void); q = 0 as *mut libc::c_char; @@ -383,6 +386,7 @@ pub unsafe fn dc_lookup_real_nchat_by_contact_id( } stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT c.id, c.blocked FROM chats c INNER JOIN chats_contacts j ON c.id=j.chat_id WHERE c.type=100 AND c.id>9 AND j.contact_id=?;\x00" as *const u8 as *const libc::c_char); @@ -565,6 +569,7 @@ unsafe fn prepare_msg_raw( ); } else { let mut from: *mut libc::c_char = dc_sqlite3_get_config( + context, &mut context.sql.lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -587,6 +592,7 @@ unsafe fn prepare_msg_raw( free(from as *mut libc::c_void); if (*chat).type_0 == 100i32 { stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT contact_id FROM chats_contacts WHERE chat_id=?;\x00" as *const u8 as *const libc::c_char, @@ -625,6 +631,7 @@ unsafe fn prepare_msg_raw( we do not send the message out at all */ do_guarantee_e2ee = 0i32; e2ee_enabled = dc_sqlite3_get_config_int( + context, &mut context.sql.lock().unwrap(), b"e2ee_enabled\x00" as *const u8 as *const libc::c_char, 1i32, @@ -634,7 +641,7 @@ unsafe fn prepare_msg_raw( let mut can_encrypt: libc::c_int = 1i32; let mut all_mutual: libc::c_int = 1i32; stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), b"SELECT ps.prefer_encrypted, c.addr FROM chats_contacts cc LEFT JOIN contacts c ON cc.contact_id=c.id LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE cc.chat_id=? AND cc.contact_id>9;\x00" as *const u8 as *const libc::c_char); @@ -677,6 +684,7 @@ unsafe fn prepare_msg_raw( do_guarantee_e2ee = 1i32 } else if 0 != last_msg_in_chat_encrypted( + context, &mut context.sql.lock().unwrap(), (*chat).id, ) @@ -744,6 +752,7 @@ unsafe fn prepare_msg_raw( if 0 != dc_param_exists((*msg).param, DC_PARAM_SET_LATITUDE as libc::c_int) { stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"INSERT INTO locations \ (timestamp,from_id,chat_id, latitude,longitude,independent)\ @@ -776,6 +785,7 @@ unsafe fn prepare_msg_raw( stmt = 0 as *mut sqlite3_stmt; location_id = dc_sqlite3_get_rowid2( + context, &mut context.sql.lock().unwrap(), b"locations\x00" as *const u8 as *const libc::c_char, b"timestamp\x00" as *const u8 as *const libc::c_char, @@ -788,7 +798,8 @@ unsafe fn prepare_msg_raw( // add message to the database stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"INSERT INTO msgs (rfc724_mid, chat_id, from_id, to_id, timestamp, type, state, txt, param, hidden, mime_in_reply_to, mime_references, location_id) VALUES (?,?,?,?,?, ?,?,?,?,?, ?,?,?);\x00" as *const u8 as *const libc::c_char); @@ -825,6 +836,7 @@ unsafe fn prepare_msg_raw( ); } else { msg_id = dc_sqlite3_get_rowid( + context, &mut context.sql.lock().unwrap(), b"msgs\x00" as *const u8 as *const libc::c_char, b"rfc724_mid\x00" as *const u8 as *const libc::c_char, @@ -858,7 +870,8 @@ unsafe fn get_parent_mime_headers( || parent_references.is_null()) { stmt = - dc_sqlite3_prepare(&mut (*chat).context.sql.lock().unwrap(), + dc_sqlite3_prepare( + (*chat).context,&mut (*chat).context.sql.lock().unwrap(), b"SELECT rfc724_mid, mime_in_reply_to, mime_references FROM msgs WHERE timestamp=(SELECT max(timestamp) FROM msgs WHERE chat_id=? AND from_id!=?);\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, (*chat).id as libc::c_int); @@ -873,7 +886,8 @@ unsafe fn get_parent_mime_headers( stmt = 0 as *mut sqlite3_stmt; if 0 == success { stmt = - dc_sqlite3_prepare(&mut (*chat).context.sql.lock().unwrap(), + dc_sqlite3_prepare( + (*chat).context,&mut (*chat).context.sql.lock().unwrap(), b"SELECT rfc724_mid, mime_in_reply_to, mime_references FROM msgs WHERE timestamp=(SELECT min(timestamp) FROM msgs WHERE chat_id=? AND from_id==?);\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, (*chat).id as libc::c_int); @@ -902,12 +916,14 @@ pub unsafe fn dc_chat_is_self_talk(mut chat: *const dc_chat_t) -> libc::c_int { * Sending messages ******************************************************************************/ unsafe fn last_msg_in_chat_encrypted( - mut sql: &mut dc_sqlite3_t, - mut chat_id: uint32_t, + context: &dc_context_t, + sql: &mut dc_sqlite3_t, + chat_id: uint32_t, ) -> libc::c_int { let mut last_is_encrypted: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = - dc_sqlite3_prepare(sql, + dc_sqlite3_prepare( + context,sql, b"SELECT param FROM msgs WHERE timestamp=(SELECT MAX(timestamp) FROM msgs WHERE chat_id=?) ORDER BY id DESC;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); @@ -928,6 +944,7 @@ unsafe fn last_msg_in_chat_encrypted( pub unsafe fn dc_chat_update_param(mut chat: *mut dc_chat_t) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + (*chat).context, &mut (*chat).context.sql.lock().unwrap(), b"UPDATE chats SET param=? WHERE id=?\x00" as *const u8 as *const libc::c_char, ); @@ -952,6 +969,7 @@ pub unsafe fn dc_is_contact_in_chat( let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT contact_id FROM chats_contacts WHERE chat_id=? AND contact_id=?;\x00" as *const u8 as *const libc::c_char, @@ -970,6 +988,7 @@ pub unsafe fn dc_is_contact_in_chat( pub unsafe fn dc_unarchive_chat(mut context: &dc_context_t, mut chat_id: uint32_t) { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE chats SET archived=0 WHERE id=?\x00" as *const u8 as *const libc::c_char, ); @@ -1116,7 +1135,8 @@ unsafe fn set_draft_raw( 14513523936503887211 => {} _ => { stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"INSERT INTO msgs (chat_id, from_id, timestamp, type, state, txt, param, hidden) VALUES (?,?,?, ?,?,?,?,?);\x00" as *const u8 as *const libc::c_char); @@ -1151,6 +1171,7 @@ unsafe fn set_draft_raw( unsafe fn get_draft_msg_id(mut context: &dc_context_t, mut chat_id: uint32_t) -> uint32_t { let mut draft_msg_id: uint32_t = 0i32 as uint32_t; let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT id FROM msgs WHERE chat_id=? AND state=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1197,23 +1218,27 @@ pub unsafe fn dc_get_chat_msgs( if !ret.is_null() { if chat_id == 1i32 as libc::c_uint { let mut show_emails: libc::c_int = dc_sqlite3_get_config_int( + context, &mut context.sql.lock().unwrap(), b"show_emails\x00" as *const u8 as *const libc::c_char, 0i32, ); stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN chats ON m.chat_id=chats.id LEFT JOIN contacts ON m.from_id=contacts.id WHERE m.from_id!=1 AND m.from_id!=2 AND m.hidden=0 AND chats.blocked=2 AND contacts.blocked=0 AND m.msgrmsg>=? ORDER BY m.timestamp,m.id;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, if show_emails == 2i32 { 0i32 } else { 1i32 }); } else if chat_id == 5i32 as libc::c_uint { stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN contacts ct ON m.from_id=ct.id WHERE m.starred=1 AND m.hidden=0 AND ct.blocked=0 ORDER BY m.timestamp,m.id;\x00" as *const u8 as *const libc::c_char) } else { stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"SELECT m.id, m.timestamp FROM msgs m WHERE m.chat_id=? AND m.hidden=0 ORDER BY m.timestamp,m.id;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); @@ -1249,6 +1274,7 @@ pub unsafe fn dc_get_msg_cnt(mut context: &dc_context_t, mut chat_id: uint32_t) let mut ret: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT COUNT(*) FROM msgs WHERE chat_id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1267,6 +1293,7 @@ pub unsafe fn dc_get_fresh_msg_cnt( let mut ret: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT COUNT(*) FROM msgs WHERE state=10 AND hidden=0 AND chat_id=?;\x00" as *const u8 as *const libc::c_char, @@ -1283,6 +1310,7 @@ pub unsafe fn dc_marknoticed_chat(mut context: &dc_context_t, mut chat_id: uint3 let mut update: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; check = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT id FROM msgs WHERE chat_id=? AND state=10;\x00" as *const u8 as *const libc::c_char, @@ -1290,6 +1318,7 @@ pub unsafe fn dc_marknoticed_chat(mut context: &dc_context_t, mut chat_id: uint3 sqlite3_bind_int(check, 1i32, chat_id as libc::c_int); if !(sqlite3_step(check) != 100i32) { update = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE msgs SET state=13 WHERE chat_id=? AND state=10;\x00" as *const u8 as *const libc::c_char, @@ -1312,11 +1341,13 @@ pub unsafe fn dc_marknoticed_all_chats(mut context: &dc_context_t) { let mut update: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; check = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT id FROM msgs WHERE state=10;\x00" as *const u8 as *const libc::c_char, ); if !(sqlite3_step(check) != 100i32) { update = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE msgs SET state=13 WHERE state=10;\x00" as *const u8 as *const libc::c_char, ); @@ -1341,7 +1372,8 @@ pub unsafe fn dc_get_chat_media( ) -> *mut dc_array_t { let mut ret: *mut dc_array_t = dc_array_new(100i32 as size_t); let mut stmt: *mut sqlite3_stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"SELECT id FROM msgs WHERE chat_id=? AND (type=? OR type=? OR type=?) ORDER BY timestamp, id;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); @@ -1432,6 +1464,7 @@ pub unsafe fn dc_archive_chat( } if 0 != archive { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE msgs SET state=13 WHERE chat_id=? AND state=10;\x00" as *const u8 as *const libc::c_char, @@ -1441,6 +1474,7 @@ pub unsafe fn dc_archive_chat( sqlite3_finalize(stmt); } let mut stmt_0: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE chats SET archived=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1457,25 +1491,23 @@ pub unsafe fn dc_archive_chat( } pub unsafe fn dc_delete_chat(mut context: &dc_context_t, mut chat_id: uint32_t) { /* Up to 2017-11-02 deleting a group also implied leaving it, see above why we have changed this. */ - let mut pending_transaction: libc::c_int = 0i32; let mut obj: *mut dc_chat_t = dc_chat_new(context); let mut q3: *mut libc::c_char = 0 as *mut libc::c_char; if !(chat_id <= 9i32 as libc::c_uint) { if !(0 == dc_chat_load_from_db(obj, chat_id)) { - pending_transaction = 1i32; q3 = sqlite3_mprintf( b"DELETE FROM msgs_mdns WHERE msg_id IN (SELECT id FROM msgs WHERE chat_id=%i);\x00" as *const u8 as *const libc::c_char, chat_id, ); - if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) { + if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) { sqlite3_free(q3 as *mut libc::c_void); q3 = 0 as *mut libc::c_char; q3 = sqlite3_mprintf( b"DELETE FROM msgs WHERE chat_id=%i;\x00" as *const u8 as *const libc::c_char, chat_id, ); - if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) { + if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) { sqlite3_free(q3 as *mut libc::c_void); q3 = 0 as *mut libc::c_char; q3 = sqlite3_mprintf( @@ -1483,7 +1515,7 @@ pub unsafe fn dc_delete_chat(mut context: &dc_context_t, mut chat_id: uint32_t) as *const libc::c_char, chat_id, ); - if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) { + if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) { sqlite3_free(q3 as *mut libc::c_void); q3 = 0 as *mut libc::c_char; q3 = sqlite3_mprintf( @@ -1491,10 +1523,10 @@ pub unsafe fn dc_delete_chat(mut context: &dc_context_t, mut chat_id: uint32_t) as *const libc::c_char, chat_id, ); - if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) { + if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) + { sqlite3_free(q3 as *mut libc::c_void); q3 = 0 as *mut libc::c_char; - pending_transaction = 0i32; (context.cb)( context, Event::MSGS_CHANGED, @@ -1524,7 +1556,8 @@ pub unsafe fn dc_get_chat_contacts( if !(chat_id == 1i32 as libc::c_uint) { /* we could also create a list for all contacts in the deaddrop by searching contacts belonging to chats with chats.blocked=2, however, currently this is not needed */ stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"SELECT cc.contact_id FROM chats_contacts cc LEFT JOIN contacts c ON c.id=cc.contact_id WHERE cc.chat_id=? ORDER BY c.id=1, LOWER(c.name||c.addr), c.id;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); @@ -1568,6 +1601,7 @@ pub unsafe fn dc_create_group_chat( draft_txt = dc_stock_str_repl_string(context, 14i32, chat_name); grpid = dc_create_id(); stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"INSERT INTO chats (type, name, grpid, param) VALUES(?, ?, ?, \'U=1\');\x00" as *const u8 as *const libc::c_char, @@ -1577,6 +1611,7 @@ pub unsafe fn dc_create_group_chat( sqlite3_bind_text(stmt, 3i32, grpid, -1i32, None); if !(sqlite3_step(stmt) != 101i32) { chat_id = dc_sqlite3_get_rowid( + context, &mut context.sql.lock().unwrap(), b"chats\x00" as *const u8 as *const libc::c_char, b"grpid\x00" as *const u8 as *const libc::c_char, @@ -1614,6 +1649,7 @@ pub unsafe fn dc_add_to_chat_contacts_table( /* add a contact to a chat; the function does not check the type or if any of the record exist or are already added to the chat! */ let mut ret: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"INSERT INTO chats_contacts (chat_id, contact_id) VALUES(?, ?)\x00" as *const u8 as *const libc::c_char, @@ -1671,6 +1707,7 @@ pub unsafe fn dc_add_contact_to_chat_ex( dc_chat_update_param(chat); } self_addr = dc_sqlite3_get_config( + context, &mut context.sql.lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -1762,6 +1799,7 @@ unsafe fn real_group_exists(mut context: &dc_context_t, mut chat_id: uint32_t) - return 0i32; } stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT id FROM chats WHERE id=? AND (type=120 OR type=130);\x00" as *const u8 as *const libc::c_char, @@ -1791,6 +1829,7 @@ pub unsafe fn dc_set_gossiped_timestamp( timestamp as libc::c_int, ); stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE chats SET gossiped_timestamp=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, @@ -1805,6 +1844,7 @@ pub unsafe fn dc_set_gossiped_timestamp( timestamp as libc::c_int, ); stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE chats SET gossiped_timestamp=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1879,7 +1919,7 @@ pub unsafe fn dc_remove_contact_from_chat( chat_id, contact_id, ); - if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) { + if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) { (context.cb)( context, Event::CHAT_MODIFIED, @@ -1903,6 +1943,7 @@ pub unsafe fn dc_set_group_explicitly_left( ) { if 0 == dc_is_group_explicitly_left(context, grpid) { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"INSERT INTO leftgrps (grpid) VALUES(?);\x00" as *const u8 as *const libc::c_char, ); @@ -1916,6 +1957,7 @@ pub unsafe fn dc_is_group_explicitly_left( mut grpid: *const libc::c_char, ) -> libc::c_int { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT id FROM leftgrps WHERE grpid=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1959,7 +2001,7 @@ pub unsafe fn dc_set_chat_name( new_name, chat_id, ); - if !(0 == dc_sqlite3_execute(&mut context.sql.lock().unwrap(), q3)) { + if !(0 == dc_sqlite3_execute(context, &mut context.sql.lock().unwrap(), q3)) { if dc_param_get_int((*chat).param, 'U' as i32, 0i32) == 0i32 { (*msg).type_0 = 10i32; (*msg).text = dc_stock_system_msg( @@ -2081,11 +2123,9 @@ pub unsafe fn dc_forward_msgs( mut msg_cnt: libc::c_int, mut chat_id: uint32_t, ) { - let mut current_block: u64; let mut msg: *mut dc_msg_t = dc_msg_new_untyped(context); let mut chat: *mut dc_chat_t = dc_chat_new(context); let mut contact: *mut dc_contact_t = dc_contact_new(context); - let mut transaction_pending: libc::c_int = 0i32; let mut created_db_entries: *mut carray = carray_new(16i32 as libc::c_uint); let mut idsstr: *mut libc::c_char = 0 as *mut libc::c_char; let mut q3: *mut libc::c_char = 0 as *mut libc::c_char; @@ -2093,7 +2133,6 @@ pub unsafe fn dc_forward_msgs( let mut curr_timestamp: time_t = 0i32 as time_t; let mut original_param: *mut dc_param_t = dc_param_new(); if !(msg_ids.is_null() || msg_cnt <= 0i32 || chat_id <= 9i32 as libc::c_uint) { - transaction_pending = 1i32; dc_unarchive_chat(context, chat_id); context.smtp.lock().unwrap().log_connect_errors = 1i32; if !(0 == dc_chat_load_from_db(chat, chat_id)) { @@ -2104,15 +2143,13 @@ pub unsafe fn dc_forward_msgs( as *const libc::c_char, idsstr, ); - stmt = dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), q3); + stmt = dc_sqlite3_prepare(context, &mut context.sql.lock().unwrap(), q3); loop { if !(sqlite3_step(stmt) == 100i32) { - current_block = 10758786907990354186; break; } let mut src_msg_id: libc::c_int = sqlite3_column_int(stmt, 0i32); if 0 == dc_msg_load_from_db(msg, context, src_msg_id as uint32_t) { - current_block = 2015322633586469911; break; } dc_param_set_packed(original_param, (*(*msg).param).packed); @@ -2163,10 +2200,6 @@ pub unsafe fn dc_forward_msgs( 0 as *mut libc::c_uint, ); } - match current_block { - 2015322633586469911 => {} - _ => transaction_pending = 0i32, - } } } if !created_db_entries.is_null() { @@ -2220,7 +2253,8 @@ pub unsafe extern "C" fn dc_chat_get_subtitle(mut chat: *const dc_chat_t) -> *mu } else if (*chat).type_0 == 100i32 { let mut r: libc::c_int = 0; let mut stmt: *mut sqlite3_stmt = - dc_sqlite3_prepare(&mut (*chat).context.sql.lock().unwrap(), + dc_sqlite3_prepare( + (*chat).context,&mut (*chat).context.sql.lock().unwrap(), b"SELECT c.addr FROM chats_contacts cc LEFT JOIN contacts c ON c.id=cc.contact_id WHERE cc.chat_id=?;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, (*chat).id as libc::c_int); @@ -2250,6 +2284,7 @@ pub unsafe fn dc_get_chat_contact_cnt( ) -> libc::c_int { let mut ret: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT COUNT(*) FROM chats_contacts WHERE chat_id=?;\x00" as *const u8 as *const libc::c_char, @@ -2338,6 +2373,7 @@ pub unsafe fn dc_get_chat_cnt(mut context: &dc_context_t) -> size_t { if !(*context.sql.lock().unwrap()).cobj.is_null() { /* no database, no chats - this is no error (needed eg. for information) */ stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT COUNT(*) FROM chats WHERE id>9 AND blocked=0;\x00" as *const u8 as *const libc::c_char, @@ -2365,6 +2401,7 @@ pub unsafe fn dc_get_chat_id_by_grpid( } stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT id, blocked, type FROM chats WHERE grpid=?;\x00" as *const u8 as *const libc::c_char, @@ -2396,7 +2433,8 @@ pub unsafe fn dc_add_device_msg( ); if !text.is_null() { stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.lock().unwrap(), b"INSERT INTO msgs (chat_id,from_id,to_id, timestamp,type,state, txt,rfc724_mid) VALUES (?,?,?, ?,?,?, ?,?);\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); @@ -2413,6 +2451,7 @@ pub unsafe fn dc_add_device_msg( sqlite3_bind_text(stmt, 8i32, rfc724_mid, -1i32, None); if !(sqlite3_step(stmt) != 101i32) { msg_id = dc_sqlite3_get_rowid( + context, &mut context.sql.lock().unwrap(), b"msgs\x00" as *const u8 as *const libc::c_char, b"rfc724_mid\x00" as *const u8 as *const libc::c_char, diff --git a/src/dc_chatlist.rs b/src/dc_chatlist.rs index 56267da8b..297c06f8b 100644 --- a/src/dc_chatlist.rs +++ b/src/dc_chatlist.rs @@ -143,15 +143,20 @@ unsafe fn dc_chatlist_load_from_db( // shown at all permanent in the chatlist. if 0 != query_contact_id { stmt = - dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(), - b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?) GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" - as *const u8 as *const libc::c_char); + dc_sqlite3_prepare( + (*chatlist).context, + &mut (*chatlist).context.sql.lock().unwrap(), + b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?) GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" + as *const u8 as *const libc::c_char + ); sqlite3_bind_int(stmt, 1i32, query_contact_id as libc::c_int); current_block = 3437258052017859086; } else if 0 != listflags & 0x1i32 { stmt = - dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(), - b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.archived=1 GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" + dc_sqlite3_prepare( + (*chatlist).context, + &mut (*chatlist).context.sql.lock().unwrap(), + b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.archived=1 GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" as *const u8 as *const libc::c_char); current_block = 3437258052017859086; } else if query__.is_null() { @@ -165,7 +170,9 @@ unsafe fn dc_chatlist_load_from_db( add_archived_link_item = 1i32 } stmt = - dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(), + dc_sqlite3_prepare( + (*chatlist).context, + &mut (*chatlist).context.sql.lock().unwrap(), b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.archived=0 GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" as *const u8 as *const libc::c_char); current_block = 3437258052017859086; @@ -178,8 +185,10 @@ unsafe fn dc_chatlist_load_from_db( } else { strLikeCmd = dc_mprintf(b"%%%s%%\x00" as *const u8 as *const libc::c_char, query); stmt = - dc_sqlite3_prepare(&mut (*chatlist).context.sql.lock().unwrap(), - b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.name LIKE ? GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" + dc_sqlite3_prepare( + (*chatlist).context, + &mut (*chatlist).context.sql.lock().unwrap(), + b"SELECT c.id, m.id FROM chats c LEFT JOIN msgs m ON c.id=m.chat_id AND m.timestamp=( SELECT MAX(timestamp) FROM msgs WHERE chat_id=c.id AND (hidden=0 OR (hidden=1 AND state=19))) WHERE c.id>9 AND c.blocked=0 AND c.name LIKE ? GROUP BY c.id ORDER BY IFNULL(m.timestamp,0) DESC, m.id DESC;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, strLikeCmd, -1i32, None); @@ -223,6 +232,7 @@ unsafe fn dc_chatlist_load_from_db( pub unsafe fn dc_get_archived_cnt(mut context: &dc_context_t) -> libc::c_int { let mut ret: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"SELECT COUNT(*) FROM chats WHERE blocked=0 AND archived=1;\x00" as *const u8 as *const libc::c_char, @@ -237,8 +247,10 @@ unsafe fn get_last_deaddrop_fresh_msg(mut context: &dc_context_t) -> uint32_t { let mut ret: uint32_t = 0i32 as uint32_t; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = - dc_sqlite3_prepare(&mut context.sql.lock().unwrap(), - b"SELECT m.id FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.state=10 AND m.hidden=0 AND c.blocked=2 ORDER BY m.timestamp DESC, m.id DESC;\x00" + dc_sqlite3_prepare( + context, + &mut context.sql.lock().unwrap(), + b"SELECT m.id FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.state=10 AND m.hidden=0 AND c.blocked=2 ORDER BY m.timestamp DESC, m.id DESC;\x00" as *const u8 as *const libc::c_char); /* we have an index over the state-column, this should be sufficient as there are typically only few fresh messages */ if !(sqlite3_step(stmt) != 100i32) { diff --git a/src/dc_configure.rs b/src/dc_configure.rs index 0a7a05da9..a7815cb19 100644 --- a/src/dc_configure.rs +++ b/src/dc_configure.rs @@ -72,7 +72,9 @@ pub unsafe fn dc_configure(mut context: &dc_context_t) { dc_job_add(context, 900i32, 0i32, 0 as *const libc::c_char, 0i32); } pub unsafe fn dc_has_ongoing(mut context: &dc_context_t) -> libc::c_int { - return if 0 != (*context).ongoing_running || (*context).shall_stop_ongoing == 0i32 { + return if 0 != context.ongoing_running + || *context.shall_stop_ongoing.clone().read().unwrap() == 0 + { 1i32 } else { 0i32 @@ -81,6 +83,7 @@ pub unsafe fn dc_has_ongoing(mut context: &dc_context_t) -> libc::c_int { pub unsafe fn dc_is_configured(mut context: &dc_context_t) -> libc::c_int { return if 0 != dc_sqlite3_get_config_int( + context, &mut context.sql.lock().unwrap(), b"configured\x00" as *const u8 as *const libc::c_char, 0i32, @@ -90,14 +93,14 @@ pub unsafe fn dc_is_configured(mut context: &dc_context_t) -> libc::c_int { 0i32 }; } -pub unsafe fn dc_stop_ongoing_process(mut context: &dc_context_t) { - if 0 != (*context).ongoing_running && (*context).shall_stop_ongoing == 0i32 { +pub unsafe fn dc_stop_ongoing_process(context: &dc_context_t) { + if 0 != context.ongoing_running && *context.shall_stop_ongoing.clone().read().unwrap() == 0 { dc_log_info( context, 0i32, b"Signaling the ongoing process to stop ASAP.\x00" as *const u8 as *const libc::c_char, ); - (*context).shall_stop_ongoing = 1i32 + *context.shall_stop_ongoing.clone().write().unwrap() = 1; } else { dc_log_info( context, @@ -133,17 +136,36 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut dc_imap_disconnect(context, &mut context.inbox.clone().lock().unwrap()); dc_imap_disconnect( context, - &mut context.sentbox_thread.imap.clone().lock().unwrap(), + &mut context + .sentbox_thread + .clone() + .lock() + .unwrap() + .imap + .clone() + .lock() + .unwrap(), ); dc_imap_disconnect( context, - &mut context.mvbox_thread.imap.clone().lock().unwrap(), + &mut context + .mvbox_thread + .clone() + .lock() + .unwrap() + .imap + .clone() + .lock() + .unwrap(), ); dc_smtp_disconnect(&mut context.smtp.clone().lock().unwrap()); context.smtp.clone().lock().unwrap().log_connect_errors = 1i32; context.inbox.clone().lock().unwrap().log_connect_errors = 1i32; context .sentbox_thread + .clone() + .lock() + .unwrap() .imap .clone() .lock() @@ -151,6 +173,9 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut .log_connect_errors = 1i32; context .mvbox_thread + .clone() + .lock() + .unwrap() .imap .clone() .lock() @@ -161,7 +186,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut 0i32, b"Configure ...\x00" as *const u8 as *const libc::c_char, ); - if !(0 != context.shall_stop_ongoing) { + if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { (context.cb)( context, Event::CONFIGURE_PROGRESS, @@ -176,6 +201,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut ); param = dc_loginparam_new(); dc_loginparam_read( + context, param, &mut context.sql.lock().unwrap(), b"\x00" as *const u8 as *const libc::c_char, @@ -192,7 +218,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut // the used oauth2 addr may differ, check this. // if dc_get_oauth2_addr() is not available in the oauth2 implementation, // just use the given one. - if 0 != context.shall_stop_ongoing { + if 0 != *context.shall_stop_ongoing.clone().read().unwrap() { current_block = 2927484062889439186; } else { (context.cb)( @@ -219,7 +245,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut (*param).addr, ); } - if 0 != context.shall_stop_ongoing { + if 0 != *context.shall_stop_ongoing.clone().read().unwrap() { current_block = 2927484062889439186; } else { (context.cb)( @@ -258,7 +284,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut if (*param).mail_pw.is_null() { (*param).mail_pw = dc_strdup(0 as *const libc::c_char) } - if !(0 != context.shall_stop_ongoing) { + if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { (context.cb)( context, Event::CONFIGURE_PROGRESS, @@ -299,7 +325,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut param_autoconfig = moz_autoconfigure(context, url, param); free(url as *mut libc::c_void); - if 0 != context.shall_stop_ongoing { + if 0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() + { current_block = 2927484062889439186; } else { (context.cb)( @@ -337,7 +368,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut param_autoconfig = moz_autoconfigure(context, url_0, param); free(url_0 as *mut libc::c_void); - if 0 != context.shall_stop_ongoing { + if 0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() + { current_block = 2927484062889439186; } else { (context.cb)( @@ -399,7 +435,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut context, url_1, param, ); free(url_1 as *mut libc::c_void); - if 0 != context.shall_stop_ongoing { + if 0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() + { current_block = 2927484062889439186; break; @@ -442,8 +483,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut free( url_2 as *mut libc::c_void, ); - if 0 != context + if 0 != *context .shall_stop_ongoing + .clone() + .read() + .unwrap() { current_block = 2927484062889439186; @@ -500,8 +544,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut free(url_3 as *mut libc::c_void); - if 0 != context + if 0 != *context .shall_stop_ongoing + .clone() + .read() + .unwrap() { current_block = @@ -562,7 +609,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut *mut libc::c_void); if 0 != - context.shall_stop_ongoing + *context.shall_stop_ongoing.clone().read().unwrap() { current_block = @@ -787,7 +834,13 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut b"Account settings incomplete.\x00" as *const u8 as *const libc::c_char, ); - } else if !(0 != context.shall_stop_ongoing) { + } else if !(0 + != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap()) + { (context.cb)( context, Event::CONFIGURE_PROGRESS, @@ -832,7 +885,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut break; } // probe STARTTLS/993 - if 0 != context.shall_stop_ongoing { + if 0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() + { current_block = 2927484062889439186; break; } @@ -876,7 +934,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut break; } // probe STARTTLS/143 - if 0 != context.shall_stop_ongoing { + if 0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() + { current_block = 2927484062889439186; break; } @@ -922,7 +985,12 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut break; } // next probe round with only the localpart of the email-address as the loginname - if 0 != context.shall_stop_ongoing { + if 0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() + { current_block = 2927484062889439186; break; } @@ -963,7 +1031,13 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut 2927484062889439186 => {} _ => { imap_connected_here = 1i32; - if !(0 != context.shall_stop_ongoing) { + if !(0 + != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap()) + { (context.cb)( context, Event::CONFIGURE_PROGRESS, @@ -979,6 +1053,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut ); /* try to connect to SMTP - if we did not got an autoconfig, the first try was SSL-465 and we do a second try with STARTTLS-587 */ if 0 == dc_smtp_connect( + context, &mut context .smtp .clone() @@ -990,7 +1065,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut current_block = 2927484062889439186; } else if 0 - != context.shall_stop_ongoing + != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap() { current_block = 2927484062889439186; @@ -1029,6 +1108,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut ); free(r_3 as *mut libc::c_void); if 0 == dc_smtp_connect( + context, &mut context .smtp .clone() @@ -1036,8 +1116,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut .unwrap(), param, ) { - if 0 != context + if 0 != *context .shall_stop_ongoing + .clone() + .read() + .unwrap() { current_block = 2927484062889439186; @@ -1087,6 +1170,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut as *mut libc::c_void); if 0 == dc_smtp_connect( + context, &mut context .smtp .clone() @@ -1116,8 +1200,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut _ => { smtp_connected_here = 1i32; if !(0 - != context - .shall_stop_ongoing) + != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap()) { (context.cb)(context, Event::CONFIGURE_PROGRESS, @@ -1143,7 +1230,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut = if 0 != - dc_sqlite3_get_config_int(&mut context.sql.lock().unwrap(), + dc_sqlite3_get_config_int(context, &mut context.sql.lock().unwrap(), b"mvbox_watch\x00" as *const u8 @@ -1153,7 +1240,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut || 0 != - dc_sqlite3_get_config_int(&mut context.sql.lock().unwrap(), + dc_sqlite3_get_config_int(context, &mut context.sql.lock().unwrap(), b"mvbox_move\x00" as *const u8 @@ -1175,8 +1262,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut flags, ); if !(0 - != context - .shall_stop_ongoing) + != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap()) { (context.cb)(context, Event::CONFIGURE_PROGRESS, @@ -1198,22 +1288,25 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut 0i32 as uintptr_t); - dc_loginparam_write(param, + dc_loginparam_write(context, param, &mut context.sql.lock().unwrap(), b"configured_\x00" as *const u8 as *const libc::c_char); - dc_sqlite3_set_config_int(&mut context.sql.lock().unwrap(), + dc_sqlite3_set_config_int(context, &mut context.sql.lock().unwrap(), b"configured\x00" as *const u8 as *const libc::c_char, 1i32); - if !(0 != context - .shall_stop_ongoing) + if !(0 != *context + .shall_stop_ongoing + .clone() + .read() + .unwrap()) { (context.cb)(context, Event::CONFIGURE_PROGRESS, @@ -1246,7 +1339,7 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut *const libc::c_char); if !(0 != - context.shall_stop_ongoing) + *context.shall_stop_ongoing.clone().read().unwrap()) { (context.cb)(context, Event::CONFIGURE_PROGRESS, @@ -1311,9 +1404,11 @@ pub unsafe fn dc_job_do_DC_JOB_CONFIGURE_IMAP(context: &dc_context_t, _job: *mut } pub unsafe fn dc_free_ongoing(mut context: &dc_context_t) { - context.ongoing_running = 0i32; - context.shall_stop_ongoing = 1i32; + // FIXME + // context.ongoing_running = 0i32; + *context.shall_stop_ongoing.clone().write().unwrap() = 1; } + pub unsafe fn dc_configure_folders( context: &dc_context_t, imap: &mut dc_imap_t, @@ -1409,6 +1504,7 @@ pub unsafe fn dc_configure_folders( mailimap_subscribe((*imap).etpan, mvbox_folder); } dc_sqlite3_set_config_int( + context, &mut context.sql.lock().unwrap(), b"folders_configured\x00" as *const u8 as *const libc::c_char, 3i32, @@ -2067,10 +2163,12 @@ pub unsafe fn dc_alloc_ongoing(context: &dc_context_t) -> libc::c_int { ); return 0i32; } - context.ongoing_running = 1i32; - context.shall_stop_ongoing = 0i32; + // FIXME + // context.ongoing_running = 1i32; + *context.shall_stop_ongoing.clone().write().unwrap() = 0; return 1i32; } + pub unsafe fn dc_connect_to_configured_imap( context: &dc_context_t, imap: &mut dc_imap_t, @@ -2080,6 +2178,7 @@ pub unsafe fn dc_connect_to_configured_imap( if 0 != dc_imap_is_connected(imap) { ret_connected = 1i32 } else if dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"configured\x00" as *const u8 as *const libc::c_char, 0i32, @@ -2092,6 +2191,7 @@ pub unsafe fn dc_connect_to_configured_imap( ); } else { dc_loginparam_read( + context, param, &mut context.sql.clone().lock().unwrap(), b"configured_\x00" as *const u8 as *const libc::c_char, diff --git a/src/dc_contact.rs b/src/dc_contact.rs index 9635dd78e..4f2186173 100644 --- a/src/dc_contact.rs +++ b/src/dc_contact.rs @@ -31,6 +31,7 @@ pub struct dc_contact_t<'a> { pub unsafe fn dc_marknoticed_contact(context: &dc_context_t, contact_id: uint32_t) { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET state=13 WHERE from_id=? AND state=10;\x00" as *const u8 as *const libc::c_char, @@ -75,6 +76,7 @@ pub unsafe fn dc_lookup_contact_id_by_addr( if !(addr.is_null() || *addr.offset(0isize) as libc::c_int == 0i32) { addr_normalized = dc_addr_normalize(addr); addr_self = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -83,7 +85,8 @@ pub unsafe fn dc_lookup_contact_id_by_addr( contact_id = 1i32 } else { stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.clone().lock().unwrap(), b"SELECT id FROM contacts WHERE addr=?1 COLLATE NOCASE AND id>?2 AND origin>=?3 AND blocked=0;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text( @@ -165,6 +168,7 @@ pub unsafe fn dc_block_contact( ) && (*contact).blocked != new_blocking { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"UPDATE contacts SET blocked=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, @@ -177,7 +181,8 @@ pub unsafe fn dc_block_contact( sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.clone().lock().unwrap(), b"UPDATE chats SET blocked=? WHERE type=? AND id IN (SELECT chat_id FROM chats_contacts WHERE contact_id=?);\x00" as *const u8 as *const libc::c_char); @@ -283,9 +288,9 @@ pub unsafe fn dc_contact_empty(mut contact: *mut dc_contact_t) { /* contacts with at least this origin value are verified and known not to be spam */ /* contacts with at least this origin value start a new "normal" chat, defaults to off */ pub unsafe fn dc_contact_load_from_db( - mut contact: *mut dc_contact_t, - mut sql: &mut dc_sqlite3_t, - mut contact_id: uint32_t, + contact: *mut dc_contact_t, + sql: &mut dc_sqlite3_t, + contact_id: uint32_t, ) -> libc::c_int { let mut current_block: u64; let mut success: libc::c_int = 0i32; @@ -296,6 +301,7 @@ pub unsafe fn dc_contact_load_from_db( (*contact).id = contact_id; (*contact).name = dc_stock_str((*contact).context, 2i32); (*contact).addr = dc_sqlite3_get_config( + (*contact).context, sql, b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -303,7 +309,8 @@ pub unsafe fn dc_contact_load_from_db( current_block = 5143058163439228106; } else { stmt = - dc_sqlite3_prepare(sql, + dc_sqlite3_prepare( + (*contact).context,sql, b"SELECT c.name, c.addr, c.origin, c.blocked, c.authname FROM contacts c WHERE c.id=?;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, contact_id as libc::c_int); @@ -369,6 +376,7 @@ pub unsafe fn dc_add_or_lookup_contact( if !(addr__.is_null() || origin <= 0i32) { addr = dc_addr_normalize(addr__); addr_self = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -389,7 +397,8 @@ pub unsafe fn dc_add_or_lookup_contact( ); } else { stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.clone().lock().unwrap(), b"SELECT id, name, addr, origin, authname FROM contacts WHERE addr=? COLLATE NOCASE;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, addr as *const libc::c_char, -1i32, None); @@ -426,6 +435,7 @@ pub unsafe fn dc_add_or_lookup_contact( || origin > row_origin { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"UPDATE contacts SET name=?, addr=?, origin=?, authname=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, @@ -470,7 +480,8 @@ pub unsafe fn dc_add_or_lookup_contact( stmt = 0 as *mut sqlite3_stmt; if 0 != update_name { stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.clone().lock().unwrap(), b"UPDATE chats SET name=? WHERE type=? AND id IN(SELECT chat_id FROM chats_contacts WHERE contact_id=?);\x00" as *const u8 as *const libc::c_char); @@ -485,6 +496,7 @@ pub unsafe fn dc_add_or_lookup_contact( sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"INSERT INTO contacts (name, addr, origin) VALUES(?, ?, ?);\x00" as *const u8 as *const libc::c_char, @@ -504,6 +516,7 @@ pub unsafe fn dc_add_or_lookup_contact( sqlite3_bind_int(stmt, 3i32, origin); if sqlite3_step(stmt) == 101i32 { row_id = dc_sqlite3_get_rowid( + context, &mut context.sql.clone().lock().unwrap(), b"contacts\x00" as *const u8 as *const libc::c_char, b"addr\x00" as *const u8 as *const libc::c_char, @@ -616,6 +629,7 @@ pub unsafe fn dc_get_contacts( let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; self_addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -633,7 +647,8 @@ pub unsafe fn dc_get_contacts( current_block = 7597307149762829253; } else { stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.clone().lock().unwrap(), b"SELECT c.id FROM contacts c LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE c.addr!=?1 AND c.id>?2 AND c.origin>=?3 AND c.blocked=0 AND (c.name LIKE ?4 OR c.addr LIKE ?5) AND (1=?6 OR LENGTH(ps.verified_key_fingerprint)!=0) ORDER BY LOWER(c.name||c.addr),c.id;\x00" as *const u8 as *const libc::c_char); @@ -652,6 +667,7 @@ pub unsafe fn dc_get_contacts( }, ); self_name = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"displayname\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -668,7 +684,8 @@ pub unsafe fn dc_get_contacts( } } else { stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), + dc_sqlite3_prepare( + context,&mut context.sql.clone().lock().unwrap(), b"SELECT id FROM contacts WHERE addr!=?1 AND id>?2 AND origin>=?3 AND blocked=0 ORDER BY LOWER(name||addr),id;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, self_addr, -1i32, None); @@ -702,6 +719,7 @@ pub unsafe fn dc_get_blocked_cnt(context: &dc_context_t) -> libc::c_int { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM contacts WHERE id>? AND blocked!=0\x00" as *const u8 as *const libc::c_char, @@ -720,6 +738,7 @@ pub unsafe fn dc_get_blocked_contacts(mut context: &dc_context_t) -> *mut dc_arr let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM contacts WHERE id>? AND blocked!=0 ORDER BY LOWER(name||addr),id;\x00" as *const u8 as *const libc::c_char, @@ -771,11 +790,13 @@ pub unsafe fn dc_get_contact_encrinfo( (*contact).addr, ); dc_loginparam_read( + context, loginparam, &mut context.sql.clone().lock().unwrap(), b"configured_\x00" as *const u8 as *const libc::c_char, ); dc_key_load_self_public( + context, self_key, (*loginparam).addr, &mut context.sql.clone().lock().unwrap(), @@ -794,6 +815,7 @@ pub unsafe fn dc_get_contact_encrinfo( if (*self_key).binary.is_null() { dc_ensure_secret_key_exists(context); dc_key_load_self_public( + context, self_key, (*loginparam).addr, &mut context.sql.clone().lock().unwrap(), @@ -804,11 +826,11 @@ pub unsafe fn dc_get_contact_encrinfo( dc_strbuilder_cat(&mut ret, p); free(p as *mut libc::c_void); dc_strbuilder_cat(&mut ret, b":\x00" as *const u8 as *const libc::c_char); - fingerprint_self = dc_key_get_formatted_fingerprint(self_key); + fingerprint_self = dc_key_get_formatted_fingerprint(context, self_key); fingerprint_other_verified = - dc_key_get_formatted_fingerprint(dc_apeerstate_peek_key(peerstate, 2i32)); + dc_key_get_formatted_fingerprint(context, dc_apeerstate_peek_key(peerstate, 2i32)); fingerprint_other_unverified = - dc_key_get_formatted_fingerprint(dc_apeerstate_peek_key(peerstate, 0i32)); + dc_key_get_formatted_fingerprint(context, dc_apeerstate_peek_key(peerstate, 0i32)); if strcmp((*loginparam).addr, (*peerstate).addr) < 0i32 { cat_fingerprint( &mut ret, @@ -900,6 +922,7 @@ pub unsafe fn dc_delete_contact( let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; if !contact_id <= 9i32 as libc::c_uint { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM chats_contacts WHERE contact_id=?;\x00" as *const u8 as *const libc::c_char, @@ -909,6 +932,7 @@ pub unsafe fn dc_delete_contact( sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM msgs WHERE from_id=? OR to_id=?;\x00" as *const u8 as *const libc::c_char, @@ -919,6 +943,7 @@ pub unsafe fn dc_delete_contact( sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"DELETE FROM contacts WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1042,11 +1067,11 @@ pub unsafe fn dc_contact_is_blocked(mut contact: *const dc_contact_t) -> libc::c return (*contact).blocked; } pub unsafe fn dc_contact_is_verified(mut contact: *mut dc_contact_t) -> libc::c_int { - return dc_contact_is_verified_ex(contact, 0 as *const dc_apeerstate_t); + return dc_contact_is_verified_ex(contact, 0 as *mut dc_apeerstate_t); } pub unsafe fn dc_contact_is_verified_ex<'a>( contact: *mut dc_contact_t<'a>, - peerstate: *const dc_apeerstate_t<'a>, + mut peerstate: *mut dc_apeerstate_t<'a>, ) -> libc::c_int { let mut current_block: u64; let mut contact_verified: libc::c_int = 0i32; @@ -1108,6 +1133,7 @@ pub unsafe fn dc_addr_equals_self( if !addr.is_null() { normalized_addr = dc_addr_normalize(addr); self_addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -1155,6 +1181,7 @@ pub unsafe fn dc_get_real_contact_cnt(mut context: &dc_context_t) -> size_t { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; if !context.sql.clone().lock().unwrap().cobj.is_null() { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM contacts WHERE id>?;\x00" as *const u8 as *const libc::c_char, ); @@ -1203,6 +1230,7 @@ pub unsafe fn dc_real_contact_exists( let mut ret: libc::c_int = 0i32; if !(context.sql.clone().lock().unwrap().cobj.is_null() || contact_id <= 9i32 as libc::c_uint) { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM contacts WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1220,6 +1248,7 @@ pub unsafe fn dc_scaleup_contact_origin( mut origin: libc::c_int, ) { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"UPDATE contacts SET origin=? WHERE id=? AND origin>, pub perform_inbox_jobs_needed: Arc>, pub probe_imap_network: Arc>, - pub sentbox_thread: dc_jobthread_t, - pub mvbox_thread: dc_jobthread_t, + pub sentbox_thread: Arc>, + pub mvbox_thread: Arc>, pub smtp: Arc>, pub smtp_state: Arc<(Mutex, Condvar)>, pub oauth2_critical: Arc>, pub cb: dc_callback_t, pub os_name: *mut libc::c_char, pub cmdline_sel_chat_id: u32, - pub bob_expects: i32, - pub bobs_status: i32, - pub bobs_qr_scan: Arc>, - pub last_smeared_timestamp: Arc>>, + pub bob: Arc>, + pub last_smeared_timestamp: Arc>, pub ongoing_running: i32, - pub shall_stop_ongoing: i32, + pub shall_stop_ongoing: Arc>, +} + +unsafe impl std::marker::Send for dc_context_t {} +unsafe impl std::marker::Sync for dc_context_t {} + +#[derive(Debug)] +pub struct BobStatus { + pub expects: i32, + pub status: i32, + pub qr_scan: *mut dc_lot_t, +} + +impl Default for BobStatus { + fn default() -> Self { + BobStatus { + expects: 0, + status: 0, + qr_scan: std::ptr::null_mut(), + } + } } #[derive(Default, Debug)] @@ -93,19 +110,17 @@ pub fn dc_context_new( })), userdata, cb, - os_name: dc_strdup_keep_null(os_name), + os_name: unsafe { dc_strdup_keep_null(os_name) }, ongoing_running: 0, - shall_stop_ongoing: 1, + shall_stop_ongoing: Arc::new(RwLock::new(1)), sql: Arc::new(Mutex::new(dc_sqlite3_new())), smtp: Arc::new(Mutex::new(dc_smtp_new())), smtp_state: Arc::new((Mutex::new(Default::default()), Condvar::new())), oauth2_critical: Arc::new(Mutex::new(())), - bob_expects: 0, - bobs_status: 0, - bobs_qr_scan: Arc::new(RwLock::new(std::ptr::null_mut())), - last_smeared_timestamp: Arc::new(RwLock::new(None)), + bob: Arc::new(RwLock::new(Default::default())), + last_smeared_timestamp: Arc::new(RwLock::new(0 as time_t)), cmdline_sel_chat_id: 0, - sentbox_thread: unsafe { + sentbox_thread: Arc::new(Mutex::new(unsafe { dc_jobthread_init( b"SENTBOX\x00" as *const u8 as *const libc::c_char, b"configured_sentbox_folder\x00" as *const u8 as *const libc::c_char, @@ -116,8 +131,8 @@ pub fn dc_context_new( Some(cb_receive_imf), ), ) - }, - mvbox_thread: unsafe { + })), + mvbox_thread: Arc::new(Mutex::new(unsafe { dc_jobthread_init( b"MVBOX\x00" as *const u8 as *const libc::c_char, b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char, @@ -128,7 +143,7 @@ pub fn dc_context_new( Some(cb_receive_imf), ), ) - }, + })), probe_imap_network: Arc::new(RwLock::new(0)), perform_inbox_jobs_needed: Arc::new(RwLock::new(0)), } @@ -231,7 +246,7 @@ unsafe fn cb_get_config( key: *const libc::c_char, def: *const libc::c_char, ) -> *mut libc::c_char { - dc_sqlite3_get_config(&mut context.sql.clone().lock().unwrap(), key, def) + dc_sqlite3_get_config(context, &mut context.sql.clone().lock().unwrap(), key, def) } pub unsafe fn dc_context_unref(context: &mut dc_context_t) { @@ -241,17 +256,33 @@ pub unsafe fn dc_context_unref(context: &mut dc_context_t) { dc_imap_unref(context, &mut context.inbox.clone().lock().unwrap()); dc_imap_unref( context, - &mut context.sentbox_thread.imap.clone().lock().unwrap(), + &mut context + .sentbox_thread + .clone() + .lock() + .unwrap() + .imap + .clone() + .lock() + .unwrap(), ); dc_imap_unref( context, - &mut context.mvbox_thread.imap.clone().lock().unwrap(), + &mut context + .mvbox_thread + .clone() + .lock() + .unwrap() + .imap + .clone() + .lock() + .unwrap(), ); dc_smtp_unref(&mut context.smtp.clone().lock().unwrap()); dc_sqlite3_unref(context, &mut context.sql.clone().lock().unwrap()); - dc_jobthread_exit(&mut context.sentbox_thread); - dc_jobthread_exit(&mut context.mvbox_thread); + dc_jobthread_exit(&mut context.sentbox_thread.clone().lock().unwrap()); + dc_jobthread_exit(&mut context.mvbox_thread.clone().lock().unwrap()); free(context.os_name as *mut libc::c_void); } @@ -260,11 +291,27 @@ pub unsafe fn dc_close(context: &mut dc_context_t) { dc_imap_disconnect(context, &mut context.inbox.clone().lock().unwrap()); dc_imap_disconnect( context, - &mut context.sentbox_thread.imap.clone().lock().unwrap(), + &mut context + .sentbox_thread + .clone() + .lock() + .unwrap() + .imap + .clone() + .lock() + .unwrap(), ); dc_imap_disconnect( context, - &mut context.mvbox_thread.imap.clone().lock().unwrap(), + &mut context + .mvbox_thread + .clone() + .lock() + .unwrap() + .imap + .clone() + .lock() + .unwrap(), ); dc_smtp_disconnect(&mut context.smtp.clone().lock().unwrap()); @@ -471,6 +518,7 @@ pub unsafe fn dc_get_config(context: &dc_context_t, key: *const libc::c_char) -> if strcmp(key, b"selfavatar\x00" as *const u8 as *const libc::c_char) == 0 { let mut rel_path: *mut libc::c_char = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), key, 0 as *const libc::c_char, @@ -481,6 +529,7 @@ pub unsafe fn dc_get_config(context: &dc_context_t, key: *const libc::c_char) -> } } else { value = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), key, 0 as *const libc::c_char, @@ -638,16 +687,19 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char { l = dc_loginparam_new(); l2 = dc_loginparam_new(); dc_loginparam_read( + context, l, &mut context.sql.clone().lock().unwrap(), b"\x00" as *const u8 as *const libc::c_char, ); dc_loginparam_read( + context, l2, &mut context.sql.clone().lock().unwrap(), b"configured_\x00" as *const u8 as *const libc::c_char, ); displayname = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"displayname\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -657,26 +709,31 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char { deaddrop_msgs = dc_get_deaddrop_msg_cnt(context) as libc::c_int; contacts = dc_get_real_contact_cnt(context) as libc::c_int; is_configured = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"configured\x00" as *const u8 as *const libc::c_char, 0, ); dbversion = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"dbversion\x00" as *const u8 as *const libc::c_char, 0, ); e2ee_enabled = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"e2ee_enabled\x00" as *const u8 as *const libc::c_char, 1, ); mdns_enabled = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mdns_enabled\x00" as *const u8 as *const libc::c_char, 1, ); let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM keypairs;\x00" as *const u8 as *const libc::c_char, ); @@ -684,6 +741,7 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char { prv_key_cnt = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM acpeerstates;\x00" as *const u8 as *const libc::c_char, ); @@ -691,47 +749,55 @@ pub unsafe fn dc_get_info(context: &dc_context_t) -> *mut libc::c_char { pub_key_cnt = sqlite3_column_int(stmt, 0); sqlite3_finalize(stmt); if 0 != dc_key_load_self_public( + context, self_public, (*l2).addr, &mut context.sql.clone().lock().unwrap(), ) { - fingerprint_str = dc_key_get_fingerprint(self_public) + fingerprint_str = dc_key_get_fingerprint(context, self_public) } else { fingerprint_str = dc_strdup(b"\x00" as *const u8 as *const libc::c_char) } l_readable_str = dc_loginparam_get_readable(l); l2_readable_str = dc_loginparam_get_readable(l2); inbox_watch = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"inbox_watch\x00" as *const u8 as *const libc::c_char, 1, ); sentbox_watch = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"sentbox_watch\x00" as *const u8 as *const libc::c_char, 1, ); mvbox_watch = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mvbox_watch\x00" as *const u8 as *const libc::c_char, 1, ); mvbox_move = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mvbox_move\x00" as *const u8 as *const libc::c_char, 1, ); folders_configured = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"folders_configured\x00" as *const u8 as *const libc::c_char, 0, ); configured_sentbox_folder = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_sentbox_folder\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, ); configured_mvbox_folder = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, @@ -844,6 +910,7 @@ pub unsafe fn dc_get_fresh_msgs(context: &dc_context_t) -> *mut dc_array_t { let mut stmt = 0 as *mut sqlite3_stmt; if !ret.is_null() { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT m.id FROM msgs m LEFT JOIN contacts ct \ ON m.from_id=ct.id LEFT JOIN chats c ON m.chat_id=c.id WHERE m.state=? \ @@ -889,6 +956,7 @@ pub unsafe fn dc_search_msgs( strLikeBeg = dc_mprintf(b"%s%%\x00" as *const u8 as *const libc::c_char, real_query); if 0 != chat_id { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN contacts ct ON m.from_id=ct.id WHERE m.chat_id=? \ AND m.hidden=0 \ @@ -901,6 +969,7 @@ pub unsafe fn dc_search_msgs( } else { let mut show_deaddrop = 0; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT m.id, m.timestamp FROM msgs m LEFT JOIN contacts ct ON m.from_id=ct.id \ LEFT JOIN chats c ON m.chat_id=c.id WHERE m.chat_id>9 AND m.hidden=0 \ @@ -958,6 +1027,7 @@ pub unsafe fn dc_is_sentbox( folder_name: *const libc::c_char, ) -> libc::c_int { let mut sentbox_name = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_sentbox_folder\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -976,6 +1046,7 @@ pub unsafe fn dc_is_sentbox( pub unsafe fn dc_is_mvbox(context: &dc_context_t, folder_name: *const libc::c_char) -> libc::c_int { let mut mvbox_name = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, diff --git a/src/dc_e2ee.rs b/src/dc_e2ee.rs index ff2e2f271..a9734ca8a 100644 --- a/src/dc_e2ee.rs +++ b/src/dc_e2ee.rs @@ -74,6 +74,7 @@ pub unsafe fn dc_e2ee_encrypt( /* libEtPan's pgp_encrypt_mime() takes the parent as the new root. We just expect the root as being given to this function. */ (*autocryptheader).prefer_encrypt = 0i32; if 0 != dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"e2ee_enabled\x00" as *const u8 as *const libc::c_char, 1i32, @@ -81,6 +82,7 @@ pub unsafe fn dc_e2ee_encrypt( (*autocryptheader).prefer_encrypt = 1i32 } (*autocryptheader).addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -137,6 +139,7 @@ pub unsafe fn dc_e2ee_encrypt( if 0 != do_encrypt { dc_keyring_add(keyring, (*autocryptheader).public_key); if 0 == dc_key_load_self_private( + context, sign_key, (*autocryptheader).addr, &mut context.sql.clone().lock().unwrap(), @@ -516,6 +519,7 @@ unsafe fn load_or_generate_self_public_key( let mut key_creation_here: libc::c_int = 0i32; if !public_key.is_null() { if 0 == dc_key_load_self_public( + context, public_key, self_addr, &mut context.sql.clone().lock().unwrap(), @@ -574,6 +578,7 @@ unsafe fn load_or_generate_self_public_key( current_block = 10496152961502316708; } else if 0 == dc_key_save_self_keypair( + context, public_key, private_key, self_addr, @@ -699,6 +704,7 @@ pub unsafe fn dc_e2ee_decrypt( } /* load private key for decryption */ self_addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -706,6 +712,7 @@ pub unsafe fn dc_e2ee_decrypt( if !self_addr.is_null() { if !(0 == dc_keyring_load_self_private_for_decrypting( + context, private_keyring, self_addr, &mut context.sql.clone().lock().unwrap(), @@ -1218,6 +1225,7 @@ pub unsafe fn dc_ensure_secret_key_exists(mut context: &dc_context_t) -> libc::c let mut self_addr: *mut libc::c_char = 0 as *mut libc::c_char; if !public_key.is_null() { self_addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, diff --git a/src/dc_imap.rs b/src/dc_imap.rs index 83cbb3802..a547c09a0 100644 --- a/src/dc_imap.rs +++ b/src/dc_imap.rs @@ -1250,7 +1250,6 @@ unsafe fn fake_idle(context: &dc_context_t, imap: &mut dc_imap_t) { }) as time_t; // FIXME // pthread_mutex_lock(&mut imap.watch_condmutex); - let mut r: libc::c_int = 0; let mut wakeup_at: timespec = timespec { tv_sec: 0, tv_nsec: 0, @@ -1746,7 +1745,7 @@ pub unsafe fn dc_imap_delete_msg( imap: &mut dc_imap_t, rfc724_mid: *const libc::c_char, folder: *const libc::c_char, - server_uid: uint32_t, + mut server_uid: uint32_t, ) -> libc::c_int { let mut success: libc::c_int = 0; let mut r: libc::c_int = 0; diff --git a/src/dc_imex.rs b/src/dc_imex.rs index c70ab7eda..4e84871af 100644 --- a/src/dc_imex.rs +++ b/src/dc_imex.rs @@ -93,6 +93,7 @@ pub unsafe fn dc_imex_has_backup( let mut sql = dc_sqlite3_new(); if 0 != dc_sqlite3_open(context, &mut sql, curr_pathNfilename, 0x1i32) { let mut curr_backup_time: time_t = dc_sqlite3_get_config_int( + context, &mut sql, b"backup_time\x00" as *const u8 as *const libc::c_char, 0i32, @@ -130,6 +131,7 @@ pub unsafe fn dc_check_password( let mut success: libc::c_int = 0i32; dc_loginparam_read( + context, loginparam, &mut context.sql.clone().lock().unwrap(), b"configured_\x00" as *const u8 as *const libc::c_char, @@ -163,11 +165,11 @@ pub unsafe fn dc_initiate_key_transfer(mut context: &dc_context_t) -> *mut libc: setup_code = dc_create_setup_code(context); if !setup_code.is_null() { /* this may require a keypair to be created. this may take a second ... */ - if !(0 != context.shall_stop_ongoing) { + if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { setup_file_content = dc_render_setup_file(context, setup_code); if !setup_file_content.is_null() { /* encrypting may also take a while ... */ - if !(0 != context.shall_stop_ongoing) { + if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { setup_file_name = dc_get_fine_pathNfilename( context, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, @@ -194,7 +196,7 @@ pub unsafe fn dc_initiate_key_transfer(mut context: &dc_context_t) -> *mut libc: ); dc_param_set_int((*msg).param, 'S' as i32, 6i32); dc_param_set_int((*msg).param, 'u' as i32, 2i32); - if !(0 != context.shall_stop_ongoing) { + if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { msg_id = dc_send_msg(context, chat_id, msg); if !(msg_id == 0i32 as libc::c_uint) { dc_msg_unref(msg); @@ -206,7 +208,8 @@ pub unsafe fn dc_initiate_key_transfer(mut context: &dc_context_t) -> *mut libc: as *const libc::c_char, ); loop { - if 0 != context.shall_stop_ongoing { + if 0 != *context.shall_stop_ongoing.clone().read().unwrap() + { current_block = 6116957410927263949; break; } @@ -265,16 +268,19 @@ pub unsafe extern "C" fn dc_render_setup_file( /* create the payload */ if !(0 == dc_ensure_secret_key_exists(context)) { self_addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); dc_key_load_self_private( + context, curr_private_key, self_addr, &mut context.sql.clone().lock().unwrap(), ); let mut e2ee_enabled: libc::c_int = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"e2ee_enabled\x00" as *const u8 as *const libc::c_char, 1i32, @@ -492,6 +498,7 @@ unsafe fn set_self_key( ); } else { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"DELETE FROM keypairs WHERE public_key=? OR private_key=?;\x00" as *const u8 as *const libc::c_char, @@ -509,16 +516,19 @@ unsafe fn set_self_key( stmt = 0 as *mut sqlite3_stmt; if 0 != set_default { dc_sqlite3_execute( + context, &mut context.sql.clone().lock().unwrap(), b"UPDATE keypairs SET is_default=0;\x00" as *const u8 as *const libc::c_char, ); } self_addr = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); if 0 == dc_key_save_self_keypair( + context, public_key, private_key, self_addr, @@ -538,6 +548,7 @@ unsafe fn set_self_key( ) == 0i32 { dc_sqlite3_set_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"e2ee_enabled\x00" as *const u8 as *const libc::c_char, 0i32, @@ -548,6 +559,7 @@ unsafe fn set_self_key( ) == 0i32 { dc_sqlite3_set_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"e2ee_enabled\x00" as *const u8 as *const libc::c_char, 1i32, @@ -974,6 +986,7 @@ unsafe fn import_backup( )) { stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM backup_blobs;\x00" as *const u8 as *const libc::c_char, ); @@ -982,6 +995,7 @@ unsafe fn import_backup( sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT file_name, file_content FROM backup_blobs ORDER BY id;\x00" as *const u8 as *const libc::c_char, @@ -991,7 +1005,7 @@ unsafe fn import_backup( current_block = 10891380440665537214; break; } - if 0 != context.shall_stop_ongoing { + if 0 != *context.shall_stop_ongoing.clone().read().unwrap() { current_block = 8648553629232744886; break; } @@ -1050,6 +1064,7 @@ unsafe fn import_backup( sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; dc_sqlite3_execute( + context, &mut context.sql.clone().lock().unwrap(), b"DROP TABLE backup_blobs;\x00" as *const u8 as *const libc::c_char, ); @@ -1147,7 +1162,7 @@ unsafe fn export_backup(mut context: &dc_context_t, mut dir: *const libc::c_char b"backup_blobs\x00" as *const u8 as *const libc::c_char, ) { if 0 == - dc_sqlite3_execute(&mut sql, + dc_sqlite3_execute(context, &mut sql, b"CREATE TABLE backup_blobs (id INTEGER PRIMARY KEY, file_name, file_content);\x00" as *const u8 as *const libc::c_char) { @@ -1196,17 +1211,20 @@ unsafe fn export_backup(mut context: &dc_context_t, mut dir: *const libc::c_char current_block = 11487273724841241105; } else { stmt = - dc_sqlite3_prepare(&mut sql, - b"INSERT INTO backup_blobs (file_name, file_content) VALUES (?, ?);\x00" - as *const u8 as - *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut sql, + b"INSERT INTO backup_blobs (file_name, file_content) VALUES (?, ?);\x00" + as *const u8 as + *const libc::c_char); loop { dir_entry = readdir(dir_handle); if dir_entry.is_null() { current_block = 2631791190359682872; break; } - if 0 != context.shall_stop_ongoing { + if 0 != *context.shall_stop_ongoing.clone().read().unwrap() + { delete_dest_file = 1i32; current_block = 11487273724841241105; break; @@ -1315,6 +1333,7 @@ unsafe fn export_backup(mut context: &dc_context_t, mut dir: *const libc::c_char 11487273724841241105 => {} _ => { dc_sqlite3_set_config_int( + context, &mut sql, b"backup_time\x00" as *const u8 as *const libc::c_char, now as int32_t, @@ -1504,6 +1523,7 @@ unsafe fn export_self_keys( let mut public_key: *mut dc_key_t = dc_key_new(); let mut private_key: *mut dc_key_t = dc_key_new(); let stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT id, public_key, private_key, is_default FROM keypairs;\x00" as *const u8 as *const libc::c_char, diff --git a/src/dc_job.rs b/src/dc_job.rs index 2b03f0dfd..523e5b5dd 100644 --- a/src/dc_job.rs +++ b/src/dc_job.rs @@ -65,7 +65,7 @@ pub unsafe fn dc_perform_imap_jobs(context: &dc_context_t) { ); } unsafe fn dc_job_perform( - mut context: &dc_context_t, + context: &dc_context_t, mut thread: libc::c_int, mut probe_network: libc::c_int, ) { @@ -90,15 +90,19 @@ unsafe fn dc_job_perform( if probe_network == 0i32 { select_stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), - b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND desired_timestamp<=? ORDER BY action DESC, added_timestamp;\x00" - as *const u8 as *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND desired_timestamp<=? ORDER BY action DESC, added_timestamp;\x00" + as *const u8 as *const libc::c_char); sqlite3_bind_int64(select_stmt, 1i32, thread as sqlite3_int64); sqlite3_bind_int64(select_stmt, 2i32, time(0 as *mut time_t) as sqlite3_int64); } else { select_stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), - b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND tries>0 ORDER BY desired_timestamp, action DESC;\x00" + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT id, action, foreign_id, param, added_timestamp, desired_timestamp, tries FROM jobs WHERE thread=? AND tries>0 ORDER BY desired_timestamp, action DESC;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int64(select_stmt, 1i32, thread as sqlite3_int64); } @@ -129,8 +133,16 @@ unsafe fn dc_job_perform( dc_job_kill_action(context, job.action); sqlite3_finalize(select_stmt); select_stmt = 0 as *mut sqlite3_stmt; - dc_jobthread_suspend(&mut context.sentbox_thread, 1i32); - dc_jobthread_suspend(&mut context.mvbox_thread, 1i32); + dc_jobthread_suspend( + context, + &mut context.sentbox_thread.clone().lock().unwrap(), + 1, + ); + dc_jobthread_suspend( + context, + &mut context.mvbox_thread.clone().lock().unwrap(), + 1, + ); dc_suspend_smtp_thread(context, 1i32); } let mut tries: libc::c_int = 0i32; @@ -178,8 +190,16 @@ unsafe fn dc_job_perform( tries += 1 } if 900i32 == job.action || 910i32 == job.action { - dc_jobthread_suspend(&mut context.sentbox_thread, 0i32); - dc_jobthread_suspend(&mut context.mvbox_thread, 0i32); + dc_jobthread_suspend( + context, + &mut context.sentbox_thread.clone().lock().unwrap(), + 0, + ); + dc_jobthread_suspend( + context, + &mut context.mvbox_thread.clone().lock().unwrap(), + 0, + ); dc_suspend_smtp_thread(context, 0i32); break; } else if job.try_again == 2i32 { @@ -248,6 +268,7 @@ unsafe fn dc_job_perform( } unsafe fn dc_job_delete(mut context: &dc_context_t, mut job: *const dc_job_t) { let mut delete_stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"DELETE FROM jobs WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -272,6 +293,7 @@ unsafe fn get_backoff_time_offset(mut c_tries: libc::c_int) -> time_t { } unsafe fn dc_job_update(mut context: &dc_context_t, mut job: *const dc_job_t) { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"UPDATE jobs SET desired_timestamp=?, tries=?, param=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, @@ -306,12 +328,16 @@ unsafe extern "C" fn dc_job_do_DC_JOB_SEND(mut context: &dc_context_t, mut job: if 0 == dc_smtp_is_connected(&context.smtp.clone().lock().unwrap()) { let mut loginparam: *mut dc_loginparam_t = dc_loginparam_new(); dc_loginparam_read( + context, loginparam, &mut context.sql.clone().lock().unwrap(), b"configured_\x00" as *const u8 as *const libc::c_char, ); - let mut connected: libc::c_int = - dc_smtp_connect(&mut context.smtp.clone().lock().unwrap(), loginparam); + let mut connected: libc::c_int = dc_smtp_connect( + context, + &mut context.smtp.clone().lock().unwrap(), + loginparam, + ); dc_loginparam_unref(loginparam); if 0 == connected { dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char); @@ -371,6 +397,7 @@ unsafe extern "C" fn dc_job_do_DC_JOB_SEND(mut context: &dc_context_t, mut job: _ => { /* send message */ if 0 == dc_smtp_send_msg( + context, &mut context.smtp.clone().lock().unwrap(), recipients_list, buf as *const libc::c_char, @@ -401,6 +428,7 @@ unsafe extern "C" fn dc_job_do_DC_JOB_SEND(mut context: &dc_context_t, mut job: if 0 != (*job).foreign_id { dc_update_msg_state(context, (*job).foreign_id, 26i32); stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT chat_id FROM msgs WHERE id=?\x00" as *const u8 as *const libc::c_char, @@ -468,6 +496,7 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc 2473556513754201174 => { if !(0 == dc_msg_load_from_db(msg, context, (*job).foreign_id)) { if dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"folders_configured\x00" as *const u8 as *const libc::c_char, 0i32, @@ -480,6 +509,7 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc ); } dest_folder = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -584,6 +614,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP( } if 0 != dc_param_get_int((*job).param, 'M' as i32, 0i32) { if dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"folders_configured\x00" as *const u8 as *const libc::c_char, 0i32, @@ -596,6 +627,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP( ); } dest_folder = dc_sqlite3_get_config( + context, &mut context.sql.clone().lock().unwrap(), b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -658,6 +690,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP( _ => { if 0 != dc_param_get_int((*msg).param, 'r' as i32, 0i32) && 0 != dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mdns_enabled\x00" as *const u8 as *const libc::c_char, 1i32, @@ -715,6 +748,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP( _ => { if 0 != dc_param_get_int((*msg).param, 'r' as i32, 0i32) && 0 != dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mdns_enabled\x00" as *const u8 as *const libc::c_char, 1i32, @@ -894,8 +928,10 @@ pub unsafe fn dc_job_add( return; } stmt = - dc_sqlite3_prepare(&mut context.sql.clone().lock().unwrap(), - b"INSERT INTO jobs (added_timestamp, thread, action, foreign_id, param, desired_timestamp) VALUES (?,?,?,?,?,?);\x00" + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"INSERT INTO jobs (added_timestamp, thread, action, foreign_id, param, desired_timestamp) VALUES (?,?,?,?,?,?);\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int64(stmt, 1i32, timestamp as sqlite3_int64); sqlite3_bind_int(stmt, 2i32, thread); @@ -933,7 +969,7 @@ pub unsafe fn dc_interrupt_smtp_idle(mut context: &dc_context_t) { ); let &(ref lock, ref cvar) = &*context.smtp_state.clone(); - let state = lock.lock().unwrap(); + let mut state = lock.lock().unwrap(); state.perform_jobs_needed = 1; state.idle = true; @@ -1015,6 +1051,7 @@ unsafe fn dc_job_do_DC_JOB_DELETE_MSG_ON_IMAP(mut context: &dc_context_t, mut jo /* delete all pending jobs with the given action */ pub unsafe fn dc_job_kill_action(mut context: &dc_context_t, mut action: libc::c_int) { let mut stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"DELETE FROM jobs WHERE action=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1029,6 +1066,7 @@ pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) { return; } if dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"inbox_watch\x00" as *const u8 as *const libc::c_char, 1i32, @@ -1046,14 +1084,14 @@ pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) { 0i32, b"INBOX-fetch started...\x00" as *const u8 as *const libc::c_char, ); - dc_imap_fetch(&mut context.inbox.clone().lock().unwrap()); + dc_imap_fetch(context, &mut context.inbox.clone().lock().unwrap()); if 0 != context.inbox.clone().lock().unwrap().should_reconnect { dc_log_info( context, 0i32, b"INBOX-fetch aborted, starting over...\x00" as *const u8 as *const libc::c_char, ); - dc_imap_fetch(&mut context.inbox.clone().lock().unwrap()); + dc_imap_fetch(context, &mut context.inbox.clone().lock().unwrap()); } dc_log_info( context, @@ -1062,74 +1100,99 @@ pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) { clock().wrapping_sub(start) as libc::c_double * 1000.0f64 / 1000000i32 as libc::c_double, ); } -pub unsafe fn dc_perform_imap_idle(mut context: &dc_context_t) { +pub unsafe fn dc_perform_imap_idle(context: &dc_context_t) { connect_to_inbox(context); - let l = context.inboxidle_condmutex.lock().unwrap(); - if 0 != context.perform_inbox_jobs_needed { + + if 0 != *context.perform_inbox_jobs_needed.clone().read().unwrap() { dc_log_info( context, 0i32, b"INBOX-IDLE will not be started because of waiting jobs.\x00" as *const u8 as *const libc::c_char, ); - drop(l); return; } - drop(l); dc_log_info( context, 0i32, b"INBOX-IDLE started...\x00" as *const u8 as *const libc::c_char, ); - dc_imap_idle(&mut context.inbox.clone().lock().unwrap()); + dc_imap_idle(context, &mut context.inbox.clone().lock().unwrap()); dc_log_info( context, 0i32, b"INBOX-IDLE ended.\x00" as *const u8 as *const libc::c_char, ); } -pub unsafe fn dc_perform_mvbox_fetch(mut context: &dc_context_t) { + +pub unsafe fn dc_perform_mvbox_fetch(context: &dc_context_t) { let mut use_network: libc::c_int = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mvbox_watch\x00" as *const u8 as *const libc::c_char, 1i32, ); - dc_jobthread_fetch(&mut context.mvbox_thread, use_network); + dc_jobthread_fetch( + context, + &mut context.mvbox_thread.clone().lock().unwrap(), + use_network, + ); } -pub unsafe fn dc_perform_mvbox_idle(mut context: &dc_context_t) { + +pub unsafe fn dc_perform_mvbox_idle(context: &dc_context_t) { let mut use_network: libc::c_int = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"mvbox_watch\x00" as *const u8 as *const libc::c_char, 1i32, ); - dc_jobthread_idle(&mut context.mvbox_thread, use_network); + dc_jobthread_idle( + context, + &mut context.mvbox_thread.clone().lock().unwrap(), + use_network, + ); } -pub unsafe fn dc_interrupt_mvbox_idle(mut context: &dc_context_t) { - dc_jobthread_interrupt_idle(&mut context.mvbox_thread); + +pub unsafe fn dc_interrupt_mvbox_idle(context: &dc_context_t) { + dc_jobthread_interrupt_idle(context, &mut context.mvbox_thread.clone().lock().unwrap()); } -pub unsafe fn dc_perform_sentbox_fetch(mut context: &dc_context_t) { + +pub unsafe fn dc_perform_sentbox_fetch(context: &dc_context_t) { let mut use_network: libc::c_int = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"sentbox_watch\x00" as *const u8 as *const libc::c_char, 1i32, ); - dc_jobthread_fetch(&mut context.sentbox_thread, use_network); + dc_jobthread_fetch( + context, + &mut context.sentbox_thread.clone().lock().unwrap(), + use_network, + ); } -pub unsafe fn dc_perform_sentbox_idle(mut context: &dc_context_t) { + +pub unsafe fn dc_perform_sentbox_idle(context: &dc_context_t) { let mut use_network: libc::c_int = dc_sqlite3_get_config_int( + context, &mut context.sql.clone().lock().unwrap(), b"sentbox_watch\x00" as *const u8 as *const libc::c_char, 1i32, ); - dc_jobthread_idle(&mut context.sentbox_thread, use_network); + dc_jobthread_idle( + context, + &mut context.sentbox_thread.clone().lock().unwrap(), + use_network, + ); } -pub unsafe fn dc_interrupt_sentbox_idle(mut context: &dc_context_t) { - dc_jobthread_interrupt_idle(&mut context.sentbox_thread); + +pub unsafe fn dc_interrupt_sentbox_idle(context: &dc_context_t) { + dc_jobthread_interrupt_idle(context, &mut context.sentbox_thread.clone().lock().unwrap()); } -pub unsafe fn dc_perform_smtp_jobs(mut context: &dc_context_t) { + +pub unsafe fn dc_perform_smtp_jobs(context: &dc_context_t) { let probe_smtp_network = { let &(ref lock, _) = &*context.smtp_state.clone(); - let state = lock.lock().unwrap(); + let mut state = lock.lock().unwrap(); let probe_smtp_network = state.probe_network; state.probe_network = 0; @@ -1162,7 +1225,7 @@ pub unsafe fn dc_perform_smtp_jobs(mut context: &dc_context_t) { { let &(ref lock, _) = &*context.smtp_state.clone(); - let state = lock.lock().unwrap(); + let mut state = lock.lock().unwrap(); state.doing_jobs = 0; } @@ -1186,16 +1249,15 @@ pub unsafe fn dc_perform_smtp_idle(mut context: &dc_context_t) { as *const libc::c_char, ); } else { - let mut r = false; // FIXME: correct time based on // get_next_wakeup_time(context, 5000) + 1; - let dur = Duration::from_milis(5000).unwrap(); + let dur = Duration::from_millis(5000); loop { - let res = cvar.wait_timeout(state, dur); + let res = cvar.wait_timeout(state, dur).unwrap(); state = res.0; - if state.idle == true || res.1 { + if state.idle == true || res.1.timed_out() { // We received the notification and the value has been updated, we can leave. break; } @@ -1211,10 +1273,11 @@ pub unsafe fn dc_perform_smtp_idle(mut context: &dc_context_t) { ); } -unsafe fn get_next_wakeup_time(mut context: &dc_context_t, mut thread: libc::c_int) -> time_t { +unsafe fn get_next_wakeup_time(context: &dc_context_t, thread: libc::c_int) -> time_t { let mut wakeup_time: time_t = 0i32 as time_t; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT MIN(desired_timestamp) FROM jobs WHERE thread=?;\x00" as *const u8 as *const libc::c_char, @@ -1224,30 +1287,35 @@ unsafe fn get_next_wakeup_time(mut context: &dc_context_t, mut thread: libc::c_i wakeup_time = sqlite3_column_int(stmt, 0i32) as time_t } if wakeup_time == 0i32 as libc::c_long { - wakeup_time = time(0 as &time_t) + (10i32 * 60i32) as libc::c_long + wakeup_time = time(0 as *mut time_t) + (10i32 * 60i32) as libc::c_long } sqlite3_finalize(stmt); return wakeup_time; } + pub unsafe fn dc_maybe_network(mut context: &dc_context_t) { - pthread_mutex_lock(&mut context.smtpidle_condmutex); - context.probe_smtp_network = 1i32; - pthread_mutex_unlock(&mut context.smtpidle_condmutex); - let l = context.inboxidle_condmutex.lock().unwrap(); - context.probe_imap_network = 1i32; - drop(l); + { + let &(ref lock, _) = &*context.smtp_state.clone(); + let mut state = lock.lock().unwrap(); + state.probe_network = 1; + + *context.probe_imap_network.clone().write().unwrap() = 1; + } + dc_interrupt_smtp_idle(context); dc_interrupt_imap_idle(context); dc_interrupt_mvbox_idle(context); dc_interrupt_sentbox_idle(context); } + pub unsafe fn dc_job_action_exists( mut context: &dc_context_t, mut action: libc::c_int, ) -> libc::c_int { let mut job_exists: libc::c_int = 0i32; - let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt; + let mut stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( + context, &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM jobs WHERE action=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1257,10 +1325,10 @@ pub unsafe fn dc_job_action_exists( return job_exists; } /* special case for DC_JOB_SEND_MSG_TO_SMTP */ -pub unsafe fn dc_job_send_msg(mut context: &dc_context_t, mut msg_id: uint32_t) -> libc::c_int { +pub unsafe fn dc_job_send_msg(context: &dc_context_t, msg_id: uint32_t) -> libc::c_int { let mut success: libc::c_int = 0i32; - let mut mimefactory: dc_mimefactory_t = dc_mimefactory_t { - from_addr: 0 as &libc::c_char, + let mut mimefactory = dc_mimefactory_t { + from_addr: 0 as *mut libc::c_char, from_displayname: 0 as *mut libc::c_char, selfstatus: 0 as *mut libc::c_char, recipients_names: 0 as *mut clist, @@ -1279,7 +1347,7 @@ pub unsafe fn dc_job_send_msg(mut context: &dc_context_t, mut msg_id: uint32_t) out_gossiped: 0, out_last_added_location_id: 0, error: 0 as *mut libc::c_char, - context: std::ptr::null_mut(), + context, }; dc_mimefactory_init(&mut mimefactory, context); /* load message data */ @@ -1299,7 +1367,7 @@ pub unsafe fn dc_job_send_msg(mut context: &dc_context_t, mut msg_id: uint32_t) || (*mimefactory.msg).type_0 == 50i32 || (*mimefactory.msg).type_0 == 60i32 { - let mut pathNfilename: &libc::c_char = dc_param_get( + let mut pathNfilename = dc_param_get( (*mimefactory.msg).param, 'f' as i32, 0 as *const libc::c_char, diff --git a/src/dc_jobthread.rs b/src/dc_jobthread.rs index f3ae31622..101678c7f 100644 --- a/src/dc_jobthread.rs +++ b/src/dc_jobthread.rs @@ -14,15 +14,10 @@ use crate::x::*; #[repr(C)] pub struct dc_jobthread_t { - // TODO: remove - pub context: *mut dc_context_t, pub name: *mut libc::c_char, pub folder_config_name: *mut libc::c_char, pub imap: Arc>, - pub idle: (Mutex, Condvar), - pub jobs_needed: libc::c_int, - pub suspended: libc::c_int, - pub using_handle: libc::c_int, + pub state: Arc<(Mutex, Condvar)>, } pub unsafe fn dc_jobthread_init( @@ -31,219 +26,243 @@ pub unsafe fn dc_jobthread_init( imap: dc_imap_t, ) -> dc_jobthread_t { dc_jobthread_t { - context: std::ptr::null_mut(), name: dc_strdup(name), folder_config_name: dc_strdup(folder_config_name), - imap: Arc::new(Mutex::New(imap)), - idle: (Mutex::new(false), Condvar::new()), - jobs_needed: 0i32, - suspended: 0i32, - using_handle: 0i32, + imap: Arc::new(Mutex::new(imap)), + state: Arc::new((Mutex::new(Default::default()), Condvar::new())), } } -pub unsafe fn dc_jobthread_exit(mut jobthread: *mut dc_jobthread_t) { - if jobthread.is_null() { - return; - } - - free((*jobthread).name as *mut libc::c_void); - (*jobthread).name = 0 as *mut libc::c_char; - free((*jobthread).folder_config_name as *mut libc::c_void); - (*jobthread).folder_config_name = 0 as *mut libc::c_char; +#[derive(Debug, Default)] +pub struct JobState { + idle: bool, + jobs_needed: i32, + suspended: i32, + using_handle: i32, } -pub unsafe fn dc_jobthread_suspend(mut jobthread: *mut dc_jobthread_t, mut suspend: libc::c_int) { - if jobthread.is_null() { - return; - } +pub unsafe fn dc_jobthread_exit(jobthread: &mut dc_jobthread_t) { + free(jobthread.name as *mut libc::c_void); + jobthread.name = 0 as *mut libc::c_char; + free(jobthread.folder_config_name as *mut libc::c_void); + jobthread.folder_config_name = 0 as *mut libc::c_char; +} + +pub unsafe fn dc_jobthread_suspend( + context: &dc_context_t, + jobthread: &mut dc_jobthread_t, + suspend: libc::c_int, +) { if 0 != suspend { dc_log_info( - (*jobthread).context, + context, 0i32, b"Suspending %s-thread.\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).suspended = 1i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); - dc_jobthread_interrupt_idle(jobthread); + + { + jobthread.state.clone().0.lock().unwrap().suspended = 1; + } + dc_jobthread_interrupt_idle(context, jobthread); loop { - pthread_mutex_lock(&mut (*jobthread).mutex); - if (*jobthread).using_handle == 0i32 { - pthread_mutex_unlock(&mut (*jobthread).mutex); + let using_handle = jobthread.state.clone().0.lock().unwrap().using_handle; + if using_handle == 0 { return; } - pthread_mutex_unlock(&mut (*jobthread).mutex); usleep((300i32 * 1000i32) as useconds_t); } } else { dc_log_info( - (*jobthread).context, + context, 0i32, b"Unsuspending %s-thread.\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).suspended = 0i32; - (*jobthread).idle_condflag = 1i32; - pthread_cond_signal(&mut (*jobthread).idle_cond); - pthread_mutex_unlock(&mut (*jobthread).mutex); - }; -} -pub unsafe extern "C" fn dc_jobthread_interrupt_idle(mut jobthread: *mut dc_jobthread_t) { - if jobthread.is_null() { - return; + + let &(ref lock, ref cvar) = &*jobthread.state.clone(); + let mut state = lock.lock().unwrap(); + + state.suspended = 0; + state.idle = true; + cvar.notify_one(); } - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).jobs_needed = 1i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); +} + +pub unsafe extern "C" fn dc_jobthread_interrupt_idle( + context: &dc_context_t, + jobthread: &mut dc_jobthread_t, +) { + { + jobthread.state.clone().0.lock().unwrap().jobs_needed = 1; + } + dc_log_info( - (*jobthread).context, - 0i32, + context, + 0, b"Interrupting %s-IDLE...\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - if !(*jobthread).imap.is_null() { - dc_imap_interrupt_idle((*jobthread).imap); - } - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).idle_condflag = 1i32; - pthread_cond_signal(&mut (*jobthread).idle_cond); - pthread_mutex_unlock(&mut (*jobthread).mutex); + + dc_imap_interrupt_idle(&mut jobthread.imap.clone().lock().unwrap()); + + let &(ref lock, ref cvar) = &*jobthread.state.clone(); + let mut state = lock.lock().unwrap(); + + state.idle = true; + cvar.notify_one(); } -pub unsafe fn dc_jobthread_fetch(mut jobthread: *mut dc_jobthread_t, mut use_network: libc::c_int) { - let mut start: libc::clock_t = 0; - if jobthread.is_null() { - return; + +pub unsafe fn dc_jobthread_fetch( + context: &dc_context_t, + jobthread: &mut dc_jobthread_t, + use_network: libc::c_int, +) { + let mut start = 0; + + { + let &(ref lock, _) = &*jobthread.state.clone(); + let mut state = lock.lock().unwrap(); + + if 0 != state.suspended { + return; + } + + state.using_handle = 1; } - pthread_mutex_lock(&mut (*jobthread).mutex); - if 0 != (*jobthread).suspended { - pthread_mutex_unlock(&mut (*jobthread).mutex); - return; - } - (*jobthread).using_handle = 1i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); - if !(0 == use_network || (*jobthread).imap.is_null()) { + + if !0 == use_network { start = clock(); - if !(0 == connect_to_imap(jobthread)) { + if !(0 == connect_to_imap(context, jobthread)) { dc_log_info( - (*jobthread).context, - 0i32, + context, + 0, b"%s-fetch started...\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - dc_imap_fetch((*jobthread).imap); - if 0 != (*(*jobthread).imap).should_reconnect { + dc_imap_fetch(context, &mut jobthread.imap.clone().lock().unwrap()); + + if 0 != jobthread.imap.clone().lock().unwrap().should_reconnect { dc_log_info( - (*jobthread).context, + context, 0i32, b"%s-fetch aborted, starting over...\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - dc_imap_fetch((*jobthread).imap); + dc_imap_fetch(context, &mut jobthread.imap.clone().lock().unwrap()); } dc_log_info( - (*jobthread).context, - 0i32, + context, + 0, b"%s-fetch done in %.0f ms.\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, clock().wrapping_sub(start) as libc::c_double * 1000.0f64 / 1000000i32 as libc::c_double, ); } } - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).using_handle = 0i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); + + jobthread.state.clone().0.lock().unwrap().using_handle = 0; } + /* ****************************************************************************** * the typical fetch, idle, interrupt-idle ******************************************************************************/ -unsafe fn connect_to_imap(mut jobthread: *mut dc_jobthread_t) -> libc::c_int { + +unsafe fn connect_to_imap(context: &dc_context_t, jobthread: &mut dc_jobthread_t) -> libc::c_int { let mut ret_connected: libc::c_int = 0i32; let mut mvbox_name: *mut libc::c_char = 0 as *mut libc::c_char; - if 0 != dc_imap_is_connected((*jobthread).imap) { - ret_connected = 1i32 + + if 0 != dc_imap_is_connected(&mut jobthread.imap.clone().lock().unwrap()) { + ret_connected = 1 } else { - ret_connected = dc_connect_to_configured_imap((*jobthread).context, (*jobthread).imap); + ret_connected = + dc_connect_to_configured_imap(context, &mut jobthread.imap.clone().lock().unwrap()); if !(0 == ret_connected) { if dc_sqlite3_get_config_int( - (*(*jobthread).context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"folders_configured\x00" as *const u8 as *const libc::c_char, - 0i32, - ) < 3i32 + 0, + ) < 3 { - dc_configure_folders((*jobthread).context, (*jobthread).imap, 0x1i32); + dc_configure_folders(context, &mut jobthread.imap.clone().lock().unwrap(), 0x1); } mvbox_name = dc_sqlite3_get_config( - (*(*jobthread).context).sql, - (*jobthread).folder_config_name, + context, + &mut context.sql.clone().lock().unwrap(), + jobthread.folder_config_name, 0 as *const libc::c_char, ); if mvbox_name.is_null() { - dc_imap_disconnect((*jobthread).imap); - ret_connected = 0i32 + dc_imap_disconnect(context, &mut jobthread.imap.clone().lock().unwrap()); + ret_connected = 0; } else { - dc_imap_set_watch_folder((*jobthread).imap, mvbox_name); + dc_imap_set_watch_folder(&mut jobthread.imap.clone().lock().unwrap(), mvbox_name); } } } free(mvbox_name as *mut libc::c_void); - return ret_connected; + + ret_connected } -pub unsafe fn dc_jobthread_idle(mut jobthread: *mut dc_jobthread_t, mut use_network: libc::c_int) { - if jobthread.is_null() { - return; - } - pthread_mutex_lock(&mut (*jobthread).mutex); - if 0 != (*jobthread).jobs_needed { - dc_log_info( - (*jobthread).context, - 0i32, - b"%s-IDLE will not be started as it was interrupted while not ideling.\x00" as *const u8 - as *const libc::c_char, - (*jobthread).name, - ); - (*jobthread).jobs_needed = 0i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); - return; - } - if 0 != (*jobthread).suspended { - while (*jobthread).idle_condflag == 0i32 { - pthread_cond_wait(&mut (*jobthread).idle_cond, &mut (*jobthread).mutex); + +pub unsafe fn dc_jobthread_idle( + context: &dc_context_t, + jobthread: &mut dc_jobthread_t, + use_network: libc::c_int, +) { + { + let &(ref lock, ref cvar) = &*jobthread.state.clone(); + let mut state = lock.lock().unwrap(); + + if 0 != state.jobs_needed { + dc_log_info( + context, + 0, + b"%s-IDLE will not be started as it was interrupted while not ideling.\x00" + as *const u8 as *const libc::c_char, + jobthread.name, + ); + state.jobs_needed = 0; + return; } - (*jobthread).idle_condflag = 0i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); - return; - } - (*jobthread).using_handle = 1i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); - if 0 == use_network || (*jobthread).imap.is_null() { - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).using_handle = 0i32; - while (*jobthread).idle_condflag == 0i32 { - pthread_cond_wait(&mut (*jobthread).idle_cond, &mut (*jobthread).mutex); + + if 0 != state.suspended { + while !state.idle { + state = cvar.wait(state).unwrap(); + } + state.idle = false; + return; + } + + state.using_handle = 1; + + if 0 == use_network { + state.using_handle = 0; + + while !state.idle { + state = cvar.wait(state).unwrap(); + } + state.idle = false; + return; } - (*jobthread).idle_condflag = 0i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); - return; } - connect_to_imap(jobthread); + + connect_to_imap(context, jobthread); dc_log_info( - (*jobthread).context, + context, 0i32, b"%s-IDLE started...\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - dc_imap_idle((*jobthread).imap); + dc_imap_idle(context, &mut jobthread.imap.clone().lock().unwrap()); dc_log_info( - (*jobthread).context, + context, 0i32, b"%s-IDLE ended.\x00" as *const u8 as *const libc::c_char, - (*jobthread).name, + jobthread.name, ); - pthread_mutex_lock(&mut (*jobthread).mutex); - (*jobthread).using_handle = 0i32; - pthread_mutex_unlock(&mut (*jobthread).mutex); + + jobthread.state.clone().0.lock().unwrap().using_handle = 0; } diff --git a/src/dc_key.rs b/src/dc_key.rs index c2567de81..a3196629d 100644 --- a/src/dc_key.rs +++ b/src/dc_key.rs @@ -252,24 +252,26 @@ pub unsafe fn dc_key_equals(mut key: *const dc_key_t, mut o: *const dc_key_t) -> } } pub unsafe fn dc_key_save_self_keypair( - mut public_key: *const dc_key_t, - mut private_key: *const dc_key_t, - mut addr: *const libc::c_char, - mut is_default: libc::c_int, - mut sql: &mut dc_sqlite3_t, + context: &dc_context_t, + public_key: *const dc_key_t, + private_key: *const dc_key_t, + addr: *const libc::c_char, + is_default: libc::c_int, + sql: &mut dc_sqlite3_t, ) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; if !(public_key.is_null() || private_key.is_null() || addr.is_null() - || sql.is_null() || (*public_key).binary.is_null() || (*private_key).binary.is_null()) { stmt = - dc_sqlite3_prepare(sql, - b"INSERT INTO keypairs (addr, is_default, public_key, private_key, created) VALUES (?,?,?,?,?);\x00" + dc_sqlite3_prepare( + context, + sql, + b"INSERT INTO keypairs (addr, is_default, public_key, private_key, created) VALUES (?,?,?,?,?);\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, addr, -1i32, None); sqlite3_bind_int(stmt, 2i32, is_default); @@ -290,15 +292,17 @@ pub unsafe fn dc_key_save_self_keypair( return success; } pub unsafe fn dc_key_load_self_public( - mut key: *mut dc_key_t, - mut self_addr: *const libc::c_char, - mut sql: &mut dc_sqlite3_t, + context: &dc_context_t, + key: *mut dc_key_t, + self_addr: *const libc::c_char, + sql: &mut dc_sqlite3_t, ) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(key.is_null() || self_addr.is_null() || sql.is_null()) { + if !(key.is_null() || self_addr.is_null()) { dc_key_empty(key); stmt = dc_sqlite3_prepare( + context, sql, b"SELECT public_key FROM keypairs WHERE addr=? AND is_default=1;\x00" as *const u8 as *const libc::c_char, @@ -313,15 +317,17 @@ pub unsafe fn dc_key_load_self_public( return success; } pub unsafe fn dc_key_load_self_private( - mut key: *mut dc_key_t, - mut self_addr: *const libc::c_char, - mut sql: &mut dc_sqlite3_t, + context: &dc_context_t, + key: *mut dc_key_t, + self_addr: *const libc::c_char, + sql: &mut dc_sqlite3_t, ) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(key.is_null() || self_addr.is_null() || sql.is_null()) { + if !(key.is_null() || self_addr.is_null()) { dc_key_empty(key); stmt = dc_sqlite3_prepare( + context, sql, b"SELECT private_key FROM keypairs WHERE addr=? AND is_default=1;\x00" as *const u8 as *const libc::c_char, @@ -469,7 +475,7 @@ pub unsafe fn dc_key_render_asc_to_file( ) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut file_content: *mut libc::c_char = 0 as *mut libc::c_char; - if !(key.is_null() || file.is_null() || context.is_null()) { + if !(key.is_null() || file.is_null()) { file_content = dc_key_render_asc(key, 0 as *const libc::c_char); if !file_content.is_null() { if 0 == dc_write_file( @@ -546,12 +552,17 @@ pub unsafe fn dc_normalize_fingerprint(mut in_0: *const libc::c_char) -> *mut li } return out.buf; } -pub unsafe fn dc_key_get_fingerprint(mut key: *const dc_key_t) -> *mut libc::c_char { +pub unsafe fn dc_key_get_fingerprint( + context: &dc_context_t, + key: *const dc_key_t, +) -> *mut libc::c_char { let mut fingerprint_buf: *mut uint8_t = 0 as *mut uint8_t; let mut fingerprint_bytes: size_t = 0i32 as size_t; let mut fingerprint_hex: *mut libc::c_char = 0 as *mut libc::c_char; if !key.is_null() { - if !(0 == dc_pgp_calc_fingerprint(key, &mut fingerprint_buf, &mut fingerprint_bytes)) { + if !(0 + == dc_pgp_calc_fingerprint(context, key, &mut fingerprint_buf, &mut fingerprint_bytes)) + { fingerprint_hex = dc_binary_to_uc_hex(fingerprint_buf, fingerprint_bytes) } } @@ -562,8 +573,11 @@ pub unsafe fn dc_key_get_fingerprint(mut key: *const dc_key_t) -> *mut libc::c_c dc_strdup(0 as *const libc::c_char) }; } -pub unsafe fn dc_key_get_formatted_fingerprint(mut key: *const dc_key_t) -> *mut libc::c_char { - let mut rawhex: *mut libc::c_char = dc_key_get_fingerprint(key); +pub unsafe fn dc_key_get_formatted_fingerprint( + context: &dc_context_t, + key: *const dc_key_t, +) -> *mut libc::c_char { + let mut rawhex: *mut libc::c_char = dc_key_get_fingerprint(context, key); let mut formatted: *mut libc::c_char = dc_format_fingerprint(rawhex); free(rawhex as *mut libc::c_void); return formatted; diff --git a/src/dc_keyring.rs b/src/dc_keyring.rs index 50c0c8e94..7a757bfa0 100644 --- a/src/dc_keyring.rs +++ b/src/dc_keyring.rs @@ -1,5 +1,6 @@ use libc; +use crate::dc_context::dc_context_t; use crate::dc_key::*; use crate::dc_sqlite3::*; use crate::types::*; @@ -54,14 +55,16 @@ pub unsafe fn dc_keyring_add(mut keyring: *mut dc_keyring_t, mut to_add: *mut dc (*keyring).count += 1; } pub unsafe fn dc_keyring_load_self_private_for_decrypting( - mut keyring: *mut dc_keyring_t, - mut self_addr: *const libc::c_char, - mut sql: &mut dc_sqlite3_t, + context: &dc_context_t, + keyring: *mut dc_keyring_t, + self_addr: *const libc::c_char, + sql: &mut dc_sqlite3_t, ) -> libc::c_int { - if keyring.is_null() || self_addr.is_null() || sql.is_null() { + if keyring.is_null() || self_addr.is_null() { return 0i32; } let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, sql, b"SELECT private_key FROM keypairs ORDER BY addr=? DESC, is_default DESC;\x00" as *const u8 as *const libc::c_char, diff --git a/src/dc_location.rs b/src/dc_location.rs index f20f9e66a..a55d2892b 100644 --- a/src/dc_location.rs +++ b/src/dc_location.rs @@ -51,16 +51,14 @@ pub unsafe fn dc_send_locations_to_chat( let mut msg: *mut dc_msg_t = 0 as *mut dc_msg_t; let mut stock_str: *mut libc::c_char = 0 as *mut libc::c_char; let mut is_sending_locations_before: libc::c_int = 0i32; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || seconds < 0i32 - || chat_id <= 9i32 as libc::c_uint) - { + if !(seconds < 0i32 || chat_id <= 9i32 as libc::c_uint) { is_sending_locations_before = dc_is_sending_locations_to_chat(context, chat_id); stmt = - dc_sqlite3_prepare((*context).sql, - b"UPDATE chats SET locations_send_begin=?, locations_send_until=? WHERE id=?\x00" - as *const u8 as *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"UPDATE chats SET locations_send_begin=?, locations_send_until=? WHERE id=?\x00" + as *const u8 as *const libc::c_char); sqlite3_bind_int64( stmt, 1i32, @@ -102,7 +100,7 @@ pub unsafe fn dc_send_locations_to_chat( ); dc_add_device_msg(context, chat_id, stock_str); } - ((*context).cb)( + (context.cb)( context, Event::CHAT_MODIFIED, chat_id as uintptr_t, @@ -137,27 +135,28 @@ pub unsafe extern "C" fn dc_is_sending_locations_to_chat( ) -> libc::c_int { let mut is_sending_locations: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - stmt = dc_sqlite3_prepare( - (*context).sql, - b"SELECT id FROM chats WHERE (? OR id=?) AND locations_send_until>?;\x00" - as *const u8 as *const libc::c_char, - ); - sqlite3_bind_int( - stmt, - 1i32, - if chat_id == 0i32 as libc::c_uint { - 1i32 - } else { - 0i32 - }, - ); - sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int); - sqlite3_bind_int64(stmt, 3i32, time(0 as *mut time_t) as sqlite3_int64); - if !(sqlite3_step(stmt) != 100i32) { - is_sending_locations = 1i32 - } + + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT id FROM chats WHERE (? OR id=?) AND locations_send_until>?;\x00" as *const u8 + as *const libc::c_char, + ); + sqlite3_bind_int( + stmt, + 1i32, + if chat_id == 0i32 as libc::c_uint { + 1i32 + } else { + 0i32 + }, + ); + sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int); + sqlite3_bind_int64(stmt, 3i32, time(0 as *mut time_t) as sqlite3_int64); + if !(sqlite3_step(stmt) != 100i32) { + is_sending_locations = 1i32 } + sqlite3_finalize(stmt); return is_sending_locations; } @@ -170,14 +169,12 @@ pub unsafe fn dc_set_location( let mut stmt_chats: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; let mut stmt_insert: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; let mut continue_streaming: libc::c_int = 0i32; - if context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || latitude == 0.0f64 && longitude == 0.0f64 - { + if latitude == 0.0f64 && longitude == 0.0f64 { continue_streaming = 1i32 } else { stmt_chats = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM chats WHERE locations_send_until>?;\x00" as *const u8 as *const libc::c_char, ); @@ -185,9 +182,11 @@ pub unsafe fn dc_set_location( while sqlite3_step(stmt_chats) == 100i32 { let mut chat_id: uint32_t = sqlite3_column_int(stmt_chats, 0i32) as uint32_t; stmt_insert = - dc_sqlite3_prepare((*context).sql, - b"INSERT INTO locations (latitude, longitude, accuracy, timestamp, chat_id, from_id) VALUES (?,?,?,?,?,?);\x00" - as *const u8 as *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"INSERT INTO locations (latitude, longitude, accuracy, timestamp, chat_id, from_id) VALUES (?,?,?,?,?,?);\x00" + as *const u8 as *const libc::c_char); sqlite3_bind_double(stmt_insert, 1i32, latitude); sqlite3_bind_double(stmt_insert, 2i32, longitude); sqlite3_bind_double(stmt_insert, 3i32, accuracy); @@ -198,7 +197,7 @@ pub unsafe fn dc_set_location( continue_streaming = 1i32 } if 0 != continue_streaming { - ((*context).cb)( + (context.cb)( context, Event::LOCATION_CHANGED, 1i32 as uintptr_t, @@ -218,70 +217,71 @@ pub unsafe fn dc_get_locations( mut timestamp_from: time_t, mut timestamp_to: time_t, ) -> *mut dc_array_t { - let mut ret: *mut dc_array_t = dc_array_new_typed(context, 1i32, 500i32 as size_t); + let mut ret: *mut dc_array_t = dc_array_new_typed(1i32, 500i32 as size_t); let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - if timestamp_to == 0i32 as libc::c_long { - timestamp_to = time(0 as *mut time_t) + 10i32 as libc::c_long - } - stmt = dc_sqlite3_prepare( - (*context).sql, - b"SELECT l.id, l.latitude, l.longitude, l.accuracy, l.timestamp, l.independent \ + + if timestamp_to == 0i32 as libc::c_long { + timestamp_to = time(0 as *mut time_t) + 10i32 as libc::c_long + } + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT l.id, l.latitude, l.longitude, l.accuracy, l.timestamp, l.independent \ m.id, l.from_id, l.chat_id, m.txt \ FROM locations l LEFT JOIN msgs m ON l.id=m.location_id WHERE (? OR l.chat_id=?) \ AND (? OR l.from_id=?) \ AND (l.independent=1 OR (l.timestamp>=? AND l.timestamp<=?)) \ ORDER BY l.timestamp DESC, l.id DESC, m.id DESC;\x00" as *const u8 - as *const libc::c_char, - ); - sqlite3_bind_int( - stmt, - 1i32, - if chat_id == 0i32 as libc::c_uint { - 1i32 - } else { - 0i32 - }, - ); - sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int); - sqlite3_bind_int( - stmt, - 3i32, - if contact_id == 0i32 as libc::c_uint { - 1i32 - } else { - 0i32 - }, - ); - sqlite3_bind_int(stmt, 4i32, contact_id as libc::c_int); - sqlite3_bind_int(stmt, 5i32, timestamp_from as libc::c_int); - sqlite3_bind_int(stmt, 6i32, timestamp_to as libc::c_int); - while sqlite3_step(stmt) == 100i32 { - let mut loc: *mut _dc_location = - calloc(1, ::std::mem::size_of::<_dc_location>()) as *mut _dc_location; - if loc.is_null() { - break; - } - (*loc).location_id = sqlite3_column_double(stmt, 0i32) as uint32_t; - (*loc).latitude = sqlite3_column_double(stmt, 1i32); - (*loc).longitude = sqlite3_column_double(stmt, 2i32); - (*loc).accuracy = sqlite3_column_double(stmt, 3i32); - (*loc).timestamp = sqlite3_column_int64(stmt, 4i32) as time_t; - (*loc).independent = sqlite3_column_int(stmt, 5i32) as uint32_t; - (*loc).msg_id = sqlite3_column_int(stmt, 6i32) as uint32_t; - (*loc).contact_id = sqlite3_column_int(stmt, 7i32) as uint32_t; - (*loc).chat_id = sqlite3_column_int(stmt, 8i32) as uint32_t; - - if 0 != (*loc).msg_id { - let mut txt: *const libc::c_char = - sqlite3_column_text(stmt, 9i32) as *const libc::c_char; - if 0 != is_marker(txt) { - (*loc).marker = strdup(txt) - } - } - dc_array_add_ptr(ret, loc as *mut libc::c_void); + as *const libc::c_char, + ); + sqlite3_bind_int( + stmt, + 1i32, + if chat_id == 0i32 as libc::c_uint { + 1i32 + } else { + 0i32 + }, + ); + sqlite3_bind_int(stmt, 2i32, chat_id as libc::c_int); + sqlite3_bind_int( + stmt, + 3i32, + if contact_id == 0i32 as libc::c_uint { + 1i32 + } else { + 0i32 + }, + ); + sqlite3_bind_int(stmt, 4i32, contact_id as libc::c_int); + sqlite3_bind_int(stmt, 5i32, timestamp_from as libc::c_int); + sqlite3_bind_int(stmt, 6i32, timestamp_to as libc::c_int); + while sqlite3_step(stmt) == 100i32 { + let mut loc: *mut _dc_location = + calloc(1, ::std::mem::size_of::<_dc_location>()) as *mut _dc_location; + if loc.is_null() { + break; } + (*loc).location_id = sqlite3_column_double(stmt, 0i32) as uint32_t; + (*loc).latitude = sqlite3_column_double(stmt, 1i32); + (*loc).longitude = sqlite3_column_double(stmt, 2i32); + (*loc).accuracy = sqlite3_column_double(stmt, 3i32); + (*loc).timestamp = sqlite3_column_int64(stmt, 4i32) as time_t; + (*loc).independent = sqlite3_column_int(stmt, 5i32) as uint32_t; + (*loc).msg_id = sqlite3_column_int(stmt, 6i32) as uint32_t; + (*loc).contact_id = sqlite3_column_int(stmt, 7i32) as uint32_t; + (*loc).chat_id = sqlite3_column_int(stmt, 8i32) as uint32_t; + + if 0 != (*loc).msg_id { + let mut txt: *const libc::c_char = + sqlite3_column_text(stmt, 9i32) as *const libc::c_char; + if 0 != is_marker(txt) { + (*loc).marker = strdup(txt) + } + } + dc_array_add_ptr(ret, loc as *mut libc::c_void); } + sqlite3_finalize(stmt); return ret; } @@ -296,19 +296,20 @@ unsafe fn is_marker(mut txt: *const libc::c_char) -> libc::c_int { } pub unsafe fn dc_delete_all_locations(mut context: &dc_context_t) { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - stmt = dc_sqlite3_prepare( - (*context).sql, - b"DELETE FROM locations;\x00" as *const u8 as *const libc::c_char, - ); - sqlite3_step(stmt); - ((*context).cb)( - context, - Event::LOCATION_CHANGED, - 0i32 as uintptr_t, - 0i32 as uintptr_t, - ); - } + + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"DELETE FROM locations;\x00" as *const u8 as *const libc::c_char, + ); + sqlite3_step(stmt); + (context.cb)( + context, + Event::LOCATION_CHANGED, + 0i32 as uintptr_t, + 0i32 as uintptr_t, + ); + sqlite3_finalize(stmt); } pub unsafe fn dc_get_location_kml( @@ -331,30 +332,34 @@ pub unsafe fn dc_get_location_kml( eos: 0 as *mut libc::c_char, }; dc_strbuilder_init(&mut ret, 1000i32); - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - self_addr = dc_sqlite3_get_config( - (*context).sql, - b"configured_addr\x00" as *const u8 as *const libc::c_char, - b"\x00" as *const u8 as *const libc::c_char, - ); - stmt = - dc_sqlite3_prepare((*context).sql, - b"SELECT locations_send_begin, locations_send_until, locations_last_sent FROM chats WHERE id=?;\x00" - as *const u8 as *const libc::c_char); - sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); - if !(sqlite3_step(stmt) != 100i32) { - locations_send_begin = sqlite3_column_int64(stmt, 0i32) as time_t; - locations_send_until = sqlite3_column_int64(stmt, 1i32) as time_t; - locations_last_sent = sqlite3_column_int64(stmt, 2i32) as time_t; - sqlite3_finalize(stmt); - stmt = 0 as *mut sqlite3_stmt; - if !(locations_send_begin == 0i32 as libc::c_long || now > locations_send_until) { - dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t, + + self_addr = dc_sqlite3_get_config( + context, + &mut context.sql.clone().lock().unwrap(), + b"configured_addr\x00" as *const u8 as *const libc::c_char, + b"\x00" as *const u8 as *const libc::c_char, + ); + stmt = + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT locations_send_begin, locations_send_until, locations_last_sent FROM chats WHERE id=?;\x00" + as *const u8 as *const libc::c_char); + sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); + if !(sqlite3_step(stmt) != 100i32) { + locations_send_begin = sqlite3_column_int64(stmt, 0i32) as time_t; + locations_send_until = sqlite3_column_int64(stmt, 1i32) as time_t; + locations_last_sent = sqlite3_column_int64(stmt, 2i32) as time_t; + sqlite3_finalize(stmt); + stmt = 0 as *mut sqlite3_stmt; + if !(locations_send_begin == 0i32 as libc::c_long || now > locations_send_until) { + dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t, b"\n\n\n\x00" as *const u8 as *const libc::c_char, self_addr); - stmt = dc_sqlite3_prepare( - (*context).sql, + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id, latitude, longitude, accuracy, timestamp\ FROM locations WHERE from_id=? \ AND timestamp>=? \ @@ -365,44 +370,41 @@ pub unsafe fn dc_get_location_kml( as *const libc::c_char, ); - sqlite3_bind_int(stmt, 1i32, 1i32); - sqlite3_bind_int64(stmt, 2i32, locations_send_begin as sqlite3_int64); - sqlite3_bind_int64(stmt, 3i32, locations_last_sent as sqlite3_int64); - sqlite3_bind_int(stmt, 4i32, 1i32); - while sqlite3_step(stmt) == 100i32 { - let mut location_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t; - let mut latitude: *mut libc::c_char = - dc_ftoa(sqlite3_column_double(stmt, 1i32)); - let mut longitude: *mut libc::c_char = - dc_ftoa(sqlite3_column_double(stmt, 2i32)); - let mut accuracy: *mut libc::c_char = - dc_ftoa(sqlite3_column_double(stmt, 3i32)); - let mut timestamp: *mut libc::c_char = - get_kml_timestamp(sqlite3_column_int64(stmt, 4i32) as time_t); - dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t, + sqlite3_bind_int(stmt, 1i32, 1i32); + sqlite3_bind_int64(stmt, 2i32, locations_send_begin as sqlite3_int64); + sqlite3_bind_int64(stmt, 3i32, locations_last_sent as sqlite3_int64); + sqlite3_bind_int(stmt, 4i32, 1i32); + while sqlite3_step(stmt) == 100i32 { + let mut location_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t; + let mut latitude: *mut libc::c_char = dc_ftoa(sqlite3_column_double(stmt, 1i32)); + let mut longitude: *mut libc::c_char = dc_ftoa(sqlite3_column_double(stmt, 2i32)); + let mut accuracy: *mut libc::c_char = dc_ftoa(sqlite3_column_double(stmt, 3i32)); + let mut timestamp: *mut libc::c_char = + get_kml_timestamp(sqlite3_column_int64(stmt, 4i32) as time_t); + dc_strbuilder_catf(&mut ret as *mut dc_strbuilder_t, b"%s%s,%s\n\x00" as *const u8 as *const libc::c_char, timestamp, accuracy, longitude, latitude); - location_count += 1; - if !last_added_location_id.is_null() { - *last_added_location_id = location_id - } - free(latitude as *mut libc::c_void); - free(longitude as *mut libc::c_void); - free(accuracy as *mut libc::c_void); - free(timestamp as *mut libc::c_void); - } - if !(location_count == 0i32) { - dc_strbuilder_cat( - &mut ret, - b"\n\x00" as *const u8 as *const libc::c_char, - ); - success = 1i32 + location_count += 1; + if !last_added_location_id.is_null() { + *last_added_location_id = location_id } + free(latitude as *mut libc::c_void); + free(longitude as *mut libc::c_void); + free(accuracy as *mut libc::c_void); + free(timestamp as *mut libc::c_void); + } + if !(location_count == 0i32) { + dc_strbuilder_cat( + &mut ret, + b"\n\x00" as *const u8 as *const libc::c_char, + ); + success = 1i32 } } } + sqlite3_finalize(stmt); free(self_addr as *mut libc::c_void); if 0 == success { @@ -449,15 +451,10 @@ unsafe fn get_kml_timestamp(mut utc: time_t) -> *mut libc::c_char { } pub unsafe fn dc_get_message_kml( - context: &dc_context_t, timestamp: time_t, latitude: libc::c_double, longitude: libc::c_double, ) -> *mut libc::c_char { - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - return std::ptr::null_mut(); - } - let timestamp_str = get_kml_timestamp(timestamp); let latitude_str = dc_ftoa(latitude); let longitude_str = dc_ftoa(longitude); @@ -485,13 +482,14 @@ pub unsafe fn dc_get_message_kml( } pub unsafe fn dc_set_kml_sent_timestamp( - mut context: &dc_context_t, - mut chat_id: uint32_t, - mut timestamp: time_t, + context: &dc_context_t, + chat_id: uint32_t, + timestamp: time_t, ) { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE chats SET locations_last_sent=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -507,7 +505,8 @@ pub unsafe fn dc_set_msg_location_id( ) { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET location_id=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int64(stmt, 1i32, location_id as sqlite3_int64); @@ -526,18 +525,16 @@ pub unsafe fn dc_save_locations( let mut stmt_insert: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; let mut newest_timestamp: time_t = 0i32 as time_t; let mut newest_location_id: uint32_t = 0i32 as uint32_t; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || chat_id <= 9i32 as libc::c_uint - || locations.is_null()) - { + if !(chat_id <= 9i32 as libc::c_uint || locations.is_null()) { stmt_test = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM locations WHERE timestamp=? AND from_id=?\x00" as *const u8 as *const libc::c_char, ); stmt_insert = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"INSERT INTO locations\ (timestamp, from_id, chat_id, latitude, longitude, accuracy, independent) \ VALUES (?,?,?,?,?,?,?);\x00" as *const u8 as *const libc::c_char, @@ -563,7 +560,8 @@ pub unsafe fn dc_save_locations( if (*location).timestamp > newest_timestamp { newest_timestamp = (*location).timestamp; newest_location_id = dc_sqlite3_get_rowid2( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"locations\x00" as *const u8 as *const libc::c_char, b"timestamp\x00" as *const u8 as *const libc::c_char, (*location).timestamp as uint64_t, @@ -591,33 +589,34 @@ pub unsafe fn dc_kml_parse( text_cb: None, userdata: 0 as *mut libc::c_void, }; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - if content_bytes > (1 * 1024 * 1024) { - dc_log_warning( - context, - 0, - b"A kml-files with %i bytes is larger than reasonably expected.\x00" as *const u8 - as *const libc::c_char, - content_bytes, + + if content_bytes > (1 * 1024 * 1024) { + dc_log_warning( + context, + 0, + b"A kml-files with %i bytes is larger than reasonably expected.\x00" as *const u8 + as *const libc::c_char, + content_bytes, + ); + } else { + content_nullterminated = dc_null_terminate(content, content_bytes as libc::c_int); + if !content_nullterminated.is_null() { + (*kml).locations = dc_array_new_typed(1, 100 as size_t); + dc_saxparser_init(&mut saxparser, kml as *mut libc::c_void); + dc_saxparser_set_tag_handler( + &mut saxparser, + Some(kml_starttag_cb), + Some(kml_endtag_cb), ); - } else { - content_nullterminated = dc_null_terminate(content, content_bytes as libc::c_int); - if !content_nullterminated.is_null() { - (*kml).locations = dc_array_new_typed(context, 1, 100 as size_t); - dc_saxparser_init(&mut saxparser, kml as *mut libc::c_void); - dc_saxparser_set_tag_handler( - &mut saxparser, - Some(kml_starttag_cb), - Some(kml_endtag_cb), - ); - dc_saxparser_set_text_handler(&mut saxparser, Some(kml_text_cb)); - dc_saxparser_parse(&mut saxparser, content_nullterminated); - } + dc_saxparser_set_text_handler(&mut saxparser, Some(kml_text_cb)); + dc_saxparser_parse(&mut saxparser, content_nullterminated); } } + free(content_nullterminated as *mut libc::c_void); return kml; } + unsafe fn kml_text_cb(userdata: *mut libc::c_void, text: *const libc::c_char, _len: libc::c_int) { let mut kml: *mut dc_kml_t = userdata as *mut dc_kml_t; if 0 != (*kml).tag & (0x4 | 0x10) { @@ -774,7 +773,8 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOCATIONS(context: &dc_context_t, _job as *const libc::c_char, ); stmt_chats = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id, locations_send_begin, locations_last_sent\ FROM chats\ WHERE locations_send_until>?;\x00" as *const u8 as *const libc::c_char, @@ -791,7 +791,8 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOCATIONS(context: &dc_context_t, _job } if stmt_locations.is_null() { stmt_locations = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id \ FROM locations \ WHERE from_id=? \ @@ -842,10 +843,11 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED( let mut chat_id: uint32_t = (*job).foreign_id; let mut locations_send_begin: time_t = 0i32 as time_t; let mut locations_send_until: time_t = 0i32 as time_t; - let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt; + let mut stmt = 0 as *mut sqlite3_stmt; let mut stock_str: *mut libc::c_char = 0 as *mut libc::c_char; stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT locations_send_begin, locations_send_until FROM chats WHERE id=?\x00" as *const u8 as *const libc::c_char, ); @@ -866,10 +868,12 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED( { // not streaming, device-message already sent stmt = - dc_sqlite3_prepare((*context).sql, - b"UPDATE chats SET locations_send_begin=0, locations_send_until=0 WHERE id=?\x00" - as *const u8 as - *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"UPDATE chats SET locations_send_begin=0, locations_send_until=0 WHERE id=?\x00" + as *const u8 as + *const libc::c_char); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); sqlite3_step(stmt); stock_str = dc_stock_system_msg( @@ -880,7 +884,7 @@ pub unsafe fn dc_job_do_DC_JOB_MAYBE_SEND_LOC_ENDED( 0i32 as uint32_t, ); dc_add_device_msg(context, chat_id, stock_str); - ((*context).cb)( + (context.cb)( context, Event::CHAT_MODIFIED, chat_id as uintptr_t, diff --git a/src/dc_log.rs b/src/dc_log.rs index e70482a62..d4022f604 100644 --- a/src/dc_log.rs +++ b/src/dc_log.rs @@ -30,9 +30,6 @@ unsafe fn log_vprintf( mut va_0: ::std::ffi::VaList, ) { let mut msg: *mut libc::c_char = 0 as *mut libc::c_char; - if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint { - return; - } if !msg_format.is_null() { let mut tempbuf: [libc::c_char; 1025] = [0; 1025]; vsnprintf( @@ -58,10 +55,7 @@ pub unsafe extern "C" fn dc_log_event_seq( mut msg: *const libc::c_char, mut va_0: ... ) { - if context.is_null() - || sequence_start.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - { + if sequence_start.is_null() { return; } log_vprintf(context, event_code, *sequence_start, msg, va_0); diff --git a/src/dc_loginparam.rs b/src/dc_loginparam.rs index 344731ba4..d6da6418a 100644 --- a/src/dc_loginparam.rs +++ b/src/dc_loginparam.rs @@ -1,5 +1,6 @@ use libc; +use crate::dc_context::dc_context_t; use crate::dc_sqlite3::*; use crate::dc_strbuilder::*; use crate::dc_tools::*; @@ -60,9 +61,10 @@ pub unsafe fn dc_loginparam_empty(mut loginparam: *mut dc_loginparam_t) { (*loginparam).server_flags = 0i32; } pub unsafe fn dc_loginparam_read( - mut loginparam: *mut dc_loginparam_t, - mut sql: &mut dc_sqlite3_t, - mut prefix: *const libc::c_char, + context: &dc_context_t, + loginparam: *mut dc_loginparam_t, + sql: &mut dc_sqlite3_t, + prefix: *const libc::c_char, ) { let mut key: *mut libc::c_char = 0 as *mut libc::c_char; dc_loginparam_empty(loginparam); @@ -72,76 +74,77 @@ pub unsafe fn dc_loginparam_read( prefix, b"addr\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).addr = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).addr = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_server\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).mail_server = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).mail_server = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_port\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).mail_port = dc_sqlite3_get_config_int(sql, key, 0i32); + (*loginparam).mail_port = dc_sqlite3_get_config_int(context, sql, key, 0i32); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_user\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).mail_user = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).mail_user = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_pw\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).mail_pw = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).mail_pw = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_server\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).send_server = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).send_server = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_port\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).send_port = dc_sqlite3_get_config_int(sql, key, 0i32); + (*loginparam).send_port = dc_sqlite3_get_config_int(context, sql, key, 0i32); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_user\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).send_user = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).send_user = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_pw\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).send_pw = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + (*loginparam).send_pw = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"server_flags\x00" as *const u8 as *const libc::c_char, ); - (*loginparam).server_flags = dc_sqlite3_get_config_int(sql, key, 0i32); + (*loginparam).server_flags = dc_sqlite3_get_config_int(context, sql, key, 0i32); sqlite3_free(key as *mut libc::c_void); } pub unsafe fn dc_loginparam_write( - mut loginparam: *const dc_loginparam_t, - mut sql: &mut dc_sqlite3_t, - mut prefix: *const libc::c_char, + context: &dc_context_t, + loginparam: *const dc_loginparam_t, + sql: &mut dc_sqlite3_t, + prefix: *const libc::c_char, ) { let mut key: *mut libc::c_char = 0 as *mut libc::c_char; sqlite3_free(key as *mut libc::c_void); @@ -150,70 +153,70 @@ pub unsafe fn dc_loginparam_write( prefix, b"addr\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).addr); + dc_sqlite3_set_config(context, sql, key, (*loginparam).addr); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_server\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).mail_server); + dc_sqlite3_set_config(context, sql, key, (*loginparam).mail_server); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_port\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config_int(sql, key, (*loginparam).mail_port); + dc_sqlite3_set_config_int(context, sql, key, (*loginparam).mail_port); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_user\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).mail_user); + dc_sqlite3_set_config(context, sql, key, (*loginparam).mail_user); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"mail_pw\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).mail_pw); + dc_sqlite3_set_config(context, sql, key, (*loginparam).mail_pw); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_server\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).send_server); + dc_sqlite3_set_config(context, sql, key, (*loginparam).send_server); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_port\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config_int(sql, key, (*loginparam).send_port); + dc_sqlite3_set_config_int(context, sql, key, (*loginparam).send_port); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_user\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).send_user); + dc_sqlite3_set_config(context, sql, key, (*loginparam).send_user); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"send_pw\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config(sql, key, (*loginparam).send_pw); + dc_sqlite3_set_config(context, sql, key, (*loginparam).send_pw); sqlite3_free(key as *mut libc::c_void); key = sqlite3_mprintf( b"%s%s\x00" as *const u8 as *const libc::c_char, prefix, b"server_flags\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_set_config_int(sql, key, (*loginparam).server_flags); + dc_sqlite3_set_config_int(context, sql, key, (*loginparam).server_flags); sqlite3_free(key as *mut libc::c_void); } pub unsafe fn dc_loginparam_get_readable( diff --git a/src/dc_mimefactory.rs b/src/dc_mimefactory.rs index 0201afd7e..aece87bc0 100644 --- a/src/dc_mimefactory.rs +++ b/src/dc_mimefactory.rs @@ -51,7 +51,7 @@ pub unsafe fn dc_mimefactory_init<'a>( factory: *mut dc_mimefactory_t<'a>, context: &'a dc_context_t, ) { - if factory.is_null() || context.is_null() { + if factory.is_null() { return; } memset( @@ -105,16 +105,11 @@ pub unsafe fn dc_mimefactory_load_msg( mut factory: *mut dc_mimefactory_t, mut msg_id: uint32_t, ) -> libc::c_int { - let mut context: *mut dc_context_t = 0 as *mut dc_context_t; let mut success: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(factory.is_null() - || msg_id <= 9i32 as libc::c_uint - || (*factory).context.is_null() - || !(*factory).msg.is_null()) - { + if !(factory.is_null() || msg_id <= 9i32 as libc::c_uint || !(*factory).msg.is_null()) { /*call empty() before */ - context = (*factory).context; + let context = (*factory).context; (*factory).recipients_names = clist_new(); (*factory).recipients_addr = clist_new(); (*factory).msg = dc_msg_new_untyped(context); @@ -128,7 +123,7 @@ pub unsafe fn dc_mimefactory_load_msg( clist_insert_after( (*factory).recipients_names, (*(*factory).recipients_names).last, - dc_strdup_keep_null((*factory).from_displayname) as &libc::c_void, + dc_strdup_keep_null((*factory).from_displayname) as *mut libc::c_void, ); clist_insert_after( (*factory).recipients_addr, @@ -137,10 +132,12 @@ pub unsafe fn dc_mimefactory_load_msg( ); } else { stmt = - dc_sqlite3_prepare((*context).sql, - b"SELECT c.authname, c.addr FROM chats_contacts cc LEFT JOIN contacts c ON cc.contact_id=c.id WHERE cc.chat_id=? AND cc.contact_id>9;\x00" - as *const u8 as - *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT c.authname, c.addr FROM chats_contacts cc LEFT JOIN contacts c ON cc.contact_id=c.id WHERE cc.chat_id=? AND cc.contact_id>9;\x00" + as *const u8 as + *const libc::c_char); sqlite3_bind_int(stmt, 1i32, (*(*factory).msg).chat_id as libc::c_int); while sqlite3_step(stmt) == 100i32 { let mut authname: *const libc::c_char = @@ -176,7 +173,8 @@ pub unsafe fn dc_mimefactory_load_msg( 0 as *const libc::c_char, ); let mut self_addr: *mut libc::c_char = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, ); @@ -202,7 +200,8 @@ pub unsafe fn dc_mimefactory_load_msg( if command != 6i32 && command != 7i32 && 0 != dc_sqlite3_get_config_int( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"mdns_enabled\x00" as *const u8 as *const libc::c_char, 1i32, ) @@ -211,7 +210,8 @@ pub unsafe fn dc_mimefactory_load_msg( } } stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT mime_in_reply_to, mime_references FROM msgs WHERE id=?\x00" as *const u8 as *const libc::c_char, ); @@ -238,17 +238,20 @@ pub unsafe fn dc_mimefactory_load_msg( } unsafe fn load_from(mut factory: *mut dc_mimefactory_t) { (*factory).from_addr = dc_sqlite3_get_config( - (*(*factory).context).sql, + (*factory).context, + &mut (*factory).context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); (*factory).from_displayname = dc_sqlite3_get_config( - (*(*factory).context).sql, + (*factory).context, + &mut (*factory).context.sql.clone().lock().unwrap(), b"displayname\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); (*factory).selfstatus = dc_sqlite3_get_config( - (*(*factory).context).sql, + (*factory).context, + &mut (*factory).context.sql.clone().lock().unwrap(), b"selfstatus\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); @@ -268,7 +271,8 @@ pub unsafe fn dc_mimefactory_load_mdn( (*factory).msg = dc_msg_new_untyped((*factory).context); if !(0 == dc_sqlite3_get_config_int( - (*(*factory).context).sql, + (*factory).context, + &mut (*factory).context.sql.clone().lock().unwrap(), b"mdns_enabled\x00" as *const u8 as *const libc::c_char, 1i32, )) @@ -278,7 +282,7 @@ pub unsafe fn dc_mimefactory_load_mdn( if !(0 == dc_msg_load_from_db((*factory).msg, (*factory).context, msg_id) || 0 == dc_contact_load_from_db( contact, - (*(*factory).context).sql, + &mut (*factory).context.sql.clone().lock().unwrap(), (*(*factory).msg).from_id, )) { @@ -858,12 +862,8 @@ pub unsafe fn dc_mimefactory_render(mut factory: *mut dc_mimefactory_t) -> libc: DC_PARAM_SET_LONGITUDE as libc::c_int, 0.0, ); - let kml_file = dc_get_message_kml( - (*msg).context, - (*msg).timestamp_sort, - latitude, - longitude, - ); + let kml_file = + dc_get_message_kml((*msg).timestamp_sort, latitude, longitude); if !kml_file.is_null() { let content_type = mailmime_content_new_with_str( b"application/vnd.google-earth.kml+xml\x00" as *const u8 @@ -1057,11 +1057,7 @@ unsafe fn get_subject( mut msg: *const dc_msg_t, mut afwd_email: libc::c_int, ) -> *mut libc::c_char { - let mut context: *mut dc_context_t = if !chat.is_null() { - (*chat).context - } else { - std::ptr::null_mut() - }; + let context = (*chat).context; let mut ret: *mut libc::c_char = 0 as *mut libc::c_char; let mut raw_subject: *mut libc::c_char = dc_msg_get_summarytext_by_raw((*msg).type_0, (*msg).text, (*msg).param, 32i32, context); diff --git a/src/dc_mimeparser.rs b/src/dc_mimeparser.rs index 7aa0f4939..36c8cfe69 100644 --- a/src/dc_mimeparser.rs +++ b/src/dc_mimeparser.rs @@ -35,7 +35,7 @@ pub struct dc_mimepart_t { */ #[derive(Copy, Clone)] #[repr(C)] -pub struct dc_mimeparser_t { +pub struct dc_mimeparser_t<'a> { pub parts: *mut carray, pub mimeroot: *mut mailmime, pub header: dc_hash_t, @@ -47,7 +47,7 @@ pub struct dc_mimeparser_t { pub e2ee_helper: *mut dc_e2ee_helper_t, pub blobdir: *const libc::c_char, pub is_forwarded: libc::c_int, - pub context: *mut dc_context_t, + pub context: &'a dc_context_t, pub reports: *mut carray, pub is_system_message: libc::c_int, pub location_kml: *mut dc_kml_t, @@ -61,8 +61,8 @@ pub unsafe fn dc_no_compound_msgs() { // deprecated: flag to switch generation of compound messages on and off. static mut s_generate_compound_msgs: libc::c_int = 1i32; pub unsafe fn dc_mimeparser_new( - mut blobdir: *const libc::c_char, - mut context: &dc_context_t, + blobdir: *const libc::c_char, + context: &dc_context_t, ) -> *mut dc_mimeparser_t { let mut mimeparser: *mut dc_mimeparser_t = 0 as *mut dc_mimeparser_t; mimeparser = calloc(1, ::std::mem::size_of::()) as *mut dc_mimeparser_t; diff --git a/src/dc_move.rs b/src/dc_move.rs index e3ed33641..c1a5da10c 100644 --- a/src/dc_move.rs +++ b/src/dc_move.rs @@ -15,7 +15,8 @@ pub unsafe fn dc_do_heuristics_moves( let mut msg: *mut dc_msg_t = 0 as *mut dc_msg_t; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; if !(dc_sqlite3_get_config_int( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"mvbox_move\x00" as *const u8 as *const libc::c_char, 1i32, ) == 0i32) diff --git a/src/dc_msg.rs b/src/dc_msg.rs index 72c9c8e25..aeb4f738d 100644 --- a/src/dc_msg.rs +++ b/src/dc_msg.rs @@ -67,225 +67,224 @@ pub unsafe fn dc_get_msg_info( eos: 0 as *mut libc::c_char, }; dc_strbuilder_init(&mut ret, 0i32); - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - dc_msg_load_from_db(msg, context, msg_id); - dc_contact_load_from_db(contact_from, (*context).sql, (*msg).from_id); - stmt = dc_sqlite3_prepare( - (*context).sql, - b"SELECT txt_raw FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char, + + dc_msg_load_from_db(msg, context, msg_id); + dc_contact_load_from_db( + contact_from, + &mut context.sql.clone().lock().unwrap(), + (*msg).from_id, + ); + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT txt_raw FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char, + ); + sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); + if sqlite3_step(stmt) != 100i32 { + p = dc_mprintf( + b"Cannot load message #%i.\x00" as *const u8 as *const libc::c_char, + msg_id as libc::c_int, ); - sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); - if sqlite3_step(stmt) != 100i32 { - p = dc_mprintf( - b"Cannot load message #%i.\x00" as *const u8 as *const libc::c_char, - msg_id as libc::c_int, + dc_strbuilder_cat(&mut ret, p); + free(p as *mut libc::c_void); + } else { + rawtxt = dc_strdup(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char); + sqlite3_finalize(stmt); + stmt = 0 as *mut sqlite3_stmt; + dc_trim(rawtxt); + dc_truncate_str(rawtxt, 100000i32); + dc_strbuilder_cat(&mut ret, b"Sent: \x00" as *const u8 as *const libc::c_char); + p = dc_timestamp_to_str(dc_msg_get_timestamp(msg)); + dc_strbuilder_cat(&mut ret, p); + free(p as *mut libc::c_void); + p = dc_contact_get_name_n_addr(contact_from); + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b" by %s\x00" as *const u8 as *const libc::c_char, + p, + ); + free(p as *mut libc::c_void); + dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + if (*msg).from_id != 1i32 as libc::c_uint { + dc_strbuilder_cat( + &mut ret, + b"Received: \x00" as *const u8 as *const libc::c_char, ); + p = dc_timestamp_to_str(if 0 != (*msg).timestamp_rcvd { + (*msg).timestamp_rcvd + } else { + (*msg).timestamp_sort + }); dc_strbuilder_cat(&mut ret, p); free(p as *mut libc::c_void); - } else { - rawtxt = dc_strdup(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char); + dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + } + if !((*msg).from_id == 2i32 as libc::c_uint || (*msg).to_id == 2i32 as libc::c_uint) { + // device-internal message, no further details needed + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;\x00" as *const u8 + as *const libc::c_char, + ); + sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); + while sqlite3_step(stmt) == 100i32 { + dc_strbuilder_cat(&mut ret, b"Read: \x00" as *const u8 as *const libc::c_char); + p = dc_timestamp_to_str(sqlite3_column_int64(stmt, 1i32) as time_t); + dc_strbuilder_cat(&mut ret, p); + free(p as *mut libc::c_void); + dc_strbuilder_cat(&mut ret, b" by \x00" as *const u8 as *const libc::c_char); + let mut contact: *mut dc_contact_t = dc_contact_new(context); + dc_contact_load_from_db( + contact, + &mut context.sql.clone().lock().unwrap(), + sqlite3_column_int64(stmt, 0i32) as uint32_t, + ); + p = dc_contact_get_name_n_addr(contact); + dc_strbuilder_cat(&mut ret, p); + free(p as *mut libc::c_void); + dc_contact_unref(contact); + dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + } sqlite3_finalize(stmt); stmt = 0 as *mut sqlite3_stmt; - dc_trim(rawtxt); - dc_truncate_str(rawtxt, 100000i32); - dc_strbuilder_cat(&mut ret, b"Sent: \x00" as *const u8 as *const libc::c_char); - p = dc_timestamp_to_str(dc_msg_get_timestamp(msg)); - dc_strbuilder_cat(&mut ret, p); - free(p as *mut libc::c_void); - p = dc_contact_get_name_n_addr(contact_from); + p = 0 as *mut libc::c_char; + match (*msg).state { + 10 => p = dc_strdup(b"Fresh\x00" as *const u8 as *const libc::c_char), + 13 => p = dc_strdup(b"Noticed\x00" as *const u8 as *const libc::c_char), + 16 => p = dc_strdup(b"Seen\x00" as *const u8 as *const libc::c_char), + 26 => p = dc_strdup(b"Delivered\x00" as *const u8 as *const libc::c_char), + 24 => p = dc_strdup(b"Failed\x00" as *const u8 as *const libc::c_char), + 28 => p = dc_strdup(b"Read\x00" as *const u8 as *const libc::c_char), + 20 => p = dc_strdup(b"Pending\x00" as *const u8 as *const libc::c_char), + 18 => p = dc_strdup(b"Preparing\x00" as *const u8 as *const libc::c_char), + _ => p = dc_mprintf(b"%i\x00" as *const u8 as *const libc::c_char, (*msg).state), + } dc_strbuilder_catf( &mut ret as *mut dc_strbuilder_t, - b" by %s\x00" as *const u8 as *const libc::c_char, + b"State: %s\x00" as *const u8 as *const libc::c_char, p, ); free(p as *mut libc::c_void); - dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); - if (*msg).from_id != 1i32 as libc::c_uint { + if 0 != dc_msg_has_location(msg) { dc_strbuilder_cat( &mut ret, - b"Received: \x00" as *const u8 as *const libc::c_char, + b", Location sent\x00" as *const u8 as *const libc::c_char, ); - p = dc_timestamp_to_str(if 0 != (*msg).timestamp_rcvd { - (*msg).timestamp_rcvd - } else { - (*msg).timestamp_sort - }); - dc_strbuilder_cat(&mut ret, p); - free(p as *mut libc::c_void); - dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); } - if !((*msg).from_id == 2i32 as libc::c_uint || (*msg).to_id == 2i32 as libc::c_uint) { - // device-internal message, no further details needed - stmt = dc_sqlite3_prepare( - (*context).sql, - b"SELECT contact_id, timestamp_sent FROM msgs_mdns WHERE msg_id=?;\x00" - as *const u8 as *const libc::c_char, - ); - sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); - while sqlite3_step(stmt) == 100i32 { - dc_strbuilder_cat(&mut ret, b"Read: \x00" as *const u8 as *const libc::c_char); - p = dc_timestamp_to_str(sqlite3_column_int64(stmt, 1i32) as time_t); - dc_strbuilder_cat(&mut ret, p); - free(p as *mut libc::c_void); - dc_strbuilder_cat(&mut ret, b" by \x00" as *const u8 as *const libc::c_char); - let mut contact: *mut dc_contact_t = dc_contact_new(context); - dc_contact_load_from_db( - contact, - (*context).sql, - sqlite3_column_int64(stmt, 0i32) as uint32_t, - ); - p = dc_contact_get_name_n_addr(contact); - dc_strbuilder_cat(&mut ret, p); - free(p as *mut libc::c_void); - dc_contact_unref(contact); - dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + p = 0 as *mut libc::c_char; + e2ee_errors = 0; + e2ee_errors = dc_param_get_int((*msg).param, 'e' as i32, 0i32); + if 0 != e2ee_errors { + if 0 != e2ee_errors & 0x2i32 { + p = dc_strdup( + b"Encrypted, no valid signature\x00" as *const u8 as *const libc::c_char, + ) } - sqlite3_finalize(stmt); - stmt = 0 as *mut sqlite3_stmt; + } else if 0 != dc_param_get_int((*msg).param, 'c' as i32, 0i32) { + p = dc_strdup(b"Encrypted\x00" as *const u8 as *const libc::c_char) + } + if !p.is_null() { + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b", %s\x00" as *const u8 as *const libc::c_char, + p, + ); + free(p as *mut libc::c_void); + } + dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + p = dc_param_get((*msg).param, 'L' as i32, 0 as *const libc::c_char); + if !p.is_null() { + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b"Error: %s\n\x00" as *const u8 as *const libc::c_char, + p, + ); + free(p as *mut libc::c_void); + } + p = dc_msg_get_file(msg); + if !p.is_null() && 0 != *p.offset(0isize) as libc::c_int { + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b"\nFile: %s, %i bytes\n\x00" as *const u8 as *const libc::c_char, + p, + dc_get_filebytes(context, p) as libc::c_int, + ); + } + free(p as *mut libc::c_void); + if (*msg).type_0 != 10i32 { p = 0 as *mut libc::c_char; - match (*msg).state { - 10 => p = dc_strdup(b"Fresh\x00" as *const u8 as *const libc::c_char), - 13 => p = dc_strdup(b"Noticed\x00" as *const u8 as *const libc::c_char), - 16 => p = dc_strdup(b"Seen\x00" as *const u8 as *const libc::c_char), - 26 => p = dc_strdup(b"Delivered\x00" as *const u8 as *const libc::c_char), - 24 => p = dc_strdup(b"Failed\x00" as *const u8 as *const libc::c_char), - 28 => p = dc_strdup(b"Read\x00" as *const u8 as *const libc::c_char), - 20 => p = dc_strdup(b"Pending\x00" as *const u8 as *const libc::c_char), - 18 => p = dc_strdup(b"Preparing\x00" as *const u8 as *const libc::c_char), + match (*msg).type_0 { + 40 => p = dc_strdup(b"Audio\x00" as *const u8 as *const libc::c_char), + 60 => p = dc_strdup(b"File\x00" as *const u8 as *const libc::c_char), + 21 => p = dc_strdup(b"GIF\x00" as *const u8 as *const libc::c_char), + 20 => p = dc_strdup(b"Image\x00" as *const u8 as *const libc::c_char), + 50 => p = dc_strdup(b"Video\x00" as *const u8 as *const libc::c_char), + 41 => p = dc_strdup(b"Voice\x00" as *const u8 as *const libc::c_char), _ => { - p = dc_mprintf(b"%i\x00" as *const u8 as *const libc::c_char, (*msg).state) + p = dc_mprintf(b"%i\x00" as *const u8 as *const libc::c_char, (*msg).type_0) } } dc_strbuilder_catf( &mut ret as *mut dc_strbuilder_t, - b"State: %s\x00" as *const u8 as *const libc::c_char, + b"Type: %s\n\x00" as *const u8 as *const libc::c_char, p, ); free(p as *mut libc::c_void); - if 0 != dc_msg_has_location(msg) { - dc_strbuilder_cat( - &mut ret, - b", Location sent\x00" as *const u8 as *const libc::c_char, - ); - } - p = 0 as *mut libc::c_char; - e2ee_errors = 0; - e2ee_errors = dc_param_get_int((*msg).param, 'e' as i32, 0i32); - if 0 != e2ee_errors { - if 0 != e2ee_errors & 0x2i32 { - p = dc_strdup( - b"Encrypted, no valid signature\x00" as *const u8 - as *const libc::c_char, - ) - } - } else if 0 != dc_param_get_int((*msg).param, 'c' as i32, 0i32) { - p = dc_strdup(b"Encrypted\x00" as *const u8 as *const libc::c_char) - } - if !p.is_null() { - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b", %s\x00" as *const u8 as *const libc::c_char, - p, - ); - free(p as *mut libc::c_void); - } - dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); - p = dc_param_get((*msg).param, 'L' as i32, 0 as *const libc::c_char); - if !p.is_null() { - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b"Error: %s\n\x00" as *const u8 as *const libc::c_char, - p, - ); - free(p as *mut libc::c_void); - } - p = dc_msg_get_file(msg); - if !p.is_null() && 0 != *p.offset(0isize) as libc::c_int { - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b"\nFile: %s, %i bytes\n\x00" as *const u8 as *const libc::c_char, - p, - dc_get_filebytes(context, p) as libc::c_int, - ); - } + p = dc_msg_get_filemime(msg); + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b"Mimetype: %s\n\x00" as *const u8 as *const libc::c_char, + p, + ); free(p as *mut libc::c_void); - if (*msg).type_0 != 10i32 { - p = 0 as *mut libc::c_char; - match (*msg).type_0 { - 40 => p = dc_strdup(b"Audio\x00" as *const u8 as *const libc::c_char), - 60 => p = dc_strdup(b"File\x00" as *const u8 as *const libc::c_char), - 21 => p = dc_strdup(b"GIF\x00" as *const u8 as *const libc::c_char), - 20 => p = dc_strdup(b"Image\x00" as *const u8 as *const libc::c_char), - 50 => p = dc_strdup(b"Video\x00" as *const u8 as *const libc::c_char), - 41 => p = dc_strdup(b"Voice\x00" as *const u8 as *const libc::c_char), - _ => { - p = dc_mprintf( - b"%i\x00" as *const u8 as *const libc::c_char, - (*msg).type_0, - ) - } - } - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b"Type: %s\n\x00" as *const u8 as *const libc::c_char, - p, - ); - free(p as *mut libc::c_void); - p = dc_msg_get_filemime(msg); - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b"Mimetype: %s\n\x00" as *const u8 as *const libc::c_char, - p, - ); - free(p as *mut libc::c_void); - } - w = dc_param_get_int((*msg).param, 'w' as i32, 0i32); - h = dc_param_get_int((*msg).param, 'h' as i32, 0i32); - if w != 0i32 || h != 0i32 { - p = dc_mprintf( - b"Dimension: %i x %i\n\x00" as *const u8 as *const libc::c_char, - w, - h, - ); - dc_strbuilder_cat(&mut ret, p); - free(p as *mut libc::c_void); - } - duration = dc_param_get_int((*msg).param, 'd' as i32, 0i32); - if duration != 0i32 { - p = dc_mprintf( - b"Duration: %i ms\n\x00" as *const u8 as *const libc::c_char, - duration, - ); - dc_strbuilder_cat(&mut ret, p); - free(p as *mut libc::c_void); - } - if !rawtxt.is_null() && 0 != *rawtxt.offset(0isize) as libc::c_int { - dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); - dc_strbuilder_cat(&mut ret, rawtxt); - dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); - } - if !(*msg).rfc724_mid.is_null() - && 0 != *(*msg).rfc724_mid.offset(0isize) as libc::c_int - { - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b"\nMessage-ID: %s\x00" as *const u8 as *const libc::c_char, - (*msg).rfc724_mid, - ); - } - if !(*msg).server_folder.is_null() - && 0 != *(*msg).server_folder.offset(0isize) as libc::c_int - { - dc_strbuilder_catf( - &mut ret as *mut dc_strbuilder_t, - b"\nLast seen as: %s/%i\x00" as *const u8 as *const libc::c_char, - (*msg).server_folder, - (*msg).server_uid as libc::c_int, - ); - } + } + w = dc_param_get_int((*msg).param, 'w' as i32, 0i32); + h = dc_param_get_int((*msg).param, 'h' as i32, 0i32); + if w != 0i32 || h != 0i32 { + p = dc_mprintf( + b"Dimension: %i x %i\n\x00" as *const u8 as *const libc::c_char, + w, + h, + ); + dc_strbuilder_cat(&mut ret, p); + free(p as *mut libc::c_void); + } + duration = dc_param_get_int((*msg).param, 'd' as i32, 0i32); + if duration != 0i32 { + p = dc_mprintf( + b"Duration: %i ms\n\x00" as *const u8 as *const libc::c_char, + duration, + ); + dc_strbuilder_cat(&mut ret, p); + free(p as *mut libc::c_void); + } + if !rawtxt.is_null() && 0 != *rawtxt.offset(0isize) as libc::c_int { + dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + dc_strbuilder_cat(&mut ret, rawtxt); + dc_strbuilder_cat(&mut ret, b"\n\x00" as *const u8 as *const libc::c_char); + } + if !(*msg).rfc724_mid.is_null() && 0 != *(*msg).rfc724_mid.offset(0isize) as libc::c_int + { + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b"\nMessage-ID: %s\x00" as *const u8 as *const libc::c_char, + (*msg).rfc724_mid, + ); + } + if !(*msg).server_folder.is_null() + && 0 != *(*msg).server_folder.offset(0isize) as libc::c_int + { + dc_strbuilder_catf( + &mut ret as *mut dc_strbuilder_t, + b"\nLast seen as: %s/%i\x00" as *const u8 as *const libc::c_char, + (*msg).server_folder, + (*msg).server_uid as libc::c_int, + ); } } } + sqlite3_finalize(stmt); dc_msg_unref(msg); dc_contact_unref(contact_from); @@ -503,21 +502,19 @@ pub unsafe fn dc_msg_get_timestamp(mut msg: *const dc_msg_t) -> time_t { (*msg).timestamp_sort }; } -pub unsafe fn dc_msg_load_from_db( - mut msg: *mut dc_msg_t, - mut context: &dc_context_t, - mut id: uint32_t, +pub unsafe fn dc_msg_load_from_db<'a>( + msg: *mut dc_msg_t<'a>, + context: &'a dc_context_t, + id: uint32_t, ) -> libc::c_int { let mut success: libc::c_int = 0i32; - let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(msg.is_null() - || (*msg).magic != 0x11561156i32 as libc::c_uint - || context.is_null() - || (*context).sql.is_null()) - { + let mut stmt = 0 as *mut sqlite3_stmt; + if !msg.is_null() { stmt = - dc_sqlite3_prepare((*context).sql, - b"SELECT m.id,rfc724_mid,m.mime_in_reply_to,m.server_folder,m.server_uid,m.move_state,m.chat_id, m.from_id,m.to_id,m.timestamp,m.timestamp_sent,m.timestamp_rcvd, m.type,m.state,m.msgrmsg,m.txt, m.param,m.starred,m.hidden,m.location_id, c.blocked FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;\x00" + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT m.id,rfc724_mid,m.mime_in_reply_to,m.server_folder,m.server_uid,m.move_state,m.chat_id, m.from_id,m.to_id,m.timestamp,m.timestamp_sent,m.timestamp_rcvd, m.type,m.state,m.msgrmsg,m.txt, m.param,m.starred,m.hidden,m.location_id, c.blocked FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=?;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_int(stmt, 1i32, id as libc::c_int); if !(sqlite3_step(stmt) != 100i32) { @@ -612,18 +609,19 @@ pub unsafe fn dc_get_mime_headers( mut context: &dc_context_t, mut msg_id: uint32_t, ) -> *mut libc::c_char { - let mut eml: &libc::c_char = 0 as *mut libc::c_char; + let mut eml = 0 as *mut libc::c_char; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - stmt = dc_sqlite3_prepare( - (*context).sql, - b"SELECT mime_headers FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char, - ); - sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); - if sqlite3_step(stmt) == 100i32 { - eml = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *const libc::c_char) - } + + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT mime_headers FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char, + ); + sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); + if sqlite3_step(stmt) == 100i32 { + eml = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *const libc::c_char) } + sqlite3_finalize(stmt); return eml; } @@ -632,11 +630,7 @@ pub unsafe fn dc_delete_msgs( mut msg_ids: *const uint32_t, mut msg_cnt: libc::c_int, ) { - if context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || msg_ids.is_null() - || msg_cnt <= 0i32 - { + if msg_ids.is_null() || msg_cnt <= 0i32 { return; } let mut i: libc::c_int = 0i32; @@ -668,8 +662,9 @@ pub unsafe fn dc_update_msg_chat_id( mut msg_id: uint32_t, mut chat_id: uint32_t, ) { - let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare( - (*context).sql, + let stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET chat_id=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int(stmt, 1i32, chat_id as libc::c_int); @@ -682,20 +677,14 @@ pub unsafe fn dc_markseen_msgs( mut msg_ids: *const uint32_t, mut msg_cnt: libc::c_int, ) { - let mut transaction_pending: libc::c_int = 0i32; let mut i: libc::c_int = 0i32; let mut send_event: libc::c_int = 0i32; let mut curr_state: libc::c_int = 0i32; let mut curr_blocked: libc::c_int = 0i32; - let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || msg_ids.is_null() - || msg_cnt <= 0i32) - { - transaction_pending = 1i32; + let mut stmt = 0 as *mut sqlite3_stmt; + if !(msg_ids.is_null() || msg_cnt <= 0i32) { stmt = - dc_sqlite3_prepare((*context).sql, + dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), b"SELECT m.state, c.blocked FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id=? AND m.chat_id>9\x00" as *const u8 as *const libc::c_char); i = 0i32; @@ -730,7 +719,7 @@ pub unsafe fn dc_markseen_msgs( } i += 1 } - transaction_pending = 0i32; + if 0 != send_event { ((*context).cb)( context, @@ -747,7 +736,8 @@ pub unsafe fn dc_update_msg_state( mut msg_id: uint32_t, mut state: libc::c_int, ) { - let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare( + let mut stmt = dc_sqlite3_prepare( + context, &mut context.sql.lock().unwrap(), b"UPDATE msgs SET state=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -762,16 +752,12 @@ pub unsafe fn dc_star_msgs( mut msg_cnt: libc::c_int, mut star: libc::c_int, ) { - if context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || msg_ids.is_null() - || msg_cnt <= 0i32 - || star != 0i32 && star != 1i32 - { + if msg_ids.is_null() || msg_cnt <= 0i32 || star != 0i32 && star != 1i32 { return; } - let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare( - (*context).sql, + let mut stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET starred=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); let mut i: libc::c_int = 0i32; @@ -794,7 +780,7 @@ pub unsafe fn dc_get_msg<'a>(context: &'a dc_context_t, msg_id: uint32_t) -> *mu obj } else { dc_msg_unref(obj); - 0 as &dc_msg_t + 0 as *mut dc_msg_t } } @@ -900,7 +886,7 @@ pub unsafe fn dc_msg_get_duration(mut msg: *const dc_msg_t) -> libc::c_int { return dc_param_get_int((*msg).param, 'd' as i32, 0i32); } pub unsafe fn dc_msg_get_showpadlock(mut msg: *const dc_msg_t) -> libc::c_int { - if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint || (*msg).context.is_null() { + if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint { return 0i32; } if dc_param_get_int((*msg).param, 'c' as i32, 0i32) != 0i32 { @@ -908,9 +894,9 @@ pub unsafe fn dc_msg_get_showpadlock(mut msg: *const dc_msg_t) -> libc::c_int { } return 0i32; } -pub unsafe fn dc_msg_get_summary( - mut msg: *const dc_msg_t, - mut chat: *const dc_chat_t, +pub unsafe fn dc_msg_get_summary<'a>( + msg: *const dc_msg_t<'a>, + mut chat: *const dc_chat_t<'a>, ) -> *mut dc_lot_t { let mut current_block: u64; let mut ret: *mut dc_lot_t = dc_lot_new(); @@ -968,7 +954,7 @@ pub unsafe fn dc_msg_get_summarytext_by_raw( mut context: &dc_context_t, ) -> *mut libc::c_char { /* get a summary text, result must be free()'d, never returns NULL. */ - let mut ret: &libc::c_char = 0 as *mut libc::c_char; + let mut ret = 0 as *mut libc::c_char; let mut prefix: *mut libc::c_char = 0 as *mut libc::c_char; let mut pathNfilename: *mut libc::c_char = 0 as *mut libc::c_char; let mut label: *mut libc::c_char = 0 as *mut libc::c_char; @@ -1075,7 +1061,7 @@ pub unsafe fn dc_msg_is_info(mut msg: *const dc_msg_t) -> libc::c_int { return 0i32; } pub unsafe fn dc_msg_is_increation(mut msg: *const dc_msg_t) -> libc::c_int { - if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint || (*msg).context.is_null() { + if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint { return 0i32; } return (((*msg).type_0 == 20i32 @@ -1198,15 +1184,12 @@ pub unsafe fn dc_msg_latefiling_mediasize( }; } pub unsafe fn dc_msg_save_param_to_disk(mut msg: *mut dc_msg_t) { - if msg.is_null() - || (*msg).magic != 0x11561156i32 as libc::c_uint - || (*msg).context.is_null() - || (*(*msg).context).sql.is_null() - { + if msg.is_null() || (*msg).magic != 0x11561156i32 as libc::c_uint { return; } let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( - (*(*msg).context).sql, + (*msg).context, + &mut (*msg).context.sql.clone().lock().unwrap(), b"UPDATE msgs SET param=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_text(stmt, 1i32, (*(*msg).param).packed, -1i32, None); @@ -1218,7 +1201,7 @@ pub unsafe fn dc_msg_new_load<'a>( context: &'a dc_context_t, msg_id: uint32_t, ) -> *mut dc_msg_t<'a> { - let mut msg: &dc_msg_t = dc_msg_new_untyped(context); + let mut msg = dc_msg_new_untyped(context); dc_msg_load_from_db(msg, context, msg_id); msg } @@ -1228,15 +1211,17 @@ pub unsafe fn dc_delete_msg_from_db(context: &dc_context_t, mut msg_id: uint32_t let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; if !(0 == dc_msg_load_from_db(msg, context, msg_id)) { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"DELETE FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int(stmt, 1i32, (*msg).id as libc::c_int); sqlite3_step(stmt); sqlite3_finalize(stmt); - stmt = 0 as &sqlite3_stmt; + stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"DELETE FROM msgs_mdns WHERE msg_id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int(stmt, 1i32, (*msg).id as libc::c_int); @@ -1255,12 +1240,10 @@ The value is also used for CC:-summaries */ pub unsafe fn dc_msg_exists(mut context: &dc_context_t, mut msg_id: uint32_t) -> libc::c_int { let mut msg_exists: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || msg_id <= 9i32 as libc::c_uint) - { + if !msg_id <= 9i32 as libc::c_uint { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT chat_id FROM msgs WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int(stmt, 1i32, msg_id as libc::c_int); @@ -1281,8 +1264,9 @@ pub unsafe fn dc_update_msg_move_state( ) { // we update the move_state for all messages belonging to a given Message-ID // so that the state stay intact when parts are deleted - let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare( - (*context).sql, + let mut stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET move_state=? WHERE rfc724_mid=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int(stmt, 1i32, state as libc::c_int); @@ -1295,7 +1279,7 @@ pub unsafe fn dc_set_msg_failed( mut msg_id: uint32_t, mut error: *const libc::c_char, ) { - let mut msg: &dc_msg_t = dc_msg_new_untyped(context); + let mut msg = dc_msg_new_untyped(context); let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; if !(0 == dc_msg_load_from_db(msg, context, msg_id)) { if 18i32 == (*msg).state || 20i32 == (*msg).state || 26i32 == (*msg).state { @@ -1311,7 +1295,8 @@ pub unsafe fn dc_set_msg_failed( ); } stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET state=?, param=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_int(stmt, 1i32, (*msg).state); @@ -1334,7 +1319,7 @@ pub unsafe fn dc_mdn_from_ext( mut from_id: uint32_t, mut rfc724_mid: *const libc::c_char, mut timestamp_sent: time_t, - mut ret_chat_id: &uint32_t, + mut ret_chat_id: *mut uint32_t, mut ret_msg_id: *mut uint32_t, ) -> libc::c_int { let mut chat_type: libc::c_int = 0; @@ -1344,9 +1329,7 @@ pub unsafe fn dc_mdn_from_ext( let mut soll_cnt: libc::c_int = 0; let mut read_by_all: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || from_id <= 9i32 as libc::c_uint + if !(from_id <= 9i32 as libc::c_uint || rfc724_mid.is_null() || ret_chat_id.is_null() || ret_msg_id.is_null() @@ -1354,9 +1337,12 @@ pub unsafe fn dc_mdn_from_ext( || *ret_msg_id != 0i32 as libc::c_uint) { stmt = - dc_sqlite3_prepare((*context).sql, - b"SELECT m.id, c.id, c.type, m.state FROM msgs m LEFT JOIN chats c ON m.chat_id=c.id WHERE rfc724_mid=? AND from_id=1 ORDER BY m.id;\x00" - as *const u8 as *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT m.id, c.id, c.type, m.state FROM msgs m LEFT JOIN chats c ON m.chat_id=c.id WHERE rfc724_mid=? AND from_id=1 ORDER BY m.id;\x00" + as *const u8 as *const libc::c_char + ); sqlite3_bind_text(stmt, 1i32, rfc724_mid, -1i32, None); if !(sqlite3_step(stmt) != 100i32) { *ret_msg_id = sqlite3_column_int(stmt, 0i32) as uint32_t; @@ -1368,7 +1354,8 @@ pub unsafe fn dc_mdn_from_ext( if !(msg_state != 18i32 && msg_state != 20i32 && msg_state != 26i32) { /* eg. already marked as MDNS_RCVD. however, it is importent, that the message ID is set above as this will allow the caller eg. to move the message away */ stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT contact_id FROM msgs_mdns WHERE msg_id=? AND contact_id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1383,10 +1370,12 @@ pub unsafe fn dc_mdn_from_ext( stmt = 0 as *mut sqlite3_stmt; if 0 == mdn_already_in_table { stmt = - dc_sqlite3_prepare((*context).sql, - b"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);\x00" - as *const u8 as - *const libc::c_char); + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"INSERT INTO msgs_mdns (msg_id, contact_id, timestamp_sent) VALUES (?, ?, ?);\x00" + as *const u8 as + *const libc::c_char); sqlite3_bind_int(stmt, 1i32, *ret_msg_id as libc::c_int); sqlite3_bind_int(stmt, 2i32, from_id as libc::c_int); sqlite3_bind_int64(stmt, 3i32, timestamp_sent as sqlite3_int64); @@ -1401,7 +1390,8 @@ pub unsafe fn dc_mdn_from_ext( } else { /* send event about new state */ stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM msgs_mdns WHERE msg_id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1442,14 +1432,17 @@ pub unsafe fn dc_mdn_from_ext( pub unsafe fn dc_get_real_msg_cnt(mut context: &dc_context_t) -> size_t { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; let mut ret: size_t = 0i32 as size_t; - if !(*(*context).sql).cobj.is_null() { + if !(*&mut context.sql.clone().lock().unwrap()).cobj.is_null() { stmt = - dc_sqlite3_prepare((*context).sql, - b"SELECT COUNT(*) FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id>9 AND m.chat_id>9 AND c.blocked=0;\x00" + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT COUNT(*) FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE m.id>9 AND m.chat_id>9 AND c.blocked=0;\x00" as *const u8 as *const libc::c_char); if sqlite3_step(stmt) != 100i32 { dc_sqlite3_log_error( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"dc_get_real_msg_cnt() failed.\x00" as *const u8 as *const libc::c_char, ); } else { @@ -1462,12 +1455,9 @@ pub unsafe fn dc_get_real_msg_cnt(mut context: &dc_context_t) -> size_t { pub unsafe fn dc_get_deaddrop_msg_cnt(mut context: &dc_context_t) -> size_t { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; let mut ret: size_t = 0i32 as size_t; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || (*(*context).sql).cobj.is_null()) - { + if !context.sql.clone().lock().unwrap().cobj.is_null() { stmt = - dc_sqlite3_prepare((*context).sql, + dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id WHERE c.blocked=2;\x00" as *const u8 as *const libc::c_char); if !(sqlite3_step(stmt) != 100i32) { @@ -1483,13 +1473,11 @@ pub unsafe fn dc_rfc724_mid_cnt( ) -> libc::c_int { /* check the number of messages with the same rfc724_mid */ let mut ret: libc::c_int = 0i32; - let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || (*(*context).sql).cobj.is_null()) - { + let mut stmt = 0 as *mut sqlite3_stmt; + if !context.sql.clone().lock().unwrap().cobj.is_null() { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT COUNT(*) FROM msgs WHERE rfc724_mid=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1505,16 +1493,14 @@ pub unsafe fn dc_rfc724_mid_exists( mut context: &dc_context_t, mut rfc724_mid: *const libc::c_char, mut ret_server_folder: *mut *mut libc::c_char, - mut ret_server_uid: &uint32_t, + mut ret_server_uid: *mut uint32_t, ) -> uint32_t { let mut ret: uint32_t = 0i32 as uint32_t; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() - || rfc724_mid.is_null() - || *rfc724_mid.offset(0isize) as libc::c_int == 0i32) - { + if !(rfc724_mid.is_null() || *rfc724_mid.offset(0isize) as libc::c_int == 0i32) { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT server_folder, server_uid, id FROM msgs WHERE rfc724_mid=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1545,8 +1531,9 @@ pub unsafe fn dc_update_server_uid( mut server_folder: *const libc::c_char, mut server_uid: uint32_t, ) { - let mut stmt: &sqlite3_stmt = dc_sqlite3_prepare( - (*context).sql, + let mut stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE msgs SET server_folder=?, server_uid=? WHERE rfc724_mid=?;\x00" as *const u8 as *const libc::c_char, ); diff --git a/src/dc_oauth2.rs b/src/dc_oauth2.rs index 3ca4b3387..7ce61f823 100644 --- a/src/dc_oauth2.rs +++ b/src/dc_oauth2.rs @@ -28,15 +28,12 @@ pub unsafe fn dc_get_oauth2_url( ) -> *mut libc::c_char { let mut oauth2: *mut oauth2_t = 0 as *mut oauth2_t; let mut oauth2_url: *mut libc::c_char = 0 as *mut libc::c_char; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || redirect_uri.is_null() - || *redirect_uri.offset(0isize) as libc::c_int == 0i32) - { + if !(redirect_uri.is_null() || *redirect_uri.offset(0isize) as libc::c_int == 0i32) { oauth2 = get_info(addr); if !oauth2.is_null() { dc_sqlite3_set_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_pending_redirect_uri\x00" as *const u8 as *const libc::c_char, redirect_uri, ); @@ -154,12 +151,7 @@ pub unsafe fn dc_get_oauth2_access_token( size: 0, }; 128]; let mut tok_cnt: libc::c_int = 0i32; - let mut locked: libc::c_int = 0i32; - if context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || code.is_null() - || *code.offset(0isize) as libc::c_int == 0i32 - { + if code.is_null() || *code.offset(0isize) as libc::c_int == 0i32 { dc_log_warning( context, 0i32, @@ -174,12 +166,14 @@ pub unsafe fn dc_get_oauth2_access_token( b"Internal OAuth2 error: 2\x00" as *const u8 as *const libc::c_char, ); } else { - pthread_mutex_lock(&mut (*context).oauth2_critical); - locked = 1i32; + let lock = context.oauth2_critical.clone(); + + let l = lock.lock().unwrap(); // read generated token if 0 == flags & 0x1i32 && 0 == is_expired(context) { access_token = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_access_token\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); @@ -196,12 +190,14 @@ pub unsafe fn dc_get_oauth2_access_token( 16914036240511706173 => {} _ => { refresh_token = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_refresh_token\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); refresh_token_for = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_refresh_token_for\x00" as *const u8 as *const libc::c_char, b"unset\x00" as *const u8 as *const libc::c_char, ); @@ -213,7 +209,8 @@ pub unsafe fn dc_get_oauth2_access_token( as *const libc::c_char, ); redirect_uri = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_pending_redirect_uri\x00" as *const u8 as *const libc::c_char, b"unset\x00" as *const u8 as *const libc::c_char, ); @@ -227,7 +224,8 @@ pub unsafe fn dc_get_oauth2_access_token( as *const libc::c_char, ); redirect_uri = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_redirect_uri\x00" as *const u8 as *const libc::c_char, b"unset\x00" as *const u8 as *const libc::c_char, ); @@ -253,7 +251,7 @@ pub unsafe fn dc_get_oauth2_access_token( b"$REFRESH_TOKEN\x00" as *const u8 as *const libc::c_char, refresh_token, ); - json = ((*context).cb)( + json = (context.cb)( context, Event::HTTP_POST, token_url as uintptr_t, @@ -381,12 +379,14 @@ pub unsafe fn dc_get_oauth2_access_token( && 0 != *refresh_token.offset(0isize) as libc::c_int { dc_sqlite3_set_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_refresh_token\x00" as *const u8 as *const libc::c_char, refresh_token, ); dc_sqlite3_set_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_refresh_token_for\x00" as *const u8 as *const libc::c_char, code, @@ -405,12 +405,14 @@ pub unsafe fn dc_get_oauth2_access_token( ); } else { dc_sqlite3_set_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_access_token\x00" as *const u8 as *const libc::c_char, access_token, ); dc_sqlite3_set_config_int64( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_timestamp_expires\x00" as *const u8 as *const libc::c_char, (if 0 != expires_in { @@ -421,7 +423,8 @@ pub unsafe fn dc_get_oauth2_access_token( ); if 0 != update_redirect_uri_on_success { dc_sqlite3_set_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_redirect_uri\x00" as *const u8 as *const libc::c_char, redirect_uri, @@ -432,11 +435,9 @@ pub unsafe fn dc_get_oauth2_access_token( } } } + drop(l); } } - if 0 != locked { - pthread_mutex_unlock(&mut (*context).oauth2_critical); - } free(refresh_token as *mut libc::c_void); free(refresh_token_for as *mut libc::c_void); free(redirect_uri as *mut libc::c_void); @@ -481,7 +482,8 @@ unsafe extern "C" fn jsoneq( } unsafe fn is_expired(mut context: &dc_context_t) -> libc::c_int { let mut expire_timestamp: time_t = dc_sqlite3_get_config_int64( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"oauth2_timestamp_expires\x00" as *const u8 as *const libc::c_char, 0i32 as int64_t, ) as time_t; @@ -501,13 +503,10 @@ pub unsafe fn dc_get_oauth2_addr( let mut access_token: *mut libc::c_char = 0 as *mut libc::c_char; let mut addr_out: *mut libc::c_char = 0 as *mut libc::c_char; let mut oauth2: *mut oauth2_t = 0 as *mut oauth2_t; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || { - oauth2 = get_info(addr); - oauth2.is_null() - } - || (*oauth2).get_userinfo.is_null()) + if !({ + oauth2 = get_info(addr); + oauth2.is_null() + } || (*oauth2).get_userinfo.is_null()) { access_token = dc_get_oauth2_access_token(context, addr, code, 0i32); addr_out = get_oauth2_addr(context, oauth2, access_token); @@ -542,9 +541,7 @@ unsafe fn get_oauth2_addr( size: 0, }; 128]; let mut tok_cnt: libc::c_int = 0i32; - if !(context.is_null() - || (*context).magic != 0x11a11807i32 as libc::c_uint - || access_token.is_null() + if !(access_token.is_null() || *access_token.offset(0isize) as libc::c_int == 0i32 || oauth2.is_null()) { @@ -554,7 +551,7 @@ unsafe fn get_oauth2_addr( b"$ACCESS_TOKEN\x00" as *const u8 as *const libc::c_char, access_token, ); - json = ((*context).cb)( + json = (context.cb)( context, Event::HTTP_GET, userinfo_url as uintptr_t, diff --git a/src/dc_param.rs b/src/dc_param.rs index 9f6f7a865..dc167a09d 100644 --- a/src/dc_param.rs +++ b/src/dc_param.rs @@ -119,9 +119,9 @@ unsafe extern "C" fn find_param( } /* the value may be an empty string, "def" is returned only if the value unset. The result must be free()'d in any case. */ pub unsafe fn dc_param_get( - mut param: *const dc_param_t, - mut key: libc::c_int, - mut def: *const libc::c_char, + param: *const dc_param_t, + key: libc::c_int, + def: *const libc::c_char, ) -> *mut libc::c_char { let mut p1: *mut libc::c_char = 0 as *mut libc::c_char; let mut p2: *mut libc::c_char = 0 as *mut libc::c_char; diff --git a/src/dc_pgp.rs b/src/dc_pgp.rs index 48165a7a4..84e358a2a 100644 --- a/src/dc_pgp.rs +++ b/src/dc_pgp.rs @@ -197,14 +197,12 @@ pub unsafe fn dc_pgp_handle_rpgp_error(mut context: &dc_context_t) -> libc::c_in len = rpgp::rpgp_last_error_length(); if !(len == 0i32) { msg = rpgp::rpgp_last_error_message(); - if !context.is_null() { - dc_log_info( - context, - 0i32, - b"[rpgp][error] %s\x00" as *const u8 as *const libc::c_char, - msg, - ); - } + dc_log_info( + context, + 0i32, + b"[rpgp][error] %s\x00" as *const u8 as *const libc::c_char, + msg, + ); success = 1i32 } if !msg.is_null() { @@ -218,11 +216,7 @@ pub unsafe fn dc_pgp_is_valid_key( ) -> libc::c_int { let mut key_is_valid: libc::c_int = 0i32; let mut key: *mut rpgp::public_or_secret_key = 0 as *mut rpgp::public_or_secret_key; - if !(context.is_null() - || raw_key.is_null() - || (*raw_key).binary.is_null() - || (*raw_key).bytes <= 0i32) - { + if !(raw_key.is_null() || (*raw_key).binary.is_null() || (*raw_key).bytes <= 0i32) { key = rpgp::rpgp_key_from_bytes( (*raw_key).binary as *const uint8_t, (*raw_key).bytes as usize, @@ -242,9 +236,10 @@ pub unsafe fn dc_pgp_is_valid_key( return key_is_valid; } pub unsafe fn dc_pgp_calc_fingerprint( - mut raw_key: *const dc_key_t, - mut ret_fingerprint: *mut *mut uint8_t, - mut ret_fingerprint_bytes: *mut size_t, + context: &dc_context_t, + raw_key: *const dc_key_t, + ret_fingerprint: *mut *mut uint8_t, + ret_fingerprint_bytes: *mut size_t, ) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut key: *mut rpgp::public_or_secret_key = 0 as *mut rpgp::public_or_secret_key; @@ -261,9 +256,9 @@ pub unsafe fn dc_pgp_calc_fingerprint( (*raw_key).binary as *const uint8_t, (*raw_key).bytes as usize, ); - if !(0 != dc_pgp_handle_rpgp_error(0 as &dc_context_t)) { + if !(0 != dc_pgp_handle_rpgp_error(context)) { fingerprint = rpgp::rpgp_key_fingerprint(key); - if !(0 != dc_pgp_handle_rpgp_error(0 as &dc_context_t)) { + if !(0 != dc_pgp_handle_rpgp_error(context)) { *ret_fingerprint_bytes = rpgp::rpgp_cvec_len(fingerprint) as size_t; *ret_fingerprint = malloc(*ret_fingerprint_bytes) as *mut uint8_t; memcpy( @@ -292,7 +287,7 @@ pub unsafe fn dc_pgp_split_key( let mut key: *mut rpgp::signed_secret_key = 0 as *mut rpgp::signed_secret_key; let mut pub_key: *mut rpgp::signed_public_key = 0 as *mut rpgp::signed_public_key; let mut buf: *mut rpgp::cvec = 0 as *mut rpgp::cvec; - if !(context.is_null() || private_in.is_null() || ret_public_key.is_null()) { + if !(private_in.is_null() || ret_public_key.is_null()) { if (*private_in).type_0 != 1i32 { dc_log_warning( context, @@ -349,8 +344,7 @@ pub unsafe fn dc_pgp_pk_encrypt( let mut public_keys: *mut *mut rpgp::signed_public_key = 0 as *mut *mut rpgp::signed_public_key; let mut private_key: *mut rpgp::signed_secret_key = 0 as *mut rpgp::signed_secret_key; let mut encrypted: *mut rpgp::Message = 0 as *mut rpgp::Message; - if !(context.is_null() - || plain_text == 0 as *mut libc::c_void + if !(plain_text == 0 as *mut libc::c_void || plain_bytes == 0 || ret_ctext.is_null() || ret_ctext_bytes.is_null() @@ -522,8 +516,7 @@ pub unsafe fn dc_pgp_pk_decrypt( let mut private_keys: *mut *mut rpgp::signed_secret_key = 0 as *mut *mut rpgp::signed_secret_key; let mut public_keys: *mut *mut rpgp::signed_public_key = 0 as *mut *mut rpgp::signed_public_key; - if !(context.is_null() - || ctext == 0 as *mut libc::c_void + if !(ctext == 0 as *mut libc::c_void || ctext_bytes == 0 || ret_plain.is_null() || ret_plain_bytes.is_null() @@ -673,8 +666,7 @@ pub unsafe fn dc_pgp_symm_encrypt( ) -> libc::c_int { let mut success: libc::c_int = 0i32; let mut decrypted: *mut rpgp::Message = 0 as *mut rpgp::Message; - if !(context.is_null() - || passphrase.is_null() + if !(passphrase.is_null() || plain == 0 as *mut libc::c_void || plain_bytes == 0 || ret_ctext_armored.is_null()) diff --git a/src/dc_qr.rs b/src/dc_qr.rs index d6f679869..23e60c1c6 100644 --- a/src/dc_qr.rs +++ b/src/dc_qr.rs @@ -43,7 +43,7 @@ pub unsafe fn dc_check_qr( 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; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || qr.is_null()) { + if !qr.is_null() { dc_log_info( context, 0i32, @@ -247,7 +247,7 @@ pub unsafe fn dc_check_qr( if addr.is_null() || invitenumber.is_null() || auth.is_null() { if 0 != dc_apeerstate_load_by_fingerprint( peerstate, - (*context).sql, + &mut context.sql.clone().lock().unwrap(), fingerprint, ) { (*qr_parsed).state = 210i32; diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index 4f7f56061..9c34a99b5 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -57,7 +57,6 @@ pub unsafe fn dc_receive_imf( let mut sent_timestamp: time_t = -1i32 as time_t; let mut rcvd_timestamp: time_t = -1i32 as time_t; let mut mime_parser: *mut dc_mimeparser_t = dc_mimeparser_new((*context).blobdir, context); - let mut transaction_pending: libc::c_int = 0i32; let mut field: *const mailimf_field = 0 as *const mailimf_field; let mut mime_in_reply_to: *mut libc::c_char = 0 as *mut libc::c_char; let mut mime_references: *mut libc::c_char = 0 as *mut libc::c_char; @@ -76,7 +75,7 @@ pub unsafe fn dc_receive_imf( }, server_uid, ); - to_ids = dc_array_new(context, 16i32 as size_t); + to_ids = dc_array_new(16i32 as size_t); if to_ids.is_null() || created_db_entries.is_null() || rr_event_to_send.is_null() @@ -107,7 +106,6 @@ pub unsafe fn dc_receive_imf( sent_timestamp = dc_timestamp_from_date((*orig_date).dt_date_time) } } - transaction_pending = 1i32; field = dc_mimeparser_lookup_field( mime_parser, b"From\x00" as *const u8 as *const libc::c_char, @@ -116,7 +114,7 @@ pub unsafe fn dc_receive_imf( let mut fld_from: *mut mailimf_from = (*field).fld_data.fld_from; if !fld_from.is_null() { let mut check_self: libc::c_int = 0; - let mut from_list: *mut dc_array_t = dc_array_new(context, 16i32 as size_t); + let mut from_list: *mut dc_array_t = dc_array_new(16i32 as size_t); dc_add_or_lookup_contacts_by_mailbox_list( context, (*fld_from).frm_mb_list, @@ -225,7 +223,6 @@ pub unsafe fn dc_receive_imf( if strcmp(old_server_folder, server_folder) != 0i32 || old_server_uid != server_uid { - transaction_pending = 0i32; dc_update_server_uid( context, rfc724_mid, @@ -253,7 +250,8 @@ pub unsafe fn dc_receive_imf( let mut allow_creation: libc::c_int = 1i32; if msgrmsg == 0i32 { let mut show_emails: libc::c_int = dc_sqlite3_get_config_int( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"show_emails\x00" as *const u8 as *const libc::c_char, 0i32, ); @@ -465,7 +463,8 @@ pub unsafe fn dc_receive_imf( // if the mime-headers should be saved, find out its size // (the mime-header ends with an empty line) let mut save_mime_headers: libc::c_int = dc_sqlite3_get_config_int( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"save_mime_headers\x00" as *const u8 as *const libc::c_char, 0i32, ); @@ -529,8 +528,10 @@ pub unsafe fn dc_receive_imf( } icnt = carray_count((*mime_parser).parts) as size_t; stmt = - dc_sqlite3_prepare((*context).sql, - b"INSERT INTO msgs (rfc724_mid, server_folder, server_uid, chat_id, from_id, to_id, timestamp, timestamp_sent, timestamp_rcvd, type, state, msgrmsg, txt, txt_raw, param, bytes, hidden, mime_headers, mime_in_reply_to, mime_references) VALUES (?,?,?,?,?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?,?);\x00" + dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"INSERT INTO msgs (rfc724_mid, server_folder, server_uid, chat_id, from_id, to_id, timestamp, timestamp_sent, timestamp_rcvd, type, state, msgrmsg, txt, txt_raw, param, bytes, hidden, mime_headers, mime_in_reply_to, mime_references) VALUES (?,?,?,?,?,?, ?,?,?,?,?,?, ?,?,?,?,?,?, ?,?);\x00" as *const u8 as *const libc::c_char); i = 0i32 as size_t; @@ -646,7 +647,8 @@ pub unsafe fn dc_receive_imf( free(txt_raw as *mut libc::c_void); txt_raw = 0 as *mut libc::c_char; insert_msg_id = dc_sqlite3_get_rowid( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"msgs\x00" as *const u8 as *const libc::c_char, b"rfc724_mid\x00" as *const u8 as *const libc::c_char, rfc724_mid, @@ -706,7 +708,8 @@ pub unsafe fn dc_receive_imf( _ => { if carray_count((*mime_parser).reports) > 0i32 as libc::c_uint { let mut mdns_enabled: libc::c_int = dc_sqlite3_get_config_int( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"mdns_enabled\x00" as *const u8 as *const libc::c_char, 1i32, ); @@ -897,7 +900,8 @@ pub unsafe fn dc_receive_imf( dc_param_set_int(param, 'z' as i32, server_uid as int32_t); if 0 != (*mime_parser).is_send_by_messenger && 0 != dc_sqlite3_get_config_int( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"mvbox_move\x00" as *const u8 as *const libc::c_char, 1i32, @@ -984,7 +988,6 @@ pub unsafe fn dc_receive_imf( 0i32, ); } - transaction_pending = 0i32 } } } @@ -1051,7 +1054,8 @@ unsafe fn calc_timestamps( *sort_timestamp = message_timestamp; if 0 != is_fresh_msg { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT MAX(timestamp) FROM msgs WHERE chat_id=? and from_id!=? AND timestamp>=?\x00" as *const u8 as *const libc::c_char, ); @@ -1313,7 +1317,8 @@ unsafe fn create_or_lookup_group( /* check if the group does not exist but should be created */ group_explicitly_left = dc_is_group_explicitly_left(context, grpid); self_addr = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, ); @@ -1391,7 +1396,8 @@ unsafe fn create_or_lookup_group( && strlen(grpname) < 200 { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"UPDATE chats SET name=? WHERE id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1460,7 +1466,8 @@ unsafe fn create_or_lookup_group( 0 as *mut libc::c_char }; stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"DELETE FROM chats_contacts WHERE chat_id=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1593,7 +1600,7 @@ unsafe fn create_or_lookup_adhoc_group( sqlite3_mprintf(b"SELECT c.id, c.blocked FROM chats c LEFT JOIN msgs m ON m.chat_id=c.id WHERE c.id IN(%s) ORDER BY m.timestamp DESC, m.id DESC LIMIT 1;\x00" as *const u8 as *const libc::c_char, chat_ids_str); - stmt = dc_sqlite3_prepare((*context).sql, q3); + stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3); if sqlite3_step(stmt) == 100i32 { chat_id = sqlite3_column_int(stmt, 0i32) as uint32_t; chat_id_blocked = sqlite3_column_int(stmt, 1i32); @@ -1674,7 +1681,8 @@ unsafe fn create_group_record( let mut chat_id: uint32_t = 0i32 as uint32_t; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"INSERT INTO chats (type, name, grpid, blocked) VALUES(?, ?, ?, ?);\x00" as *const u8 as *const libc::c_char, ); @@ -1688,7 +1696,8 @@ unsafe fn create_group_record( sqlite3_bind_int(stmt, 4i32, create_blocked); if !(sqlite3_step(stmt) != 101i32) { chat_id = dc_sqlite3_get_rowid( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"chats\x00" as *const u8 as *const libc::c_char, b"grpid\x00" as *const u8 as *const libc::c_char, grpid, @@ -1707,7 +1716,7 @@ unsafe fn create_adhoc_grp_id( - sha-256 this string (without possibly terminating null-characters) - encode the first 64 bits of the sha-256 output as lowercase hex (results in 16 characters from the set [0-9a-f]) */ - let mut member_addrs: *mut dc_array_t = dc_array_new(context, 23i32 as size_t); + let mut member_addrs: *mut dc_array_t = dc_array_new(23i32 as size_t); let mut member_ids_str: *mut libc::c_char = dc_array_get_string(member_ids, b",\x00" as *const u8 as *const libc::c_char); let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; @@ -1728,9 +1737,10 @@ unsafe fn create_adhoc_grp_id( as *const libc::c_char, member_ids_str, ); - stmt = dc_sqlite3_prepare((*context).sql, q3); + stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3); addr = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"no-self\x00" as *const u8 as *const libc::c_char, ); @@ -1788,62 +1798,62 @@ unsafe fn search_chat_ids_by_contact_ids( ) -> *mut dc_array_t { /* searches chat_id's by the given contact IDs, may return zero, one or more chat_id's */ let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - let mut contact_ids: *mut dc_array_t = dc_array_new(context, 23i32 as size_t); + let mut contact_ids: *mut dc_array_t = dc_array_new(23i32 as size_t); let mut contact_ids_str: *mut libc::c_char = 0 as *mut libc::c_char; let mut q3: *mut libc::c_char = 0 as *mut libc::c_char; - let mut chat_ids: *mut dc_array_t = dc_array_new(context, 23i32 as size_t); - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - /* copy array, remove duplicates and SELF, sort by ID */ - let mut i: libc::c_int = 0; - let mut iCnt: libc::c_int = dc_array_get_cnt(unsorted_contact_ids) as libc::c_int; - if !(iCnt <= 0i32) { - i = 0i32; - while i < iCnt { - let mut curr_id: uint32_t = dc_array_get_id(unsorted_contact_ids, i as size_t); - if curr_id != 1i32 as libc::c_uint - && 0 == dc_array_search_id(contact_ids, curr_id, 0 as *mut size_t) - { - dc_array_add_id(contact_ids, curr_id); - } - i += 1 + let mut chat_ids: *mut dc_array_t = dc_array_new(23i32 as size_t); + + /* copy array, remove duplicates and SELF, sort by ID */ + let mut i: libc::c_int = 0; + let mut iCnt: libc::c_int = dc_array_get_cnt(unsorted_contact_ids) as libc::c_int; + if !(iCnt <= 0i32) { + i = 0i32; + while i < iCnt { + let mut curr_id: uint32_t = dc_array_get_id(unsorted_contact_ids, i as size_t); + if curr_id != 1i32 as libc::c_uint + && 0 == dc_array_search_id(contact_ids, curr_id, 0 as *mut size_t) + { + dc_array_add_id(contact_ids, curr_id); } - if !(dc_array_get_cnt(contact_ids) == 0) { - dc_array_sort_ids(contact_ids); - contact_ids_str = - dc_array_get_string(contact_ids, b",\x00" as *const u8 as *const libc::c_char); - q3 = + i += 1 + } + if !(dc_array_get_cnt(contact_ids) == 0) { + dc_array_sort_ids(contact_ids); + contact_ids_str = + dc_array_get_string(contact_ids, b",\x00" as *const u8 as *const libc::c_char); + q3 = sqlite3_mprintf(b"SELECT DISTINCT cc.chat_id, cc.contact_id FROM chats_contacts cc LEFT JOIN chats c ON c.id=cc.chat_id WHERE cc.chat_id IN(SELECT chat_id FROM chats_contacts WHERE contact_id IN(%s)) AND c.type=120 AND cc.contact_id!=1 ORDER BY cc.chat_id, cc.contact_id;\x00" as *const u8 as *const libc::c_char, contact_ids_str); - stmt = dc_sqlite3_prepare((*context).sql, q3); - let mut last_chat_id = 0; - let mut matches = 0; - let mut mismatches = 0; - while sqlite3_step(stmt) == 100 { - let mut chat_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t; - let mut contact_id: uint32_t = sqlite3_column_int(stmt, 1i32) as uint32_t; - if chat_id != last_chat_id { - if matches == dc_array_get_cnt(contact_ids) - && mismatches == 0i32 as libc::c_uint - { - dc_array_add_id(chat_ids, last_chat_id); - } - last_chat_id = chat_id; - matches = 0; - mismatches = 0; - } - if contact_id == dc_array_get_id(contact_ids, matches as size_t) { - matches = matches.wrapping_add(1) - } else { - mismatches = mismatches.wrapping_add(1) + stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3); + let mut last_chat_id = 0; + let mut matches = 0; + let mut mismatches = 0; + while sqlite3_step(stmt) == 100 { + let mut chat_id: uint32_t = sqlite3_column_int(stmt, 0i32) as uint32_t; + let mut contact_id: uint32_t = sqlite3_column_int(stmt, 1i32) as uint32_t; + if chat_id != last_chat_id { + if matches == dc_array_get_cnt(contact_ids) + && mismatches == 0i32 as libc::c_uint + { + dc_array_add_id(chat_ids, last_chat_id); } + last_chat_id = chat_id; + matches = 0; + mismatches = 0; } - if matches == dc_array_get_cnt(contact_ids) && mismatches == 0 { - dc_array_add_id(chat_ids, last_chat_id); + if contact_id == dc_array_get_id(contact_ids, matches as size_t) { + matches = matches.wrapping_add(1) + } else { + mismatches = mismatches.wrapping_add(1) } } + if matches == dc_array_get_cnt(contact_ids) && mismatches == 0 { + dc_array_add_id(chat_ids, last_chat_id); + } } } + sqlite3_finalize(stmt); free(contact_ids_str as *mut libc::c_void); dc_array_unref(contact_ids); @@ -1864,7 +1874,7 @@ unsafe fn check_verified_properties( let mut to_ids_str: *mut libc::c_char = 0 as *mut libc::c_char; let mut q3: *mut libc::c_char = 0 as *mut libc::c_char; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if 0 == dc_contact_load_from_db(contact, (*context).sql, from_id) { + if 0 == dc_contact_load_from_db(contact, &mut context.sql.clone().lock().unwrap(), from_id) { *failure_reason = dc_mprintf( b"%s. See \"Info\" for details.\x00" as *const u8 as *const libc::c_char, b"Internal Error; cannot load contact.\x00" as *const u8 as *const libc::c_char, @@ -1882,8 +1892,11 @@ unsafe fn check_verified_properties( // this check is skipped for SELF as there is no proper SELF-peerstate // and results in group-splits otherwise. if from_id != 1i32 as libc::c_uint { - if 0 == dc_apeerstate_load_by_addr(peerstate, (*context).sql, (*contact).addr) - || dc_contact_is_verified_ex(contact, peerstate) != 2i32 + if 0 == dc_apeerstate_load_by_addr( + peerstate, + &mut context.sql.clone().lock().unwrap(), + (*contact).addr, + ) || dc_contact_is_verified_ex(contact, peerstate) != 2i32 { *failure_reason = dc_mprintf( b"%s. See \"Info\" for details.\x00" as *const u8 as *const libc::c_char, @@ -1920,7 +1933,7 @@ unsafe fn check_verified_properties( sqlite3_mprintf(b"SELECT c.addr, LENGTH(ps.verified_key_fingerprint) FROM contacts c LEFT JOIN acpeerstates ps ON c.addr=ps.addr WHERE c.id IN(%s) \x00" as *const u8 as *const libc::c_char, to_ids_str); - stmt = dc_sqlite3_prepare((*context).sql, q3); + stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), q3); loop { if !(sqlite3_step(stmt) == 100i32) { current_block = 2604890879466389055; @@ -1935,7 +1948,11 @@ unsafe fn check_verified_properties( strlen(to_addr) as libc::c_int, ) .is_null() - && 0 != dc_apeerstate_load_by_addr(peerstate, (*context).sql, to_addr) + && 0 != dc_apeerstate_load_by_addr( + peerstate, + &mut context.sql.clone().lock().unwrap(), + to_addr, + ) { if 0 == is_verified || strcmp( @@ -1960,7 +1977,11 @@ unsafe fn check_verified_properties( (*peerstate).gossip_key_fingerprint, 2i32, ); - dc_apeerstate_save_to_db(peerstate, (*context).sql, 0i32); + dc_apeerstate_save_to_db( + peerstate, + &mut context.sql.clone().lock().unwrap(), + 0i32, + ); is_verified = 1i32 } } @@ -2095,7 +2116,7 @@ unsafe fn is_known_rfc724_mid( let mut is_known: libc::c_int = 0i32; if !rfc724_mid.is_null() { let mut stmt: *mut sqlite3_stmt = - dc_sqlite3_prepare((*context).sql, + dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), b"SELECT m.id FROM msgs m LEFT JOIN chats c ON m.chat_id=c.id WHERE m.rfc724_mid=? AND m.chat_id>9 AND c.blocked=0;\x00" as *const u8 as *const libc::c_char); sqlite3_bind_text(stmt, 1i32, rfc724_mid, -1i32, None); @@ -2184,7 +2205,8 @@ unsafe fn is_msgrmsg_rfc724_mid( let mut is_msgrmsg: libc::c_int = 0i32; if !rfc724_mid.is_null() { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM msgs WHERE rfc724_mid=? AND msgrmsg!=0 AND chat_id>9;\x00" as *const u8 as *const libc::c_char, ); @@ -2203,8 +2225,7 @@ unsafe fn dc_add_or_lookup_contacts_by_address_list( mut ids: *mut dc_array_t, mut check_self: *mut libc::c_int, ) { - if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || adr_list.is_null() - { + if adr_list.is_null() { return; } let mut cur: *mut clistiter = (*(*adr_list).ad_list).first; @@ -2254,7 +2275,7 @@ unsafe fn dc_add_or_lookup_contacts_by_mailbox_list( mut ids: *mut dc_array_t, mut check_self: *mut libc::c_int, ) { - if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || mb_list.is_null() { + if mb_list.is_null() { return; } let mut cur: *mut clistiter = (*(*mb_list).mb_list).first; @@ -2297,13 +2318,13 @@ unsafe fn add_or_lookup_contact_by_addr( if check_self.is_null() { check_self = &mut dummy } - if context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || addr_spec.is_null() - { + if addr_spec.is_null() { return; } *check_self = 0i32; let mut self_addr: *mut libc::c_char = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, b"\x00" as *const u8 as *const libc::c_char, ); diff --git a/src/dc_securejoin.rs b/src/dc_securejoin.rs index 3a397ea8f..9e59e3147 100644 --- a/src/dc_securejoin.rs +++ b/src/dc_securejoin.rs @@ -44,91 +44,92 @@ pub unsafe fn dc_get_securejoin_qr( let mut chat: *mut dc_chat_t = 0 as *mut dc_chat_t; let mut group_name: *mut libc::c_char = 0 as *mut libc::c_char; let mut group_name_urlencoded: *mut libc::c_char = 0 as *mut libc::c_char; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - dc_ensure_secret_key_exists(context); - invitenumber = dc_token_lookup(context, DC_TOKEN_INVITENUMBER, group_chat_id); - if invitenumber.is_null() { - invitenumber = dc_create_id(); - dc_token_save(context, DC_TOKEN_INVITENUMBER, group_chat_id, invitenumber); - } - auth = dc_token_lookup(context, DC_TOKEN_AUTH, group_chat_id); - if auth.is_null() { - auth = dc_create_id(); - dc_token_save(context, DC_TOKEN_AUTH, group_chat_id, auth); - } - self_addr = dc_sqlite3_get_config( - (*context).sql, - b"configured_addr\x00" as *const u8 as *const libc::c_char, - 0 as *const libc::c_char, + + dc_ensure_secret_key_exists(context); + invitenumber = dc_token_lookup(context, DC_TOKEN_INVITENUMBER, group_chat_id); + if invitenumber.is_null() { + invitenumber = dc_create_id(); + dc_token_save(context, DC_TOKEN_INVITENUMBER, group_chat_id, invitenumber); + } + auth = dc_token_lookup(context, DC_TOKEN_AUTH, group_chat_id); + if auth.is_null() { + auth = dc_create_id(); + dc_token_save(context, DC_TOKEN_AUTH, group_chat_id, auth); + } + self_addr = dc_sqlite3_get_config( + context, + &mut context.sql.clone().lock().unwrap(), + b"configured_addr\x00" as *const u8 as *const libc::c_char, + 0 as *const libc::c_char, + ); + if self_addr.is_null() { + dc_log_error( + context, + 0i32, + b"Not configured, cannot generate QR code.\x00" as *const u8 as *const libc::c_char, ); - if self_addr.is_null() { - dc_log_error( - context, - 0i32, - b"Not configured, cannot generate QR code.\x00" as *const u8 as *const libc::c_char, - ); - } else { - self_name = dc_sqlite3_get_config( - (*context).sql, - b"displayname\x00" as *const u8 as *const libc::c_char, - b"\x00" as *const u8 as *const libc::c_char, - ); - fingerprint = get_self_fingerprint(context); - if !fingerprint.is_null() { - self_addr_urlencoded = dc_urlencode(self_addr); - self_name_urlencoded = dc_urlencode(self_name); - if 0 != group_chat_id { - chat = dc_get_chat(context, group_chat_id); - if chat.is_null() { - dc_log_error( - context, - 0i32, - b"Cannot get QR-code for chat-id %i\x00" as *const u8 - as *const libc::c_char, - group_chat_id, - ); - current_block = 9531737720721467826; - } else { - group_name = dc_chat_get_name(chat); - group_name_urlencoded = dc_urlencode(group_name); - qr = dc_mprintf( - b"OPENPGP4FPR:%s#a=%s&g=%s&x=%s&i=%s&s=%s\x00" as *const u8 - as *const libc::c_char, - fingerprint, - self_addr_urlencoded, - group_name_urlencoded, - (*chat).grpid, - invitenumber, - auth, - ); - current_block = 1118134448028020070; - } + } else { + self_name = dc_sqlite3_get_config( + context, + &mut context.sql.clone().lock().unwrap(), + b"displayname\x00" as *const u8 as *const libc::c_char, + b"\x00" as *const u8 as *const libc::c_char, + ); + fingerprint = get_self_fingerprint(context); + if !fingerprint.is_null() { + self_addr_urlencoded = dc_urlencode(self_addr); + self_name_urlencoded = dc_urlencode(self_name); + if 0 != group_chat_id { + chat = dc_get_chat(context, group_chat_id); + if chat.is_null() { + dc_log_error( + context, + 0i32, + b"Cannot get QR-code for chat-id %i\x00" as *const u8 + as *const libc::c_char, + group_chat_id, + ); + current_block = 9531737720721467826; } else { + group_name = dc_chat_get_name(chat); + group_name_urlencoded = dc_urlencode(group_name); qr = dc_mprintf( - b"OPENPGP4FPR:%s#a=%s&n=%s&i=%s&s=%s\x00" as *const u8 + b"OPENPGP4FPR:%s#a=%s&g=%s&x=%s&i=%s&s=%s\x00" as *const u8 as *const libc::c_char, fingerprint, self_addr_urlencoded, - self_name_urlencoded, + group_name_urlencoded, + (*chat).grpid, invitenumber, auth, ); current_block = 1118134448028020070; } - match current_block { - 9531737720721467826 => {} - _ => { - dc_log_info( - context, - 0i32, - b"Generated QR code: %s\x00" as *const u8 as *const libc::c_char, - qr, - ); - } + } else { + qr = dc_mprintf( + b"OPENPGP4FPR:%s#a=%s&n=%s&i=%s&s=%s\x00" as *const u8 as *const libc::c_char, + fingerprint, + self_addr_urlencoded, + self_name_urlencoded, + invitenumber, + auth, + ); + current_block = 1118134448028020070; + } + match current_block { + 9531737720721467826 => {} + _ => { + dc_log_info( + context, + 0i32, + b"Generated QR code: %s\x00" as *const u8 as *const libc::c_char, + qr, + ); } } } } + free(self_addr_urlencoded as *mut libc::c_void); free(self_addr as *mut libc::c_void); free(self_name as *mut libc::c_void); @@ -145,17 +146,26 @@ pub unsafe fn dc_get_securejoin_qr( dc_strdup(0 as *const libc::c_char) }; } + unsafe fn get_self_fingerprint(mut context: &dc_context_t) -> *mut libc::c_char { let mut self_addr: *mut libc::c_char = 0 as *mut libc::c_char; let mut self_key: *mut dc_key_t = dc_key_new(); let mut fingerprint: *mut libc::c_char = 0 as *mut libc::c_char; self_addr = dc_sqlite3_get_config( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"configured_addr\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, ); - if !(self_addr.is_null() || 0 == dc_key_load_self_public(self_key, self_addr, (*context).sql)) { - fingerprint = dc_key_get_fingerprint(self_key); + if !(self_addr.is_null() + || 0 == dc_key_load_self_public( + context, + self_key, + self_addr, + &mut context.sql.clone().lock().unwrap(), + )) + { + fingerprint = dc_key_get_fingerprint(context, self_key); fingerprint.is_null(); } free(self_addr as *mut libc::c_void); @@ -175,7 +185,6 @@ pub unsafe fn dc_join_securejoin( let mut contact_chat_id: uint32_t = 0i32 as uint32_t; let mut join_vg: libc::c_int = 0i32; let mut qr_scan: *mut dc_lot_t = 0 as *mut dc_lot_t; - let mut qr_locked: libc::c_int = 0i32; dc_log_info( context, 0i32, @@ -199,16 +208,12 @@ pub unsafe fn dc_join_securejoin( 0i32, b"Unknown contact.\x00" as *const u8 as *const libc::c_char, ); - } else if !(0 != (*context).shall_stop_ongoing) { + } else if !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { join_vg = ((*qr_scan).state == 202i32) as libc::c_int; - (*context).bobs_status = 0i32; - pthread_mutex_lock(&mut (*context).bobs_qr_critical); - qr_locked = 1i32; - (*context).bobs_qr_scan = qr_scan; - if 0 != qr_locked { - pthread_mutex_unlock(&mut (*context).bobs_qr_critical); - qr_locked = 0i32 - } + let bob_a = context.bob.clone(); + let mut bob = bob_a.write().unwrap(); + bob.status = 0; + bob.qr_scan = qr_scan; if 0 != fingerprint_equals_sender(context, (*qr_scan).fingerprint, contact_chat_id) { dc_log_info( @@ -216,8 +221,8 @@ pub unsafe fn dc_join_securejoin( 0i32, b"Taking protocol shortcut.\x00" as *const u8 as *const libc::c_char, ); - (*context).bob_expects = 6i32; - ((*context).cb)( + bob.expects = 6; + (context.cb)( context, Event::SECUREJOIN_JOINER_PROGRESS, chat_id_2_contact_id(context, contact_chat_id) as uintptr_t, @@ -242,7 +247,7 @@ pub unsafe fn dc_join_securejoin( ); free(own_fingerprint as *mut libc::c_void); } else { - (*context).bob_expects = 2i32; + bob.expects = 2; send_handshake_msg( context, contact_chat_id, @@ -257,14 +262,17 @@ pub unsafe fn dc_join_securejoin( ); } // Bob -> Alice - while !(0 != (*context).shall_stop_ongoing) { + while !(0 != *context.shall_stop_ongoing.clone().read().unwrap()) { usleep((300i32 * 1000i32) as useconds_t); } } } } - (*context).bob_expects = 0i32; - if (*context).bobs_status == 1i32 { + let bob_a = context.bob.clone(); + let mut bob = bob_a.write().unwrap(); + + bob.expects = 0; + if bob.status == 1 { if 0 != join_vg { ret_chat_id = dc_get_chat_id_by_grpid( context, @@ -276,19 +284,15 @@ pub unsafe fn dc_join_securejoin( ret_chat_id = contact_chat_id as libc::c_int } } - pthread_mutex_lock(&mut (*context).bobs_qr_critical); - qr_locked = 1i32; - (*context).bobs_qr_scan = 0 as *mut dc_lot_t; - if 0 != qr_locked { - pthread_mutex_unlock(&mut (*context).bobs_qr_critical); - qr_locked = 0i32 - } + bob.qr_scan = std::ptr::null_mut(); + dc_lot_unref(qr_scan); if 0 != ongoing_allocated { dc_free_ongoing(context); } - return ret_chat_id as uint32_t; + ret_chat_id as uint32_t } + unsafe fn send_handshake_msg( mut context: &dc_context_t, mut contact_chat_id: uint32_t, @@ -351,10 +355,14 @@ unsafe fn fingerprint_equals_sender( if !(0 == dc_contact_load_from_db( contact, - (*context).sql, + &mut context.sql.clone().lock().unwrap(), dc_array_get_id(contacts, 0i32 as size_t), ) - || 0 == dc_apeerstate_load_by_addr(peerstate, (*context).sql, (*contact).addr)) + || 0 == dc_apeerstate_load_by_addr( + peerstate, + &mut context.sql.clone().lock().unwrap(), + (*contact).addr, + )) { fingerprint_normalized = dc_normalize_fingerprint(fingerprint); if strcasecmp(fingerprint_normalized, (*peerstate).public_key_fingerprint) == 0i32 { @@ -369,12 +377,11 @@ unsafe fn fingerprint_equals_sender( } /* library private: secure-join */ pub unsafe fn dc_handle_securejoin_handshake( - mut context: &dc_context_t, - mut mimeparser: *mut dc_mimeparser_t, - mut contact_id: uint32_t, + context: &dc_context_t, + mimeparser: *mut dc_mimeparser_t, + contact_id: uint32_t, ) -> libc::c_int { let mut current_block: u64; - let mut qr_locked: libc::c_int = 0i32; let mut step: *const libc::c_char = 0 as *const libc::c_char; let mut join_vg: libc::c_int = 0i32; let mut scanned_fingerprint_of_alice: *mut libc::c_char = 0 as *mut libc::c_char; @@ -385,7 +392,7 @@ pub unsafe fn dc_handle_securejoin_handshake( let mut grpid: *mut libc::c_char = 0 as *mut libc::c_char; let mut ret: libc::c_int = 0i32; let mut contact: *mut dc_contact_t = 0 as *mut dc_contact_t; - if !(context.is_null() || mimeparser.is_null() || contact_id <= 9i32 as libc::c_uint) { + if !(mimeparser.is_null() || contact_id <= 9i32 as libc::c_uint) { step = lookup_field( mimeparser, b"Secure-Join\x00" as *const u8 as *const libc::c_char, @@ -449,7 +456,7 @@ pub unsafe fn dc_handle_securejoin_handshake( 0i32, b"Secure-join requested.\x00" as *const u8 as *const libc::c_char, ); - ((*context).cb)( + (context.cb)( context, Event::SECUREJOIN_INVITER_PROGRESS, contact_id as uintptr_t, @@ -478,11 +485,10 @@ pub unsafe fn dc_handle_securejoin_handshake( b"vc-auth-required\x00" as *const u8 as *const libc::c_char, ) == 0i32 { - pthread_mutex_lock(&mut (*context).bobs_qr_critical); - qr_locked = 1i32; - if (*context).bobs_qr_scan.is_null() - || (*context).bob_expects != 2i32 - || 0 != join_vg && (*(*context).bobs_qr_scan).state != 202i32 + let bob_a = context.bob.clone(); + let bob = bob_a.read().unwrap(); + let scan = bob.qr_scan; + if scan.is_null() || bob.expects != 2i32 || 0 != join_vg && (*scan).state != 202i32 { dc_log_warning( context, @@ -493,15 +499,10 @@ pub unsafe fn dc_handle_securejoin_handshake( // no error, just aborted somehow or a mail from another handshake current_block = 4378276786830486580; } else { - scanned_fingerprint_of_alice = - dc_strdup((*(*context).bobs_qr_scan).fingerprint); - auth = dc_strdup((*(*context).bobs_qr_scan).auth); + scanned_fingerprint_of_alice = dc_strdup((*scan).fingerprint); + auth = dc_strdup((*scan).auth); if 0 != join_vg { - grpid = dc_strdup((*(*context).bobs_qr_scan).text2) - } - if 0 != qr_locked { - pthread_mutex_unlock(&mut (*context).bobs_qr_critical); - qr_locked = 0i32 + grpid = dc_strdup((*scan).text2) } if 0 == encrypted_and_signed(mimeparser, scanned_fingerprint_of_alice) { could_not_establish_secure_connection( @@ -537,13 +538,14 @@ pub unsafe fn dc_handle_securejoin_handshake( b"Fingerprint verified.\x00" as *const u8 as *const libc::c_char, ); own_fingerprint = get_self_fingerprint(context); - ((*context).cb)( + (context.cb)( context, Event::SECUREJOIN_JOINER_PROGRESS, contact_id as uintptr_t, 400i32 as uintptr_t, ); - (*context).bob_expects = 6i32; + context.bob.clone().write().unwrap().expects = 6; + send_handshake_msg( context, contact_chat_id, @@ -643,13 +645,13 @@ pub unsafe fn dc_handle_securejoin_handshake( b"Auth verified.\x00" as *const u8 as *const libc::c_char, ); secure_connection_established(context, contact_chat_id); - ((*context).cb)( + (context.cb)( context, Event::CONTACTS_CHANGED, contact_id as uintptr_t, 0i32 as uintptr_t, ); - ((*context).cb)( + (context.cb)( context, Event::SECUREJOIN_INVITER_PROGRESS, contact_id as uintptr_t, @@ -692,7 +694,7 @@ pub unsafe fn dc_handle_securejoin_handshake( 0 as *const libc::c_char, 0 as *const libc::c_char, ); - ((*context).cb)( + (context.cb)( context, Event::SECUREJOIN_INVITER_PROGRESS, contact_id as uintptr_t, @@ -714,7 +716,7 @@ pub unsafe fn dc_handle_securejoin_handshake( if 0 != join_vg { ret = 0x1i32 } - if (*context).bob_expects != 6i32 { + if context.bob.clone().read().unwrap().expects != 6 { dc_log_info( context, 0i32, @@ -723,11 +725,8 @@ pub unsafe fn dc_handle_securejoin_handshake( ); current_block = 4378276786830486580; } else { - pthread_mutex_lock(&mut (*context).bobs_qr_critical); - qr_locked = 1i32; - if (*context).bobs_qr_scan.is_null() - || 0 != join_vg && (*(*context).bobs_qr_scan).state != 202i32 - { + let scan = context.bob.clone().read().unwrap().qr_scan; + if scan.is_null() || 0 != join_vg && (*scan).state != 202i32 { dc_log_warning( context, 0i32, @@ -736,14 +735,9 @@ pub unsafe fn dc_handle_securejoin_handshake( ); current_block = 4378276786830486580; } else { - scanned_fingerprint_of_alice = - dc_strdup((*(*context).bobs_qr_scan).fingerprint); + scanned_fingerprint_of_alice = dc_strdup((*scan).fingerprint); if 0 != join_vg { - grpid = dc_strdup((*(*context).bobs_qr_scan).text2) - } - if 0 != qr_locked { - pthread_mutex_unlock(&mut (*context).bobs_qr_critical); - qr_locked = 0i32 + grpid = dc_strdup((*scan).text2) } let mut vg_expect_encrypted: libc::c_int = 1i32; if 0 != join_vg { @@ -788,7 +782,7 @@ pub unsafe fn dc_handle_securejoin_handshake( current_block = 4378276786830486580; } else { dc_scaleup_contact_origin(context, contact_id, 0x2000000i32); - ((*context).cb)( + (context.cb)( context, Event::CONTACTS_CHANGED, 0i32 as uintptr_t, @@ -818,7 +812,7 @@ pub unsafe fn dc_handle_securejoin_handshake( 4378276786830486580 => {} _ => { secure_connection_established(context, contact_chat_id); - (*context).bob_expects = 0i32; + context.bob.clone().write().unwrap().expects = 0; if 0 != join_vg { send_handshake_msg( context, @@ -858,13 +852,13 @@ pub unsafe fn dc_handle_securejoin_handshake( ); current_block = 4378276786830486580; } else { - ((*context).cb)( + (context.cb)( context, Event::SECUREJOIN_INVITER_PROGRESS, contact_id as uintptr_t, 800i32 as uintptr_t, ); - ((*context).cb)( + (context.cb)( context, Event::SECUREJOIN_INVITER_PROGRESS, contact_id as uintptr_t, @@ -885,10 +879,6 @@ pub unsafe fn dc_handle_securejoin_handshake( } } } - if 0 != qr_locked { - pthread_mutex_unlock(&mut (*context).bobs_qr_critical); - qr_locked = 0i32 - } dc_contact_unref(contact); free(scanned_fingerprint_of_alice as *mut libc::c_void); free(auth as *mut libc::c_void); @@ -896,8 +886,8 @@ pub unsafe fn dc_handle_securejoin_handshake( free(grpid as *mut libc::c_void); return ret; } -unsafe fn end_bobs_joining(mut context: &dc_context_t, mut status: libc::c_int) { - (*context).bobs_status = status; +unsafe fn end_bobs_joining(context: &dc_context_t, status: libc::c_int) { + context.bob.clone().write().unwrap().status = status; dc_stop_ongoing_process(context); } unsafe fn secure_connection_established(mut context: &dc_context_t, mut contact_chat_id: uint32_t) { @@ -913,7 +903,7 @@ unsafe fn secure_connection_established(mut context: &dc_context_t, mut contact_ }, ); dc_add_device_msg(context, contact_chat_id, msg); - ((*context).cb)( + (context.cb)( context, Event::CHAT_MODIFIED, contact_chat_id as uintptr_t, @@ -941,12 +931,12 @@ unsafe fn lookup_field( return value; } unsafe fn could_not_establish_secure_connection( - mut context: *mut dc_context_t, - mut contact_chat_id: uint32_t, - mut details: *const libc::c_char, + context: &dc_context_t, + contact_chat_id: uint32_t, + details: *const libc::c_char, ) { let mut contact_id: uint32_t = chat_id_2_contact_id(context, contact_chat_id); - let mut contact: &dc_contact_t = dc_get_contact(context, contact_id); + let mut contact = dc_get_contact(context, contact_id); let mut msg: *mut libc::c_char = dc_stock_str_repl_string( context, 36i32, @@ -968,16 +958,22 @@ unsafe fn could_not_establish_secure_connection( dc_contact_unref(contact); } unsafe fn mark_peer_as_verified( - mut context: *mut dc_context_t, - mut fingerprint: *const libc::c_char, + context: &dc_context_t, + fingerprint: *const libc::c_char, ) -> libc::c_int { let mut success: libc::c_int = 0i32; - let mut peerstate: &dc_apeerstate_t = dc_apeerstate_new(context); - if !(0 == dc_apeerstate_load_by_fingerprint(peerstate, (*context).sql, fingerprint)) { + let mut peerstate = dc_apeerstate_new(context); + if !(0 + == dc_apeerstate_load_by_fingerprint( + peerstate, + &mut context.sql.clone().lock().unwrap(), + fingerprint, + )) + { if !(0 == dc_apeerstate_set_verified(peerstate, 1i32, fingerprint, 2i32)) { (*peerstate).prefer_encrypt = 1i32; (*peerstate).to_save |= 0x2i32; - dc_apeerstate_save_to_db(peerstate, (*context).sql, 0i32); + dc_apeerstate_save_to_db(peerstate, &mut context.sql.clone().lock().unwrap(), 0i32); success = 1i32 } } @@ -1037,10 +1033,10 @@ pub unsafe fn dc_handle_degrade_event( mut context: &dc_context_t, mut peerstate: *mut dc_apeerstate_t, ) { - let mut stmt: &sqlite3_stmt = 0 as *mut sqlite3_stmt; + let mut stmt = 0 as *mut sqlite3_stmt; let mut contact_id: uint32_t = 0i32 as uint32_t; let mut contact_chat_id: uint32_t = 0i32 as uint32_t; - if !(context.is_null() || peerstate.is_null()) { + if !peerstate.is_null() { // - we do not issue an warning for DC_DE_ENCRYPTION_PAUSED as this is quite normal // - currently, we do not issue an extra warning for DC_DE_VERIFICATION_LOST - this always comes // together with DC_DE_FINGERPRINT_CHANGED which is logged, the idea is not to bother @@ -1048,7 +1044,8 @@ pub unsafe fn dc_handle_degrade_event( // (and he will know this and can fix this) if 0 != (*peerstate).degrade_event & 0x2i32 { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM contacts WHERE addr=?;\x00" as *const u8 as *const libc::c_char, ); sqlite3_bind_text(stmt, 1i32, (*peerstate).addr, -1i32, None); @@ -1067,7 +1064,7 @@ pub unsafe fn dc_handle_degrade_event( dc_stock_str_repl_string(context, 37i32, (*peerstate).addr); dc_add_device_msg(context, contact_chat_id, msg); free(msg as *mut libc::c_void); - ((*context).cb)( + (context.cb)( context, Event::CHAT_MODIFIED, contact_chat_id as uintptr_t, diff --git a/src/dc_smtp.rs b/src/dc_smtp.rs index f1b441363..7f9fc793d 100644 --- a/src/dc_smtp.rs +++ b/src/dc_smtp.rs @@ -16,8 +16,6 @@ pub struct dc_smtp_t { pub from: *mut libc::c_char, pub esmtp: libc::c_int, pub log_connect_errors: libc::c_int, - // TODO: Remvoe - pub context: *mut dc_context_t, pub error: *mut libc::c_char, pub error_etpan: libc::c_int, } @@ -28,7 +26,6 @@ pub fn dc_smtp_new() -> dc_smtp_t { from: std::ptr::null_mut(), esmtp: 0, log_connect_errors: 1, - context: std::ptr::null_mut(), error: std::ptr::null_mut(), error_etpan: 0, } @@ -38,7 +35,6 @@ pub unsafe fn dc_smtp_unref(smtp: &mut dc_smtp_t) { dc_smtp_disconnect(smtp); free(smtp.from as *mut libc::c_void); free(smtp.error as *mut libc::c_void); - free(smtp as *mut libc::c_void); } pub unsafe fn dc_smtp_disconnect(smtp: &mut dc_smtp_t) { @@ -56,7 +52,11 @@ pub unsafe fn dc_smtp_is_connected(smtp: &dc_smtp_t) -> libc::c_int { } } -pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) -> libc::c_int { +pub unsafe fn dc_smtp_connect( + context: &dc_context_t, + smtp: &mut dc_smtp_t, + lp: *const dc_loginparam_t, +) -> libc::c_int { let mut current_block: u64; let mut success: libc::c_int = 0; let mut r: libc::c_int = 0; @@ -67,14 +67,14 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) if !smtp.etpan.is_null() { dc_log_warning( - smtp.context, + context, 0, b"SMTP already connected.\x00" as *const u8 as *const libc::c_char, ); success = 1; } else if (*lp).addr.is_null() || (*lp).send_server.is_null() || (*lp).send_port == 0 { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, b"SMTP bad parameters.\x00" as *const u8 as *const libc::c_char, @@ -85,7 +85,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) smtp.etpan = mailsmtp_new(0 as size_t, None); if smtp.etpan.is_null() { dc_log_error( - smtp.context, + context, 0, b"SMTP-object creation failed.\x00" as *const u8 as *const libc::c_char, ); @@ -94,7 +94,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) mailsmtp_set_progress_callback( smtp.etpan, Some(body_progress), - smtp as *mut libc::c_void, + smtp as *mut _ as *mut libc::c_void, ); /* connect to SMTP server */ if 0 != (*lp).server_flags & (0x10000 | 0x40000) { @@ -105,7 +105,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) ); if r != MAILSMTP_NO_ERROR as libc::c_int { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, b"SMTP-Socket connection to %s:%i failed (%s)\x00" as *const u8 @@ -126,7 +126,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) ); if r != MAILSMTP_NO_ERROR as libc::c_int { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, b"SMTP-SSL connection to %s:%i failed (%s)\x00" as *const u8 @@ -155,7 +155,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) } if r != MAILSMTP_NO_ERROR as libc::c_int { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, b"SMTP-helo failed (%s)\x00" as *const u8 as *const libc::c_char, @@ -166,7 +166,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) r = mailsmtp_socket_starttls(smtp.etpan); if r != MAILSMTP_NO_ERROR as libc::c_int { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, b"SMTP-STARTTLS failed (%s)\x00" as *const u8 @@ -188,7 +188,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) } if r != MAILSMTP_NO_ERROR as libc::c_int { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, b"SMTP-helo failed (%s)\x00" as *const u8 @@ -198,7 +198,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) current_block = 12512295087047028901; } else { dc_log_info( - smtp.context, + context, 0, b"SMTP-server %s:%i STARTTLS-connected.\x00" as *const u8 as *const libc::c_char, @@ -211,7 +211,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) } else { if 0 != (*lp).server_flags & 0x40000 { dc_log_info( - smtp.context, + context, 0, b"SMTP-server %s:%i connected.\x00" as *const u8 as *const libc::c_char, @@ -220,7 +220,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) ); } else { dc_log_info( - smtp.context, + context, 0, b"SMTP-server %s:%i SSL-connected.\x00" as *const u8 as *const libc::c_char, @@ -236,14 +236,14 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) if !(*lp).send_user.is_null() { if 0 != (*lp).server_flags & 0x2 { dc_log_info( - smtp.context, + context, 0, b"SMTP-OAuth2 connect...\x00" as *const u8 as *const libc::c_char, ); let mut access_token: *mut libc::c_char = dc_get_oauth2_access_token( - smtp.context, + context, (*lp).addr, (*lp).send_pw, 0, @@ -256,7 +256,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) if r != MAILSMTP_NO_ERROR as libc::c_int { free(access_token as *mut libc::c_void); access_token = dc_get_oauth2_access_token( - smtp.context, + context, (*lp).addr, (*lp).send_pw, 0x1, @@ -284,7 +284,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) & MAILSMTP_AUTH_PLAIN as libc::c_int { dc_log_info( - smtp.context, + context, 0, b"Trying SMTP-Login workaround \"%s\"...\x00" as *const u8 @@ -299,7 +299,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) ); if err < 0 { dc_log_error( - smtp.context, + context, 0, b"SMTP-Login: Cannot get hostname.\x00" as *const u8 @@ -333,7 +333,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) _ => { if r != MAILSMTP_NO_ERROR as libc::c_int { dc_log_event_seq( - smtp.context, + context, Event::ERROR_NETWORK, &mut smtp.log_connect_errors as *mut libc::c_int, @@ -346,7 +346,7 @@ pub unsafe fn dc_smtp_connect(smtp: &mut dc_smtp_t, lp: *const dc_loginparam_t) current_block = 12512295087047028901; } else { dc_log_event( - smtp.context, + context, Event::SMTP_CONNECTED, 0, b"SMTP-login as %s ok.\x00" as *const u8 @@ -388,6 +388,7 @@ unsafe extern "C" fn body_progress( } pub unsafe fn dc_smtp_send_msg( + context: &dc_context_t, smtp: &mut dc_smtp_t, recipients: *const clist, data_not_terminated: *const libc::c_char, @@ -418,6 +419,7 @@ pub unsafe fn dc_smtp_send_msg( }; if r != MAILSMTP_NO_ERROR as libc::c_int { log_error( + context, smtp, b"SMTP failed to start message\x00" as *const u8 as *const libc::c_char, r, @@ -444,6 +446,7 @@ pub unsafe fn dc_smtp_send_msg( }; if r != MAILSMTP_NO_ERROR as libc::c_int { log_error( + context, smtp, b"SMTP failed to add recipient\x00" as *const u8 as *const libc::c_char, r, @@ -465,6 +468,7 @@ pub unsafe fn dc_smtp_send_msg( r = mailsmtp_data(smtp.etpan); if r != MAILSMTP_NO_ERROR as libc::c_int { log_error( + context, smtp, b"SMTP failed to set data\x00" as *const u8 as *const libc::c_char, r, @@ -473,6 +477,7 @@ pub unsafe fn dc_smtp_send_msg( r = mailsmtp_data_message(smtp.etpan, data_not_terminated, data_bytes); if r != MAILSMTP_NO_ERROR as libc::c_int { log_error( + context, smtp, b"SMTP failed to send message\x00" as *const u8 as *const libc::c_char, @@ -480,7 +485,7 @@ pub unsafe fn dc_smtp_send_msg( ); } else { dc_log_event( - smtp.context, + context, Event::SMTP_MESSAGE_SENT, 0, b"Message was sent to SMTP server\x00" as *const u8 @@ -497,7 +502,12 @@ pub unsafe fn dc_smtp_send_msg( success } -unsafe fn log_error(smtp: &mut dc_smtp_t, what_failed: *const libc::c_char, r: libc::c_int) { +unsafe fn log_error( + context: &dc_context_t, + smtp: &mut dc_smtp_t, + what_failed: *const libc::c_char, + r: libc::c_int, +) { let mut error_msg: *mut libc::c_char = dc_mprintf( b"%s: %s: %s\x00" as *const u8 as *const libc::c_char, what_failed, @@ -505,7 +515,7 @@ unsafe fn log_error(smtp: &mut dc_smtp_t, what_failed: *const libc::c_char, r: l (*smtp.etpan).response, ); dc_log_warning( - smtp.context, + context, 0, b"%s\x00" as *const u8 as *const libc::c_char, error_msg, diff --git a/src/dc_sqlite3.rs b/src/dc_sqlite3.rs index 8721919d2..735d289e8 100644 --- a/src/dc_sqlite3.rs +++ b/src/dc_sqlite3.rs @@ -73,13 +73,12 @@ pub unsafe fn dc_sqlite3_open( dbfile, &mut sql.cobj, SQLITE_OPEN_FULLMUTEX - | (if flags & DC_OPEN_READONLY { + | (if 0 != (flags & DC_OPEN_READONLY as i32) { SQLITE_OPEN_READONLY } else { SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE }), std::ptr::null(), - 0 as *const libc::c_char, ) != 0 { dc_sqlite3_log_error( @@ -90,15 +89,17 @@ pub unsafe fn dc_sqlite3_open( ); } else { dc_sqlite3_execute( + context, sql, b"PRAGMA secure_delete=on;\x00" as *const u8 as *const libc::c_char, ); sqlite3_busy_timeout(sql.cobj, 10 * 1000); - if 0 == flags & DC_OPEN_READONLY { + if 0 == flags & DC_OPEN_READONLY as i32 { let mut exists_before_update = 0; let mut dbversion_before_update = 0; /* Init tables to dbversion=0 */ if 0 == dc_sqlite3_table_exists( + context, sql, b"config\x00" as *const u8 as *const libc::c_char, ) { @@ -110,17 +111,20 @@ pub unsafe fn dc_sqlite3_open( dbfile, ); dc_sqlite3_execute( + context, sql, b"CREATE TABLE config (id INTEGER PRIMARY KEY, keyname TEXT, value TEXT);\x00" as *const u8 as *const libc::c_char ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX config_index1 ON config (keyname);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE TABLE contacts (\ id INTEGER PRIMARY KEY AUTOINCREMENT, \ @@ -133,16 +137,19 @@ pub unsafe fn dc_sqlite3_open( as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX contacts_index1 ON contacts (name COLLATE NOCASE);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX contacts_index2 ON contacts (addr COLLATE NOCASE);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"INSERT INTO contacts (id,name,origin) VALUES \ (1,\'self\',262144), (2,\'device\',262144), (3,\'rsvd\',262144), \ @@ -151,6 +158,7 @@ pub unsafe fn dc_sqlite3_open( as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE TABLE chats (\ id INTEGER PRIMARY KEY AUTOINCREMENT, \ @@ -164,21 +172,25 @@ pub unsafe fn dc_sqlite3_open( as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX chats_index1 ON chats (grpid);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE TABLE chats_contacts (chat_id INTEGER, contact_id INTEGER);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX chats_contacts_index1 ON chats_contacts (chat_id);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"INSERT INTO chats (id,type,name) VALUES \ (1,120,\'deaddrop\'), (2,120,\'rsvd\'), (3,120,\'trash\'), \ @@ -187,6 +199,7 @@ pub unsafe fn dc_sqlite3_open( as *const u8 as *const libc::c_char ); dc_sqlite3_execute( + context, sql, b"CREATE TABLE msgs (\ id INTEGER PRIMARY KEY AUTOINCREMENT, \ @@ -207,26 +220,31 @@ pub unsafe fn dc_sqlite3_open( as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_index1 ON msgs (rfc724_mid);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_index2 ON msgs (chat_id);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_index3 ON msgs (timestamp);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_index4 ON msgs (state);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"INSERT INTO msgs (id,msgrmsg,txt) VALUES \ (1,0,\'marker1\'), (2,0,\'rsvd\'), (3,0,\'rsvd\'), \ @@ -235,6 +253,7 @@ pub unsafe fn dc_sqlite3_open( as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE TABLE jobs (\ id INTEGER PRIMARY KEY AUTOINCREMENT, \ @@ -246,36 +265,44 @@ pub unsafe fn dc_sqlite3_open( as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX jobs_index1 ON jobs (desired_timestamp);\x00" as *const u8 as *const libc::c_char, ); if 0 == dc_sqlite3_table_exists( + context, sql, b"config\x00" as *const u8 as *const libc::c_char, ) || 0 == dc_sqlite3_table_exists( + context, sql, b"contacts\x00" as *const u8 as *const libc::c_char, ) || 0 == dc_sqlite3_table_exists( + context, sql, b"chats\x00" as *const u8 as *const libc::c_char, ) || 0 == dc_sqlite3_table_exists( + context, sql, b"chats_contacts\x00" as *const u8 as *const libc::c_char, ) || 0 == dc_sqlite3_table_exists( + context, sql, b"msgs\x00" as *const u8 as *const libc::c_char, ) || 0 == dc_sqlite3_table_exists( + context, sql, b"jobs\x00" as *const u8 as *const libc::c_char, ) { dc_sqlite3_log_error( + context, sql, b"Cannot create tables in new database \"%s\".\x00" as *const u8 as *const libc::c_char, @@ -285,6 +312,7 @@ pub unsafe fn dc_sqlite3_open( current_block = 13628706266672894061; } else { dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 0, @@ -294,6 +322,7 @@ pub unsafe fn dc_sqlite3_open( } else { exists_before_update = 1; dbversion_before_update = dc_sqlite3_get_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 0, @@ -312,11 +341,12 @@ pub unsafe fn dc_sqlite3_open( let mut update_file_paths: libc::c_int = 0; if dbversion < 1 { dc_sqlite3_execute( - sql, + context, sql, b"CREATE TABLE leftgrps ( id INTEGER PRIMARY KEY, grpid TEXT DEFAULT \'\');\x00" as *const u8 as *const libc::c_char ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX leftgrps_index1 ON leftgrps (grpid);\x00" as *const u8 @@ -324,6 +354,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 1; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 1, @@ -331,6 +362,7 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 2 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE contacts ADD COLUMN authname TEXT DEFAULT \'\';\x00" as *const u8 @@ -338,6 +370,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 2; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 2, @@ -345,6 +378,7 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 7 { dc_sqlite3_execute( + context, sql, b"CREATE TABLE keypairs (\ id INTEGER PRIMARY KEY, \ @@ -358,6 +392,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 7; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 7, @@ -365,6 +400,7 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 10 { dc_sqlite3_execute( + context, sql, b"CREATE TABLE acpeerstates (\ id INTEGER PRIMARY KEY, \ @@ -377,6 +413,7 @@ pub unsafe fn dc_sqlite3_open( as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX acpeerstates_index1 ON acpeerstates (addr);\x00" as *const u8 @@ -384,6 +421,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 10; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 10, @@ -391,11 +429,12 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 12 { dc_sqlite3_execute( - sql, + context, sql, b"CREATE TABLE msgs_mdns ( msg_id INTEGER, contact_id INTEGER);\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_mdns_index1 ON msgs_mdns (msg_id);\x00" as *const u8 @@ -403,6 +442,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 12; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 12, @@ -410,29 +450,34 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 17 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE chats ADD COLUMN archived INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX chats_index2 ON chats (archived);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN starred INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_index5 ON msgs (starred);\x00" as *const u8 as *const libc::c_char, ); dbversion = 17; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 17, @@ -440,17 +485,19 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 18 { dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE acpeerstates ADD COLUMN gossip_timestamp INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( + context, sql, b"ALTER TABLE acpeerstates ADD COLUMN gossip_key;\x00" as *const u8 as *const libc::c_char, ); dbversion = 18; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 18, @@ -458,23 +505,26 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 27 { dc_sqlite3_execute( + context, sql, b"DELETE FROM msgs WHERE chat_id=1 OR chat_id=2;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( - sql, + context, sql, b"CREATE INDEX chats_contacts_index2 ON chats_contacts (contact_id);\x00" as *const u8 as *const libc::c_char ); dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN timestamp_sent INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN timestamp_rcvd INTEGER DEFAULT 0;\x00" as *const u8 @@ -482,6 +532,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 27; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 27, @@ -489,40 +540,42 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 34 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN hidden INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE msgs_mdns ADD COLUMN timestamp_sent INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char ); dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE acpeerstates ADD COLUMN public_key_fingerprint TEXT DEFAULT \'\';\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE acpeerstates ADD COLUMN gossip_key_fingerprint TEXT DEFAULT \'\';\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( - sql, + context, sql, b"CREATE INDEX acpeerstates_index3 ON acpeerstates (public_key_fingerprint);\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( - sql, + context, sql, b"CREATE INDEX acpeerstates_index4 ON acpeerstates (gossip_key_fingerprint);\x00" as *const u8 as *const libc::c_char); recalc_fingerprints = 1; dbversion = 34; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 34, @@ -530,40 +583,42 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 39 { dc_sqlite3_execute( - sql, + context, sql, b"CREATE TABLE tokens ( id INTEGER PRIMARY KEY, namespc INTEGER DEFAULT 0, foreign_id INTEGER DEFAULT 0, token TEXT DEFAULT \'\', timestamp INTEGER DEFAULT 0);\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( + context, sql, b"ALTER TABLE acpeerstates ADD COLUMN verified_key;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE acpeerstates ADD COLUMN verified_key_fingerprint TEXT DEFAULT \'\';\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( - sql, + context, sql, b"CREATE INDEX acpeerstates_index5 ON acpeerstates (verified_key_fingerprint);\x00" as *const u8 as *const libc::c_char); if dbversion_before_update == 34 { dc_sqlite3_execute( - sql, + context, sql, b"UPDATE acpeerstates SET verified_key=gossip_key, verified_key_fingerprint=gossip_key_fingerprint WHERE gossip_key_verified=2;\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( - sql, + context, sql, b"UPDATE acpeerstates SET verified_key=public_key, verified_key_fingerprint=public_key_fingerprint WHERE public_key_verified=2;\x00" as *const u8 as *const libc::c_char); } dbversion = 39; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 39, @@ -571,6 +626,7 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 40 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE jobs ADD COLUMN thread INTEGER DEFAULT 0;\x00" as *const u8 @@ -578,6 +634,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 40; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 40, @@ -587,6 +644,7 @@ pub unsafe fn dc_sqlite3_open( update_file_paths = 1; dbversion = 41; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 41, @@ -594,12 +652,14 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 42 { dc_sqlite3_execute( + context, sql, b"UPDATE msgs SET txt=\'\' WHERE type!=10\x00" as *const u8 as *const libc::c_char, ); dbversion = 42; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 42, @@ -607,12 +667,14 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 44 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN mime_headers TEXT;\x00" as *const u8 as *const libc::c_char, ); dbversion = 44; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 44, @@ -620,12 +682,14 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 46 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN mime_in_reply_to TEXT;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN mime_references TEXT;\x00" as *const u8 @@ -633,6 +697,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 46; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 46, @@ -640,6 +705,7 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 47 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE jobs ADD COLUMN tries INTEGER DEFAULT 0;\x00" as *const u8 @@ -647,6 +713,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 47; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 47, @@ -654,6 +721,7 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 48 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN move_state INTEGER DEFAULT 1;\x00" as *const u8 @@ -721,6 +789,7 @@ pub unsafe fn dc_sqlite3_open( }; dbversion = 48; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 48, @@ -728,12 +797,13 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 49 { dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE chats ADD COLUMN gossiped_timestamp INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char); dbversion = 49; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 49, @@ -742,6 +812,7 @@ pub unsafe fn dc_sqlite3_open( if dbversion < 50 { if 0 != exists_before_update { dc_sqlite3_set_config_int( + context, sql, b"show_emails\x00" as *const u8 as *const libc::c_char, 2, @@ -749,41 +820,45 @@ pub unsafe fn dc_sqlite3_open( } dbversion = 50; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 50, ); } if dbversion < 53 { - dc_sqlite3_execute(sql, + dc_sqlite3_execute(context, sql, b"CREATE TABLE locations ( id INTEGER PRIMARY KEY AUTOINCREMENT, latitude REAL DEFAULT 0.0, longitude REAL DEFAULT 0.0, accuracy REAL DEFAULT 0.0, timestamp INTEGER DEFAULT 0, chat_id INTEGER DEFAULT 0, from_id INTEGER DEFAULT 0);\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( + context, sql, b"CREATE INDEX locations_index1 ON locations (from_id);\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX locations_index2 ON locations (timestamp);\x00" as *const u8 as *const libc::c_char, ); - dc_sqlite3_execute(sql, + dc_sqlite3_execute(context, sql, b"ALTER TABLE chats ADD COLUMN locations_send_begin INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char); - dc_sqlite3_execute(sql, + dc_sqlite3_execute(context, sql, b"ALTER TABLE chats ADD COLUMN locations_send_until INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char); - dc_sqlite3_execute(sql, + dc_sqlite3_execute(context, sql, b"ALTER TABLE chats ADD COLUMN locations_last_sent INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char); dc_sqlite3_execute( + context, sql, b"CREATE INDEX chats_index3 ON chats (locations_send_until);\x00" as *const u8 @@ -791,6 +866,7 @@ pub unsafe fn dc_sqlite3_open( ); dbversion = 53; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 53, @@ -798,18 +874,21 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 54 { dc_sqlite3_execute( + context, sql, b"ALTER TABLE msgs ADD COLUMN location_id INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char, ); dc_sqlite3_execute( + context, sql, b"CREATE INDEX msgs_index6 ON msgs (location_id);\x00" as *const u8 as *const libc::c_char, ); dbversion = 54; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 54, @@ -817,12 +896,13 @@ pub unsafe fn dc_sqlite3_open( } if dbversion < 55 { dc_sqlite3_execute( - sql, + context, sql, b"ALTER TABLE locations ADD COLUMN independent INTEGER DEFAULT 0;\x00" as *const u8 as *const libc::c_char ); dbversion = 55; dc_sqlite3_set_config_int( + context, sql, b"dbversion\x00" as *const u8 as *const libc::c_char, 55, @@ -831,13 +911,14 @@ pub unsafe fn dc_sqlite3_open( if 0 != recalc_fingerprints { let mut stmt: *mut sqlite3_stmt = dc_sqlite3_prepare( + context, sql, b"SELECT addr FROM acpeerstates;\x00" as *const u8 as *const libc::c_char, ); while sqlite3_step(stmt) == 100 { let mut peerstate: *mut dc_apeerstate_t = - dc_apeerstate_new(sql.context); + dc_apeerstate_new(context); if 0 != dc_apeerstate_load_by_addr( peerstate, sql, @@ -852,9 +933,10 @@ pub unsafe fn dc_sqlite3_open( } if 0 != update_file_paths { let mut repl_from: *mut libc::c_char = dc_sqlite3_get_config( + context, sql, b"backup_for\x00" as *const u8 as *const libc::c_char, - (*sql.context).blobdir, + context.blobdir, ); dc_ensure_no_slash(repl_from); if 0 != !('f' as i32 == 'f' as i32) as libc::c_int as libc::c_long { @@ -874,7 +956,7 @@ pub unsafe fn dc_sqlite3_open( as *const u8 as *const libc::c_char, repl_from); - dc_sqlite3_execute(sql, q3); + dc_sqlite3_execute(context, sql, q3); sqlite3_free(q3 as *mut libc::c_void); if 0 != !('i' as i32 == 'i' as i32) as libc::c_int as libc::c_long { __assert_rtn( @@ -894,10 +976,11 @@ pub unsafe fn dc_sqlite3_open( as *const u8 as *const libc::c_char, repl_from); - dc_sqlite3_execute(sql, q3); + dc_sqlite3_execute(context, sql, q3); sqlite3_free(q3 as *mut libc::c_void); free(repl_from as *mut libc::c_void); dc_sqlite3_set_config( + context, sql, b"backup_for\x00" as *const u8 as *const libc::c_char, 0 as *const libc::c_char, @@ -913,7 +996,7 @@ pub unsafe fn dc_sqlite3_open( 13628706266672894061 => {} _ => { dc_log_info( - sql.context, + context, 0, b"Opened \"%s\".\x00" as *const u8 as *const libc::c_char, dbfile, @@ -924,7 +1007,7 @@ pub unsafe fn dc_sqlite3_open( } } - dc_sqlite3_close(sql); + dc_sqlite3_close(context, sql); 0 } @@ -955,6 +1038,7 @@ pub unsafe fn dc_sqlite3_set_config( } if !value.is_null() { stmt = dc_sqlite3_prepare( + context, sql, b"SELECT value FROM config WHERE keyname=?;\x00" as *const u8 as *const libc::c_char, ); @@ -963,6 +1047,7 @@ pub unsafe fn dc_sqlite3_set_config( sqlite3_finalize(stmt); if state == 101 { stmt = dc_sqlite3_prepare( + context, sql, b"INSERT INTO config (keyname, value) VALUES (?, ?);\x00" as *const u8 as *const libc::c_char, @@ -973,6 +1058,7 @@ pub unsafe fn dc_sqlite3_set_config( sqlite3_finalize(stmt); } else if state == 100 { stmt = dc_sqlite3_prepare( + context, sql, b"UPDATE config SET value=? WHERE keyname=?;\x00" as *const u8 as *const libc::c_char, @@ -992,6 +1078,7 @@ pub unsafe fn dc_sqlite3_set_config( } } else { stmt = dc_sqlite3_prepare( + context, sql, b"DELETE FROM config WHERE keyname=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1015,6 +1102,7 @@ pub unsafe fn dc_sqlite3_set_config( /* tools, these functions are compatible to the corresponding sqlite3_* functions */ /* the result mus be freed using sqlite3_finalize() */ pub unsafe fn dc_sqlite3_prepare( + context: &dc_context_t, sql: &mut dc_sqlite3_t, querystr: *const libc::c_char, ) -> *mut sqlite3_stmt { @@ -1031,6 +1119,7 @@ pub unsafe fn dc_sqlite3_prepare( ) != 0 { dc_sqlite3_log_error( + context, sql, b"Query failed: %s\x00" as *const u8 as *const libc::c_char, querystr, @@ -1080,6 +1169,7 @@ pub unsafe fn dc_sqlite3_is_open(sql: &dc_sqlite3_t) -> libc::c_int { /* the returned string must be free()'d, returns NULL on errors */ pub unsafe fn dc_sqlite3_get_config( + context: &dc_context_t, sql: &mut dc_sqlite3_t, key: *const libc::c_char, def: *const libc::c_char, @@ -1089,6 +1179,7 @@ pub unsafe fn dc_sqlite3_get_config( return dc_strdup_keep_null(def); } stmt = dc_sqlite3_prepare( + context, sql, b"SELECT value FROM config WHERE keyname=?;\x00" as *const u8 as *const libc::c_char, ); @@ -1106,16 +1197,18 @@ pub unsafe fn dc_sqlite3_get_config( } pub unsafe fn dc_sqlite3_execute( + context: &dc_context_t, sql: &mut dc_sqlite3_t, querystr: *const libc::c_char, ) -> libc::c_int { let mut success = 0; let mut sqlState = 0; - let stmt = dc_sqlite3_prepare(sql, querystr); + let stmt = dc_sqlite3_prepare(context, sql, querystr); if !stmt.is_null() { sqlState = sqlite3_step(stmt); if sqlState != 101 && sqlState != 100 { dc_sqlite3_log_error( + context, sql, b"Cannot execute \"%s\".\x00" as *const u8 as *const libc::c_char, querystr, @@ -1129,6 +1222,7 @@ pub unsafe fn dc_sqlite3_execute( } pub unsafe fn dc_sqlite3_set_config_int( + context: &dc_context_t, sql: &mut dc_sqlite3_t, key: *const libc::c_char, value: int32_t, @@ -1140,18 +1234,19 @@ pub unsafe fn dc_sqlite3_set_config_int( if value_str.is_null() { return 0; } - let ret = dc_sqlite3_set_config(sql, key, value_str); + let ret = dc_sqlite3_set_config(context, sql, key, value_str); free(value_str as *mut libc::c_void); ret } pub unsafe fn dc_sqlite3_get_config_int( + context: &dc_context_t, sql: &mut dc_sqlite3_t, key: *const libc::c_char, def: int32_t, ) -> int32_t { - let mut str = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + let mut str = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); if str.is_null() { return def; } @@ -1181,7 +1276,7 @@ pub unsafe fn dc_sqlite3_table_exists( b"dc_sqlite3_table_exists_(): Out of memory.\x00" as *const u8 as *const libc::c_char, ); } else { - stmt = dc_sqlite3_prepare(sql, querystr); + stmt = dc_sqlite3_prepare(context, sql, querystr); if !stmt.is_null() { sqlState = sqlite3_step(stmt); if sqlState == 100 { @@ -1200,6 +1295,7 @@ pub unsafe fn dc_sqlite3_table_exists( } pub unsafe fn dc_sqlite3_set_config_int64( + context: &dc_context_t, sql: &mut dc_sqlite3_t, key: *const libc::c_char, value: int64_t, @@ -1211,17 +1307,18 @@ pub unsafe fn dc_sqlite3_set_config_int64( if value_str.is_null() { return 0; } - let ret = dc_sqlite3_set_config(sql, key, value_str); + let ret = dc_sqlite3_set_config(context, sql, key, value_str); free(value_str as *mut libc::c_void); ret } pub unsafe fn dc_sqlite3_get_config_int64( + context: &dc_context_t, sql: &mut dc_sqlite3_t, key: *const libc::c_char, def: int64_t, ) -> int64_t { - let mut str = dc_sqlite3_get_config(sql, key, 0 as *const libc::c_char); + let mut str = dc_sqlite3_get_config(context, sql, key, 0 as *const libc::c_char); if str.is_null() { return def; } @@ -1243,7 +1340,7 @@ pub unsafe fn dc_sqlite3_try_execute( // same as dc_sqlite3_execute() but does not pass error to ui let mut success = 0; let mut sql_state = 0; - let stmt = dc_sqlite3_prepare(sql, querystr); + let stmt = dc_sqlite3_prepare(context, sql, querystr); if !stmt.is_null() { sql_state = sqlite3_step(stmt); if sql_state != 101 && sql_state != 100 { @@ -1263,6 +1360,7 @@ pub unsafe fn dc_sqlite3_try_execute( } pub unsafe fn dc_sqlite3_get_rowid( + context: &dc_context_t, sql: &mut dc_sqlite3_t, table: *const libc::c_char, field: *const libc::c_char, @@ -1278,7 +1376,7 @@ pub unsafe fn dc_sqlite3_get_rowid( field, value, ); - let mut stmt = dc_sqlite3_prepare(sql, q3); + let mut stmt = dc_sqlite3_prepare(context, sql, q3); if 100 == sqlite3_step(stmt) { id = sqlite3_column_int(stmt, 0) as uint32_t } @@ -1288,6 +1386,7 @@ pub unsafe fn dc_sqlite3_get_rowid( } pub unsafe fn dc_sqlite3_get_rowid2( + context: &dc_context_t, sql: &mut dc_sqlite3_t, table: *const libc::c_char, field: *const libc::c_char, @@ -1307,7 +1406,7 @@ pub unsafe fn dc_sqlite3_get_rowid2( field2, value2, ); - let mut stmt = dc_sqlite3_prepare(sql, q3); + let mut stmt = dc_sqlite3_prepare(context, sql, q3); if 100 == sqlite3_step(stmt) { id = sqlite3_column_int(stmt, 0) as uint32_t } @@ -1362,7 +1461,8 @@ pub unsafe fn dc_housekeeping(context: &dc_context_t) { 'i' as i32, ); stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT value FROM config;\x00" as *const u8 as *const libc::c_char, ); while sqlite3_step(stmt) == 100 { @@ -1378,13 +1478,13 @@ pub unsafe fn dc_housekeeping(context: &dc_context_t) { files_in_use.count as libc::c_int, ); /* go through directory and delete unused files */ - dir_handle = opendir((*context).blobdir); + dir_handle = opendir(context.blobdir); if dir_handle.is_null() { dc_log_warning( context, 0, b"Housekeeping: Cannot open %s.\x00" as *const u8 as *const libc::c_char, - (*context).blobdir, + context.blobdir, ); } else { /* avoid deletion of files that are just created to build a message object */ @@ -1429,7 +1529,7 @@ pub unsafe fn dc_housekeeping(context: &dc_context_t) { free(path as *mut libc::c_void); path = dc_mprintf( b"%s/%s\x00" as *const u8 as *const libc::c_char, - (*context).blobdir, + context.blobdir, name, ); @@ -1526,7 +1626,7 @@ unsafe fn maybe_add_from_param( param_id: libc::c_int, ) { let mut param = dc_param_new(); - let mut stmt = dc_sqlite3_prepare((*context).sql, query); + let mut stmt = dc_sqlite3_prepare(context, &mut context.sql.clone().lock().unwrap(), query); while sqlite3_step(stmt) == 100 { dc_param_set_packed(param, sqlite3_column_text(stmt, 0) as *const libc::c_char); let mut file = dc_param_get(param, param_id, 0 as *const libc::c_char); diff --git a/src/dc_stock.rs b/src/dc_stock.rs index b7604efc7..d167f45b7 100644 --- a/src/dc_stock.rs +++ b/src/dc_stock.rs @@ -19,14 +19,14 @@ unsafe fn get_string( mut qty: libc::c_int, ) -> *mut libc::c_char { let mut ret: *mut libc::c_char = 0 as *mut libc::c_char; - if !context.is_null() { - ret = ((*context).cb)( - context, - Event::GET_STRING, - id as uintptr_t, - qty as uintptr_t, - ) as *mut libc::c_char; - } + + ret = ((*context).cb)( + context, + Event::GET_STRING, + id as uintptr_t, + qty as uintptr_t, + ) as *mut libc::c_char; + if ret.is_null() { ret = default_string(id) } diff --git a/src/dc_token.rs b/src/dc_token.rs index 8d399e35d..78b9924e7 100644 --- a/src/dc_token.rs +++ b/src/dc_token.rs @@ -18,11 +18,11 @@ pub unsafe fn dc_token_save( mut token: *const libc::c_char, ) { let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || token.is_null()) - { + if !token.is_null() { // foreign_id may be 0 stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"INSERT INTO tokens (namespc, foreign_id, token, timestamp) VALUES (?, ?, ?, ?);\x00" as *const u8 as *const libc::c_char, ); @@ -41,20 +41,21 @@ pub unsafe fn dc_token_lookup( ) -> *mut libc::c_char { let mut token: *mut libc::c_char = 0 as *mut libc::c_char; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint) { - stmt = dc_sqlite3_prepare( - (*context).sql, - b"SELECT token FROM tokens WHERE namespc=? AND foreign_id=?;\x00" as *const u8 - as *const libc::c_char, - ); - sqlite3_bind_int(stmt, 1i32, namespc as libc::c_int); - sqlite3_bind_int(stmt, 2i32, foreign_id as libc::c_int); - sqlite3_step(stmt); - token = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char) - } + stmt = dc_sqlite3_prepare( + context, + &mut context.sql.clone().lock().unwrap(), + b"SELECT token FROM tokens WHERE namespc=? AND foreign_id=?;\x00" as *const u8 + as *const libc::c_char, + ); + sqlite3_bind_int(stmt, 1i32, namespc as libc::c_int); + sqlite3_bind_int(stmt, 2i32, foreign_id as libc::c_int); + sqlite3_step(stmt); + token = dc_strdup_keep_null(sqlite3_column_text(stmt, 0i32) as *mut libc::c_char); + sqlite3_finalize(stmt); - return token; + token } + pub unsafe fn dc_token_exists( mut context: &dc_context_t, mut namespc: dc_tokennamespc_t, @@ -62,10 +63,10 @@ pub unsafe fn dc_token_exists( ) -> libc::c_int { let mut exists: libc::c_int = 0i32; let mut stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt; - if !(context.is_null() || (*context).magic != 0x11a11807i32 as libc::c_uint || token.is_null()) - { + if !token.is_null() { stmt = dc_sqlite3_prepare( - (*context).sql, + context, + &mut context.sql.clone().lock().unwrap(), b"SELECT id FROM tokens WHERE namespc=? AND token=?;\x00" as *const u8 as *const libc::c_char, ); diff --git a/src/dc_tools.rs b/src/dc_tools.rs index ce5b4db41..2a9f29fc2 100644 --- a/src/dc_tools.rs +++ b/src/dc_tools.rs @@ -890,27 +890,28 @@ pub unsafe fn dc_gm2local_offset() -> libc::c_long { pub unsafe fn dc_smeared_time(mut context: &dc_context_t) -> time_t { /* function returns a corrected time(NULL) */ let mut now: time_t = time(0 as *mut time_t); - pthread_mutex_lock(&mut (*context).smear_critical); - if (*context).last_smeared_timestamp >= now { - now = (*context).last_smeared_timestamp + 1i32 as libc::c_long + let mut ts = *context.last_smeared_timestamp.clone().read().unwrap(); + if ts >= now { + now = ts + 1; } - pthread_mutex_unlock(&mut (*context).smear_critical); - return now; + now } + pub unsafe fn dc_create_smeared_timestamp(mut context: &dc_context_t) -> time_t { let mut now: time_t = time(0 as *mut time_t); let mut ret: time_t = now; - pthread_mutex_lock(&mut (*context).smear_critical); - if ret <= (*context).last_smeared_timestamp { - ret = (*context).last_smeared_timestamp + 1i32 as libc::c_long; - if ret - now > 5i32 as libc::c_long { - ret = now + 5i32 as libc::c_long + + let mut ts = *context.last_smeared_timestamp.clone().write().unwrap(); + if ret <= ts { + ret = ts + 1; + if ret - now > 5 { + ret = now + 5 } } - (*context).last_smeared_timestamp = ret; - pthread_mutex_unlock(&mut (*context).smear_critical); - return ret; + ts = ret; + ret } + pub unsafe fn dc_create_smeared_timestamps( mut context: &dc_context_t, mut count: libc::c_int, @@ -919,16 +920,13 @@ pub unsafe fn dc_create_smeared_timestamps( let mut now: time_t = time(0 as *mut time_t); let mut start: time_t = now + (if count < 5i32 { count } else { 5i32 }) as libc::c_long - count as libc::c_long; - pthread_mutex_lock(&mut (*context).smear_critical); - start = if (*context).last_smeared_timestamp + 1i32 as libc::c_long > start { - (*context).last_smeared_timestamp + 1i32 as libc::c_long - } else { - start - }; - (*context).last_smeared_timestamp = start + (count - 1i32) as libc::c_long; - pthread_mutex_unlock(&mut (*context).smear_critical); - return start; + + let mut ts = *context.last_smeared_timestamp.clone().write().unwrap(); + start = if ts + 1 > start { ts + 1 } else { start }; + ts = start + ((count - 1) as time_t); + start } + /* Message-ID tools */ pub unsafe fn dc_create_id() -> *mut libc::c_char { /* generate an id. the generated ID should be as short and as unique as possible: @@ -1268,7 +1266,7 @@ pub unsafe fn dc_get_abs_path( let mut current_block: u64; let mut success: libc::c_int = 0i32; let mut pathNfilename_abs: *mut libc::c_char = 0 as *mut libc::c_char; - if !(context.is_null() || pathNfilename.is_null()) { + if !pathNfilename.is_null() { pathNfilename_abs = dc_strdup(pathNfilename); if strncmp( pathNfilename_abs, @@ -1276,13 +1274,13 @@ pub unsafe fn dc_get_abs_path( 8, ) == 0i32 { - if (*context).blobdir.is_null() { + if context.blobdir.is_null() { current_block = 3805228753452640762; } else { dc_str_replace( &mut pathNfilename_abs, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, - (*context).blobdir, + context.blobdir, ); current_block = 6937071982253665452; } @@ -1638,7 +1636,7 @@ pub unsafe fn dc_is_blobdir_path( mut context: &dc_context_t, mut path: *const libc::c_char, ) -> libc::c_int { - if strncmp(path, (*context).blobdir, strlen((*context).blobdir)) == 0i32 + if strncmp(path, context.blobdir, strlen(context.blobdir)) == 0i32 || strncmp(path, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, 8) == 0i32 { return 1i32; @@ -1646,13 +1644,13 @@ pub unsafe fn dc_is_blobdir_path( return 0i32; } pub unsafe fn dc_make_rel_path(mut context: &dc_context_t, mut path: *mut *mut libc::c_char) { - if context.is_null() || path.is_null() || (*path).is_null() { + if path.is_null() || (*path).is_null() { return; } - if strncmp(*path, (*context).blobdir, strlen((*context).blobdir)) == 0i32 { + if strncmp(*path, context.blobdir, strlen(context.blobdir)) == 0i32 { dc_str_replace( path, - (*context).blobdir, + context.blobdir, b"$BLOBDIR\x00" as *const u8 as *const libc::c_char, ); }; @@ -1664,7 +1662,7 @@ pub unsafe fn dc_make_rel_and_copy( let mut success: libc::c_int = 0i32; let mut filename: *mut libc::c_char = 0 as *mut libc::c_char; let mut blobdir_path: *mut libc::c_char = 0 as *mut libc::c_char; - if !(context.is_null() || path.is_null() || (*path).is_null()) { + if !(path.is_null() || (*path).is_null()) { if 0 != dc_is_blobdir_path(context, *path) { dc_make_rel_path(context, path); success = 1i32