aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vmime/net/imap/IMAPFolder.cpp110
-rw-r--r--src/vmime/net/imap/IMAPUtils.cpp14
-rw-r--r--src/vmime/net/imap/IMAPUtils.hpp7
-rw-r--r--src/vmime/net/maildir/maildirFolder.cpp8
-rw-r--r--src/vmime/net/maildir/maildirUtils.cpp19
-rw-r--r--src/vmime/net/maildir/maildirUtils.hpp3
-rw-r--r--src/vmime/net/messageSet.cpp15
-rw-r--r--src/vmime/net/pop3/POP3Folder.cpp6
-rw-r--r--src/vmime/net/pop3/POP3Utils.cpp19
-rw-r--r--src/vmime/net/pop3/POP3Utils.hpp3
10 files changed, 111 insertions, 93 deletions
diff --git a/src/vmime/net/imap/IMAPFolder.cpp b/src/vmime/net/imap/IMAPFolder.cpp
index 2ed64936..fbc23d4d 100644
--- a/src/vmime/net/imap/IMAPFolder.cpp
+++ b/src/vmime/net/imap/IMAPFolder.cpp
@@ -542,79 +542,75 @@ std::vector <shared_ptr <message> > IMAPFolder::getMessages(const messageSet& ms
std::vector <shared_ptr <message> > messages;
- if (msgs.isNumberSet())
- {
- const std::vector <size_t> numbers = IMAPUtils::messageSetToNumberList(msgs);
-
- shared_ptr <IMAPFolder> thisFolder = dynamicCast <IMAPFolder>(shared_from_this());
+ // Sequence number message set:
+ // C: . FETCH uuuu1,uuuu2,uuuu3 UID
+ // S: * nnnn1 FETCH (UID uuuu1)
+ // S: * nnnn2 FETCH (UID uuuu2)
+ // S: * nnnn3 FETCH (UID uuuu3)
+ // S: . OK FETCH completed
- for (std::vector <size_t>::const_iterator it = numbers.begin() ; it != numbers.end() ; ++it)
- messages.push_back(make_shared <IMAPMessage>(thisFolder, *it));
- }
- else if (msgs.isUIDSet())
- {
- // C: . UID FETCH uuuu1,uuuu2,uuuu3 UID
- // S: * nnnn1 FETCH (UID uuuu1)
- // S: * nnnn2 FETCH (UID uuuu2)
- // S: * nnnn3 FETCH (UID uuuu3)
- // S: . OK UID FETCH completed
+ // UID message set:
+ // C: . UID FETCH uuuu1,uuuu2,uuuu3 UID
+ // S: * nnnn1 FETCH (UID uuuu1)
+ // S: * nnnn2 FETCH (UID uuuu2)
+ // S: * nnnn3 FETCH (UID uuuu3)
+ // S: . OK UID FETCH completed
- std::vector <string> params;
- params.push_back("UID");
+ std::vector <string> params;
+ params.push_back("UID");
- IMAPCommand::FETCH(msgs, params)->send(m_connection);
+ IMAPCommand::FETCH(msgs, params)->send(m_connection);
- // Get the response
- scoped_ptr <IMAPParser::response> resp(m_connection->readResponse());
+ // Get the response
+ scoped_ptr <IMAPParser::response> resp(m_connection->readResponse());
- if (resp->isBad() || resp->response_done()->response_tagged()->
- resp_cond_state()->status() != IMAPParser::resp_cond_state::OK)
- {
- throw exceptions::command_error("UID FETCH ... UID", resp->getErrorLog(), "bad response");
- }
+ if (resp->isBad() || resp->response_done()->response_tagged()->
+ resp_cond_state()->status() != IMAPParser::resp_cond_state::OK)
+ {
+ throw exceptions::command_error("UID FETCH ... UID", resp->getErrorLog(), "bad response");
+ }
- // Process the response
- const std::vector <IMAPParser::continue_req_or_response_data*>& respDataList =
- resp->continue_req_or_response_data();
+ // Process the response
+ const std::vector <IMAPParser::continue_req_or_response_data*>& respDataList =
+ resp->continue_req_or_response_data();
- for (std::vector <IMAPParser::continue_req_or_response_data*>::const_iterator
- it = respDataList.begin() ; it != respDataList.end() ; ++it)
+ for (std::vector <IMAPParser::continue_req_or_response_data*>::const_iterator
+ it = respDataList.begin() ; it != respDataList.end() ; ++it)
+ {
+ if ((*it)->response_data() == NULL)
{
- if ((*it)->response_data() == NULL)
- {
- throw exceptions::command_error("UID FETCH ... UID",
- resp->getErrorLog(), "invalid response");
- }
+ throw exceptions::command_error("UID FETCH ... UID",
+ resp->getErrorLog(), "invalid response");
+ }
- const IMAPParser::message_data* messageData =
- (*it)->response_data()->message_data();
+ const IMAPParser::message_data* messageData =
+ (*it)->response_data()->message_data();
- // We are only interested in responses of type "FETCH"
- if (messageData == NULL || messageData->type() != IMAPParser::message_data::FETCH)
- continue;
+ // We are only interested in responses of type "FETCH"
+ if (messageData == NULL || messageData->type() != IMAPParser::message_data::FETCH)
+ continue;
- // Get Process fetch response for this message
- const size_t msgNum = messageData->number();
- message::uid msgUID;
+ // Get Process fetch response for this message
+ const size_t msgNum = messageData->number();
+ message::uid msgUID;
- // Find UID in message attributes
- const std::vector <IMAPParser::msg_att_item*> atts = messageData->msg_att()->items();
+ // Find UID in message attributes
+ const std::vector <IMAPParser::msg_att_item*> atts = messageData->msg_att()->items();
- for (std::vector <IMAPParser::msg_att_item*>::const_iterator
- it = atts.begin() ; it != atts.end() ; ++it)
+ for (std::vector <IMAPParser::msg_att_item*>::const_iterator
+ it = atts.begin() ; it != atts.end() ; ++it)
+ {
+ if ((*it)->type() == IMAPParser::msg_att_item::UID)
{
- if ((*it)->type() == IMAPParser::msg_att_item::UID)
- {
- msgUID = (*it)->unique_id()->value();
- break;
- }
+ msgUID = (*it)->unique_id()->value();
+ break;
}
+ }
- if (!msgUID.empty())
- {
- shared_ptr <IMAPFolder> thisFolder = dynamicCast <IMAPFolder>(shared_from_this());
- messages.push_back(make_shared <IMAPMessage>(thisFolder, msgNum, msgUID));
- }
+ if (!msgUID.empty())
+ {
+ shared_ptr <IMAPFolder> thisFolder = dynamicCast <IMAPFolder>(shared_from_this());
+ messages.push_back(make_shared <IMAPMessage>(thisFolder, msgNum, msgUID));
}
}
diff --git a/src/vmime/net/imap/IMAPUtils.cpp b/src/vmime/net/imap/IMAPUtils.cpp
index d92ee240..6124edcf 100644
--- a/src/vmime/net/imap/IMAPUtils.cpp
+++ b/src/vmime/net/imap/IMAPUtils.cpp
@@ -703,6 +703,8 @@ public:
if (range.getFirst() == range.getLast())
m_oss << range.getFirst();
+ else if (range.getLast() == size_t(-1))
+ m_oss << range.getFirst() << ":*";
else
m_oss << range.getFirst() << ":" << range.getLast();
@@ -716,6 +718,8 @@ public:
if (range.getFirst() == range.getLast())
m_oss << range.getFirst();
+ else if (range.getLast() == size_t(-1))
+ m_oss << range.getFirst() << ":*";
else
m_oss << range.getFirst() << ":" << range.getLast();
@@ -772,16 +776,6 @@ const string IMAPUtils::messageSetToSequenceSet(const messageSet& msgs)
// static
-const std::vector <size_t> IMAPUtils::messageSetToNumberList(const messageSet& msgs)
-{
- IMAPMessageSetEnumerator en;
- msgs.enumerate(en);
-
- return en.list();
-}
-
-
-// static
messageSet IMAPUtils::buildMessageSet(const IMAPParser::uid_set* uidSet)
{
messageSet set = messageSet::empty();
diff --git a/src/vmime/net/imap/IMAPUtils.hpp b/src/vmime/net/imap/IMAPUtils.hpp
index 729bc0f0..6140855d 100644
--- a/src/vmime/net/imap/IMAPUtils.hpp
+++ b/src/vmime/net/imap/IMAPUtils.hpp
@@ -114,13 +114,6 @@ public:
*/
static const string messageSetToSequenceSet(const messageSet& msgs);
- /** Returns a list of message sequence numbers given a message set.
- *
- * @param msgs message set
- * @return list of message numbers
- */
- static const std::vector <size_t> messageSetToNumberList(const messageSet& msgs);
-
/** Constructs a message set from a parser 'uid_set' structure.
*
* @param uidSet UID set, as returned by the parser
diff --git a/src/vmime/net/maildir/maildirFolder.cpp b/src/vmime/net/maildir/maildirFolder.cpp
index 81e64cee..94cf5b68 100644
--- a/src/vmime/net/maildir/maildirFolder.cpp
+++ b/src/vmime/net/maildir/maildirFolder.cpp
@@ -427,7 +427,7 @@ std::vector <shared_ptr <message> > maildirFolder::getMessages(const messageSet&
if (msgs.isNumberSet())
{
- const std::vector <size_t> numbers = maildirUtils::messageSetToNumberList(msgs);
+ const std::vector <size_t> numbers = maildirUtils::messageSetToNumberList(msgs, m_messageCount);
std::vector <shared_ptr <message> > messages;
shared_ptr <maildirFolder> thisFolder = dynamicCast <maildirFolder>(shared_from_this());
@@ -595,7 +595,7 @@ void maildirFolder::setMessageFlags
if (msgs.isNumberSet())
{
- const std::vector <size_t> nums = maildirUtils::messageSetToNumberList(msgs);
+ const std::vector <size_t> nums = maildirUtils::messageSetToNumberList(msgs, m_messageCount);
// Change message flags
shared_ptr <utility::fileSystemFactory> fsf = platform::getHandler()->getFileSystemFactory();
@@ -950,7 +950,7 @@ messageSet maildirFolder::copyMessages(const folder::path& dest, const messageSe
}
// Copy messages
- const std::vector <size_t> nums = maildirUtils::messageSetToNumberList(msgs);
+ const std::vector <size_t> nums = maildirUtils::messageSetToNumberList(msgs, m_messageCount);
try
{
@@ -1013,6 +1013,8 @@ void maildirFolder::status(size_t& count, size_t& unseen)
count = status->getMessageCount();
unseen = status->getUnseenCount();
+
+ m_messageCount = count;
}
diff --git a/src/vmime/net/maildir/maildirUtils.cpp b/src/vmime/net/maildir/maildirUtils.cpp
index 8c40f076..b31eb931 100644
--- a/src/vmime/net/maildir/maildirUtils.cpp
+++ b/src/vmime/net/maildir/maildirUtils.cpp
@@ -218,9 +218,18 @@ class maildirMessageSetEnumerator : public messageSetEnumerator
{
public:
+ maildirMessageSetEnumerator(const size_t msgCount)
+ : m_msgCount(msgCount)
+ {
+
+ }
+
void enumerateNumberMessageRange(const vmime::net::numberMessageRange& range)
{
- for (size_t i = range.getFirst(), last = range.getLast() ; i <= last ; ++i)
+ size_t last = range.getLast();
+ if (last == size_t(-1)) last = m_msgCount;
+
+ for (size_t i = range.getFirst() ; i <= last ; ++i)
list.push_back(i);
}
@@ -232,13 +241,17 @@ public:
public:
std::vector <size_t> list;
+
+private:
+
+ size_t m_msgCount;
};
// static
-const std::vector <size_t> maildirUtils::messageSetToNumberList(const messageSet& msgs)
+const std::vector <size_t> maildirUtils::messageSetToNumberList(const messageSet& msgs, const size_t msgCount)
{
- maildirMessageSetEnumerator en;
+ maildirMessageSetEnumerator en(msgCount);
msgs.enumerate(en);
return en.list;
diff --git a/src/vmime/net/maildir/maildirUtils.hpp b/src/vmime/net/maildir/maildirUtils.hpp
index 152db45b..8899bdd7 100644
--- a/src/vmime/net/maildir/maildirUtils.hpp
+++ b/src/vmime/net/maildir/maildirUtils.hpp
@@ -135,9 +135,10 @@ public:
/** Returns a list of message numbers given a message set.
*
* @param msgs message set
+ * @param msgCount number of messages in folder
* @return list of message numbers
*/
- static const std::vector <size_t> messageSetToNumberList(const messageSet& msgs);
+ static const std::vector <size_t> messageSetToNumberList(const messageSet& msgs, const size_t msgCount);
};
diff --git a/src/vmime/net/messageSet.cpp b/src/vmime/net/messageSet.cpp
index 516dce12..e30ebc5c 100644
--- a/src/vmime/net/messageSet.cpp
+++ b/src/vmime/net/messageSet.cpp
@@ -63,9 +63,9 @@ numberMessageRange::numberMessageRange(const size_t number)
numberMessageRange::numberMessageRange(const size_t first, const size_t last)
: m_first(first), m_last(last)
{
- if (first < 1)
+ if (first < 1 || first == static_cast <size_t>(-1))
throw std::invalid_argument("first");
- else if (last != -1U && last < first)
+ else if (last != static_cast <size_t>(-1) && last < first)
throw std::invalid_argument("last");
}
@@ -208,7 +208,7 @@ messageSet messageSet::byNumber(const std::vector <size_t>& numbers)
std::sort(sortedNumbers.begin(), sortedNumbers.end());
// Build the set by detecting ranges of continuous numbers
- size_t previous = -1U, rangeStart = -1U;
+ size_t previous = static_cast <size_t>(-1), rangeStart = static_cast <size_t>(-1);
messageSet set;
for (std::vector <size_t>::const_iterator it = sortedNumbers.begin() ;
@@ -219,7 +219,10 @@ messageSet messageSet::byNumber(const std::vector <size_t>& numbers)
if (current == previous)
continue; // skip duplicates
- if (previous == -1U)
+ if (current == static_cast <size_t>(-1))
+ throw std::invalid_argument("numbers");
+
+ if (previous == static_cast <size_t>(-1))
{
previous = current;
rangeStart = current;
@@ -302,7 +305,7 @@ messageSet messageSet::byUID(const std::vector <message::uid>& uids)
std::sort(sortedUIDs.begin(), sortedUIDs.end());
// Build the set by detecting ranges of continuous numbers
- vmime_uint32 previous = -1U, rangeStart = -1U;
+ vmime_uint32 previous = static_cast <vmime_uint32>(-1), rangeStart = static_cast <vmime_uint32>(-1);
messageSet set;
for (std::vector <vmime_uint32>::const_iterator it = sortedUIDs.begin() ;
@@ -313,7 +316,7 @@ messageSet messageSet::byUID(const std::vector <message::uid>& uids)
if (current == previous)
continue; // skip duplicates
- if (previous == -1U)
+ if (previous == static_cast <vmime_uint32>(-1))
{
previous = current;
rangeStart = current;
diff --git a/src/vmime/net/pop3/POP3Folder.cpp b/src/vmime/net/pop3/POP3Folder.cpp
index 6621fd37..459cc043 100644
--- a/src/vmime/net/pop3/POP3Folder.cpp
+++ b/src/vmime/net/pop3/POP3Folder.cpp
@@ -245,7 +245,7 @@ std::vector <shared_ptr <message> > POP3Folder::getMessages(const messageSet& ms
if (msgs.isNumberSet())
{
- const std::vector <size_t> numbers = POP3Utils::messageSetToNumberList(msgs);
+ const std::vector <size_t> numbers = POP3Utils::messageSetToNumberList(msgs, m_messageCount);
std::vector <shared_ptr <message> > messages;
shared_ptr <POP3Folder> thisFolder(dynamicCast <POP3Folder>(shared_from_this()));
@@ -558,7 +558,7 @@ void POP3Folder::deleteMessages(const messageSet& msgs)
{
shared_ptr <POP3Store> store = m_store.lock();
- const std::vector <size_t> nums = POP3Utils::messageSetToNumberList(msgs);
+ const std::vector <size_t> nums = POP3Utils::messageSetToNumberList(msgs, m_messageCount);
if (nums.empty())
throw exceptions::invalid_argument();
@@ -653,6 +653,8 @@ void POP3Folder::status(size_t& count, size_t& unseen)
count = status->getMessageCount();
unseen = status->getUnseenCount();
+
+ m_messageCount = count;
}
diff --git a/src/vmime/net/pop3/POP3Utils.cpp b/src/vmime/net/pop3/POP3Utils.cpp
index 6627cca6..0649fb79 100644
--- a/src/vmime/net/pop3/POP3Utils.cpp
+++ b/src/vmime/net/pop3/POP3Utils.cpp
@@ -78,9 +78,18 @@ class POP3MessageSetEnumerator : public messageSetEnumerator
{
public:
+ POP3MessageSetEnumerator(const size_t msgCount)
+ : m_msgCount(msgCount)
+ {
+
+ }
+
void enumerateNumberMessageRange(const vmime::net::numberMessageRange& range)
{
- for (size_t i = range.getFirst(), last = range.getLast() ; i <= last ; ++i)
+ size_t last = range.getLast();
+ if (last == size_t(-1)) last = m_msgCount;
+
+ for (size_t i = range.getFirst() ; i <= last ; ++i)
list.push_back(i);
}
@@ -92,13 +101,17 @@ public:
public:
std::vector <size_t> list;
+
+private:
+
+ size_t m_msgCount;
};
// static
-const std::vector <size_t> POP3Utils::messageSetToNumberList(const messageSet& msgs)
+const std::vector <size_t> POP3Utils::messageSetToNumberList(const messageSet& msgs, const size_t msgCount)
{
- POP3MessageSetEnumerator en;
+ POP3MessageSetEnumerator en(msgCount);
msgs.enumerate(en);
return en.list;
diff --git a/src/vmime/net/pop3/POP3Utils.hpp b/src/vmime/net/pop3/POP3Utils.hpp
index 995c9115..c7d15b07 100644
--- a/src/vmime/net/pop3/POP3Utils.hpp
+++ b/src/vmime/net/pop3/POP3Utils.hpp
@@ -69,9 +69,10 @@ public:
/** Returns a list of message numbers given a message set.
*
* @param msgs message set
+ * @param msgCount number of messages in folder
* @return list of message numbers
*/
- static const std::vector <size_t> messageSetToNumberList(const messageSet& msgs);
+ static const std::vector <size_t> messageSetToNumberList(const messageSet& msgs, const size_t msgCount);
};