From e83f54d0d4f52d935984819f2f60b801a87caaeb Mon Sep 17 00:00:00 2001 From: Matt Vogt Date: Mon, 29 Jul 2013 13:05:41 +1000 Subject: [PATCH] [libcontacts] Export name group members for potential filtration The NameGroupModel may wish to filter the members of each group. --- src/seasidecache.cpp | 37 ++++++++++++++++++++++--------------- src/seasidecache.h | 16 +++++++++------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/seasidecache.cpp b/src/seasidecache.cpp index e3aa41f..bf91f72 100644 --- a/src/seasidecache.cpp +++ b/src/seasidecache.cpp @@ -392,11 +392,11 @@ QList SeasideCache::allNameGroups() return allContactNameGroups; } -QHash SeasideCache::nameGroupCounts() +QHash > SeasideCache::nameGroupMembers() { if (instancePtr) return instancePtr->m_contactNameGroups; - return QHash(); + return QHash >(); } SeasideCache::DisplayLabelOrder SeasideCache::displayLabelOrder() @@ -459,8 +459,11 @@ SeasideCache::CacheItem *SeasideCache::itemById(int id) SeasideCache::CacheItem *SeasideCache::existingItem(const ContactIdType &id) { - quint32 iid = internalId(id); + return existingItem(internalId(id)); +} +SeasideCache::CacheItem *SeasideCache::existingItem(quint32 iid) +{ QHash::iterator it = instancePtr->m_people.find(iid); return it != instancePtr->m_people.end() ? &(*it) @@ -1115,8 +1118,8 @@ void SeasideCache::contactsAvailable() // do this even if !roleDataChanged as name groups are affected by other display label changes QChar newNameGroup = nameGroupForCacheItem(&item); if (newNameGroup != oldNameGroup) { - addToContactNameGroup(newNameGroup, &modifiedGroups); - removeFromContactNameGroup(oldNameGroup, &modifiedGroups); + addToContactNameGroup(item.iid, newNameGroup, &modifiedGroups); + removeFromContactNameGroup(item.iid, oldNameGroup, &modifiedGroups); } } @@ -1131,19 +1134,19 @@ void SeasideCache::contactsAvailable() } } -void SeasideCache::addToContactNameGroup(const QChar &group, QList *modifiedGroups) +void SeasideCache::addToContactNameGroup(quint32 iid, const QChar &group, QList *modifiedGroups) { if (!group.isNull()) { - m_contactNameGroups[group] += 1; + m_contactNameGroups[group].insert(iid); if (modifiedGroups && !m_nameGroupChangeListeners.isEmpty()) modifiedGroups->append(group); } } -void SeasideCache::removeFromContactNameGroup(const QChar &group, QList *modifiedGroups) +void SeasideCache::removeFromContactNameGroup(quint32 iid, const QChar &group, QList *modifiedGroups) { if (!group.isNull() && m_contactNameGroups.contains(group)) { - m_contactNameGroups[group] -= 1; + m_contactNameGroups[group].remove(iid); if (modifiedGroups && !m_nameGroupChangeListeners.isEmpty()) modifiedGroups->append(group); } @@ -1154,7 +1157,7 @@ void SeasideCache::notifyNameGroupsChanged(const QList &groups) if (groups.isEmpty() || m_nameGroupChangeListeners.isEmpty()) return; - QHash updates; + QHash > updates; for (int i = 0; i < groups.count(); ++i) updates[groups[i]] = m_contactNameGroups[groups[i]]; @@ -1226,9 +1229,11 @@ void SeasideCache::removeRange( for (int i = 0; i < count; ++i) { if (filter == FilterAll) { - m_expiredContacts[cacheIds.at(index)] -= 1; + const ContactIdType apiId = cacheIds.at(index); + m_expiredContacts[apiId] -= 1; - removeFromContactNameGroup(nameGroupForCacheItem(existingItem(cacheIds.at(index))), &modifiedNameGroups); + const QChar nameGroup = nameGroupForCacheItem(existingItem(apiId)); + removeFromContactNameGroup(internalId(apiId), nameGroup, &modifiedNameGroups); } cacheIds.remove(index); @@ -1262,9 +1267,11 @@ int SeasideCache::insertRange( continue; if (filter == FilterAll) { - m_expiredContacts[queryIds.at(queryIndex + i)] += 1; + const ContactIdType apiId = queryIds.at(queryIndex + i); + m_expiredContacts[apiId] += 1; - addToContactNameGroup(nameGroupForCacheItem(existingItem(queryIds.at(queryIndex + i))), &modifiedNameGroups); + const QChar nameGroup = nameGroupForCacheItem(existingItem(apiId)); + addToContactNameGroup(internalId(apiId), nameGroup, &modifiedNameGroups); } cacheIds.insert(index + i, queryIds.at(queryIndex + i)); @@ -1304,7 +1311,7 @@ void SeasideCache::appendContacts(const QList &contacts) cacheItem.contactState = ContactFetched; if (m_fetchFilter == FilterAll) - addToContactNameGroup(nameGroupForCacheItem(&cacheItem), 0); + addToContactNameGroup(iid, nameGroupForCacheItem(&cacheItem), 0); foreach (const QContactPhoneNumber &phoneNumber, contact.details()) { QString normalizedNumber = Normalization::normalizePhoneNumber(phoneNumber.number()); diff --git a/src/seasidecache.h b/src/seasidecache.h index 126ad7b..1b91f16 100644 --- a/src/seasidecache.h +++ b/src/seasidecache.h @@ -72,7 +72,7 @@ class CONTACTCACHE_EXPORT SeasideNameGroupChangeListener SeasideNameGroupChangeListener() {} ~SeasideNameGroupChangeListener() {} - virtual void nameGroupsUpdated(const QHash &groups) = 0; + virtual void nameGroupsUpdated(const QHash > &groups) = 0; }; class CONTACTCACHE_EXPORT SeasideCache : public QObject @@ -125,14 +125,15 @@ class CONTACTCACHE_EXPORT SeasideCache : public QObject struct CacheItem { - CacheItem() : itemData(0), modelData(0), contactState(ContactAbsent) {} - CacheItem(const QContact &contact) : contact(contact), itemData(0), modelData(0), contactState(ContactAbsent) {} + CacheItem() : itemData(0), modelData(0), iid(0), contactState(ContactAbsent) {} + CacheItem(const QContact &contact) : contact(contact), itemData(0), modelData(0), iid(internalId(contact)), contactState(ContactAbsent) {} ContactIdType apiId() const { return SeasideCache::apiId(contact); } QContact contact; ItemData *itemData; ModelData *modelData; + quint32 iid; ContactState contactState; }; @@ -190,6 +191,7 @@ class CONTACTCACHE_EXPORT SeasideCache : public QObject static int contactId(const QContact &contact); static CacheItem *existingItem(const ContactIdType &id); + static CacheItem *existingItem(quint32 iid); static CacheItem *itemById(const ContactIdType &id); #ifdef USING_QTPIM static CacheItem *itemById(int id); @@ -198,7 +200,7 @@ class CONTACTCACHE_EXPORT SeasideCache : public QObject static QContact contactById(const ContactIdType &id); static QChar nameGroupForCacheItem(CacheItem *cacheItem); static QList allNameGroups(); - static QHash nameGroupCounts(); + static QHash > nameGroupMembers(); static CacheItem *itemByPhoneNumber(const QString &msisdn); static CacheItem *itemByEmailAddress(const QString &email); @@ -274,8 +276,8 @@ private slots: void removeContactData(const ContactIdType &contactId, FilterType filter); void makePopulated(FilterType filter); - void addToContactNameGroup(const QChar &group, QList *modifiedGroups = 0); - void removeFromContactNameGroup(const QChar &group, QList *modifiedGroups = 0); + void addToContactNameGroup(quint32 iid, const QChar &group, QList *modifiedGroups = 0); + void removeFromContactNameGroup(quint32 iid, const QChar &group, QList *modifiedGroups = 0); void notifyNameGroupsChanged(const QList &groups); void updateConstituentAggregations(const ContactIdType &contactId); @@ -289,7 +291,7 @@ private slots: QHash m_phoneNumberIds; QHash m_emailAddressIds; QHash m_contactsToSave; - QHash m_contactNameGroups; + QHash > m_contactNameGroups; QList m_contactsToCreate; QList m_contactsToRemove; QList m_changedContacts;