Merge pull request #1468 from wavexx/initialize_my_addresses

mu-store: Initialize "my addresses"
This commit is contained in:
Dirk-Jan C. Binnema 2019-09-26 00:48:13 +03:00 committed by GitHub
commit 0170b4166b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 19 additions and 17 deletions

View File

@ -142,6 +142,8 @@ struct Store::Private {
void set_personal_addresses (const Addresses& addresses) { void set_personal_addresses (const Addresses& addresses) {
std::string all_addresses; std::string all_addresses;
personal_addresses_.clear();
for (const auto& addr : addresses) { for (const auto& addr : addresses) {
// very basic check; just ensure there's no ',' in the address. // very basic check; just ensure there's no ',' in the address.
// we don't insist on full RFC5322 // we don't insist on full RFC5322
@ -150,6 +152,7 @@ struct Store::Private {
if (!all_addresses.empty()) if (!all_addresses.empty())
all_addresses += ','; all_addresses += ',';
all_addresses += addr; all_addresses += addr;
personal_addresses_.emplace_back(addr);
} }
writable_db()->set_metadata (PersonalAddressesKey, all_addresses); writable_db()->set_metadata (PersonalAddressesKey, all_addresses);
} }
@ -172,7 +175,7 @@ struct Store::Private {
const std::string maildir_; const std::string maildir_;
const time_t created_{}; const time_t created_{};
const std::string schema_version_; const std::string schema_version_;
const Addresses personal_addresses_; Addresses personal_addresses_;
Contacts contacts_; Contacts contacts_;
bool in_transaction_{}; bool in_transaction_{};
@ -706,7 +709,7 @@ mu_store_personal_addresses (const MuStore *store)
const auto size = self(store)->personal_addresses().size(); const auto size = self(store)->personal_addresses().size();
auto addrs = g_new0 (char*, 1 + size); auto addrs = g_new0 (char*, 1 + size);
for (auto i = 0; i != size; ++i) for (size_t i = 0; i != size; ++i)
addrs[i] = g_strdup(self(store)->personal_addresses()[i].c_str()); addrs[i] = g_strdup(self(store)->personal_addresses()[i].c_str());
return addrs; return addrs;
@ -993,7 +996,7 @@ struct MsgDoc {
Store *_store; Store *_store;
/* callback data, to determine whether this message is 'personal' */ /* callback data, to determine whether this message is 'personal' */
gboolean _personal; gboolean _personal;
GSList *_my_addresses; const Addresses *_my_addresses;
}; };
@ -1132,14 +1135,13 @@ each_contact_info (MuMsgContact *contact, MsgDoc *msgdoc)
static gboolean static gboolean
each_contact_check_if_personal (MuMsgContact *contact, MsgDoc *msgdoc) each_contact_check_if_personal (MuMsgContact *contact, MsgDoc *msgdoc)
{ {
GSList *cur;
if (msgdoc->_personal || !contact->email) if (msgdoc->_personal || !contact->email)
return TRUE; return TRUE;
for (cur = msgdoc->_my_addresses; cur; cur = g_slist_next (cur)) { for (const auto& cur : *msgdoc->_my_addresses) {
if (g_ascii_strcasecmp ( if (g_ascii_strcasecmp
contact->email, (const char*)cur->data) == 0) { (contact->email,
(const char*)cur.c_str()) == 0) {
msgdoc->_personal = TRUE; msgdoc->_personal = TRUE;
break; break;
} }
@ -1152,21 +1154,21 @@ static Xapian::Document
new_doc_from_message (MuStore *store, MuMsg *msg) new_doc_from_message (MuStore *store, MuMsg *msg)
{ {
Xapian::Document doc; Xapian::Document doc;
MsgDoc docinfo = {&doc, msg, mutable_self(store), 0, FALSE}; MsgDoc docinfo = {&doc, msg, mutable_self(store), 0, NULL};
mu_msg_field_foreach ((MuMsgFieldForeachFunc)add_terms_values, &docinfo); mu_msg_field_foreach ((MuMsgFieldForeachFunc)add_terms_values, &docinfo);
/* determine whether this is 'personal' email, ie. one of my /* determine whether this is 'personal' email, ie. one of my
* e-mail addresses is explicitly mentioned -- it's not a * e-mail addresses is explicitly mentioned -- it's not a
* mailing list message. Callback will update docinfo->_personal */ * mailing list message. Callback will update docinfo->_personal */
// FIXME const auto& personal_addresses = self(store)->personal_addresses();
// if (store->my_addresses()) { if (personal_addresses.size()) {
// docinfo._my_addresses = store->my_addresses(); docinfo._my_addresses = &personal_addresses;
// mu_msg_contact_foreach mu_msg_contact_foreach
// (msg, (msg,
// (MuMsgContactForeachFunc)each_contact_check_if_personal, (MuMsgContactForeachFunc)each_contact_check_if_personal,
// &docinfo); &docinfo);
// } }
/* also store the contact-info as separate terms, and add it /* also store the contact-info as separate terms, and add it
* to the cache */ * to the cache */