summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/domain/mail.cpp8
-rw-r--r--common/mailpreprocessor.cpp14
-rw-r--r--common/propertymapper.cpp32
-rw-r--r--common/propertymapper.h17
4 files changed, 67 insertions, 4 deletions
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<Mail>::configure(ReadPropertyMapper<Buffer> &propertyMap
68{ 68{
69 propertyMapper.addMapping<Mail::Uid, Buffer>(&Buffer::uid); 69 propertyMapper.addMapping<Mail::Uid, Buffer>(&Buffer::uid);
70 propertyMapper.addMapping<Mail::Sender, Buffer>(&Buffer::sender); 70 propertyMapper.addMapping<Mail::Sender, Buffer>(&Buffer::sender);
71 /* propertyMapper.addMapping<Mail::Recepients, Buffer>(&Buffer::recepients); */ 71 propertyMapper.addMapping<Mail::To, Buffer>(&Buffer::to);
72 propertyMapper.addMapping<Mail::Cc, Buffer>(&Buffer::cc);
73 propertyMapper.addMapping<Mail::Bcc, Buffer>(&Buffer::bcc);
72 propertyMapper.addMapping<Mail::Subject, Buffer>(&Buffer::subject); 74 propertyMapper.addMapping<Mail::Subject, Buffer>(&Buffer::subject);
73 propertyMapper.addMapping<Mail::Date, Buffer>(&Buffer::date); 75 propertyMapper.addMapping<Mail::Date, Buffer>(&Buffer::date);
74 propertyMapper.addMapping<Mail::Unread, Buffer>(&Buffer::unread); 76 propertyMapper.addMapping<Mail::Unread, Buffer>(&Buffer::unread);
@@ -86,7 +88,9 @@ void TypeImplementation<Mail>::configure(WritePropertyMapper<BufferBuilder> &pro
86{ 88{
87 propertyMapper.addMapping<Mail::Uid>(&BufferBuilder::add_uid); 89 propertyMapper.addMapping<Mail::Uid>(&BufferBuilder::add_uid);
88 propertyMapper.addMapping<Mail::Sender>(&BufferBuilder::add_sender); 90 propertyMapper.addMapping<Mail::Sender>(&BufferBuilder::add_sender);
89 /* propertyMapper.addMapping<Mail::Recepients>(&BufferBuilder::add_senderName); */ 91 propertyMapper.addMapping<Mail::To>(&BufferBuilder::add_to);
92 propertyMapper.addMapping<Mail::Cc>(&BufferBuilder::add_cc);
93 propertyMapper.addMapping<Mail::Bcc>(&BufferBuilder::add_bcc);
90 propertyMapper.addMapping<Mail::Subject>(&BufferBuilder::add_subject); 94 propertyMapper.addMapping<Mail::Subject>(&BufferBuilder::add_subject);
91 propertyMapper.addMapping<Mail::Date>(&BufferBuilder::add_date); 95 propertyMapper.addMapping<Mail::Date>(&BufferBuilder::add_date);
92 propertyMapper.addMapping<Mail::Unread>(&BufferBuilder::add_unread); 96 propertyMapper.addMapping<Mail::Unread>(&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 {
81 qint64 mappedSize; 81 qint64 mappedSize;
82}; 82};
83 83
84static Sink::ApplicationDomain::Mail::Contact getContact(const KMime::Headers::From *header) 84static Sink::ApplicationDomain::Mail::Contact getContact(const KMime::Headers::Generics::MailboxList *header)
85{ 85{
86 const auto name = header->displayNames().isEmpty() ? QString() : header->displayNames().first(); 86 const auto name = header->displayNames().isEmpty() ? QString() : header->displayNames().first();
87 const auto address = header->addresses().isEmpty() ? QString() : header->addresses().first(); 87 const auto address = header->addresses().isEmpty() ? QString() : header->addresses().first();
88 return Sink::ApplicationDomain::Mail::Contact{name, address}; 88 return Sink::ApplicationDomain::Mail::Contact{name, address};
89} 89}
90 90
91static QList<Sink::ApplicationDomain::Mail::Contact> getContactList(const KMime::Headers::Generics::AddressList *header)
92{
93 QList<Sink::ApplicationDomain::Mail::Contact> list;
94 for (const auto mb : header->mailboxes()) {
95 list << Sink::ApplicationDomain::Mail::Contact{mb.name(), mb.address()};
96 }
97 return list;
98}
99
91static void updatedIndexedProperties(Sink::ApplicationDomain::Mail &mail, KMime::Message::Ptr msg) 100static void updatedIndexedProperties(Sink::ApplicationDomain::Mail &mail, KMime::Message::Ptr msg)
92{ 101{
93 mail.setExtractedSubject(msg->subject(true)->asUnicodeString()); 102 mail.setExtractedSubject(msg->subject(true)->asUnicodeString());
94 mail.setExtractedSender(getContact(msg->from(true))); 103 mail.setExtractedSender(getContact(msg->from(true)));
104 mail.setExtractedTo(getContactList(msg->to(true)));
105 mail.setExtractedCc(getContactList(msg->cc(true)));
106 mail.setExtractedBcc(getContactList(msg->bcc(true)));
95 mail.setExtractedDate(msg->date(true)->dateTime()); 107 mail.setExtractedDate(msg->date(true)->dateTime());
96 108
97 //The rest should never change, unless we didn't have the headers available initially. 109 //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<Sink::ApplicationDomain::Mail::Contact>
70{ 70{
71 if (property.isValid()) { 71 if (property.isValid()) {
72 const auto value = property.value<Sink::ApplicationDomain::Mail::Contact>(); 72 const auto value = property.value<Sink::ApplicationDomain::Mail::Contact>();
73 return Sink::ApplicationDomain::Buffer::CreateMailContactDirect(fbb, value.name.toUtf8().constData(), value.name.toUtf8().constData()).o; 73 return Sink::ApplicationDomain::Buffer::CreateMailContactDirect(fbb, value.name.toUtf8().constData(), value.emailAddress.toUtf8().constData()).o;
74 }
75 return 0;
76}
77
78template <>
79flatbuffers::uoffset_t variantToProperty<QList<Sink::ApplicationDomain::Mail::Contact>>(const QVariant &property, flatbuffers::FlatBufferBuilder &fbb)
80{
81 if (property.isValid()) {
82 const auto list = property.value<QList<Sink::ApplicationDomain::Mail::Contact>>();
83 std::vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>> vector;
84 for (const auto &value : list) {
85 auto offset = Sink::ApplicationDomain::Buffer::CreateMailContactDirect(fbb, value.name.toUtf8().constData(), value.emailAddress.toUtf8().constData()).o;
86 vector.push_back(offset);
87 }
88 return fbb.CreateVector(vector).o;
74 } 89 }
75 return 0; 90 return 0;
76} 91}
@@ -141,6 +156,21 @@ QVariant propertyToVariant<Sink::ApplicationDomain::Mail::Contact>(const Sink::A
141} 156}
142 157
143template <> 158template <>
159QVariant propertyToVariant<QList<Sink::ApplicationDomain::Mail::Contact>>(const flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>> *property)
160{
161 if (property) {
162 QList<Sink::ApplicationDomain::Mail::Contact> list;
163 for (auto it = property->begin(); it != property->end();) {
164 // We have to copy the memory, otherwise it would become eventually invalid
165 list << Sink::ApplicationDomain::Mail::Contact{propertyToString(it->name()), propertyToString(it->email())};
166 it.operator++();
167 }
168 return QVariant::fromValue(list);
169 }
170 return QVariant();
171}
172
173template <>
144QVariant propertyToVariant<bool>(uint8_t property) 174QVariant propertyToVariant<bool>(uint8_t property)
145{ 175{
146 return static_cast<bool>(property); 176 return static_cast<bool>(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 <typename T>
52QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *); 52QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *);
53template <typename T> 53template <typename T>
54QVariant SINK_EXPORT propertyToVariant(const Sink::ApplicationDomain::Buffer::MailContact *); 54QVariant SINK_EXPORT propertyToVariant(const Sink::ApplicationDomain::Buffer::MailContact *);
55template <typename T>
56QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>> *);
55 57
56/** 58/**
57 * The property mapper is a non-typesafe virtual dispatch. 59 * The property mapper is a non-typesafe virtual dispatch.
@@ -123,6 +125,12 @@ public:
123 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); }); 125 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
124 } 126 }
125 127
128 template <typename T, typename Buffer>
129 void addMapping(const flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>> *(Buffer::*f)() const)
130 {
131 addMapping(T::name, [f](Buffer const *buffer) -> QVariant { return propertyToVariant<typename T::Type>((buffer->*f)()); });
132 }
133
126private: 134private:
127 QHash<QByteArray, std::function<QVariant(BufferType const *)>> mReadAccessors; 135 QHash<QByteArray, std::function<QVariant(BufferType const *)>> mReadAccessors;
128}; 136};
@@ -201,6 +209,15 @@ public:
201 }); 209 });
202 } 210 }
203 211
212 template <typename T>
213 void addMapping(void (BufferBuilder::*f)(flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Sink::ApplicationDomain::Buffer::MailContact>>>))
214 {
215 addMapping(T::name, [f](const QVariant &value, flatbuffers::FlatBufferBuilder &fbb) -> std::function<void(BufferBuilder &)> {
216 auto offset = variantToProperty<typename T::Type>(value, fbb);
217 return [offset, f](BufferBuilder &builder) { (builder.*f)(offset); };
218 });
219 }
220
204private: 221private:
205 QHash<QByteArray, std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors; 222 QHash<QByteArray, std::function<std::function<void(BufferBuilder &)>(const QVariant &, flatbuffers::FlatBufferBuilder &)>> mWriteAccessors;
206}; 223};