From 6f5513f01adf98542b12aa05904c898bf4906c3a Mon Sep 17 00:00:00 2001 From: Peter Iakovlev Date: Wed, 24 Jan 2018 01:05:05 +0400 Subject: [PATCH] no message --- Postbox/ChatListView.swift | 3 +++ Postbox/GroupFeedIndexTable.swift | 26 ++++++++++++++++++++++++++ Postbox/Message.swift | 4 ++++ Postbox/Postbox.swift | 11 ++++++++++- 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Postbox/ChatListView.swift b/Postbox/ChatListView.swift index 1ade038e7a..f930fedfd6 100644 --- a/Postbox/ChatListView.swift +++ b/Postbox/ChatListView.swift @@ -732,11 +732,14 @@ final class MutableChatListView { } public final class ChatListView { + public let groupId: PeerGroupId? public let entries: [ChatListEntry] public let earlierIndex: ChatListIndex? public let laterIndex: ChatListIndex? init(_ mutableView: MutableChatListView) { + self.groupId = mutableView.groupId + var entries: [ChatListEntry] = [] for entry in mutableView.entries { switch entry { diff --git a/Postbox/GroupFeedIndexTable.swift b/Postbox/GroupFeedIndexTable.swift index 35b96ca9a3..fe6f9f2f7f 100644 --- a/Postbox/GroupFeedIndexTable.swift +++ b/Postbox/GroupFeedIndexTable.swift @@ -176,6 +176,32 @@ final class GroupFeedIndexTable: Table { } } + func addHoleFromLatestEntries(groupId: PeerGroupId, messageHistoryTable: MessageHistoryTable, operations: inout [PeerGroupId: [GroupFeedIndexOperation]]) { + self.ensureInitialized(groupId) + let entries = self.entriesInRange(groupId: groupId, fromIndex: MessageIndex.absoluteUpperBound(), toIndex: MessageIndex.absoluteLowerBound(), count: 1, messageHistoryTable: messageHistoryTable) + if let entry = entries.first { + switch entry { + case .Message: + self.addHole(groupId: groupId, stableId: self.metadataTable.getNextStableMessageIndexId(), hole: GroupFeedIndexHole(lowerIndex: entry.index.successor(), upperIndex: MessageIndex.absoluteUpperBound().predecessor()), addOperation: { groupId, operation in + addOperation(groupId: groupId, operation: operation, to: &operations) + }) + case let .Hole(hole, lowerIndex): + if hole.maxIndex.timestamp != Int32.max { + if let lowerIndex = lowerIndex { + self.removeHole(groupId: groupId, messageIndex: entry.index, addOperation: { groupId, operation in + addOperation(groupId: groupId, operation: operation, to: &operations) + }) + self.addHole(groupId: groupId, stableId: self.metadataTable.getNextStableMessageIndexId(), hole: GroupFeedIndexHole(lowerIndex: lowerIndex, upperIndex: MessageIndex.absoluteUpperBound().predecessor()), addOperation: { groupId, operation in + addOperation(groupId: groupId, operation: operation, to: &operations) + }) + } else { + assertionFailure() + } + } + } + } + } + private func addHole(groupId: PeerGroupId, stableId: UInt32, hole: GroupFeedIndexHole, addOperation: (PeerGroupId, GroupFeedIndexOperation) -> Void) { self.ensureInitialized(groupId) diff --git a/Postbox/Message.swift b/Postbox/Message.swift index f4cf536142..3b92b05594 100644 --- a/Postbox/Message.swift +++ b/Postbox/Message.swift @@ -508,6 +508,10 @@ public final class Message { self.associatedMessageIds = associatedMessageIds } + public func withUpdatedFlags(_ flags: MessageFlags) -> Message { + return Message(stableId: self.stableId, stableVersion: self.stableVersion, id: self.id, globallyUniqueId: self.globallyUniqueId, groupingKey: self.groupingKey, groupInfo: self.groupInfo, timestamp: self.timestamp, flags: flags, tags: self.tags, globalTags: self.globalTags, localTags: self.localTags, forwardInfo: self.forwardInfo, author: self.author, text: self.text, attributes: self.attributes, media: self.media, peers: self.peers, associatedMessages: self.associatedMessages, associatedMessageIds: self.associatedMessageIds) + } + func withUpdatedGroupInfo(_ groupInfo: MessageGroupInfo?) -> Message { return Message(stableId: self.stableId, stableVersion: self.stableVersion, id: self.id, globallyUniqueId: self.globallyUniqueId, groupingKey: self.groupingKey, groupInfo: groupInfo, timestamp: self.timestamp, flags: self.flags, tags: self.tags, globalTags: self.globalTags, localTags: self.localTags, forwardInfo: self.forwardInfo, author: self.author, text: self.text, attributes: self.attributes, media: self.media, peers: self.peers, associatedMessages: self.associatedMessages, associatedMessageIds: self.associatedMessageIds) } diff --git a/Postbox/Postbox.swift b/Postbox/Postbox.swift index b31607f886..69f397891a 100644 --- a/Postbox/Postbox.swift +++ b/Postbox/Postbox.swift @@ -57,6 +57,11 @@ public final class Modifier { self.postbox?.fillMultipleGroupFeedHoles(groupId: groupId, mainHoleMaxIndex: mainHoleMaxIndex, fillType: fillType, messages: messages) } + public func addFeedHoleFromLatestEntries(groupId: PeerGroupId) { + assert(!self.disposed) + self.postbox?.addFeedHoleFromLatestEntries(groupId: groupId) + } + public func replaceChatListHole(groupId: PeerGroupId?, index: MessageIndex, hole: ChatListHole?) { assert(!self.disposed) self.postbox?.replaceChatListHole(groupId: groupId, index: index, hole: hole) @@ -830,7 +835,7 @@ public func openPostbox(basePath: String, globalMessageIdsNamespace: MessageId.N #if DEBUG //debugSaveState(basePath: basePath, name: "previous") - //debugRestoreState(basePath: basePath, name: "previous") + debugRestoreState(basePath: basePath, name: "previous") #endif loop: while true { @@ -1379,6 +1384,10 @@ public final class Postbox { self.currentRemovedHolesByPeerGroupId[groupId]![mainHoleMaxIndex] = fillType.direction } + fileprivate func addFeedHoleFromLatestEntries(groupId: PeerGroupId) { + self.groupFeedIndexTable.addHoleFromLatestEntries(groupId: groupId, messageHistoryTable: self.messageHistoryTable, operations: &self.currentGroupFeedOperations) + } + fileprivate func replaceChatListHole(groupId: PeerGroupId?, index: MessageIndex, hole: ChatListHole?) { self.chatListTable.replaceHole(groupId: groupId, index: index, hole: hole, operations: &self.currentChatListOperations) }