From 16995dc3d98e9d3036baae6535a0c7f2fb970d24 Mon Sep 17 00:00:00 2001 From: x-yl Date: Wed, 2 Jun 2021 18:51:46 +0400 Subject: [PATCH] LibIMAP: Support for APPEND --- Userland/Libraries/LibIMAP/Client.cpp | 33 +++++++++++++++++++++++++++ Userland/Libraries/LibIMAP/Client.h | 1 + Userland/Libraries/LibIMAP/Objects.h | 1 + 3 files changed, 35 insertions(+) diff --git a/Userland/Libraries/LibIMAP/Client.cpp b/Userland/Libraries/LibIMAP/Client.cpp index b5543d881a..37bf28f46a 100644 --- a/Userland/Libraries/LibIMAP/Client.cpp +++ b/Userland/Libraries/LibIMAP/Client.cpp @@ -144,6 +144,8 @@ static ReadonlyBytes command_byte_buffer(CommandType command) return "UID COPY"sv.bytes(); case CommandType::UIDSearch: return "UID SEARCH"sv.bytes(); + case CommandType::Append: + return "APPEND"sv.bytes(); case CommandType::Rename: return "RENAME"sv.bytes(); case CommandType::Status: @@ -360,6 +362,37 @@ RefPtr>> Client::status(StringView mailbox, Vect return cast_promise(send_command(move(command))); } +RefPtr>> Client::append(StringView mailbox, Message&& message, Optional> flags, Optional date_time) +{ + Vector args = { mailbox }; + if (flags.has_value()) { + StringBuilder flags_sb; + flags_sb.append('('); + flags_sb.join(" ", flags.value()); + flags_sb.append(')'); + args.append(flags_sb.build()); + } + if (date_time.has_value()) + args.append(date_time.value().to_string("\"%d-%b-%Y %H:%M:%S +0000\"")); + + args.append(String::formatted("{{{}}}", message.data.length())); + + auto continue_req = send_command(Command { CommandType::Append, m_current_command, args }); + + auto response_promise = Promise>::construct(); + m_pending_promises.append(response_promise); + + continue_req->on_resolved = [this, message2 { move(message) }](auto& data) { + if (!data.has_value()) { + handle_parsed_response({ .successful = false, .response = {} }); + } else { + send_raw(message2.data); + m_expecting_response = true; + } + }; + + return cast_promise(response_promise); +} RefPtr>> Client::rename(StringView from, StringView to) { auto command = Command { CommandType::Rename, m_current_command, { from, to } }; diff --git a/Userland/Libraries/LibIMAP/Client.h b/Userland/Libraries/LibIMAP/Client.h index 2e79d7eb13..a1b2f46c1b 100644 --- a/Userland/Libraries/LibIMAP/Client.h +++ b/Userland/Libraries/LibIMAP/Client.h @@ -34,6 +34,7 @@ public: RefPtr>> idle(); RefPtr>> finish_idle(); RefPtr>> status(StringView mailbox, Vector const& types); + RefPtr>> append(StringView mailbox, Message&& message, Optional> flags = {}, Optional date_time = {}); void close(); diff --git a/Userland/Libraries/LibIMAP/Objects.h b/Userland/Libraries/LibIMAP/Objects.h index 3ad9b51bed..9f9b926caa 100644 --- a/Userland/Libraries/LibIMAP/Objects.h +++ b/Userland/Libraries/LibIMAP/Objects.h @@ -17,6 +17,7 @@ namespace IMAP { enum class CommandType { + Append, Capability, Copy, Create,