diff --git a/src/imap.rs b/src/imap.rs index 9f52938fb..0589cffa2 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -32,7 +32,8 @@ pub struct Imap { precheck_imf: dc_precheck_imf_t, receive_imf: dc_receive_imf_t, - session: Arc, Option)>>, + session: Arc>>, + stream: Arc>>, connected: Arc>, } @@ -350,7 +351,8 @@ impl Imap { receive_imf: dc_receive_imf_t, ) -> Self { Imap { - session: Arc::new(Mutex::new((None, None))), + session: Arc::new(Mutex::new(None)), + stream: Arc::new(RwLock::new(None)), config: Arc::new(RwLock::new(ImapConfig::default())), watch: Arc::new((Mutex::new(false), Condvar::new())), get_config, @@ -378,7 +380,7 @@ impl Imap { self.unsetup_handle(context); } - if self.is_connected() && self.session.lock().unwrap().1.is_some() { + if self.is_connected() && self.stream.read().unwrap().is_some() { self.config.write().unwrap().should_reconnect = false; return 1; } @@ -453,7 +455,8 @@ impl Imap { match login_res { Ok((session, stream)) => { - *self.session.lock().unwrap() = (Some(session), Some(stream)); + *self.session.lock().unwrap() = Some(session); + *self.stream.write().unwrap() = Some(stream); 1 } Err((err, _)) => { @@ -466,7 +469,7 @@ impl Imap { } fn unsetup_handle(&self, context: &Context) { - let session = self.session.lock().unwrap().0.take(); + let session = self.session.lock().unwrap().take(); if session.is_some() { match session.unwrap().close() { Ok(_) => {} @@ -475,7 +478,7 @@ impl Imap { } } } - let stream = self.session.lock().unwrap().1.take(); + let stream = self.stream.write().unwrap().take(); if stream.is_some() { match stream.unwrap().shutdown(net::Shutdown::Both) { Ok(_) => {} @@ -537,7 +540,7 @@ impl Imap { return 0; } - match self.session.lock().unwrap().0 { + match &mut *self.session.lock().unwrap() { Some(ref mut session) => { if let Ok(caps) = session.capabilities() { let can_idle = caps.has("IDLE"); @@ -615,7 +618,7 @@ impl Imap { } fn select_folder>(&self, context: &Context, folder: Option) -> usize { - if self.session.lock().unwrap().0.is_none() { + if self.session.lock().unwrap().is_none() { let mut cfg = self.config.write().unwrap(); cfg.selected_folder = None; cfg.selected_folder_needs_expunge = false; @@ -639,7 +642,7 @@ impl Imap { // A CLOSE-SELECT is considerably faster than an EXPUNGE-SELECT, see // https://tools.ietf.org/html/rfc3501#section-6.4.2 - if let Some(ref mut session) = self.session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.close() { Ok(_) => {} Err(err) => { @@ -655,7 +658,7 @@ impl Imap { // select new folder if let Some(ref folder) = folder { - if let Some(ref mut session) = self.session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.select(folder) { Ok(mailbox) => { let mut config = self.config.write().unwrap(); @@ -761,7 +764,7 @@ impl Imap { return 0; } - let list = if let Some(ref mut session) = self.session.lock().unwrap().0 { + let list = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { // `FETCH (UID)` let set = format!("{}", mailbox.exists); match session.fetch(set, PREFETCH_FLAGS) { @@ -805,7 +808,7 @@ impl Imap { let mut read_errors = 0; let mut new_last_seen_uid = 0; - let list = if let Some(ref mut session) = self.session.lock().unwrap().0 { + let list = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { // fetch messages with larger UID than the last one seen // (`UID FETCH lastseenuid+1:*)`, see RFC 4549 let set = format!("{}:*", last_seen_uid + 1); @@ -928,7 +931,7 @@ impl Imap { let set = format!("{}", server_uid); - let msgs = if let Some(ref mut session) = self.session.lock().unwrap().0 { + let msgs = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_fetch(set, BODY_FLAGS) { Ok(msgs) => msgs, Err(err) => { @@ -1027,7 +1030,7 @@ impl Imap { std::thread::spawn(move || { let &(ref lock, ref cvar) = &*v; - if let Some(ref mut session) = session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *session.lock().unwrap() { let mut idle = match session.idle() { Ok(idle) => idle, Err(err) => { @@ -1205,7 +1208,7 @@ impl Imap { folder.as_ref() ); } else { - let moved = if let Some(ref mut session) = self.session.lock().unwrap().0 { + let moved = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_mv(&set, &dest_folder) { Ok(_) => { res = DC_SUCCESS; @@ -1230,7 +1233,7 @@ impl Imap { }; if !moved { - let copied = if let Some(ref mut session) = self.session.lock().unwrap().0 { + let copied = if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_copy(&set, &dest_folder) { Ok(_) => true, Err(err) => { @@ -1275,7 +1278,7 @@ impl Imap { if server_uid == 0 { return 0; } - if let Some(ref mut session) = self.session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { let set = format!("{}", server_uid); let query = format!("+FLAGS ({})", flag.as_ref()); match session.uid_store(&set, &query) { @@ -1387,18 +1390,18 @@ impl Imap { .expect("just selected folder"); if can_create_flag { - let fetched_msgs = if let Some(ref mut session) = self.session.lock().unwrap().0 - { - match session.uid_fetch(set, FETCH_FLAGS) { - Ok(res) => Some(res), - Err(err) => { - eprintln!("fetch error: {:?}", err); - None + let fetched_msgs = + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { + match session.uid_fetch(set, FETCH_FLAGS) { + Ok(res) => Some(res), + Err(err) => { + eprintln!("fetch error: {:?}", err); + None + } } - } - } else { - unreachable!(); - }; + } else { + unreachable!(); + }; if let Some(msgs) = fetched_msgs { let flag_set = msgs @@ -1479,7 +1482,7 @@ impl Imap { ); } else { let set = format!("{}", server_uid); - if let Some(ref mut session) = self.session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.uid_fetch(set, PREFETCH_FLAGS) { Ok(msgs) => { if msgs.is_empty() @@ -1561,7 +1564,7 @@ impl Imap { if mvbox_folder.is_none() && 0 != (flags as usize & DC_CREATE_MVBOX) { info!(context, 0, "Creating MVBOX-folder \"DeltaChat\"...",); - if let Some(ref mut session) = self.session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { match session.create("DeltaChat") { Ok(_) => { mvbox_folder = Some("DeltaChat".into()); @@ -1616,7 +1619,7 @@ impl Imap { &self, context: &Context, ) -> Option>> { - if let Some(ref mut session) = self.session.lock().unwrap().0 { + if let Some(ref mut session) = &mut *self.session.lock().unwrap() { // TODO: use xlist when available match session.list(Some(""), Some("*")) { Ok(list) => {