diff options
-rw-r--r-- | common/domain/mail.cpp | 8 | ||||
-rw-r--r-- | common/mailpreprocessor.cpp | 14 | ||||
-rw-r--r-- | common/propertymapper.cpp | 32 | ||||
-rw-r--r-- | common/propertymapper.h | 17 |
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 | ||
84 | static Sink::ApplicationDomain::Mail::Contact getContact(const KMime::Headers::From *header) | 84 | static 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 | ||
91 | static 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 | |||
91 | static void updatedIndexedProperties(Sink::ApplicationDomain::Mail &mail, KMime::Message::Ptr msg) | 100 | static 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 | |||
78 | template <> | ||
79 | flatbuffers::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 | ||
143 | template <> | 158 | template <> |
159 | QVariant 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 | |||
173 | template <> | ||
144 | QVariant propertyToVariant<bool>(uint8_t property) | 174 | QVariant 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> | |||
52 | QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *); | 52 | QVariant SINK_EXPORT propertyToVariant(const flatbuffers::Vector<flatbuffers::Offset<flatbuffers::String>> *); |
53 | template <typename T> | 53 | template <typename T> |
54 | QVariant SINK_EXPORT propertyToVariant(const Sink::ApplicationDomain::Buffer::MailContact *); | 54 | QVariant SINK_EXPORT propertyToVariant(const Sink::ApplicationDomain::Buffer::MailContact *); |
55 | template <typename T> | ||
56 | QVariant 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 | |||
126 | private: | 134 | private: |
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 | |||
204 | private: | 221 | private: |
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 | }; |