fix some locking issues, start rust-imap impl

This commit is contained in:
dignifiedquire
2019-05-04 01:36:21 +02:00
committed by Lars-Magnus Skog
parent 0b3a4b4c13
commit e7d72dfdd4
15 changed files with 2264 additions and 2375 deletions

View File

@@ -68,6 +68,7 @@ unsafe fn dc_job_perform(
mut thread: libc::c_int,
mut probe_network: libc::c_int,
) {
println!("perform job");
let mut select_stmt: *mut sqlite3_stmt = 0 as *mut sqlite3_stmt;
let mut job: dc_job_t = dc_job_t {
job_id: 0,
@@ -470,9 +471,12 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc
let mut msg: *mut dc_msg_t = dc_msg_new_untyped(context);
let mut dest_folder: *mut libc::c_char = 0 as *mut libc::c_char;
let mut dest_uid: uint32_t = 0i32 as uint32_t;
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
connect_to_inbox(context);
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
let inbox = context.inbox.read().unwrap();
if !inbox.is_connected() {
connect_to_inbox(context, &inbox);
if !inbox.is_connected() {
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
current_block = 2238328302157162973;
} else {
@@ -491,11 +495,7 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc
0i32,
) < 3i32
{
dc_configure_folders(
context,
&mut context.inbox.clone().lock().unwrap(),
0x1i32,
);
inbox.configure_folders(context, 0x1i32);
}
dest_folder = dc_sqlite3_get_config(
context,
@@ -503,9 +503,8 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
0 as *const libc::c_char,
);
match dc_imap_move(
match inbox.mv(
context,
&mut context.inbox.clone().lock().unwrap(),
(*msg).server_folder,
(*msg).server_uid,
dest_folder,
@@ -556,31 +555,28 @@ unsafe fn dc_job_do_DC_JOB_MOVE_MSG(mut context: &dc_context_t, mut job: *mut dc
/* ******************************************************************************
* IMAP-jobs
******************************************************************************/
unsafe fn connect_to_inbox(mut context: &dc_context_t) -> libc::c_int {
unsafe fn connect_to_inbox(context: &dc_context_t, inbox: &dc_imap_t) -> libc::c_int {
let mut ret_connected: libc::c_int = 0i32;
ret_connected =
dc_connect_to_configured_imap(context, &mut context.inbox.clone().lock().unwrap());
ret_connected = dc_connect_to_configured_imap(context, inbox);
if !(0 == ret_connected) {
dc_imap_set_watch_folder(
&mut context.inbox.clone().lock().unwrap(),
b"INBOX\x00" as *const u8 as *const libc::c_char,
);
inbox.set_watch_folder(b"INBOX\x00" as *const u8 as *const libc::c_char);
}
return ret_connected;
ret_connected
}
unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(
mut context: &dc_context_t,
mut job: *mut dc_job_t,
) {
unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(context: &dc_context_t, job: *mut dc_job_t) {
let mut current_block: u64;
let mut folder: *mut libc::c_char =
dc_param_get((*job).param, 'Z' as i32, 0 as *const libc::c_char);
let mut uid: uint32_t = dc_param_get_int((*job).param, 'z' as i32, 0i32) as uint32_t;
let mut dest_folder: *mut libc::c_char = 0 as *mut libc::c_char;
let mut dest_uid: uint32_t = 0i32 as uint32_t;
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
connect_to_inbox(context);
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
let mut inbox = context.inbox.read().unwrap();
if !inbox.is_connected() {
connect_to_inbox(context, &inbox);
if !inbox.is_connected() {
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
current_block = 2670689566614003383;
} else {
@@ -591,14 +587,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(
}
match current_block {
11006700562992250127 => {
if dc_imap_set_seen(
context,
&mut context.inbox.clone().lock().unwrap(),
folder,
uid,
) as libc::c_uint
== 0i32 as libc::c_uint
{
if inbox.set_seen(context, folder, uid) as libc::c_uint == 0i32 as libc::c_uint {
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
}
if 0 != dc_param_get_int((*job).param, 'M' as i32, 0i32) {
@@ -609,11 +598,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(
0i32,
) < 3i32
{
dc_configure_folders(
context,
&mut context.inbox.clone().lock().unwrap(),
0x1i32,
);
inbox.configure_folders(context, 0x1i32);
}
dest_folder = dc_sqlite3_get_config(
context,
@@ -621,15 +606,7 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MDN_ON_IMAP(
b"configured_mvbox_folder\x00" as *const u8 as *const libc::c_char,
0 as *const libc::c_char,
);
match dc_imap_move(
context,
&mut context.inbox.clone().lock().unwrap(),
folder,
uid,
dest_folder,
&mut dest_uid,
) as libc::c_uint
{
match inbox.mv(context, folder, uid, dest_folder, &mut dest_uid) as libc::c_uint {
1 => {
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
}
@@ -648,9 +625,11 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP(
) {
let mut current_block: u64;
let mut msg: *mut dc_msg_t = dc_msg_new_untyped(context);
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
connect_to_inbox(context);
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
let inbox = context.inbox.read().unwrap();
if !inbox.is_connected() {
connect_to_inbox(context, &inbox);
if !inbox.is_connected() {
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
current_block = 17792648348530113339;
} else {
@@ -662,12 +641,8 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP(
match current_block {
15240798224410183470 => {
if !(0 == dc_msg_load_from_db(msg, context, (*job).foreign_id)) {
match dc_imap_set_seen(
context,
&mut context.inbox.clone().lock().unwrap(),
(*msg).server_folder,
(*msg).server_uid,
) as libc::c_uint
match inbox.set_seen(context, (*msg).server_folder, (*msg).server_uid)
as libc::c_uint
{
0 => {}
1 => {
@@ -685,9 +660,8 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP(
1i32,
)
{
match dc_imap_set_mdnsent(
match inbox.set_mdnsent(
context,
&mut context.inbox.clone().lock().unwrap(),
(*msg).server_folder,
(*msg).server_uid,
) as libc::c_uint
@@ -743,9 +717,8 @@ unsafe fn dc_job_do_DC_JOB_MARKSEEN_MSG_ON_IMAP(
1i32,
)
{
match dc_imap_set_mdnsent(
match inbox.set_mdnsent(
context,
&mut context.inbox.clone().lock().unwrap(),
(*msg).server_folder,
(*msg).server_uid,
) as libc::c_uint
@@ -965,21 +938,25 @@ pub unsafe fn dc_interrupt_smtp_idle(mut context: &dc_context_t) {
cvar.notify_one();
}
pub unsafe fn dc_interrupt_imap_idle(mut context: &dc_context_t) {
pub unsafe fn dc_interrupt_imap_idle(context: &dc_context_t) {
dc_log_info(
context,
0i32,
b"Interrupting IMAP-IDLE...\x00" as *const u8 as *const libc::c_char,
);
*context.perform_inbox_jobs_needed.clone().write().unwrap() = 1;
dc_imap_interrupt_idle(&mut context.inbox.clone().lock().unwrap());
println!("inbox lock");
*context.perform_inbox_jobs_needed.write().unwrap() = 1;
println!("imap lock");
context.inbox.read().unwrap().interrupt_idle();
}
unsafe fn dc_job_do_DC_JOB_DELETE_MSG_ON_IMAP(mut context: &dc_context_t, mut job: *mut dc_job_t) {
let mut current_block: u64;
let mut delete_from_server: libc::c_int = 1i32;
let mut msg: *mut dc_msg_t = dc_msg_new_untyped(context);
let inbox = context.inbox.read().unwrap();
if !(0 == dc_msg_load_from_db(msg, context, (*job).foreign_id)
|| (*msg).rfc724_mid.is_null()
|| *(*msg).rfc724_mid.offset(0isize) as libc::c_int == 0i32)
@@ -996,9 +973,9 @@ unsafe fn dc_job_do_DC_JOB_DELETE_MSG_ON_IMAP(mut context: &dc_context_t, mut jo
}
/* if this is the last existing part of the message, we delete the message from the server */
if 0 != delete_from_server {
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
connect_to_inbox(context);
if 0 == dc_imap_is_connected(&mut context.inbox.clone().lock().unwrap()) {
if !inbox.is_connected() {
connect_to_inbox(context, &inbox);
if !inbox.is_connected() {
dc_job_try_again_later(job, 3i32, 0 as *const libc::c_char);
current_block = 8913536887710889399;
} else {
@@ -1010,9 +987,8 @@ unsafe fn dc_job_do_DC_JOB_DELETE_MSG_ON_IMAP(mut context: &dc_context_t, mut jo
match current_block {
8913536887710889399 => {}
_ => {
if 0 == dc_imap_delete_msg(
if 0 == inbox.delete_msg(
context,
&mut context.inbox.clone().lock().unwrap(),
(*msg).rfc724_mid,
(*msg).server_folder,
(*msg).server_uid,
@@ -1049,9 +1025,11 @@ pub unsafe fn dc_job_kill_action(mut context: &dc_context_t, mut action: libc::c
sqlite3_finalize(stmt);
}
pub unsafe fn dc_perform_imap_fetch(mut context: &dc_context_t) {
pub unsafe fn dc_perform_imap_fetch(context: &dc_context_t) {
let inbox = context.inbox.read().unwrap();
let mut start: libc::clock_t = clock();
if 0 == connect_to_inbox(context) {
if 0 == connect_to_inbox(context, &inbox) {
return;
}
if dc_sqlite3_get_config_int(
@@ -1073,14 +1051,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(context, &mut context.inbox.clone().lock().unwrap());
if 0 != context.inbox.clone().lock().unwrap().should_reconnect {
inbox.fetch(context);
if inbox.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(context, &mut context.inbox.clone().lock().unwrap());
inbox.fetch(context);
}
dc_log_info(
context,
@@ -1089,8 +1067,11 @@ 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(context: &dc_context_t) {
connect_to_inbox(context);
let inbox = context.inbox.read().unwrap();
connect_to_inbox(context, &inbox);
if 0 != *context.perform_inbox_jobs_needed.clone().read().unwrap() {
dc_log_info(
@@ -1106,7 +1087,7 @@ pub unsafe fn dc_perform_imap_idle(context: &dc_context_t) {
0i32,
b"INBOX-IDLE started...\x00" as *const u8 as *const libc::c_char,
);
dc_imap_idle(context, &mut context.inbox.clone().lock().unwrap());
inbox.idle(context);
dc_log_info(
context,
0i32,