summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2019-08-26 20:04:02 +0300
committerManos Pitsidianakis <el13635@mail.ntua.gr>2019-09-15 13:21:14 +0300
commit525bd1649316c3f0abc5234cd4470fa124712289 (patch)
tree6e60010ff330b35ce16a7a6180df9b18ec7226ac
parentc9f7b41e4720b2aef0c68f5c6e3361a859c1f4e3 (diff)
imap: add folder operations in backend
-rw-r--r--melib/src/backends/imap.rs54
1 files changed, 53 insertions, 1 deletions
diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs
index 7307336c..3ecee812 100644
--- a/melib/src/backends/imap.rs
+++ b/melib/src/backends/imap.rs
@@ -36,7 +36,7 @@ use crate::backends::BackendOp;
use crate::backends::FolderHash;
use crate::backends::RefreshEvent;
use crate::backends::RefreshEventKind::{self, *};
-use crate::backends::{BackendFolder, Folder, MailBackend, RefreshEventConsumer};
+use crate::backends::{BackendFolder, Folder, FolderOperation, MailBackend, RefreshEventConsumer};
use crate::conf::AccountSettings;
use crate::email::*;
use crate::error::{MeliError, Result};
@@ -525,6 +525,58 @@ impl MailBackend for ImapType {
conn.read_response(&mut response)?;
Ok(())
}
+
+ fn folder_operation(&mut self, path: &str, op: FolderOperation) -> Result<()> {
+ use FolderOperation::*;
+
+ match (&op, self.folders.values().any(|f| f.path == path)) {
+ (Create, true) => {
+ return Err(MeliError::new(format!(
+ "Folder named `{}` in account `{}` already exists.",
+ path, self.account_name,
+ )));
+ }
+ (op, false) if *op != Create => {
+ return Err(MeliError::new(format!(
+ "No folder named `{}` in account `{}`",
+ path, self.account_name,
+ )));
+ }
+ _ => {}
+ }
+
+ let mut response = String::with_capacity(8 * 1024);
+ match op {
+ Create => {
+ let mut conn = self.connection.lock()?;
+ conn.send_command(format!("CREATE \"{}\"", path,).as_bytes())?;
+ conn.read_response(&mut response)?;
+ conn.send_command(format!("SUBSCRIBE \"{}\"", path,).as_bytes())?;
+ conn.read_response(&mut response)?;
+ }
+ Rename(dest) => {
+ let mut conn = self.connection.lock()?;
+ conn.send_command(format!("RENAME \"{}\" \"{}\"", path, dest).as_bytes())?;
+ conn.read_response(&mut response)?;
+ }
+ Delete => {
+ let mut conn = self.connection.lock()?;
+ conn.send_command(format!("DELETE \"{}\"", path,).as_bytes())?;
+ conn.read_response(&mut response)?;
+ }
+ Subscribe => {
+ let mut conn = self.connection.lock()?;
+ conn.send_command(format!("SUBSCRIBE \"{}\"", path,).as_bytes())?;
+ conn.read_response(&mut response)?;
+ }
+ Unsubscribe => {
+ let mut conn = self.connection.lock()?;
+ conn.send_command(format!("UNSUBSCRIBE \"{}\"", path,).as_bytes())?;
+ conn.read_response(&mut response)?;
+ }
+ }
+ Ok(())
+ }
}
fn lookup_ipv4(host: &str, port: u16) -> Result<SocketAddr> {