diff --git a/ChangeLog b/ChangeLog index c2a6af0a..62d49e1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -11,6 +11,8 @@ VERSION 0.6.4cvs * SConstruct: fixed compilation/linking problem with g++ and X86-64 on static library: added -fPIC/-fpic in compiler flags. + * messaging/POP3*: added notifications. + 2005-03-17 Vincent Richard * base.{cpp|hpp}: renamed 'MIME_VERSION' to 'SUPPORTED_MIME_VERSION'. diff --git a/src/messaging/POP3Folder.cpp b/src/messaging/POP3Folder.cpp index c70005c6..e0bac1a8 100644 --- a/src/messaging/POP3Folder.cpp +++ b/src/messaging/POP3Folder.cpp @@ -540,6 +540,24 @@ void POP3Folder::deleteMessage(const int num) if (!m_store->isSuccessResponse(response)) throw exceptions::command_error("DELE", response); + + // Update local flags + for (std::map ::iterator it = + m_messages.begin() ; it != m_messages.end() ; ++it) + { + POP3Message* msg = (*it).first; + + if (msg->getNumber() == num) + msg->m_deleted = true; + } + + // Notify message flags changed + std::vector nums; + nums.push_back(num); + + events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + + notifyMessageChanged(event); } @@ -568,6 +586,26 @@ void POP3Folder::deleteMessages(const int from, const int to) if (!m_store->isSuccessResponse(response)) throw exceptions::command_error("DELE", response); } + + // Update local flags + for (std::map ::iterator it = + m_messages.begin() ; it != m_messages.end() ; ++it) + { + POP3Message* msg = (*it).first; + + if (msg->getNumber() >= from && msg->getNumber() <= to2) + msg->m_deleted = true; + } + + // Notify message flags changed + std::vector nums; + + for (int i = from ; i <= to2 ; ++i) + nums.push_back(i); + + events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, nums); + + notifyMessageChanged(event); } @@ -595,6 +633,29 @@ void POP3Folder::deleteMessages(const std::vector & nums) if (!m_store->isSuccessResponse(response)) throw exceptions::command_error("DELE", response); } + + // Sort message list + std::vector list; + + list.resize(nums.size()); + std::copy(nums.begin(), nums.end(), list.begin()); + + std::sort(list.begin(), list.end()); + + // Update local flags + for (std::map ::iterator it = + m_messages.begin() ; it != m_messages.end() ; ++it) + { + POP3Message* msg = (*it).first; + + if (std::binary_search(list.begin(), list.end(), msg->getNumber())) + msg->m_deleted = true; + } + + // Notify message flags changed + events::messageChangedEvent event(this, events::messageChangedEvent::TYPE_FLAGS, list); + + notifyMessageChanged(event); } diff --git a/src/messaging/POP3Message.cpp b/src/messaging/POP3Message.cpp index d9ef2989..3c84368c 100644 --- a/src/messaging/POP3Message.cpp +++ b/src/messaging/POP3Message.cpp @@ -29,7 +29,7 @@ namespace messaging { POP3Message::POP3Message(POP3Folder* folder, const int num) - : m_folder(folder), m_num(num), m_size(-1), m_header(NULL) + : m_folder(folder), m_num(num), m_size(-1), m_deleted(false), m_header(NULL) { m_folder->registerMessage(this); } @@ -79,7 +79,12 @@ const bool POP3Message::isExpunged() const const int POP3Message::getFlags() const { - return (FLAG_RECENT); + int flags = FLAG_RECENT; + + if (m_deleted) + flags |= FLAG_DELETED; + + return (flags); } diff --git a/vmime/messaging/POP3Message.hpp b/vmime/messaging/POP3Message.hpp index b7535fe9..fbf94730 100644 --- a/vmime/messaging/POP3Message.hpp +++ b/vmime/messaging/POP3Message.hpp @@ -79,6 +79,8 @@ private: uid m_uid; int m_size; + bool m_deleted; + header* m_header; };