diff --git a/src/spacehierarchycache.cpp b/src/spacehierarchycache.cpp index 4898ebad9..2c2826359 100644 --- a/src/spacehierarchycache.cpp +++ b/src/spacehierarchycache.cpp @@ -3,7 +3,6 @@ #include "spacehierarchycache.h" -#include #include #include @@ -55,24 +54,44 @@ void SpaceHierarchyCache::populateSpaceHierarchy(const QString &spaceId) if (!m_connection) { return; } - auto job = m_connection->callApi(spaceId); + + m_nextBatchTokens[spaceId] = QString(); + auto job = m_connection->callApi(spaceId, none, none, none, *m_nextBatchTokens[spaceId]); auto group = KConfigGroup(KSharedConfig::openStateConfig("SpaceHierarchy"_ls), "Cache"_ls); m_spaceHierarchy.insert(spaceId, group.readEntry(spaceId, QStringList())); connect(job, &BaseJob::success, this, [this, job, spaceId]() { - const auto rooms = job->rooms(); - QList roomList; - for (unsigned long i = 0; i < rooms.size(); ++i) { - for (const auto &state : rooms[i].childrenState) { + addBatch(spaceId, job); + }); +} + +void SpaceHierarchyCache::addBatch(const QString &spaceId, Quotient::GetSpaceHierarchyJob *job) +{ + const auto rooms = job->rooms(); + QStringList roomList = m_spaceHierarchy[spaceId]; + for (unsigned long i = 0; i < rooms.size(); ++i) { + for (const auto &state : rooms[i].childrenState) { + if (!roomList.contains(state->stateKey())) { roomList.push_back(state->stateKey()); } } - m_spaceHierarchy.insert(spaceId, roomList); - Q_EMIT spaceHierarchyChanged(); - auto group = KConfigGroup(KSharedConfig::openStateConfig("SpaceHierarchy"_ls), "Cache"_ls); - group.writeEntry(spaceId, roomList); - group.sync(); - }); + } + m_spaceHierarchy.insert(spaceId, roomList); + Q_EMIT spaceHierarchyChanged(); + auto group = KConfigGroup(KSharedConfig::openStateConfig("SpaceHierarchy"_ls), "Cache"_ls); + group.writeEntry(spaceId, roomList); + group.sync(); + + const auto nextBatchToken = job->nextBatch(); + if (!nextBatchToken.isEmpty() && nextBatchToken != *m_nextBatchTokens[spaceId]) { + *m_nextBatchTokens[spaceId] = nextBatchToken; + auto nextJob = m_connection->callApi(spaceId, none, none, none, *m_nextBatchTokens[spaceId]); + connect(nextJob, &BaseJob::success, this, [this, nextJob, spaceId]() { + addBatch(spaceId, nextJob); + }); + } else { + m_nextBatchTokens[spaceId].reset(); + } } void SpaceHierarchyCache::addSpaceToHierarchy(Quotient::Room *room) diff --git a/src/spacehierarchycache.h b/src/spacehierarchycache.h index 069e8f755..929cd9c72 100644 --- a/src/spacehierarchycache.h +++ b/src/spacehierarchycache.h @@ -10,6 +10,8 @@ #include #include +#include + #include "neochatconnection.h" namespace Quotient @@ -110,6 +112,9 @@ private: QList m_activeSpaceRooms; QHash> m_spaceHierarchy; void cacheSpaceHierarchy(); + + QHash> m_nextBatchTokens; void populateSpaceHierarchy(const QString &spaceId); + void addBatch(const QString &spaceId, Quotient::GetSpaceHierarchyJob *job); NeoChatConnection *m_connection; };