From e69c5a6fee6baf893c6a2175e33d7942b9c73cf9 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Thu, 14 Jun 2018 00:01:29 +0200
Subject: [PATCH] Fixes a bug where reloading notifications may corrupt backlog

---
 .../quassel/syncables/BacklogManager.kt       | 36 ++++++++++---------
 1 file changed, 20 insertions(+), 16 deletions(-)

diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
index b593aec30..de63bc96e 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
@@ -30,8 +30,8 @@ class BacklogManager(
   private val session: Session,
   private val backlogStorage: BacklogStorage
 ) : SyncableObject(session, "BacklogManager"), IBacklogManager {
-  private val loading = mutableMapOf<BufferId, (List<Message>) -> Unit>()
-  private val loadingFiltered = mutableMapOf<BufferId, (List<Message>) -> Unit>()
+  private val loading = mutableMapOf<BufferId, (List<Message>) -> Boolean>()
+  private val loadingFiltered = mutableMapOf<BufferId, (List<Message>) -> Boolean>()
 
   init {
     initialized = true
@@ -40,7 +40,7 @@ class BacklogManager(
   fun updateIgnoreRules() = backlogStorage.updateIgnoreRules(session)
 
   fun requestBacklog(bufferId: BufferId, first: MsgId = -1, last: MsgId = -1, limit: Int = -1,
-                     additional: Int = 0, callback: (List<Message>) -> Unit) {
+                     additional: Int = 0, callback: (List<Message>) -> Boolean) {
     if (loading.contains(bufferId)) return
     loading[bufferId] = callback
     requestBacklog(bufferId, first, last, limit, additional)
@@ -48,14 +48,14 @@ class BacklogManager(
 
   fun requestBacklogFiltered(bufferId: BufferId, first: MsgId = -1, last: MsgId = -1,
                              limit: Int = -1, additional: Int = 0, type: Int = -1, flags: Int = -1,
-                             callback: (List<Message>) -> Unit) {
+                             callback: (List<Message>) -> Boolean) {
     if (loadingFiltered.contains(bufferId)) return
     loadingFiltered[bufferId] = callback
     requestBacklogFiltered(bufferId, first, last, limit, additional, type, flags)
   }
 
   fun requestBacklogAll(first: MsgId = -1, last: MsgId = -1, limit: Int = -1, additional: Int = 0,
-                        callback: (List<Message>) -> Unit) {
+                        callback: (List<Message>) -> Boolean) {
     if (loading.contains(-1)) return
     loading[-1] = callback
     requestBacklogAll(first, last, limit, additional)
@@ -63,7 +63,7 @@ class BacklogManager(
 
   fun requestBacklogAllFiltered(first: MsgId = -1, last: MsgId = -1, limit: Int = -1,
                                 additional: Int = 0, type: Int = -1, flags: Int = -1,
-                                callback: (List<Message>) -> Unit) {
+                                callback: (List<Message>) -> Boolean) {
     if (loading.contains(-1)) return
     loadingFiltered[-1] = callback
     requestBacklogAllFiltered(first, last, limit, additional, type, flags)
@@ -72,34 +72,38 @@ class BacklogManager(
   override fun receiveBacklog(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int,
                               additional: Int, messages: QVariantList) {
     val list = messages.mapNotNull<QVariant_, Message>(QVariant_::value)
-    loading.remove(bufferId)?.invoke(list)
-    log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
-    backlogStorage.storeMessages(session, list)
+    if (loading.remove(bufferId)?.invoke(list) != false) {
+      log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
+      backlogStorage.storeMessages(session, list)
+    }
   }
 
   override fun receiveBacklogAll(first: MsgId, last: MsgId, limit: Int, additional: Int,
                                  messages: QVariantList) {
     val list = messages.mapNotNull<QVariant_, Message>(QVariant_::value)
-    loading.remove(-1)?.invoke(list)
-    log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
-    backlogStorage.storeMessages(session, list)
+    if (loading.remove(-1)?.invoke(list) != false) {
+      log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
+      backlogStorage.storeMessages(session, list)
+    }
   }
 
   override fun receiveBacklogFiltered(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int,
                                       additional: Int, type: Int, flags: Int,
                                       messages: QVariantList) {
     val list = messages.mapNotNull<QVariant_, Message>(QVariant_::value)
-    loadingFiltered.remove(bufferId)?.invoke(list)
+    if (loadingFiltered.remove(bufferId)?.invoke(list) != false) {
     log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
     backlogStorage.storeMessages(session, list)
+    }
   }
 
   override fun receiveBacklogAllFiltered(first: MsgId, last: MsgId, limit: Int, additional: Int,
                                          type: Int, flags: Int, messages: QVariantList) {
     val list = messages.mapNotNull<QVariant_, Message>(QVariant_::value)
-    loadingFiltered.remove(-1)?.invoke(list)
-    log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
-    backlogStorage.storeMessages(session, list)
+    if (loadingFiltered.remove(-1)?.invoke(list) != false) {
+      log(DEBUG, "BacklogManager", "storeMessages(${list.size})")
+      backlogStorage.storeMessages(session, list)
+    }
   }
 
   fun removeBuffer(buffer: BufferId) {
-- 
GitLab