mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 20:28:11 +00:00
LibIMAP: Support for the FETCH command (*mostly)
This commit doesn't include support for FETCH BODY, because it's a bit big already. Rest assured, FETCH is the most complicated IMAP command, and we'll go back to simple boring ones shortly.
This commit is contained in:
parent
1e9dfdcdcc
commit
c152a9a594
6 changed files with 509 additions and 0 deletions
|
@ -8,4 +8,105 @@
|
|||
|
||||
namespace IMAP {
|
||||
|
||||
String Sequence::serialize() const
|
||||
{
|
||||
if (start == end) {
|
||||
return AK::String::formatted("{}", start);
|
||||
} else {
|
||||
auto start_char = start != -1 ? String::formatted("{}", start) : "*";
|
||||
auto end_char = end != -1 ? String::formatted("{}", end) : "*";
|
||||
return String::formatted("{}:{}", start_char, end_char);
|
||||
}
|
||||
}
|
||||
|
||||
String FetchCommand::DataItem::Section::serialize() const
|
||||
{
|
||||
StringBuilder headers_builder;
|
||||
switch (type) {
|
||||
case SectionType::Header:
|
||||
return "HEADER";
|
||||
case SectionType::HeaderFields:
|
||||
case SectionType::HeaderFieldsNot: {
|
||||
if (type == SectionType::HeaderFields)
|
||||
headers_builder.append("HEADER.FIELDS (");
|
||||
else
|
||||
headers_builder.append("HEADERS.FIELDS.NOT (");
|
||||
|
||||
bool first = true;
|
||||
for (auto& field : headers.value()) {
|
||||
if (!first)
|
||||
headers_builder.append(" ");
|
||||
headers_builder.append(field);
|
||||
first = false;
|
||||
}
|
||||
headers_builder.append(")");
|
||||
return headers_builder.build();
|
||||
}
|
||||
case SectionType::Text:
|
||||
return "TEXT";
|
||||
case SectionType::Parts: {
|
||||
StringBuilder sb;
|
||||
bool first = true;
|
||||
for (int part : parts.value()) {
|
||||
if (!first)
|
||||
sb.append(".");
|
||||
sb.appendff("{}", part);
|
||||
first = false;
|
||||
}
|
||||
if (ends_with_mime) {
|
||||
sb.append(".MIME");
|
||||
}
|
||||
return sb.build();
|
||||
}
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
String FetchCommand::DataItem::serialize() const
|
||||
{
|
||||
switch (type) {
|
||||
case DataItemType::Envelope:
|
||||
return "ENVELOPE";
|
||||
case DataItemType::Flags:
|
||||
return "FLAGS";
|
||||
case DataItemType::InternalDate:
|
||||
return "INTERNALDATE";
|
||||
case DataItemType::UID:
|
||||
return "UID";
|
||||
case DataItemType::PeekBody:
|
||||
TODO();
|
||||
case DataItemType::BodySection:
|
||||
StringBuilder sb;
|
||||
sb.appendff("BODY[{}]", section.value().serialize());
|
||||
if (partial_fetch) {
|
||||
sb.appendff("<{}.{}>", start, octets);
|
||||
}
|
||||
|
||||
return sb.build();
|
||||
}
|
||||
VERIFY_NOT_REACHED();
|
||||
}
|
||||
String FetchCommand::serialize()
|
||||
{
|
||||
StringBuilder sequence_builder;
|
||||
bool first = true;
|
||||
for (auto& sequence : sequence_set) {
|
||||
if (!first) {
|
||||
sequence_builder.append(",");
|
||||
}
|
||||
sequence_builder.append(sequence.serialize());
|
||||
first = false;
|
||||
}
|
||||
|
||||
StringBuilder data_items_builder;
|
||||
first = true;
|
||||
for (auto& data_item : data_items) {
|
||||
if (!first) {
|
||||
data_items_builder.append(" ");
|
||||
}
|
||||
data_items_builder.append(data_item.serialize());
|
||||
first = false;
|
||||
}
|
||||
|
||||
return AK::String::formatted("{} ({})", sequence_builder.build(), data_items_builder.build());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue