From b2ff359eb70d294532c9ef2a3884951608576f73 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Sat, 3 Sep 2022 23:44:39 +0300 Subject: [PATCH] melib/imap: add support for CHILDREN extesion RFC 3348 --- melib/src/backends/imap.rs | 1 + melib/src/backends/imap/mailbox.rs | 12 ++++++++++++ melib/src/backends/imap/protocol_parser.rs | 5 +++++ 3 files changed, 18 insertions(+) diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 8e27d470..29812921 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -66,6 +66,7 @@ pub type MessageSequenceNumber = ImapNum; pub static SUPPORTED_CAPABILITIES: &[&str] = &[ "AUTH=OAUTH2", + "CHILDREN", #[cfg(feature = "deflate_compression")] "COMPRESS=DEFLATE", "CONDSTORE", diff --git a/melib/src/backends/imap/mailbox.rs b/melib/src/backends/imap/mailbox.rs index baa918ca..00f5ce0f 100644 --- a/melib/src/backends/imap/mailbox.rs +++ b/melib/src/backends/imap/mailbox.rs @@ -33,6 +33,7 @@ pub struct ImapMailbox { pub path: String, pub name: String, pub parent: Option, + pub has_children: bool, pub children: Vec, pub separator: u8, pub usage: Arc>, @@ -47,6 +48,12 @@ pub struct ImapMailbox { } impl ImapMailbox { + pub fn set_has_children(&mut self, has_children: bool) -> &mut Self { + self.has_children = has_children; + + self + } + pub fn imap_path(&self) -> &str { &self.imap_path } @@ -88,6 +95,9 @@ impl BackendMailbox for ImapMailbox { } fn children(&self) -> &[MailboxHash] { + if !self.has_children { + return &[]; + } &self.children } @@ -106,9 +116,11 @@ impl BackendMailbox for ImapMailbox { fn permissions(&self) -> MailboxPermissions { *self.permissions.lock().unwrap() } + fn is_subscribed(&self) -> bool { self.is_subscribed } + fn set_is_subscribed(&mut self, new_val: bool) -> Result<()> { self.is_subscribed = new_val; Ok(()) diff --git a/melib/src/backends/imap/protocol_parser.rs b/melib/src/backends/imap/protocol_parser.rs index ab78b28b..3a865725 100644 --- a/melib/src/backends/imap/protocol_parser.rs +++ b/melib/src/backends/imap/protocol_parser.rs @@ -449,6 +449,7 @@ pub fn list_mailbox_result(input: &[u8]) -> IResult<&[u8], ImapMailbox> { ({ let separator: u8 = separator[0]; let mut f = ImapMailbox::default(); + f.has_children = true; f.no_select = false; f.is_subscribed = false; @@ -475,6 +476,10 @@ pub fn list_mailbox_result(input: &[u8]) -> IResult<&[u8], ImapMailbox> { let _ = f.set_special_usage(SpecialUsageMailbox::Flagged); } else if p.eq_ignore_ascii_case(b"\\Archive") { let _ = f.set_special_usage(SpecialUsageMailbox::Archive); + } else if p.eq_ignore_ascii_case(b"\\HasChildren") { + f.has_children = true; + } else if p.eq_ignore_ascii_case(b"\\HasNoChildren") { + f.has_children = false; } } f.imap_path = path.to_string();