mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-18 19:40:19 +00:00
no message
This commit is contained in:
parent
ec390503ef
commit
33c847b71b
@ -29,6 +29,7 @@ class IntermediateMessage {
|
|||||||
let timestamp: Int32
|
let timestamp: Int32
|
||||||
let flags: MessageFlags
|
let flags: MessageFlags
|
||||||
let tags: MessageTags
|
let tags: MessageTags
|
||||||
|
let globalTags: GlobalMessageTags
|
||||||
let forwardInfo: IntermediateMessageForwardInfo?
|
let forwardInfo: IntermediateMessageForwardInfo?
|
||||||
let authorId: PeerId?
|
let authorId: PeerId?
|
||||||
let text: String
|
let text: String
|
||||||
@ -36,7 +37,7 @@ class IntermediateMessage {
|
|||||||
let embeddedMediaData: ReadBuffer
|
let embeddedMediaData: ReadBuffer
|
||||||
let referencedMedia: [MediaId]
|
let referencedMedia: [MediaId]
|
||||||
|
|
||||||
init(stableId: UInt32, stableVersion: UInt32, id: MessageId, globallyUniqueId: Int64?, timestamp: Int32, flags: MessageFlags, tags: MessageTags, forwardInfo: IntermediateMessageForwardInfo?, authorId: PeerId?, text: String, attributesData: ReadBuffer, embeddedMediaData: ReadBuffer, referencedMedia: [MediaId]) {
|
init(stableId: UInt32, stableVersion: UInt32, id: MessageId, globallyUniqueId: Int64?, timestamp: Int32, flags: MessageFlags, tags: MessageTags, globalTags: GlobalMessageTags, forwardInfo: IntermediateMessageForwardInfo?, authorId: PeerId?, text: String, attributesData: ReadBuffer, embeddedMediaData: ReadBuffer, referencedMedia: [MediaId]) {
|
||||||
self.stableId = stableId
|
self.stableId = stableId
|
||||||
self.stableVersion = stableVersion
|
self.stableVersion = stableVersion
|
||||||
self.id = id
|
self.id = id
|
||||||
@ -44,6 +45,7 @@ class IntermediateMessage {
|
|||||||
self.timestamp = timestamp
|
self.timestamp = timestamp
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
|
self.globalTags = globalTags
|
||||||
self.forwardInfo = forwardInfo
|
self.forwardInfo = forwardInfo
|
||||||
self.authorId = authorId
|
self.authorId = authorId
|
||||||
self.text = text
|
self.text = text
|
||||||
|
@ -228,6 +228,18 @@ public struct MessageTags: OptionSet {
|
|||||||
public static let All = MessageTags(rawValue: 0xffffffff)
|
public static let All = MessageTags(rawValue: 0xffffffff)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct GlobalMessageTags: OptionSet {
|
||||||
|
public var rawValue: UInt32
|
||||||
|
|
||||||
|
public init(rawValue: UInt32) {
|
||||||
|
self.rawValue = rawValue
|
||||||
|
}
|
||||||
|
|
||||||
|
public init() {
|
||||||
|
self.rawValue = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public struct MessageFlags: OptionSet {
|
public struct MessageFlags: OptionSet {
|
||||||
public var rawValue: UInt32
|
public var rawValue: UInt32
|
||||||
|
|
||||||
@ -343,6 +355,7 @@ public final class Message: CustomStringConvertible {
|
|||||||
public let timestamp: Int32
|
public let timestamp: Int32
|
||||||
public let flags: MessageFlags
|
public let flags: MessageFlags
|
||||||
public let tags: MessageTags
|
public let tags: MessageTags
|
||||||
|
public let globalTags: GlobalMessageTags
|
||||||
public let forwardInfo: MessageForwardInfo?
|
public let forwardInfo: MessageForwardInfo?
|
||||||
public let author: Peer?
|
public let author: Peer?
|
||||||
public let text: String
|
public let text: String
|
||||||
@ -352,7 +365,7 @@ public final class Message: CustomStringConvertible {
|
|||||||
public let associatedMessages: SimpleDictionary<MessageId, Message>
|
public let associatedMessages: SimpleDictionary<MessageId, Message>
|
||||||
public let associatedMessageIds: [MessageId]
|
public let associatedMessageIds: [MessageId]
|
||||||
|
|
||||||
public init(stableId: UInt32, stableVersion: UInt32, id: MessageId, globallyUniqueId: Int64?, timestamp: Int32, flags: MessageFlags, tags: MessageTags, forwardInfo: MessageForwardInfo?, author: Peer?, text: String, attributes: [MessageAttribute], media: [Media], peers: SimpleDictionary<PeerId, Peer>, associatedMessages: SimpleDictionary<MessageId, Message>, associatedMessageIds: [MessageId]) {
|
public init(stableId: UInt32, stableVersion: UInt32, id: MessageId, globallyUniqueId: Int64?, timestamp: Int32, flags: MessageFlags, tags: MessageTags, globalTags: GlobalMessageTags, forwardInfo: MessageForwardInfo?, author: Peer?, text: String, attributes: [MessageAttribute], media: [Media], peers: SimpleDictionary<PeerId, Peer>, associatedMessages: SimpleDictionary<MessageId, Message>, associatedMessageIds: [MessageId]) {
|
||||||
self.stableId = stableId
|
self.stableId = stableId
|
||||||
self.stableVersion = stableVersion
|
self.stableVersion = stableVersion
|
||||||
self.id = id
|
self.id = id
|
||||||
@ -360,6 +373,7 @@ public final class Message: CustomStringConvertible {
|
|||||||
self.timestamp = timestamp
|
self.timestamp = timestamp
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
|
self.globalTags = globalTags
|
||||||
self.forwardInfo = forwardInfo
|
self.forwardInfo = forwardInfo
|
||||||
self.author = author
|
self.author = author
|
||||||
self.text = text
|
self.text = text
|
||||||
@ -444,18 +458,20 @@ public final class StoreMessage {
|
|||||||
public let globallyUniqueId: Int64?
|
public let globallyUniqueId: Int64?
|
||||||
public let flags: StoreMessageFlags
|
public let flags: StoreMessageFlags
|
||||||
public let tags: MessageTags
|
public let tags: MessageTags
|
||||||
|
public let globalTags: GlobalMessageTags
|
||||||
public let forwardInfo: StoreMessageForwardInfo?
|
public let forwardInfo: StoreMessageForwardInfo?
|
||||||
public let authorId: PeerId?
|
public let authorId: PeerId?
|
||||||
public let text: String
|
public let text: String
|
||||||
public let attributes: [MessageAttribute]
|
public let attributes: [MessageAttribute]
|
||||||
public let media: [Media]
|
public let media: [Media]
|
||||||
|
|
||||||
public init(id: MessageId, globallyUniqueId: Int64?, timestamp: Int32, flags: StoreMessageFlags, tags: MessageTags, forwardInfo: StoreMessageForwardInfo?, authorId: PeerId?, text: String, attributes: [MessageAttribute], media: [Media]) {
|
public init(id: MessageId, globallyUniqueId: Int64?, timestamp: Int32, flags: StoreMessageFlags, tags: MessageTags, globalTags: GlobalMessageTags, forwardInfo: StoreMessageForwardInfo?, authorId: PeerId?, text: String, attributes: [MessageAttribute], media: [Media]) {
|
||||||
self.id = .Id(id)
|
self.id = .Id(id)
|
||||||
self.globallyUniqueId = globallyUniqueId
|
self.globallyUniqueId = globallyUniqueId
|
||||||
self.timestamp = timestamp
|
self.timestamp = timestamp
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
|
self.globalTags = globalTags
|
||||||
self.forwardInfo = forwardInfo
|
self.forwardInfo = forwardInfo
|
||||||
self.authorId = authorId
|
self.authorId = authorId
|
||||||
self.text = text
|
self.text = text
|
||||||
@ -463,12 +479,13 @@ public final class StoreMessage {
|
|||||||
self.media = media
|
self.media = media
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(peerId: PeerId, namespace: MessageId.Namespace, globallyUniqueId: Int64?, timestamp: Int32, flags: StoreMessageFlags, tags: MessageTags, forwardInfo: StoreMessageForwardInfo?, authorId: PeerId?, text: String, attributes: [MessageAttribute], media: [Media]) {
|
public init(peerId: PeerId, namespace: MessageId.Namespace, globallyUniqueId: Int64?, timestamp: Int32, flags: StoreMessageFlags, tags: MessageTags, globalTags: GlobalMessageTags, forwardInfo: StoreMessageForwardInfo?, authorId: PeerId?, text: String, attributes: [MessageAttribute], media: [Media]) {
|
||||||
self.id = .Partial(peerId, namespace)
|
self.id = .Partial(peerId, namespace)
|
||||||
self.timestamp = timestamp
|
self.timestamp = timestamp
|
||||||
self.globallyUniqueId = globallyUniqueId
|
self.globallyUniqueId = globallyUniqueId
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
|
self.globalTags = globalTags
|
||||||
self.forwardInfo = forwardInfo
|
self.forwardInfo = forwardInfo
|
||||||
self.authorId = authorId
|
self.authorId = authorId
|
||||||
self.text = text
|
self.text = text
|
||||||
@ -483,18 +500,20 @@ final class InternalStoreMessage {
|
|||||||
let globallyUniqueId: Int64?
|
let globallyUniqueId: Int64?
|
||||||
let flags: StoreMessageFlags
|
let flags: StoreMessageFlags
|
||||||
let tags: MessageTags
|
let tags: MessageTags
|
||||||
|
let globalTags: GlobalMessageTags
|
||||||
let forwardInfo: StoreMessageForwardInfo?
|
let forwardInfo: StoreMessageForwardInfo?
|
||||||
let authorId: PeerId?
|
let authorId: PeerId?
|
||||||
let text: String
|
let text: String
|
||||||
let attributes: [MessageAttribute]
|
let attributes: [MessageAttribute]
|
||||||
let media: [Media]
|
let media: [Media]
|
||||||
|
|
||||||
init(id: MessageId, timestamp: Int32, globallyUniqueId: Int64?, flags: StoreMessageFlags, tags: MessageTags, forwardInfo: StoreMessageForwardInfo?, authorId: PeerId?, text: String, attributes: [MessageAttribute], media: [Media]) {
|
init(id: MessageId, timestamp: Int32, globallyUniqueId: Int64?, flags: StoreMessageFlags, tags: MessageTags, globalTags: GlobalMessageTags, forwardInfo: StoreMessageForwardInfo?, authorId: PeerId?, text: String, attributes: [MessageAttribute], media: [Media]) {
|
||||||
self.id = id
|
self.id = id
|
||||||
self.timestamp = timestamp
|
self.timestamp = timestamp
|
||||||
self.globallyUniqueId = globallyUniqueId
|
self.globallyUniqueId = globallyUniqueId
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
|
self.globalTags = globalTags
|
||||||
self.forwardInfo = forwardInfo
|
self.forwardInfo = forwardInfo
|
||||||
self.authorId = authorId
|
self.authorId = authorId
|
||||||
self.text = text
|
self.text = text
|
||||||
|
@ -33,6 +33,21 @@ enum RenderedMessageHistoryEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private struct MessageDataFlags: OptionSet {
|
||||||
|
var rawValue: Int8
|
||||||
|
|
||||||
|
init() {
|
||||||
|
self.rawValue = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
init(rawValue: Int8) {
|
||||||
|
self.rawValue = rawValue
|
||||||
|
}
|
||||||
|
|
||||||
|
static let hasGloballyUniqueId = MessageDataFlags(rawValue: 1 << 0)
|
||||||
|
static let hasGlobalTags = MessageDataFlags(rawValue: 1 << 1)
|
||||||
|
}
|
||||||
|
|
||||||
final class MessageHistoryTable: Table {
|
final class MessageHistoryTable: Table {
|
||||||
static func tableSpec(_ id: Int32) -> ValueBoxTable {
|
static func tableSpec(_ id: Int32) -> ValueBoxTable {
|
||||||
return ValueBoxTable(id: id, keyType: .binary)
|
return ValueBoxTable(id: id, keyType: .binary)
|
||||||
@ -277,10 +292,10 @@ final class MessageHistoryTable: Table {
|
|||||||
for message in messages {
|
for message in messages {
|
||||||
switch message.id {
|
switch message.id {
|
||||||
case let .Id(id):
|
case let .Id(id):
|
||||||
internalStoreMessages.append(InternalStoreMessage(id: id, timestamp: message.timestamp, globallyUniqueId: message.globallyUniqueId, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributes: message.attributes, media: message.media))
|
internalStoreMessages.append(InternalStoreMessage(id: id, timestamp: message.timestamp, globallyUniqueId: message.globallyUniqueId, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributes: message.attributes, media: message.media))
|
||||||
case let .Partial(peerId, namespace):
|
case let .Partial(peerId, namespace):
|
||||||
let id = self.historyMetadataTable.getNextMessageIdAndIncrement(peerId, namespace: namespace)
|
let id = self.historyMetadataTable.getNextMessageIdAndIncrement(peerId, namespace: namespace)
|
||||||
internalStoreMessages.append(InternalStoreMessage(id: id, timestamp: message.timestamp, globallyUniqueId: message.globallyUniqueId, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributes: message.attributes, media: message.media))
|
internalStoreMessages.append(InternalStoreMessage(id: id, timestamp: message.timestamp, globallyUniqueId: message.globallyUniqueId, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributes: message.attributes, media: message.media))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return internalStoreMessages
|
return internalStoreMessages
|
||||||
@ -564,13 +579,23 @@ final class MessageHistoryTable: Table {
|
|||||||
var stableVersion: UInt32 = 0
|
var stableVersion: UInt32 = 0
|
||||||
sharedBuffer.write(&stableVersion, offset: 0, length: 4)
|
sharedBuffer.write(&stableVersion, offset: 0, length: 4)
|
||||||
|
|
||||||
var hasGloballyUniqueId: Int8 = message.globallyUniqueId != nil ? 1 : 0
|
var dataFlags: MessageDataFlags = []
|
||||||
sharedBuffer.write(&hasGloballyUniqueId, offset: 0, length: 1)
|
if message.globallyUniqueId != nil {
|
||||||
|
dataFlags.insert(.hasGloballyUniqueId)
|
||||||
|
}
|
||||||
|
if !message.globalTags.isEmpty {
|
||||||
|
dataFlags.insert(.hasGlobalTags)
|
||||||
|
}
|
||||||
|
sharedBuffer.write(&dataFlags, offset: 0, length: 1)
|
||||||
if let globallyUniqueId = message.globallyUniqueId {
|
if let globallyUniqueId = message.globallyUniqueId {
|
||||||
var globallyUniqueIdValue = globallyUniqueId
|
var globallyUniqueIdValue = globallyUniqueId
|
||||||
sharedBuffer.write(&globallyUniqueIdValue, offset: 0, length: 8)
|
sharedBuffer.write(&globallyUniqueIdValue, offset: 0, length: 8)
|
||||||
self.globallyUniqueMessageIdsTable.set(peerId: message.id.peerId, globallyUniqueId: globallyUniqueId, id: message.id)
|
self.globallyUniqueMessageIdsTable.set(peerId: message.id.peerId, globallyUniqueId: globallyUniqueId, id: message.id)
|
||||||
}
|
}
|
||||||
|
if !message.globalTags.isEmpty {
|
||||||
|
var globalTagsValue: UInt32 = message.globalTags.rawValue
|
||||||
|
sharedBuffer.write(&globalTagsValue, offset: 0, length: 4)
|
||||||
|
}
|
||||||
|
|
||||||
var flags = MessageFlags(message.flags)
|
var flags = MessageFlags(message.flags)
|
||||||
sharedBuffer.write(&flags.rawValue, offset: 0, length: 4)
|
sharedBuffer.write(&flags.rawValue, offset: 0, length: 4)
|
||||||
@ -688,7 +713,7 @@ final class MessageHistoryTable: Table {
|
|||||||
|
|
||||||
self.valueBox.set(self.table, key: self.key(MessageIndex(message), key: sharedKey), value: sharedBuffer)
|
self.valueBox.set(self.table, key: self.key(MessageIndex(message), key: sharedKey), value: sharedBuffer)
|
||||||
|
|
||||||
return IntermediateMessage(stableId: stableId, stableVersion: stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: flags, tags: message.tags, forwardInfo: intermediateForwardInfo, authorId: message.authorId, text: message.text, attributesData: attributesBuffer.makeReadBufferAndReset(), embeddedMediaData: embeddedMediaBuffer.makeReadBufferAndReset(), referencedMedia: referencedMedia)
|
return IntermediateMessage(stableId: stableId, stableVersion: stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: intermediateForwardInfo, authorId: message.authorId, text: message.text, attributesData: attributesBuffer.makeReadBufferAndReset(), embeddedMediaData: embeddedMediaBuffer.makeReadBufferAndReset(), referencedMedia: referencedMedia)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func justInsertHole(_ hole: MessageHistoryHole, sharedBuffer: WriteBuffer = WriteBuffer()) {
|
private func justInsertHole(_ hole: MessageHistoryHole, sharedBuffer: WriteBuffer = WriteBuffer()) {
|
||||||
@ -862,7 +887,7 @@ final class MessageHistoryTable: Table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
withExtendedLifetime(updatedEmbeddedMediaBuffer, {
|
withExtendedLifetime(updatedEmbeddedMediaBuffer, {
|
||||||
self.storeIntermediateMessage(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: updatedEmbeddedMediaBuffer.readBufferNoCopy(), referencedMedia: message.referencedMedia), sharedKey: self.key(index))
|
self.storeIntermediateMessage(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: updatedEmbeddedMediaBuffer.readBufferNoCopy(), referencedMedia: message.referencedMedia), sharedKey: self.key(index))
|
||||||
})
|
})
|
||||||
|
|
||||||
let operation: MessageHistoryOperation = .UpdateEmbeddedMedia(index, updatedEmbeddedMediaBuffer.makeReadBufferAndReset())
|
let operation: MessageHistoryOperation = .UpdateEmbeddedMedia(index, updatedEmbeddedMediaBuffer.makeReadBufferAndReset())
|
||||||
@ -953,6 +978,15 @@ final class MessageHistoryTable: Table {
|
|||||||
self.globallyUniqueMessageIdsTable.set(peerId: message.id.peerId, globallyUniqueId: globallyUniqueId, id: message.id)
|
self.globallyUniqueMessageIdsTable.set(peerId: message.id.peerId, globallyUniqueId: globallyUniqueId, id: message.id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if !message.globalTags.isEmpty || !previousMessage.globalTags.isEmpty {
|
||||||
|
assertionFailure("implement global tags")
|
||||||
|
if index != MessageIndex(message) {
|
||||||
|
|
||||||
|
} else if message.globalTags != previousMessage.globalTags {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (previousMessage.flags.contains(.Unsent) && !previousMessage.flags.contains(.Failed), message.flags.contains(.Unsent) && !message.flags.contains(.Failed)) {
|
switch (previousMessage.flags.contains(.Unsent) && !previousMessage.flags.contains(.Failed), message.flags.contains(.Unsent) && !message.flags.contains(.Failed)) {
|
||||||
case (true, false):
|
case (true, false):
|
||||||
self.unsentTable.remove(index.id, operations: &unsentMessageOperations)
|
self.unsentTable.remove(index.id, operations: &unsentMessageOperations)
|
||||||
@ -1098,7 +1132,7 @@ final class MessageHistoryTable: Table {
|
|||||||
|
|
||||||
self.valueBox.set(self.table, key: self.key(MessageIndex(message), key: sharedKey), value: sharedBuffer)
|
self.valueBox.set(self.table, key: self.key(MessageIndex(message), key: sharedKey), value: sharedBuffer)
|
||||||
|
|
||||||
return (IntermediateMessage(stableId: stableId, stableVersion: stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: flags, tags: tags, forwardInfo: intermediateForwardInfo, authorId: message.authorId, text: message.text, attributesData: attributesBuffer.makeReadBufferAndReset(), embeddedMediaData: embeddedMediaBuffer.makeReadBufferAndReset(), referencedMedia: referencedMedia), previousMessage.tags)
|
return (IntermediateMessage(stableId: stableId, stableVersion: stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: flags, tags: tags, globalTags: message.globalTags, forwardInfo: intermediateForwardInfo, authorId: message.authorId, text: message.text, attributesData: attributesBuffer.makeReadBufferAndReset(), embeddedMediaData: embeddedMediaBuffer.makeReadBufferAndReset(), referencedMedia: referencedMedia), previousMessage.tags)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -1107,7 +1141,7 @@ final class MessageHistoryTable: Table {
|
|||||||
private func justUpdateTimestamp(_ index: MessageIndex, timestamp: Int32) {
|
private func justUpdateTimestamp(_ index: MessageIndex, timestamp: Int32) {
|
||||||
if let previousMessage = self.getMessage(index) {
|
if let previousMessage = self.getMessage(index) {
|
||||||
self.valueBox.remove(self.table, key: self.key(index))
|
self.valueBox.remove(self.table, key: self.key(index))
|
||||||
let updatedMessage = IntermediateMessage(stableId: previousMessage.stableId, stableVersion: previousMessage.stableVersion + 1, id: previousMessage.id, globallyUniqueId: previousMessage.globallyUniqueId, timestamp: timestamp, flags: previousMessage.flags, tags: previousMessage.tags, forwardInfo: previousMessage.forwardInfo, authorId: previousMessage.authorId, text: previousMessage.text, attributesData: previousMessage.attributesData, embeddedMediaData: previousMessage.embeddedMediaData, referencedMedia: previousMessage.referencedMedia)
|
let updatedMessage = IntermediateMessage(stableId: previousMessage.stableId, stableVersion: previousMessage.stableVersion + 1, id: previousMessage.id, globallyUniqueId: previousMessage.globallyUniqueId, timestamp: timestamp, flags: previousMessage.flags, tags: previousMessage.tags, globalTags: previousMessage.globalTags, forwardInfo: previousMessage.forwardInfo, authorId: previousMessage.authorId, text: previousMessage.text, attributesData: previousMessage.attributesData, embeddedMediaData: previousMessage.embeddedMediaData, referencedMedia: previousMessage.referencedMedia)
|
||||||
self.storeIntermediateMessage(updatedMessage, sharedKey: self.key(index))
|
self.storeIntermediateMessage(updatedMessage, sharedKey: self.key(index))
|
||||||
|
|
||||||
let tags = previousMessage.tags.rawValue
|
let tags = previousMessage.tags.rawValue
|
||||||
@ -1161,7 +1195,7 @@ final class MessageHistoryTable: Table {
|
|||||||
var updatedReferencedMedia = message.referencedMedia
|
var updatedReferencedMedia = message.referencedMedia
|
||||||
updatedReferencedMedia.append(extractedMedia.id!)
|
updatedReferencedMedia.append(extractedMedia.id!)
|
||||||
withExtendedLifetime(updatedEmbeddedMediaBuffer, {
|
withExtendedLifetime(updatedEmbeddedMediaBuffer, {
|
||||||
self.storeIntermediateMessage(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: updatedEmbeddedMediaBuffer.readBufferNoCopy(), referencedMedia: updatedReferencedMedia), sharedKey: self.key(index))
|
self.storeIntermediateMessage(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: updatedEmbeddedMediaBuffer.readBufferNoCopy(), referencedMedia: updatedReferencedMedia), sharedKey: self.key(index))
|
||||||
})
|
})
|
||||||
|
|
||||||
return extractedMedia
|
return extractedMedia
|
||||||
@ -1313,15 +1347,24 @@ final class MessageHistoryTable: Table {
|
|||||||
var stableVersion: UInt32 = 0
|
var stableVersion: UInt32 = 0
|
||||||
value.read(&stableVersion, offset: 0, length: 4)
|
value.read(&stableVersion, offset: 0, length: 4)
|
||||||
|
|
||||||
var hasGloballyUniqueId: Int8 = 0
|
var dataFlagsValue: Int8 = 0
|
||||||
|
value.read(&dataFlagsValue, offset: 0, length: 1)
|
||||||
|
let dataFlags = MessageDataFlags(rawValue: dataFlagsValue)
|
||||||
|
|
||||||
var globallyUniqueId: Int64?
|
var globallyUniqueId: Int64?
|
||||||
value.read(&hasGloballyUniqueId, offset: 0, length: 1)
|
if dataFlags.contains(.hasGloballyUniqueId) {
|
||||||
if hasGloballyUniqueId != 0 {
|
|
||||||
var globallyUniqueIdValue: Int64 = 0
|
var globallyUniqueIdValue: Int64 = 0
|
||||||
value.read(&globallyUniqueIdValue, offset: 0, length: 8)
|
value.read(&globallyUniqueIdValue, offset: 0, length: 8)
|
||||||
globallyUniqueId = globallyUniqueIdValue
|
globallyUniqueId = globallyUniqueIdValue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var globalTags: GlobalMessageTags = []
|
||||||
|
if dataFlags.contains(.hasGlobalTags) {
|
||||||
|
var globalTagsValue: UInt32 = 0
|
||||||
|
value.read(&globalTagsValue, offset: 0, length: 4)
|
||||||
|
globalTags = GlobalMessageTags(rawValue: globalTagsValue)
|
||||||
|
}
|
||||||
|
|
||||||
var flagsValue: UInt32 = 0
|
var flagsValue: UInt32 = 0
|
||||||
value.read(&flagsValue, offset: 0, length: 4)
|
value.read(&flagsValue, offset: 0, length: 4)
|
||||||
let flags = MessageFlags(rawValue: flagsValue)
|
let flags = MessageFlags(rawValue: flagsValue)
|
||||||
@ -1413,7 +1456,7 @@ final class MessageHistoryTable: Table {
|
|||||||
referencedMediaIds.append(MediaId(namespace: idNamespace, id: idId))
|
referencedMediaIds.append(MediaId(namespace: idNamespace, id: idId))
|
||||||
}
|
}
|
||||||
|
|
||||||
return .Message(IntermediateMessage(stableId: stableId, stableVersion: stableVersion, id: index.id, globallyUniqueId: globallyUniqueId, timestamp: index.timestamp, flags: flags, tags: tags, forwardInfo: forwardInfo, authorId: authorId, text: text, attributesData: attributesData, embeddedMediaData: embeddedMediaData, referencedMedia: referencedMediaIds))
|
return .Message(IntermediateMessage(stableId: stableId, stableVersion: stableVersion, id: index.id, globallyUniqueId: globallyUniqueId, timestamp: index.timestamp, flags: flags, tags: tags, globalTags: globalTags, forwardInfo: forwardInfo, authorId: authorId, text: text, attributesData: attributesData, embeddedMediaData: embeddedMediaData, referencedMedia: referencedMediaIds))
|
||||||
} else {
|
} else {
|
||||||
var stableId: UInt32 = 0
|
var stableId: UInt32 = 0
|
||||||
value.read(&stableId, offset: 0, length: 4)
|
value.read(&stableId, offset: 0, length: 4)
|
||||||
@ -1523,7 +1566,7 @@ final class MessageHistoryTable: Table {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: forwardInfo, author: author, text: message.text, attributes: parsedAttributes, media: parsedMedia, peers: peers, associatedMessages: associatedMessages, associatedMessageIds: associatedMessageIds)
|
return Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: forwardInfo, author: author, text: message.text, attributes: parsedAttributes, media: parsedMedia, peers: peers, associatedMessages: associatedMessages, associatedMessageIds: associatedMessageIds)
|
||||||
}
|
}
|
||||||
|
|
||||||
func entriesAround(_ index: MessageIndex, count: Int, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?]) -> (entries: [IntermediateMessageHistoryEntry], lower: IntermediateMessageHistoryEntry?, upper: IntermediateMessageHistoryEntry?) {
|
func entriesAround(_ index: MessageIndex, count: Int, operationsByPeerId: inout [PeerId: [MessageHistoryOperation]], unsentMessageOperations: inout [IntermediateMessageHistoryUnsentOperation], updatedPeerReadStateOperations: inout [PeerId: PeerReadStateSynchronizationOperation?]) -> (entries: [IntermediateMessageHistoryEntry], lower: IntermediateMessageHistoryEntry?, upper: IntermediateMessageHistoryEntry?) {
|
||||||
|
@ -159,10 +159,10 @@ enum MutableMessageHistoryEntry {
|
|||||||
func updatedTimestamp(_ timestamp: Int32) -> MutableMessageHistoryEntry {
|
func updatedTimestamp(_ timestamp: Int32) -> MutableMessageHistoryEntry {
|
||||||
switch self {
|
switch self {
|
||||||
case let .IntermediateMessageEntry(message, location, monthLocation):
|
case let .IntermediateMessageEntry(message, location, monthLocation):
|
||||||
let updatedMessage = IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: message.embeddedMediaData, referencedMedia: message.referencedMedia)
|
let updatedMessage = IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: message.embeddedMediaData, referencedMedia: message.referencedMedia)
|
||||||
return .IntermediateMessageEntry(updatedMessage, location, monthLocation)
|
return .IntermediateMessageEntry(updatedMessage, location, monthLocation)
|
||||||
case let .MessageEntry(message, location, monthLocation):
|
case let .MessageEntry(message, location, monthLocation):
|
||||||
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: message.associatedMessages, associatedMessageIds: message.associatedMessageIds)
|
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: message.associatedMessages, associatedMessageIds: message.associatedMessageIds)
|
||||||
return .MessageEntry(updatedMessage, location, monthLocation)
|
return .MessageEntry(updatedMessage, location, monthLocation)
|
||||||
case let .HoleEntry(hole, location):
|
case let .HoleEntry(hole, location):
|
||||||
let updatedHole = MessageHistoryHole(stableId: hole.stableId, maxIndex: MessageIndex(id: hole.maxIndex.id, timestamp: timestamp), min: hole.min, tags: hole.tags)
|
let updatedHole = MessageHistoryHole(stableId: hole.stableId, maxIndex: MessageIndex(id: hole.maxIndex.id, timestamp: timestamp), min: hole.min, tags: hole.tags)
|
||||||
@ -550,7 +550,7 @@ final class MutableMessageHistoryView {
|
|||||||
case let .UpdateEmbeddedMedia(index, embeddedMediaData):
|
case let .UpdateEmbeddedMedia(index, embeddedMediaData):
|
||||||
for i in 0 ..< self.entries.count {
|
for i in 0 ..< self.entries.count {
|
||||||
if case let .IntermediateMessageEntry(message, location, monthLocation) = self.entries[i] , MessageIndex(message) == index {
|
if case let .IntermediateMessageEntry(message, location, monthLocation) = self.entries[i] , MessageIndex(message) == index {
|
||||||
self.entries[i] = .IntermediateMessageEntry(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: embeddedMediaData, referencedMedia: message.referencedMedia), location, monthLocation)
|
self.entries[i] = .IntermediateMessageEntry(IntermediateMessage(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, authorId: message.authorId, text: message.text, attributesData: message.attributesData, embeddedMediaData: embeddedMediaData, referencedMedia: message.referencedMedia), location, monthLocation)
|
||||||
hasChanges = true
|
hasChanges = true
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -591,7 +591,7 @@ final class MutableMessageHistoryView {
|
|||||||
messageMedia.append(media)
|
messageMedia.append(media)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: messageMedia, peers: message.peers, associatedMessages: message.associatedMessages, associatedMessageIds: message.associatedMessageIds)
|
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: messageMedia, peers: message.peers, associatedMessages: message.associatedMessages, associatedMessageIds: message.associatedMessageIds)
|
||||||
self.entries[i] = .MessageEntry(updatedMessage, location, monthLocation)
|
self.entries[i] = .MessageEntry(updatedMessage, location, monthLocation)
|
||||||
hasChanges = true
|
hasChanges = true
|
||||||
}
|
}
|
||||||
@ -633,7 +633,7 @@ final class MutableMessageHistoryView {
|
|||||||
var updatedAssociatedMessages = message.associatedMessages
|
var updatedAssociatedMessages = message.associatedMessages
|
||||||
let renderedMessage = renderIntermediateMessage(intermediateMessage)
|
let renderedMessage = renderIntermediateMessage(intermediateMessage)
|
||||||
updatedAssociatedMessages[intermediateMessage.id] = renderedMessage
|
updatedAssociatedMessages[intermediateMessage.id] = renderedMessage
|
||||||
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId:message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: updatedAssociatedMessages, associatedMessageIds: message.associatedMessageIds)
|
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId:message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: updatedAssociatedMessages, associatedMessageIds: message.associatedMessageIds)
|
||||||
self.entries[i] = .MessageEntry(updatedMessage, location, monthLocation)
|
self.entries[i] = .MessageEntry(updatedMessage, location, monthLocation)
|
||||||
hasChanges = true
|
hasChanges = true
|
||||||
}
|
}
|
||||||
@ -789,7 +789,7 @@ final class MutableMessageHistoryView {
|
|||||||
switch entry {
|
switch entry {
|
||||||
case let .MessageEntry(message, location, monthLocation):
|
case let .MessageEntry(message, location, monthLocation):
|
||||||
if let updatedAssociatedMessages = message.associatedMessages.filteredOut(keysIn: ids) {
|
if let updatedAssociatedMessages = message.associatedMessages.filteredOut(keysIn: ids) {
|
||||||
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: updatedAssociatedMessages, associatedMessageIds: message.associatedMessageIds)
|
let updatedMessage = Message(stableId: message.stableId, stableVersion: message.stableVersion, id: message.id, globallyUniqueId: message.globallyUniqueId, timestamp: message.timestamp, flags: message.flags, tags: message.tags, globalTags: message.globalTags, forwardInfo: message.forwardInfo, author: message.author, text: message.text, attributes: message.attributes, media: message.media, peers: message.peers, associatedMessages: updatedAssociatedMessages, associatedMessageIds: message.associatedMessageIds)
|
||||||
self.entries[i] = .MessageEntry(updatedMessage, location, monthLocation)
|
self.entries[i] = .MessageEntry(updatedMessage, location, monthLocation)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user