Skip to content
This repository has been archived by the owner on Sep 4, 2021. It is now read-only.

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #100 from amtep/master
Fix UI freeze on first start
  • Loading branch information
amtep committed Feb 19, 2015
2 parents 5b5c00d + 4bfe880 commit 0004b23
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 1 deletion.
49 changes: 49 additions & 0 deletions src/seasidecache.cpp
Expand Up @@ -682,6 +682,24 @@ void SeasideCache::unregisterResolveListener(ResolveListener *listener)
++it2;
}
}

QList<ResolveData>::iterator it3 = instancePtr->m_unknownResolveAddresses.begin();
while (it3 != instancePtr->m_unknownResolveAddresses.end()) {
if (it3->listener == listener) {
it3 = instancePtr->m_unknownResolveAddresses.erase(it3);
} else {
++it3;
}
}

QSet<ResolveData>::iterator it4 = instancePtr->m_pendingResolve.begin();
while (it4 != instancePtr->m_pendingResolve.end()) {
if (it4->listener == listener) {
it4 = instancePtr->m_pendingResolve.erase(it4);
} else {
++it4;
}
}
}

void SeasideCache::setNameGrouper(SeasideNameGrouper *grouper)
Expand Down Expand Up @@ -1420,6 +1438,7 @@ void SeasideCache::startRequest(bool *idleProcessing)
m_fetchRequest.setFilter(favoriteFilter());
m_fetchRequest.setFetchHint(favoriteFetchHint(m_fetchTypes));
m_fetchRequest.setSorting(m_sortOrder);
qDebug() << "Starting favorites query at" << m_timer.elapsed() << "ms";
m_fetchRequest.start();

m_fetchProcessedCount = 0;
Expand Down Expand Up @@ -1464,6 +1483,7 @@ void SeasideCache::startRequest(bool *idleProcessing)
m_fetchRequest.setFilter(allFilter());
m_fetchRequest.setFetchHint(metadataFetchHint(m_fetchTypes));
m_fetchRequest.setSorting(m_sortOrder);
qDebug() << "Starting metadata query at" << m_timer.elapsed() << "ms";
m_fetchRequest.start();

m_fetchProcessedCount = 0;
Expand All @@ -1473,6 +1493,7 @@ void SeasideCache::startRequest(bool *idleProcessing)
m_fetchRequest.setFilter(onlineFilter());
m_fetchRequest.setFetchHint(onlineFetchHint(m_fetchTypes | SeasideCache::FetchAccountUri));
m_fetchRequest.setSorting(m_onlineSortOrder);
qDebug() << "Starting online query at" << m_timer.elapsed() << "ms";
m_fetchRequest.start();

m_fetchProcessedCount = 0;
Expand Down Expand Up @@ -2707,6 +2728,7 @@ void SeasideCache::addressRequestStateChanged(QContactAbstractRequest::State sta
}
data.listener->addressResolved(data.first, data.second, item);
delete it.key();
m_pendingResolve.remove(data);
m_resolveAddresses.erase(it);
}

Expand Down Expand Up @@ -3078,6 +3100,10 @@ void SeasideCache::resolveAddress(ResolveListener *listener, const QString &firs
data.requireComplete = requireComplete;
data.listener = listener;

// filter out duplicate requests
if (m_pendingResolve.find(data) != m_pendingResolve.end())
return;

// Is this address a known-unknown?
bool knownUnknown = false;
QList<ResolveData>::const_iterator it = instancePtr->m_unknownAddresses.constBegin(), end = m_unknownAddresses.constEnd();
Expand Down Expand Up @@ -3126,6 +3152,7 @@ void SeasideCache::resolveAddress(ResolveListener *listener, const QString &firs
connect(request, SIGNAL(stateChanged(QContactAbstractRequest::State)),
this, SLOT(addressRequestStateChanged(QContactAbstractRequest::State)));
m_resolveAddresses[request] = data;
m_pendingResolve.insert(data);
request->start();
}
}
Expand Down Expand Up @@ -3193,5 +3220,27 @@ QContactRelationship SeasideCache::makeRelationship(const QString &type, const Q
return makeRelationship(type, contact1.id(), contact2.id());
}

bool operator==(const SeasideCache::ResolveData &lhs, const SeasideCache::ResolveData &rhs)
{
// .listener and .requireComplete first because they are the cheapest comparisons
// then .second before .first because .second is most likely to be unequal
// .compare is derived from first and second so it does not need to be checked
return lhs.listener == rhs.listener
&& lhs.requireComplete == rhs.requireComplete
&& lhs.second == rhs.second
&& lhs.first == rhs.first;
}

uint qHash(const SeasideCache::ResolveData &key, uint seed)
{
uint h1 = qHash(key.first, seed);
uint h2 = qHash(key.second, seed);
uint h3 = key.requireComplete;
uint h4 = qHash(key.listener, seed);

// Don't xor with seed here because h4 already did that
return h1 ^ h2 ^ h3 ^ h4;
}

// Instantiate the contact ID functions for qtcontacts-sqlite
#include <qtcontacts-extensions_impl.h>
10 changes: 9 additions & 1 deletion src/seasidecache.h
Expand Up @@ -52,6 +52,7 @@
#include <QContactIdFetchRequest>

#include <QBasicTimer>
#include <QHash>
#include <QSet>

#include <QElapsedTimer>
Expand Down Expand Up @@ -469,11 +470,12 @@ private slots:
struct ResolveData {
QString first;
QString second;
QString compare;
QString compare; // only used in m_unknownAddresses
bool requireComplete;
ResolveListener *listener;
};
QHash<QContactFetchRequest *, ResolveData> m_resolveAddresses;
QSet<ResolveData> m_pendingResolve; // these have active requests already
QList<ResolveData> m_unknownResolveAddresses;
QList<ResolveData> m_unknownAddresses;
QSet<QString> m_resolvedPhoneNumbers;
Expand All @@ -484,6 +486,12 @@ private slots:
static SeasideCache *instancePtr;
static int contactNameGroupCount;
static QStringList allContactNameGroups;

friend bool operator==(const SeasideCache::ResolveData &lhs, const SeasideCache::ResolveData &rhs);
friend uint qHash(const SeasideCache::ResolveData &key, uint seed);
};

bool operator==(const SeasideCache::ResolveData &lhs, const SeasideCache::ResolveData &rhs);
uint qHash(const SeasideCache::ResolveData &key, uint seed = 0);

#endif

0 comments on commit 0004b23

Please sign in to comment.