aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/imap/IMAPUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/imap/IMAPUtils.cpp')
-rw-r--r--src/net/imap/IMAPUtils.cpp80
1 files changed, 78 insertions, 2 deletions
diff --git a/src/net/imap/IMAPUtils.cpp b/src/net/imap/IMAPUtils.cpp
index 0d6fc478..eceac16b 100644
--- a/src/net/imap/IMAPUtils.cpp
+++ b/src/net/imap/IMAPUtils.cpp
@@ -540,6 +540,24 @@ const string IMAPUtils::listToSet(const std::vector <int>& list, const int max,
// static
+const string IMAPUtils::listToSet(const std::vector <message::uid>& list)
+{
+ if (list.size() == 0)
+ return "";
+
+ std::ostringstream res;
+ res.imbue(std::locale::classic());
+
+ res << extractUIDFromGlobalUID(list[0]);
+
+ for (unsigned int i = 1, n = list.size() ; i < n ; ++i)
+ res << "," << extractUIDFromGlobalUID(list[i]);
+
+ return res.str();
+}
+
+
+// static
const string IMAPUtils::dateTime(const vmime::datetime& date)
{
std::ostringstream res;
@@ -609,7 +627,8 @@ const string IMAPUtils::dateTime(const vmime::datetime& date)
// static
-const string IMAPUtils::buildFetchRequest(const std::vector <int>& list, const int options)
+const string IMAPUtils::buildFetchRequestImpl
+ (const std::string& mode, const std::string& set, const int options)
{
// Example:
// C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])
@@ -671,7 +690,10 @@ const string IMAPUtils::buildFetchRequest(const std::vector <int>& list, const i
std::ostringstream command;
command.imbue(std::locale::classic());
- command << "FETCH " << listToSet(list, -1, false) << " (";
+ if (mode == "uid")
+ command << "UID FETCH " << set << " (";
+ else
+ command << "FETCH " << set << " (";
for (std::vector <string>::const_iterator it = items.begin() ;
it != items.end() ; ++it)
@@ -687,6 +709,20 @@ const string IMAPUtils::buildFetchRequest(const std::vector <int>& list, const i
// static
+const string IMAPUtils::buildFetchRequest(const std::vector <int>& list, const int options)
+{
+ return buildFetchRequestImpl("number", listToSet(list, -1, false), options);
+}
+
+
+// static
+const string IMAPUtils::buildFetchRequest(const std::vector <message::uid>& list, const int options)
+{
+ return buildFetchRequestImpl("uid", listToSet(list), options);
+}
+
+
+// static
void IMAPUtils::convertAddressList
(const IMAPParser::address_list& src, mailboxList& dest)
{
@@ -706,6 +742,46 @@ void IMAPUtils::convertAddressList
}
+// static
+unsigned int IMAPUtils::extractUIDFromGlobalUID(const message::uid& uid)
+{
+ message::uid::size_type colonPos = uid.find(':');
+
+ if (colonPos == message::uid::npos)
+ {
+ std::istringstream iss(uid);
+ iss.imbue(std::locale::classic());
+
+ unsigned int n = 0;
+ iss >> n;
+
+ return n;
+ }
+ else
+ {
+ std::istringstream iss(uid.substr(colonPos + 1));
+ iss.imbue(std::locale::classic());
+
+ unsigned int n = 0;
+ iss >> n;
+
+ return n;
+ }
+}
+
+
+// static
+const message::uid IMAPUtils::makeGlobalUID(const unsigned int UIDValidity, const unsigned int messageUID)
+{
+ std::ostringstream oss;
+ oss.imbue(std::locale::classic());
+
+ oss << UIDValidity << ":" << messageUID;
+
+ return message::uid(oss.str());
+}
+
+
} // imap
} // net
} // vmime