/* ** Copyright (C) 2020-2022 Dirk-Jan C. Binnema ** ** 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 3, 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. ** */ #ifndef __MU_CONTACTS_CACHE_HH__ #define __MU_CONTACTS_CACHE_HH__ #include #include #include #include #include #include #include #include #include #include namespace Mu { class ContactsCache { public: /** * Construct a new ContactsCache object * * @param serialized serialized contacts * @param personal personal addresses */ ContactsCache(const std::string& serialized = "", const StringVec& personal = {}); /** * DTOR * */ ~ContactsCache(); /** * Add a contact * * @param contact a Contact object * */ void add(Contact&& contact); /** * Add a contacts sequence; this should be used for the contacts of a * specific message, and determines if it is a "personal" message: * if any of the contacts matches one of the personal addresses, * any of the senders/recipients are considered "personal" * * @param contacts a Contact object sequence * @param is_personal receives true if any of the contacts was personal; * false otherwise */ void add(Contacts&& contacts, bool& is_personal); void add(Contacts&& contacts) { bool _ignore; add(std::move(contacts), _ignore); } /** * Clear all contacts * */ void clear(); /** * Get the number of contacts * * @return number of contacts */ std::size_t size() const; /** * Are there no contacts? * * @return true or false */ bool empty() const { return size() == 0; } /** * Get the contacts, serialized. This all marks the data as * non-dirty (see dirty()) * * @return serialized contacts */ std::string serialize() const; /** * Has the contacts database change since the last * call to serialize()? * * @return true or false */ bool dirty() const; /** * Does this look like a 'personal' address? * * @param addr some e-mail address * * @return true or false */ bool is_personal(const std::string& addr) const; /** * Find a contact based on the email address. This is not safe, since * the returned ptr can be invalidated at any time; only for unit-tests. * * @param email email address * * @return contact info, or {} if not found */ const Contact* _find(const std::string& email) const; /** * Prototype for a callable that receives a contact * * @param contact some contact * * @return to get more contacts; false otherwise */ using EachContactFunc = std::function; /** * Invoke some callable for each contact, in _descending_ order of rank (i.e., the * highest ranked contacts come first). * * @param each_contact function invoked for each contact */ void for_each(const EachContactFunc& each_contact) const; private: struct Private; std::unique_ptr priv_; }; } // namespace Mu #endif /* __MU_CONTACTS_CACHE_HH__ */