From 63ca9c4e0be265a4db6b89d444e6fcd8bdd135c1 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 1 Nov 2016 11:23:35 +0100 Subject: Set to/cc/bcc --- common/domain/mail.cpp | 8 ++++++-- common/mailpreprocessor.cpp | 14 +++++++++++++- common/propertymapper.cpp | 32 +++++++++++++++++++++++++++++++- common/propertymapper.h | 17 +++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) (limited to 'common') diff --git a/common/domain/mail.cpp b/common/domain/mail.cpp index 5a77681..6926711 100644 --- a/common/domain/mail.cpp +++ b/common/domain/mail.cpp @@ -68,7 +68,9 @@ void TypeImplementation::configure(ReadPropertyMapper &propertyMap { propertyMapper.addMapping(&Buffer::uid); propertyMapper.addMapping(&Buffer::sender); - /* propertyMapper.addMapping(&Buffer::recepients); */ + propertyMapper.addMapping(&Buffer::to); + propertyMapper.addMapping(&Buffer::cc); + propertyMapper.addMapping(&Buffer::bcc); propertyMapper.addMapping(&Buffer::subject); propertyMapper.addMapping(&Buffer::date); propertyMapper.addMapping(&Buffer::unread); @@ -86,7 +88,9 @@ void TypeImplementation::configure(WritePropertyMapper &pro { propertyMapper.addMapping(&BufferBuilder::add_uid); propertyMapper.addMapping(&BufferBuilder::add_sender); - /* propertyMapper.addMapping(&BufferBuilder::add_senderName); */ + propertyMapper.addMapping(&BufferBuilder::add_to); + propertyMapper.addMapping(&BufferBuilder::add_cc); + propertyMapper.addMapping(&BufferBuilder::add_bcc); propertyMapper.addMapping(&BufferBuilder::add_subject); propertyMapper.addMapping(&BufferBuilder::add_date); propertyMapper.addMapping(&BufferBuilder::add_unread); diff --git a/common/mailpreprocessor.cpp b/common/mailpreprocessor.cpp index 45f5def..575ff4b 100644 --- a/common/mailpreprocessor.cpp +++ b/common/mailpreprocessor.cpp @@ -81,17 +81,29 @@ struct MimeMessageReader { qint64 mappedSize; }; -static Sink::ApplicationDomain::Mail::Contact getContact(const KMime::Headers::From *header) +static Sink::ApplicationDomain::Mail::Contact getContact(const KMime::Headers::Generics::MailboxList *header) { const auto name = header->displayNames().isEmpty() ? QString() : header->displayNames().first(); const auto address = header->addresses().isEmpty() ? QString() : header->addresses().first(); return Sink::ApplicationDomain::Mail::Contact{name, address}; } +static QList getContactList(const KMime::Headers::Generics::AddressList *header) +{ + QList list; + for (const auto mb : header->mailboxes()) { + list << Sink::ApplicationDomain::Mail::Contact{mb.name(), mb.address()}; + } + return list; +} + static void updatedIndexedProperties(Sink::ApplicationDomain::Mail &mail, KMime::Message::Ptr msg) { mail.setExtractedSubject(msg->subject(true)->asUnicodeString()); mail.setExtractedSender(getContact(msg->from(true))); + mail.setExtractedTo(getContactList(msg->to(true))); + mail.setExtractedCc(getContactList(msg->cc(true))); + mail.setExtractedBcc(getContactList(msg->bcc(true))); mail.setExtractedDate(msg->date(true)->dateTime()); //The rest should never change, unless we didn't have the headers available initially. diff --git a/common/propertymapper.cpp b/common/propertymapper.cpp index 78c5021..754c874 100644 --- a/common/propertymapper.cpp +++ b/common/propertymapper.cpp @@ -70,7 +70,22 @@ flatbuffers::uoffset_t variantToProperty { if (property.isValid()) { const auto value = property.value(); - return Sink::ApplicationDomain::Buffer::CreateMailContactDirect(fbb, value.name.toUtf8().constData(), value.name.toUtf8().constData()).o; + return Sink::ApplicationDomain::Buffer::CreateMailContactDirect(fbb, value.name.toUtf8().constData(), value.emailAddress.toUtf8().constData()).o; + } + return 0; +} + +template <> +flatbuffers::uoffset_t variantToProperty>(const QVariant &property, flatbuffers::FlatBufferBuilder &fbb) +{ + if (property.isValid()) { + const auto list = property.value>(); + std::vector> vector; + for (const auto &value : list) { + auto offset = Sink::ApplicationDomain::Buffer::CreateMailContactDirect(fbb, value.name.toUtf8().constData(), value.emailAddress.toUtf8().constData()).o; + vector.push_back(offset); + } + return fbb.CreateVector(vector).o; } return 0; } @@ -140,6 +155,21 @@ QVariant propertyToVariant(const Sink::A } +template <> +QVariant propertyToVariant>(const flatbuffers::Vector> *property) +{ + if (property) { + QList list; + for (auto it = property->begin(); it != property->end();) { + // We have to copy the memory, otherwise it would become eventually invalid + list << Sink::ApplicationDomain::Mail::Contact{propertyToString(it->name()), propertyToString(it->email())}; + it.operator++(); + } + return QVariant::fromValue(list); + } + return QVariant(); +} + template <> QVariant propertyToVariant(uint8_t property) { diff --git a/common/propertymapper.h b/common/propertymapper.h index a63b7e7..70491a1 100644 --- a/common/propertymapper.h +++ b/common/propertymapper.h @@ -52,6 +52,8 @@ template QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector> *); template QVariant SINK_EXPORT propertyToVariant(const Sink::ApplicationDomain::Buffer::MailContact *); +template +QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector> *); /** * The property mapper is a non-typesafe virtual dispatch. @@ -123,6 +125,12 @@ public: addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); } + template + void addMapping(const flatbuffers::Vector> *(Buffer::*f)() const) + { + addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant((buffer->*f)()); }); + } + private: QHash> mReadAccessors; }; @@ -201,6 +209,15 @@ public: }); } + template + void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset>>)) + { + addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function { + auto offset = variantToProperty(value, fbb); + return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); }; + }); + } + private: QHash(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors; }; -- cgit v1.2.3