aboutsummaryrefslogtreecommitdiffstats
path: root/src/messaging/POP3Message.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/messaging/POP3Message.cpp')
-rw-r--r--src/messaging/POP3Message.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/src/messaging/POP3Message.cpp b/src/messaging/POP3Message.cpp
new file mode 100644
index 00000000..66b3f466
--- /dev/null
+++ b/src/messaging/POP3Message.cpp
@@ -0,0 +1,220 @@
+//
+// VMime library (http://vmime.sourceforge.net)
+// Copyright (C) 2002-2004 Vincent Richard <[email protected]>
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//
+
+#include "POP3Message.hpp"
+#include "POP3Folder.hpp"
+#include "POP3Store.hpp"
+
+#include <sstream>
+
+
+namespace vmime {
+namespace messaging {
+
+
+
+class POP3header : public header
+{
+public:
+
+ POP3header(const string& str)
+ {
+ parse(str);
+ }
+};
+
+
+
+POP3Message::POP3Message(POP3Folder* folder, const int num)
+ : m_folder(folder), m_num(num), m_header(NULL)
+{
+ m_folder->registerMessage(this);
+}
+
+
+POP3Message::~POP3Message()
+{
+ if (m_folder)
+ m_folder->unregisterMessage(this);
+
+ delete dynamic_cast <POP3header*>(m_header);
+}
+
+
+void POP3Message::onFolderClosed()
+{
+ m_folder = NULL;
+}
+
+
+const int POP3Message::number() const
+{
+ return (m_num);
+}
+
+
+const message::uid POP3Message::uniqueId() const
+{
+ return (m_uid);
+}
+
+
+const int POP3Message::size() const
+{
+ if (!m_folder)
+ throw exceptions::illegal_state("Folder closed");
+
+ POP3Folder::MessageMap::const_iterator it =
+ m_folder->m_messages.find(const_cast <POP3Message*>(this));
+
+ return ((it != m_folder->m_messages.end()) ? (*it).second : 0);
+}
+
+
+const bool POP3Message::isExpunged() const
+{
+ return (false);
+}
+
+
+const int POP3Message::flags() const
+{
+ return (FLAG_RECENT);
+}
+
+
+const class structure& POP3Message::structure() const
+{
+ throw exceptions::operation_not_supported();
+}
+
+
+class structure& POP3Message::structure()
+{
+ throw exceptions::operation_not_supported();
+}
+
+
+const class header& POP3Message::header() const
+{
+ if (m_header == NULL)
+ throw exceptions::unfetched_object();
+
+ return (*m_header);
+}
+
+
+void POP3Message::extract(utility::outputStream& os, progressionListener* progress,
+ const int start, const int length) const
+{
+ if (!m_folder)
+ throw exceptions::illegal_state("Folder closed");
+ else if (!m_folder->m_store)
+ throw exceptions::illegal_state("Store disconnected");
+
+ if (start != 0 && length != -1)
+ throw exceptions::partial_fetch_not_supported();
+
+ // Emit the "RETR" command
+ std::ostringstream oss;
+ oss << "RETR " << m_num;
+
+ const_cast <POP3Folder*>(m_folder)->m_store->sendRequest(oss.str());
+
+ try
+ {
+ POP3Folder::MessageMap::const_iterator it =
+ m_folder->m_messages.find(const_cast <POP3Message*>(this));
+
+ const int totalSize = (it != m_folder->m_messages.end())
+ ? (*it).second : 0;
+
+ const_cast <POP3Folder*>(m_folder)->m_store->
+ readResponse(os, progress, totalSize);
+ }
+ catch (exceptions::command_error& e)
+ {
+ throw exceptions::command_error("RETR", e.response());
+ }
+}
+
+
+void POP3Message::extractPart
+ (const part& /* p */, utility::outputStream& /* os */, progressionListener* /* progress */,
+ const int /* start */, const int /* length */) const
+{
+ throw exceptions::operation_not_supported();
+}
+
+
+void POP3Message::fetchPartHeader(part& /* p */)
+{
+ throw exceptions::operation_not_supported();
+}
+
+
+void POP3Message::fetch(POP3Folder* folder, const int options)
+{
+ if (m_folder != folder)
+ throw exceptions::folder_not_found();
+
+ // FETCH_STRUCTURE and FETCH_FLAGS are not supported by POP3.
+ if (options & (folder::FETCH_STRUCTURE | folder::FETCH_FLAGS))
+ throw exceptions::operation_not_supported();
+
+ // Check for the real need to fetch the full header
+ if (!((options & folder::FETCH_ENVELOPE) ||
+ (options & folder::FETCH_CONTENT_INFO) ||
+ (options & folder::FETCH_FULL_HEADER)))
+ {
+ return;
+ }
+
+ // No need to differenciate between FETCH_ENVELOPE,
+ // FETCH_CONTENT_INFO, ... since POP3 only permits to
+ // retrieve the whole header and not fields in particular.
+
+ // Emit the "TOP" command
+ std::ostringstream oss;
+ oss << "TOP " << m_num << " 0";
+
+ m_folder->m_store->sendRequest(oss.str());
+
+ try
+ {
+ string buffer;
+ m_folder->m_store->readResponse(buffer, true);
+
+ m_header = new POP3header(buffer);
+ }
+ catch (exceptions::command_error& e)
+ {
+ throw exceptions::command_error("TOP", e.response());
+ }
+}
+
+
+void POP3Message::setFlags(const int /* flags */, const int /* mode */)
+{
+ throw exceptions::operation_not_supported();
+}
+
+
+} // messaging
+} // vmime