From 6221f3c51509f18297a704f9f908f55a11972f8f Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Tue, 21 Dec 2004 14:09:26 +0000 Subject: [PATCH] Done addMessage() operation for 'maildir'. --- src/messaging/maildirFolder.cpp | 136 +++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 4 deletions(-) diff --git a/src/messaging/maildirFolder.cpp b/src/messaging/maildirFolder.cpp index 21b97016..c950815e 100644 --- a/src/messaging/maildirFolder.cpp +++ b/src/messaging/maildirFolder.cpp @@ -756,14 +756,142 @@ void maildirFolder::setMessageFlagsImpl void maildirFolder::addMessage(vmime::message* msg, const int flags, vmime::datetime* date, progressionListener* progress) { - // TODO + std::ostringstream oss; + utility::outputStreamAdapter ossAdapter(oss); + + msg->generate(ossAdapter); + + const std::string& str = oss.str(); + utility::inputStreamStringAdapter strAdapter(str); + + addMessage(strAdapter, str.length(), flags, date, progress); } void maildirFolder::addMessage(utility::inputStream& is, const int size, - const int flags, vmime::datetime* date, progressionListener* progress) + const int flags, vmime::datetime* /* date */, progressionListener* progress) { - // TODO + if (!m_store) + throw exceptions::illegal_state("Store disconnected"); + else if (!isOpen()) + throw exceptions::illegal_state("Folder not open"); + else if (m_mode == MODE_READ_ONLY) + throw exceptions::illegal_state("Folder is read-only"); + + utility::fileSystemFactory* fsf = platformDependant::getHandler()->getFileSystemFactory(); + + utility::file::path tmpDirPath = maildirUtils::getFolderFSPath + (m_store, m_path, maildirUtils::FOLDER_PATH_TMP); + utility::file::path curDirPath = maildirUtils::getFolderFSPath + (m_store, m_path, maildirUtils::FOLDER_PATH_CUR); + + const utility::file::path::component filename = + maildirUtils::buildFilename(maildirUtils::generateId(), + ((flags == message::FLAG_UNDEFINED) ? 0 : flags)); + + try + { + utility::auto_ptr tmpDir = fsf->create(tmpDirPath); + tmpDir->createDirectory(true); + } + catch (exceptions::filesystem_exception&) + { + // Don't throw now, it will fail later... + } + + try + { + utility::auto_ptr curDir = fsf->create(curDirPath); + curDir->createDirectory(true); + } + catch (exceptions::filesystem_exception&) + { + // Don't throw now, it will fail later... + } + + if (progress) + progress->start(size); + + try + { + // Write the message into 'tmp' + utility::auto_ptr file = fsf->create(tmpDirPath / filename); + + file->createFile(); + + utility::fileWriter* fw = file->getFileWriter(); + utility::outputStream* os = fw->getOutputStream(); + + utility::stream::value_type buffer[65536]; + utility::stream::size_type total = 0; + + while (!is.eof()) + { + const utility::stream::size_type read = is.read(buffer, sizeof(buffer)); + + if (read != 0) + { + os->write(buffer, read); + total += read; + } + + if (progress) + progress->progress(total, size); + } + + delete (os); + delete (fw); + + // And move it to 'cur' + file->rename(curDirPath / filename); + + if (progress) + progress->stop(total); + } + catch (exception& e) + { + if (progress) + progress->stop(size); + + throw exceptions::command_error("ADD", "", "", e); + } + + // Append the message to the cache list + messageInfos msgInfos; + msgInfos.path = filename; + msgInfos.type = messageInfos::TYPE_CUR; + + m_messageInfos.push_back(msgInfos); + m_messageCount++; + + if ((flags == message::FLAG_UNDEFINED) || !(flags & message::FLAG_SEEN)) + m_unreadMessageCount++; + + // Notification + std::vector nums; + nums.push_back(m_messageCount); + + events::messageCountEvent event(this, events::messageCountEvent::TYPE_ADDED, nums); + + notifyMessageCount(event); + + // Notify folders with the same path + for (std::list ::iterator it = m_store->m_folders.begin() ; + it != m_store->m_folders.end() ; ++it) + { + if ((*it) != this && (*it)->getFullPath() == m_path) + { + (*it)->m_messageCount = m_messageCount; + (*it)->m_unreadMessageCount = m_unreadMessageCount; + + events::messageCountEvent event(*it, events::messageCountEvent::TYPE_ADDED, nums); + + (*it)->notifyMessageCount(event); + + (*it)->m_messageInfos.resize(m_messageInfos.size()); + std::copy(m_messageInfos.begin(), m_messageInfos.end(), (*it)->m_messageInfos.begin()); + } + } } @@ -774,7 +902,7 @@ void maildirFolder::copyMessage(const folder::path& dest, const int num) else if (!isOpen()) throw exceptions::illegal_state("Folder not open"); - // TODO + copyMessages(dest, num, num); }