From b289dd9bf618a2512cbf15b2a6fc4ae77e4792c8 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 19 Jun 2016 12:27:38 +0200 Subject: Moved mailpreprocessors to a shared location --- common/mailpreprocessor.cpp | 117 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 common/mailpreprocessor.cpp (limited to 'common/mailpreprocessor.cpp') diff --git a/common/mailpreprocessor.cpp b/common/mailpreprocessor.cpp new file mode 100644 index 0000000..64cb3d9 --- /dev/null +++ b/common/mailpreprocessor.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2015 Christian Mollekopf + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "mailpreprocessor.h" + +#include +#include +#include + +#include "pipeline.h" +#include "definitions.h" +#include "applicationdomaintype.h" + +using namespace Sink; + +void MailPropertyExtractor::updatedIndexedProperties(Sink::ApplicationDomain::Mail &mail) +{ + const auto mimeMessagePath = mail.getMimeMessagePath(); + Trace() << "Updating indexed properties " << mimeMessagePath; + QFile f(mimeMessagePath); + if (!f.open(QIODevice::ReadOnly)) { + Warning() << "Failed to open the file: " << mimeMessagePath; + return; + } + if (!f.size()) { + Warning() << "The file is empty."; + return; + } + const auto mappedSize = qMin((qint64)8000, f.size()); + auto mapped = f.map(0, mappedSize); + if (!mapped) { + Warning() << "Failed to map the file: " << f.errorString(); + return; + } + + KMime::Message *msg = new KMime::Message; + msg->setHead(KMime::CRLFtoLF(QByteArray::fromRawData(reinterpret_cast(mapped), mappedSize))); + msg->parse(); + + mail.setExtractedSubject(msg->subject(true)->asUnicodeString()); + mail.setExtractedSender(msg->from(true)->asUnicodeString()); + mail.setExtractedSenderName(msg->from(true)->asUnicodeString()); + mail.setExtractedDate(msg->date(true)->dateTime()); +} + +void MailPropertyExtractor::newEntity(Sink::ApplicationDomain::Mail &mail, Sink::Storage::Transaction &transaction) +{ + updatedIndexedProperties(mail); +} + +void MailPropertyExtractor::modifiedEntity(const Sink::ApplicationDomain::Mail &oldMail, Sink::ApplicationDomain::Mail &newMail,Sink::Storage::Transaction &transaction) +{ + updatedIndexedProperties(newMail); +} + + +MimeMessageMover::MimeMessageMover() : Sink::EntityPreprocessor() +{ +} + +QString MimeMessageMover::moveMessage(const QString &oldPath, const Sink::ApplicationDomain::Mail &mail) +{ + const auto directory = Sink::resourceStorageLocation(resourceInstanceIdentifier()); + const auto filePath = directory + "/" + mail.identifier(); + if (oldPath != filePath) { + if (!QDir().mkpath(directory)) { + Warning() << "Failed to create the directory: " << directory; + } + QFile::remove(filePath); + QFile origFile(oldPath); + if (!origFile.open(QIODevice::ReadWrite)) { + Warning() << "Failed to open the original file with write rights: " << origFile.errorString(); + } + if (!origFile.rename(filePath)) { + Warning() << "Failed to move the file from: " << oldPath << " to " << filePath << ". " << origFile.errorString(); + } + origFile.close(); + return filePath; + } + return oldPath; +} + +void MimeMessageMover::newEntity(Sink::ApplicationDomain::Mail &mail, Sink::Storage::Transaction &transaction) +{ + if (!mail.getMimeMessagePath().isEmpty()) { + mail.setMimeMessagePath(moveMessage(mail.getMimeMessagePath(), mail)); + } +} + +void MimeMessageMover::modifiedEntity(const Sink::ApplicationDomain::Mail &oldMail, Sink::ApplicationDomain::Mail &newMail, Sink::Storage::Transaction &transaction) +{ + if (!newMail.getMimeMessagePath().isEmpty()) { + newMail.setMimeMessagePath(moveMessage(newMail.getMimeMessagePath(), newMail)); + } +} + +void MimeMessageMover::deletedEntity(const Sink::ApplicationDomain::Mail &mail, Sink::Storage::Transaction &transaction) +{ + QFile::remove(mail.getMimeMessagePath()); +} + -- cgit v1.2.3