diff --git a/submodules/Postbox/Sources/OrderedItemListEntry.swift b/submodules/Postbox/Sources/OrderedItemListEntry.swift index edefb701dc..b34ac776f4 100644 --- a/submodules/Postbox/Sources/OrderedItemListEntry.swift +++ b/submodules/Postbox/Sources/OrderedItemListEntry.swift @@ -1,14 +1,10 @@ import Foundation -public protocol OrderedItemListEntryContents: PostboxCoding { - -} - public struct OrderedItemListEntry { public let id: MemoryBuffer - public let contents: OrderedItemListEntryContents + public let contents: CodableEntry - public init(id: MemoryBuffer, contents: OrderedItemListEntryContents) { + public init(id: MemoryBuffer, contents: CodableEntry) { self.id = id self.contents = contents } diff --git a/submodules/Postbox/Sources/OrderedItemListIndexTable.swift b/submodules/Postbox/Sources/OrderedItemListIndexTable.swift index e1ce8d1f42..612cf4b4ec 100644 --- a/submodules/Postbox/Sources/OrderedItemListIndexTable.swift +++ b/submodules/Postbox/Sources/OrderedItemListIndexTable.swift @@ -12,9 +12,9 @@ final class OrderedItemListIndexTable: Table { return key } - func get(collectionId: Int32, id: MemoryBuffer) -> PostboxCoding? { - if let value = self.valueBox.get(self.table, key: self.key(collectionId: collectionId, id: id)), let content = PostboxDecoder(buffer: value).decodeRootObject() { - return content + func get(collectionId: Int32, id: MemoryBuffer) -> CodableEntry? { + if let value = self.valueBox.get(self.table, key: self.key(collectionId: collectionId, id: id)) { + return CodableEntry(data: value.makeData()) } else { return nil } @@ -24,12 +24,8 @@ final class OrderedItemListIndexTable: Table { self.valueBox.remove(self.table, key: self.key(collectionId: collectionId, id: id), secure: false) } - func set(collectionId: Int32, id: MemoryBuffer, content: PostboxCoding) { - let encoder = PostboxEncoder() - encoder.encodeRootObject(content) - withExtendedLifetime(encoder, { - self.valueBox.set(self.table, key: self.key(collectionId: collectionId, id: id), value: encoder.readBufferNoCopy()) - }) + func set(collectionId: Int32, id: MemoryBuffer, content: CodableEntry) { + self.valueBox.set(self.table, key: self.key(collectionId: collectionId, id: id), value: ReadBuffer(data: content.data)) } func getAllItemIds(collectionId: Int32) -> [MemoryBuffer] { diff --git a/submodules/Postbox/Sources/OrderedItemListTable.swift b/submodules/Postbox/Sources/OrderedItemListTable.swift index 6a7dfde6cb..0754986fd3 100644 --- a/submodules/Postbox/Sources/OrderedItemListTable.swift +++ b/submodules/Postbox/Sources/OrderedItemListTable.swift @@ -4,7 +4,7 @@ enum OrderedItemListOperation { case replace([OrderedItemListEntry]) case addOrMoveToFirstPosition(OrderedItemListEntry, Int?) case remove(MemoryBuffer) - case update(MemoryBuffer, OrderedItemListEntryContents) + case update(MemoryBuffer, CodableEntry) } private enum OrderedItemListKeyNamespace: UInt8 { @@ -97,7 +97,7 @@ final class OrderedItemListTable: Table { }, limit: 0) var items: [OrderedItemListEntry] = [] for id in currentIds { - if let contents = self.indexTable.get(collectionId: collectionId, id: id) as? OrderedItemListEntryContents { + if let contents = self.indexTable.get(collectionId: collectionId, id: id) { items.append(OrderedItemListEntry(id: id, contents: contents)) } else { assertionFailure() @@ -107,15 +107,15 @@ final class OrderedItemListTable: Table { } func getItem(collectionId: Int32, itemId: MemoryBuffer) -> OrderedItemListEntry? { - if let contents = self.indexTable.get(collectionId: collectionId, id: itemId) as? OrderedItemListEntryContents { + if let contents = self.indexTable.get(collectionId: collectionId, id: itemId) { return OrderedItemListEntry(id: itemId, contents: contents) } else { return nil } } - func updateItem(collectionId: Int32, itemId: MemoryBuffer, item: OrderedItemListEntryContents, operations: inout [Int32: [OrderedItemListOperation]]) { - if let _ = self.indexTable.get(collectionId: collectionId, id: itemId) as? OrderedItemListEntryContents { + func updateItem(collectionId: Int32, itemId: MemoryBuffer, item: CodableEntry, operations: inout [Int32: [OrderedItemListOperation]]) { + if let _ = self.indexTable.get(collectionId: collectionId, id: itemId) { self.indexTable.set(collectionId: collectionId, id: itemId, content: item) if operations[collectionId] == nil { operations[collectionId] = [] diff --git a/submodules/Postbox/Sources/Postbox.swift b/submodules/Postbox/Sources/Postbox.swift index d9f7a4cab6..924a699338 100644 --- a/submodules/Postbox/Sources/Postbox.swift +++ b/submodules/Postbox/Sources/Postbox.swift @@ -2,6 +2,10 @@ import Foundation import SwiftSignalKit +public protocol PostboxTypes { + associatedtype Media +} + public protocol PeerChatState: PostboxCoding { func equals(_ other: PeerChatState) -> Bool } @@ -649,7 +653,7 @@ public final class Transaction { return self.postbox?.getOrderedItemListItem(collectionId: collectionId, itemId: itemId) } - public func updateOrderedItemListItem(collectionId: Int32, itemId: MemoryBuffer, item: OrderedItemListEntryContents) { + public func updateOrderedItemListItem(collectionId: Int32, itemId: MemoryBuffer, item: CodableEntry) { assert(!self.disposed) self.postbox?.updateOrderedItemListItem(collectionId: collectionId, itemId: itemId, item: item) } @@ -3400,7 +3404,7 @@ public final class Postbox { return self.orderedItemListTable.getItem(collectionId: collectionId, itemId: itemId) } - fileprivate func updateOrderedItemListItem(collectionId: Int32, itemId: MemoryBuffer, item: OrderedItemListEntryContents) { + fileprivate func updateOrderedItemListItem(collectionId: Int32, itemId: MemoryBuffer, item: CodableEntry) { self.orderedItemListTable.updateItem(collectionId: collectionId, itemId: itemId, item: item, operations: &self.currentOrderedItemListOperations) } diff --git a/submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift index 32317752fb..158a5645f6 100644 --- a/submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift +++ b/submodules/SettingsUI/Sources/Search/SettingsSearchRecentQueries.swift @@ -26,21 +26,23 @@ private struct SettingsSearchRecentQueryItemId { } } -public final class RecentSettingsSearchQueryItem: OrderedItemListEntryContents { +public final class RecentSettingsSearchQueryItem: Codable { public init() { } - public init(decoder: PostboxDecoder) { + public init(from decoder: Decoder) throws { } - public func encode(_ encoder: PostboxEncoder) { + public func encode(to encoder: Encoder) throws { } } func addRecentSettingsSearchItem(postbox: Postbox, item: SettingsSearchableItemId) { let _ = (postbox.transaction { transaction in let itemId = SettingsSearchRecentQueryItemId(item.index) - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems, item: OrderedItemListEntry(id: itemId.rawValue, contents: RecentSettingsSearchQueryItem()), removeTailIfCountExceeds: 100) + if let entry = CodableEntry(RecentSettingsSearchQueryItem()) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.settingsSearchRecentItems, item: OrderedItemListEntry(id: itemId.rawValue, contents: entry), removeTailIfCountExceeds: 100) + } }).start() } diff --git a/submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift b/submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift index 8dd9078b9e..0f4bd3a2cd 100644 --- a/submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift +++ b/submodules/SettingsUI/Sources/Themes/WallpaperSearchRecentQueries.swift @@ -23,21 +23,23 @@ private struct WallpaperSearchRecentQueryItemId { } } -public final class RecentWallpaperSearchQueryItem: OrderedItemListEntryContents { +public final class RecentWallpaperSearchQueryItem: Codable { public init() { } - public init(decoder: PostboxDecoder) { + public init(from decoder: Decoder) throws { } - public func encode(_ encoder: PostboxEncoder) { + public func encode(to encoder: Encoder) throws { } } func addRecentWallpaperSearchQuery(postbox: Postbox, string: String) -> Signal { return postbox.transaction { transaction in if let itemId = WallpaperSearchRecentQueryItemId(string) { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.wallpaperSearchRecentQueries, item: OrderedItemListEntry(id: itemId.rawValue, contents: RecentWallpaperSearchQueryItem()), removeTailIfCountExceeds: 100) + if let entry = CodableEntry(RecentWallpaperSearchQueryItem()) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.wallpaperSearchRecentQueries, item: OrderedItemListEntry(id: itemId.rawValue, contents: entry), removeTailIfCountExceeds: 100) + } } } } diff --git a/submodules/TelegramCore/Sources/Account/AccountManager.swift b/submodules/TelegramCore/Sources/Account/AccountManager.swift index 4fa3e0ed8e..c7c4726a5b 100644 --- a/submodules/TelegramCore/Sources/Account/AccountManager.swift +++ b/submodules/TelegramCore/Sources/Account/AccountManager.swift @@ -133,9 +133,6 @@ private var declaredEncodables: Void = { declareEncodable(CloudChatRemoveChatOperation.self, f: { CloudChatRemoveChatOperation(decoder: $0) }) declareEncodable(SynchronizePinnedChatsOperation.self, f: { SynchronizePinnedChatsOperation(decoder: $0) }) declareEncodable(SynchronizeConsumeMessageContentsOperation.self, f: { SynchronizeConsumeMessageContentsOperation(decoder: $0) }) - declareEncodable(RecentMediaItem.self, f: { RecentMediaItem(decoder: $0) }) - declareEncodable(RecentPeerItem.self, f: { RecentPeerItem(decoder: $0) }) - declareEncodable(RecentHashtagItem.self, f: { RecentHashtagItem(decoder: $0) }) declareEncodable(CloudChatClearHistoryOperation.self, f: { CloudChatClearHistoryOperation(decoder: $0) }) declareEncodable(OutgoingContentInfoMessageAttribute.self, f: { OutgoingContentInfoMessageAttribute(decoder: $0) }) declareEncodable(ConsumableContentMessageAttribute.self, f: { ConsumableContentMessageAttribute(decoder: $0) }) @@ -143,9 +140,7 @@ private var declaredEncodables: Void = { declareEncodable(TelegramMediaInvoice.self, f: { TelegramMediaInvoice(decoder: $0) }) declareEncodable(TelegramMediaWebFile.self, f: { TelegramMediaWebFile(decoder: $0) }) declareEncodable(SynchronizeInstalledStickerPacksOperation.self, f: { SynchronizeInstalledStickerPacksOperation(decoder: $0) }) - declareEncodable(FeaturedStickerPackItem.self, f: { FeaturedStickerPackItem(decoder: $0) }) declareEncodable(SynchronizeMarkFeaturedStickerPacksAsSeenOperation.self, f: { SynchronizeMarkFeaturedStickerPacksAsSeenOperation(decoder: $0) }) - declareEncodable(ArchivedStickerPacksInfo.self, f: { ArchivedStickerPacksInfo(decoder: $0) }) declareEncodable(SynchronizeChatInputStateOperation.self, f: { SynchronizeChatInputStateOperation(decoder: $0) }) declareEncodable(SynchronizeSavedGifsOperation.self, f: { SynchronizeSavedGifsOperation(decoder: $0) }) declareEncodable(SynchronizeSavedStickersOperation.self, f: { SynchronizeSavedStickersOperation(decoder: $0) }) @@ -156,14 +151,11 @@ private var declaredEncodables: Void = { declareEncodable(CachedSecretChatData.self, f: { CachedSecretChatData(decoder: $0) }) declareEncodable(AuthorSignatureMessageAttribute.self, f: { AuthorSignatureMessageAttribute(decoder: $0) }) declareEncodable(TelegramMediaExpiredContent.self, f: { TelegramMediaExpiredContent(decoder: $0) }) - declareEncodable(SavedStickerItem.self, f: { SavedStickerItem(decoder: $0) }) declareEncodable(ConsumablePersonalMentionMessageAttribute.self, f: { ConsumablePersonalMentionMessageAttribute(decoder: $0) }) declareEncodable(ConsumePersonalMessageAction.self, f: { ConsumePersonalMessageAction(decoder: $0) }) declareEncodable(SynchronizeGroupedPeersOperation.self, f: { SynchronizeGroupedPeersOperation(decoder: $0) }) declareEncodable(TelegramDeviceContactImportedData.self, f: { TelegramDeviceContactImportedData(decoder: $0) }) declareEncodable(SecureFileMediaResource.self, f: { SecureFileMediaResource(decoder: $0) }) - declareEncodable(TelegramWallpaper.self, f: { TelegramWallpaper(decoder: $0) }) - declareEncodable(TelegramTheme.self, f: { TelegramTheme(decoder: $0) }) declareEncodable(SynchronizeMarkAllUnseenPersonalMessagesOperation.self, f: { SynchronizeMarkAllUnseenPersonalMessagesOperation(decoder: $0) }) declareEncodable(SynchronizeAppLogEventsOperation.self, f: { SynchronizeAppLogEventsOperation(decoder: $0) }) declareEncodable(TelegramMediaPoll.self, f: { TelegramMediaPoll(decoder: $0) }) diff --git a/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift b/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift index 9c5b99c7a5..5bcfc3659f 100644 --- a/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift +++ b/submodules/TelegramCore/Sources/Network/FetchedMediaResource.swift @@ -350,7 +350,8 @@ final class MediaReferenceRevalidationContext { return self.genericItem(key: .savedGifs, background: background, request: { next, error in let loadRecentGifs: Signal<[TelegramMediaFile], NoError> = postbox.transaction { transaction -> [TelegramMediaFile] in return transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudRecentGifs).compactMap({ item -> TelegramMediaFile? in - if let contents = item.contents as? RecentMediaItem, let file = contents.media as? TelegramMediaFile { + if let contents = item.contents.get(RecentMediaItem.self) { + let file = contents.media return file } return nil diff --git a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift index ae9f48f816..a489df1672 100644 --- a/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift +++ b/submodules/TelegramCore/Sources/State/AccountStateManagementUtils.swift @@ -3409,7 +3409,9 @@ func replayFinalState( return $0.0 < $1.0 }).map({ $0.1 }) for file in stickerFiles { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 20) + if let entry = CodableEntry(RecentMediaItem(file)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 20) + } } } @@ -3448,7 +3450,9 @@ func replayFinalState( }).map({ $0.1 }) for file in gifFiles { if !file.hasLinkedStickers { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 200) + if let entry = CodableEntry(RecentMediaItem(file)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 200) + } } } } @@ -3552,18 +3556,20 @@ func replayFinalState( if !updatedThemes.isEmpty { let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) let themes = entries.map { entry -> TelegramTheme in - let theme = entry.contents as! TelegramTheme - if let updatedTheme = updatedThemes[theme.id] { + let theme = entry.contents.get(TelegramThemeNativeCodable.self)! + if let updatedTheme = updatedThemes[theme.value.id] { return updatedTheme } else { - return theme + return theme.value } } var updatedEntries: [OrderedItemListEntry] = [] for theme in themes { var intValue = Int32(updatedEntries.count) let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) - updatedEntries.append(OrderedItemListEntry(id: id, contents: theme)) + if let entry = CodableEntry(TelegramThemeNativeCodable(theme)) { + updatedEntries.append(OrderedItemListEntry(id: id, contents: entry)) + } } transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) let _ = accountManager.transaction { transaction in diff --git a/submodules/TelegramCore/Sources/State/AccountViewTracker.swift b/submodules/TelegramCore/Sources/State/AccountViewTracker.swift index db38aa4c90..b2b667e250 100644 --- a/submodules/TelegramCore/Sources/State/AccountViewTracker.swift +++ b/submodules/TelegramCore/Sources/State/AccountViewTracker.swift @@ -1581,7 +1581,7 @@ public final class AccountViewTracker { if let account = self.account { let view = account.postbox.combinedView(keys: [.orderedItemList(id: Namespaces.OrderedItemList.CloudFeaturedStickerPacks)]).start(next: { next in if let view = next.views[.orderedItemList(id: Namespaces.OrderedItemList.CloudFeaturedStickerPacks)] as? OrderedItemListView { - subscriber.putNext(view.items.map { $0.contents as! FeaturedStickerPackItem }) + subscriber.putNext(view.items.map { $0.contents.get(FeaturedStickerPackItem.self)! }) } else { subscriber.putNext([]) } diff --git a/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift b/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift index 8fed6be810..50997bc665 100644 --- a/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift +++ b/submodules/TelegramCore/Sources/State/ApplyUpdateMessage.swift @@ -244,11 +244,15 @@ func applyUpdateMessage(postbox: Postbox, stateManager: AccountStateManager, mes } } for file in sentStickers { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 20) + if let entry = CodableEntry(RecentMediaItem(file)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 20) + } } for file in sentGifs { if !file.hasLinkedStickers { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 200) + if let entry = CodableEntry(RecentMediaItem(file)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 200) + } } } @@ -385,11 +389,15 @@ func applyUpdateGroupMessages(postbox: Postbox, stateManager: AccountStateManage } for file in sentStickers { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 20) + if let entry = CodableEntry(RecentMediaItem(file)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 20) + } } for file in sentGifs { if !file.hasLinkedStickers { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: RecentMediaItem(file)), removeTailIfCountExceeds: 200) + if let entry = CodableEntry(RecentMediaItem(file)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 200) + } } } stateManager.addUpdates(result) diff --git a/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift b/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift index 178d0ace56..8ac1e27de4 100644 --- a/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift +++ b/submodules/TelegramCore/Sources/State/ManagedRecentStickers.swift @@ -55,7 +55,9 @@ func managedRecentStickers(postbox: Postbox, network: Network) -> Signal Signal Signal Signal Signal OrderedItemListEntry? in + if let entry = CodableEntry(item) { + return OrderedItemListEntry(id: FeaturedStickerPackItemId(item.info.id.id).rawValue, contents: entry) + } else { + return nil + } + }) } } } @@ -83,7 +89,7 @@ public func requestOldFeaturedStickerPacks(network: Network, postbox: Postbox, o public func preloadedFeaturedStickerSet(network: Network, postbox: Postbox, id: ItemCollectionId) -> Signal { return postbox.transaction { transaction -> Signal in - if let pack = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, itemId: FeaturedStickerPackItemId(id.id).rawValue)?.contents as? FeaturedStickerPackItem { + if let pack = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, itemId: FeaturedStickerPackItemId(id.id).rawValue)?.contents.get(FeaturedStickerPackItem.self) { if pack.topItems.count < 5 && pack.topItems.count < pack.info.count { return _internal_requestStickerSet(postbox: postbox, network: network, reference: .id(id: pack.info.id.id, accessHash: pack.info.accessHash)) |> map(Optional.init) @@ -93,12 +99,14 @@ public func preloadedFeaturedStickerSet(network: Network, postbox: Postbox, id: |> mapToSignal { result -> Signal in if let result = result { return postbox.transaction { transaction -> Void in - if let pack = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, itemId: FeaturedStickerPackItemId(id.id).rawValue)?.contents as? FeaturedStickerPackItem { + if let pack = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, itemId: FeaturedStickerPackItemId(id.id).rawValue)?.contents.get(FeaturedStickerPackItem.self) { var items = result.items.map({ $0 as? StickerPackItem }).compactMap({ $0 }) if items.count > 5 { items.removeSubrange(5 ..< items.count) } - transaction.updateOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, itemId: FeaturedStickerPackItemId(id.id).rawValue, item: FeaturedStickerPackItem(info: pack.info, topItems: items, unread: pack.unread)) + if let entry = CodableEntry(FeaturedStickerPackItem(info: pack.info, topItems: items, unread: pack.unread)) { + transaction.updateOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks, itemId: FeaturedStickerPackItemId(id.id).rawValue, item: entry) + } } } } else { diff --git a/submodules/TelegramCore/Sources/State/SynchronizeRecentlyUsedMediaOperations.swift b/submodules/TelegramCore/Sources/State/SynchronizeRecentlyUsedMediaOperations.swift index 867364f432..b3b5d74eb4 100644 --- a/submodules/TelegramCore/Sources/State/SynchronizeRecentlyUsedMediaOperations.swift +++ b/submodules/TelegramCore/Sources/State/SynchronizeRecentlyUsedMediaOperations.swift @@ -33,7 +33,9 @@ func addSynchronizeRecentlyUsedMediaOperation(transaction: Transaction, category func addRecentlyUsedSticker(transaction: Transaction, fileReference: FileMediaReference) { if let resource = fileReference.media.resource as? CloudDocumentMediaResource { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(fileReference.media.fileId).rawValue, contents: RecentMediaItem(fileReference.media)), removeTailIfCountExceeds: 20) + if let entry = CodableEntry(RecentMediaItem(fileReference.media)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentStickers, item: OrderedItemListEntry(id: RecentMediaItemId(fileReference.media.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 20) + } addSynchronizeRecentlyUsedMediaOperation(transaction: transaction, category: .stickers, operation: .add(id: resource.fileId, accessHash: resource.accessHash, fileReference: fileReference)) } } diff --git a/submodules/TelegramCore/Sources/State/SynchronizeSavedGifsOperation.swift b/submodules/TelegramCore/Sources/State/SynchronizeSavedGifsOperation.swift index 5d2ea8bd2d..d9dd0f2602 100644 --- a/submodules/TelegramCore/Sources/State/SynchronizeSavedGifsOperation.swift +++ b/submodules/TelegramCore/Sources/State/SynchronizeSavedGifsOperation.swift @@ -33,7 +33,9 @@ public func isGifSaved(transaction: Transaction, mediaId: MediaId) -> Bool { public func addSavedGif(postbox: Postbox, fileReference: FileMediaReference) -> Signal { return postbox.transaction { transaction -> Void in if let resource = fileReference.media.resource as? CloudDocumentMediaResource { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(fileReference.media.fileId).rawValue, contents: RecentMediaItem(fileReference.media)), removeTailIfCountExceeds: 200) + if let entry = CodableEntry(RecentMediaItem(fileReference.media)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, item: OrderedItemListEntry(id: RecentMediaItemId(fileReference.media.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 200) + } addSynchronizeSavedGifsOperation(transaction: transaction, operation: .add(id: resource.fileId, accessHash: resource.accessHash, fileReference: fileReference)) } } @@ -41,8 +43,9 @@ public func addSavedGif(postbox: Postbox, fileReference: FileMediaReference) -> public func removeSavedGif(postbox: Postbox, mediaId: MediaId) -> Signal { return postbox.transaction { transaction -> Void in - if let entry = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, itemId: RecentMediaItemId(mediaId).rawValue), let item = entry.contents as? RecentMediaItem { - if let file = item.media as? TelegramMediaFile, let resource = file.resource as? CloudDocumentMediaResource { + if let entry = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, itemId: RecentMediaItemId(mediaId).rawValue), let item = entry.contents.get(RecentMediaItem.self) { + let file = item.media + if let resource = file.resource as? CloudDocumentMediaResource { transaction.removeOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentGifs, itemId: entry.id) addSynchronizeSavedGifsOperation(transaction: transaction, operation: .remove(id: resource.fileId, accessHash: resource.accessHash)) } diff --git a/submodules/TelegramCore/Sources/State/SynchronizeSavedStickersOperation.swift b/submodules/TelegramCore/Sources/State/SynchronizeSavedStickersOperation.swift index 1bf6f161ef..5cd4ad4144 100644 --- a/submodules/TelegramCore/Sources/State/SynchronizeSavedStickersOperation.swift +++ b/submodules/TelegramCore/Sources/State/SynchronizeSavedStickersOperation.swift @@ -107,13 +107,15 @@ public func addSavedSticker(postbox: Postbox, network: Network, file: TelegramMe public func addSavedSticker(transaction: Transaction, file: TelegramMediaFile, stringRepresentations: [String]) { if let resource = file.resource as? CloudDocumentMediaResource { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: SavedStickerItem(file: file, stringRepresentations: stringRepresentations)), removeTailIfCountExceeds: 5) + if let entry = CodableEntry(SavedStickerItem(file: file, stringRepresentations: stringRepresentations)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, item: OrderedItemListEntry(id: RecentMediaItemId(file.fileId).rawValue, contents: entry), removeTailIfCountExceeds: 5) + } addSynchronizeSavedStickersOperation(transaction: transaction, operation: .add(id: resource.fileId, accessHash: resource.accessHash, fileReference: .standalone(media: file))) } } public func removeSavedSticker(transaction: Transaction, mediaId: MediaId) { - if let entry = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, itemId: RecentMediaItemId(mediaId).rawValue), let item = entry.contents as? SavedStickerItem { + if let entry = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, itemId: RecentMediaItemId(mediaId).rawValue), let item = entry.contents.get(SavedStickerItem.self) { if let resource = item.file.resource as? CloudDocumentMediaResource { transaction.removeOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, itemId: entry.id) addSynchronizeSavedStickersOperation(transaction: transaction, operation: .remove(id: resource.fileId, accessHash: resource.accessHash)) @@ -123,7 +125,7 @@ public func removeSavedSticker(transaction: Transaction, mediaId: MediaId) { public func removeSavedSticker(postbox: Postbox, mediaId: MediaId) -> Signal { return postbox.transaction { transaction in - if let entry = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, itemId: RecentMediaItemId(mediaId).rawValue), let item = entry.contents as? SavedStickerItem { + if let entry = transaction.getOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, itemId: RecentMediaItemId(mediaId).rawValue), let item = entry.contents.get(SavedStickerItem.self) { if let resource = item.file.resource as? CloudDocumentMediaResource { transaction.removeOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudSavedStickers, itemId: entry.id) addSynchronizeSavedStickersOperation(transaction: transaction, operation: .remove(id: resource.fileId, accessHash: resource.accessHash)) diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_ArchivedStickerPacksInfo.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_ArchivedStickerPacksInfo.swift index da13628cac..351efd445d 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_ArchivedStickerPacksInfo.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_ArchivedStickerPacksInfo.swift @@ -1,7 +1,6 @@ import Foundation import Postbox - public struct ArchivedStickerPacksInfoId { public let rawValue: MemoryBuffer public let id: Int32 @@ -22,18 +21,22 @@ public struct ArchivedStickerPacksInfoId { } } -public final class ArchivedStickerPacksInfo: OrderedItemListEntryContents { +public final class ArchivedStickerPacksInfo: Codable { public let count: Int32 init(count: Int32) { self.count = count } - public init(decoder: PostboxDecoder) { - self.count = decoder.decodeInt32ForKey("c", orElse: 0) + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + self.count = try container.decode(Int32.self, forKey: "c") } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeInt32(self.count, forKey: "c") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(self.count, forKey: "c") } } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_FeaturedStickerPack.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_FeaturedStickerPack.swift index 156cd8be14..701b940979 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_FeaturedStickerPack.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_FeaturedStickerPack.swift @@ -21,7 +21,7 @@ public struct FeaturedStickerPackItemId { } } -public final class FeaturedStickerPackItem: OrderedItemListEntryContents { +public final class FeaturedStickerPackItem: Codable { public let info: StickerPackCollectionInfo public let topItems: [StickerPackItem] public let unread: Bool @@ -32,15 +32,27 @@ public final class FeaturedStickerPackItem: OrderedItemListEntryContents { self.unread = unread } - public init(decoder: PostboxDecoder) { - self.info = decoder.decodeObjectForKey("i") as! StickerPackCollectionInfo - self.topItems = decoder.decodeObjectArrayForKey("t") - self.unread = decoder.decodeInt32ForKey("u", orElse: 0) != 0 + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + let infoData = try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "i") + self.info = StickerPackCollectionInfo(decoder: PostboxDecoder(buffer: MemoryBuffer(data: infoData.data))) + + self.topItems = (try container.decode([AdaptedPostboxDecoder.RawObjectData].self, forKey: "t")).map { itemData in + return StickerPackItem(decoder: PostboxDecoder(buffer: MemoryBuffer(data: itemData.data))) + } + + self.unread = try container.decode(Int32.self, forKey: "u") != 0 } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeObject(self.info, forKey: "i") - encoder.encodeObjectArray(self.topItems, forKey: "t") - encoder.encodeInt32(self.unread ? 1 : 0, forKey: "u") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(PostboxEncoder().encodeObjectToRawData(self.info), forKey: "i") + try container.encode(self.topItems.map { item in + return PostboxEncoder().encodeObjectToRawData(item) + }, forKey: "t") + + try container.encode((self.unread ? 1 : 0) as Int32, forKey: "u") } } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentHashtagItem.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentHashtagItem.swift index 1add80d86e..0b427b4e59 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentHashtagItem.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentHashtagItem.swift @@ -1,12 +1,12 @@ import Postbox -public final class RecentHashtagItem: OrderedItemListEntryContents { +public final class RecentHashtagItem: Codable { public init() { } - public init(decoder: PostboxDecoder) { + public init(from decoder: Decoder) throws { } - public func encode(_ encoder: PostboxEncoder) { + public func encode(to encoder: Encoder) throws { } } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentMediaItem.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentMediaItem.swift index 461c41cd7d..74999632b9 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentMediaItem.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentMediaItem.swift @@ -25,19 +25,24 @@ public struct RecentMediaItemId { } } -public final class RecentMediaItem: OrderedItemListEntryContents, Equatable { - public let media: Media +public final class RecentMediaItem: Codable, Equatable { + public let media: TelegramMediaFile - public init(_ media: Media) { + public init(_ media: TelegramMediaFile) { self.media = media } - public init(decoder: PostboxDecoder) { - self.media = decoder.decodeObjectForKey("m") as! Media + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + let mediaData = try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "m") + self.media = TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: mediaData.data))) } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeObject(self.media, forKey: "m") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(PostboxEncoder().encodeObjectToRawData(self.media), forKey: "m") } public static func ==(lhs: RecentMediaItem, rhs: RecentMediaItem) -> Bool { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentPeerItem.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentPeerItem.swift index f7c66347c3..57b4c05528 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentPeerItem.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_RecentPeerItem.swift @@ -21,18 +21,22 @@ public struct RecentPeerItemId { } } -public final class RecentPeerItem: OrderedItemListEntryContents { +public final class RecentPeerItem: Codable { public let rating: Double public init(rating: Double) { self.rating = rating } - public init(decoder: PostboxDecoder) { - self.rating = decoder.decodeDoubleForKey("r", orElse: 0.0) + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + self.rating = try container.decode(Double.self, forKey: "r") } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeDouble(self.rating, forKey: "r") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(self.rating, forKey: "r") } } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_SavedStickerItem.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_SavedStickerItem.swift index b834f409a4..6c5c40ab1f 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_SavedStickerItem.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_SavedStickerItem.swift @@ -1,7 +1,7 @@ import Foundation import Postbox -public final class SavedStickerItem: OrderedItemListEntryContents, Equatable { +public final class SavedStickerItem: Codable, Equatable { public let file: TelegramMediaFile public let stringRepresentations: [String] @@ -10,14 +10,18 @@ public final class SavedStickerItem: OrderedItemListEntryContents, Equatable { self.stringRepresentations = stringRepresentations } - public init(decoder: PostboxDecoder) { - self.file = decoder.decodeObjectForKey("f") as! TelegramMediaFile - self.stringRepresentations = decoder.decodeStringArrayForKey("sr") + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + self.file = TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: (try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "f")).data))) + self.stringRepresentations = try container.decode([String].self, forKey: "sr") } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeObject(self.file, forKey: "f") - encoder.encodeStringArray(self.stringRepresentations, forKey: "sr") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(PostboxEncoder().encodeObjectToRawData(self.file), forKey: "f") + try container.encode(self.stringRepresentations, forKey: "sr") } public static func ==(lhs: SavedStickerItem, rhs: SavedStickerItem) -> Bool { diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaWebpage.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaWebpage.swift index 2e6eba6cbe..538cbefc82 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaWebpage.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramMediaWebpage.swift @@ -56,13 +56,13 @@ public final class TelegraMediaWebpageThemeAttribute: PostboxCoding, Equatable { public init(decoder: PostboxDecoder) { self.files = decoder.decodeObjectArrayForKey("files") - self.settings = decoder.decodeObjectForKey("settings", decoder: { TelegramThemeSettings(decoder: $0) }) as? TelegramThemeSettings + self.settings = decoder.decode(TelegramThemeSettings.self, forKey: "settings") } public func encode(_ encoder: PostboxEncoder) { encoder.encodeObjectArray(self.files, forKey: "files") if let settings = self.settings { - encoder.encodeObject(settings, forKey: "settings") + encoder.encode(settings, forKey: "settings") } else { encoder.encodeNil(forKey: "settings") } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramTheme.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramTheme.swift index 2968b2299c..6a7fc782f6 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramTheme.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramTheme.swift @@ -14,7 +14,7 @@ public extension UInt32 { } } -public final class TelegramThemeSettings: PostboxCoding, Equatable { +public final class TelegramThemeSettings: Codable, Equatable { public static func == (lhs: TelegramThemeSettings, rhs: TelegramThemeSettings) -> Bool { if lhs.baseTheme != rhs.baseTheme { return false @@ -53,43 +53,108 @@ public final class TelegramThemeSettings: PostboxCoding, Equatable { self.wallpaper = wallpaper } - public init(decoder: PostboxDecoder) { - self.baseTheme = TelegramBaseTheme(rawValue: decoder.decodeInt32ForKey("baseTheme", orElse: 0)) ?? .classic - self.accentColor = UInt32(bitPattern: decoder.decodeInt32ForKey("accent", orElse: 0)) - self.outgoingAccentColor = decoder.decodeOptionalInt32ForKey("outgoingAccent").flatMap { UInt32(bitPattern: $0) } - let messageColors = decoder.decodeInt32ArrayForKey("messageColors") + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + self.baseTheme = TelegramBaseTheme(rawValue: try container.decode(Int32.self, forKey: "baseTheme")) ?? .classic + self.accentColor = UInt32(bitPattern: try container.decode(Int32.self, forKey: "accent")) + self.outgoingAccentColor = (try container.decodeIfPresent(Int32.self, forKey: "outgoingAccent")).flatMap { UInt32(bitPattern: $0) } + let messageColors = try container.decode([Int32].self, forKey: "messageColors") if !messageColors.isEmpty { self.messageColors = messageColors.map(UInt32.init(bitPattern:)) } else { - if let topMessageColor = decoder.decodeOptionalInt32ForKey("topMessage"), let bottomMessageColor = decoder.decodeOptionalInt32ForKey("bottomMessage") { + if let topMessageColor = try container.decodeIfPresent(Int32.self, forKey: "topMessage"), let bottomMessageColor = try container.decodeIfPresent(Int32.self, forKey: "bottomMessage") { self.messageColors = [UInt32(bitPattern: topMessageColor), UInt32(bitPattern: bottomMessageColor)] } else { self.messageColors = [] } } - self.animateMessageColors = decoder.decodeInt32ForKey("animateMessageColors", orElse: 0) != 0 - self.wallpaper = decoder.decodeObjectForKey("wallpaper", decoder: { TelegramWallpaper(decoder: $0) }) as? TelegramWallpaper + self.animateMessageColors = try container.decode(Int32.self, forKey: "animateMessageColors") != 0 + + self.wallpaper = (try container.decodeIfPresent(TelegramWallpaperNativeCodable.self, forKey: "wallpaper"))?.value } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeInt32(self.baseTheme.rawValue, forKey: "baseTheme") - encoder.encodeInt32(Int32(bitPattern: self.accentColor), forKey: "accent") + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(self.baseTheme.rawValue, forKey: "baseTheme") + try container.encode(Int32(bitPattern: self.accentColor), forKey: "accent") if let outgoingAccentColor = self.outgoingAccentColor { - encoder.encodeInt32(Int32(bitPattern: outgoingAccentColor), forKey: "outgoingAccent") + try container.encode(Int32(bitPattern: outgoingAccentColor), forKey: "outgoingAccent") } else { - encoder.encodeNil(forKey: "outgoingAccent") - } - encoder.encodeInt32Array(self.messageColors.map(Int32.init(bitPattern:)), forKey: "messageColors") - encoder.encodeInt32(self.animateMessageColors ? 1 : 0, forKey: "animateMessageColors") - if let wallpaper = self.wallpaper { - encoder.encodeObject(wallpaper, forKey: "wallpaper") - } else { - encoder.encodeNil(forKey: "wallpaper") + try container.encodeNil(forKey: "outgoingAccent") } + try container.encode(self.messageColors.map(Int32.init(bitPattern:)), forKey: "messageColors") + try container.encode((self.animateMessageColors ? 1 : 0) as Int32, forKey: "animateMessageColors") + try container.encodeIfPresent(self.wallpaper.flatMap(TelegramWallpaperNativeCodable.init), forKey: "wallpaper") } } -public final class TelegramTheme: OrderedItemListEntryContents, Equatable { +public struct TelegramThemeNativeCodable: Codable { + public let value: TelegramTheme + + public init(_ value: TelegramTheme) { + self.value = value + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + let id = try container.decode(Int64.self, forKey: "id") + let accessHash = try container.decode(Int64.self, forKey: "accessHash") + let slug = try container.decode(String.self, forKey: "slug") + let title = try container.decode(String.self, forKey: "title") + + let file: TelegramMediaFile? + if let fileData = try container.decodeIfPresent(AdaptedPostboxDecoder.RawObjectData.self, forKey: "file") { + file = TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: fileData.data))) + } else { + file = nil + } + + let settings = try container.decodeIfPresent(TelegramThemeSettings.self, forKey: "settings") + + let isCreator = try container.decode(Int32.self, forKey: "isCreator") != 0 + let isDefault = try container.decode(Int32.self, forKey: "isDefault") != 0 + let installCount = try container.decodeIfPresent(Int32.self, forKey: "installCount") + + self.value = TelegramTheme( + id: id, + accessHash: accessHash, + slug: slug, + title: title, + file: file, + settings: settings, + isCreator: isCreator, + isDefault: isDefault, + installCount: installCount + ) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode(self.value.id, forKey: "id") + try container.encode(self.value.accessHash, forKey: "accessHash") + try container.encode(self.value.slug, forKey: "slug") + try container.encode(self.value.title, forKey: "title") + + if let file = self.value.file { + try container.encode(PostboxEncoder().encodeObjectToRawData(file), forKey: "file") + } else { + try container.encodeNil(forKey: "file") + } + + try container.encodeIfPresent(self.value.settings, forKey: "settings") + + try container.encode((self.value.isCreator ? 1 : 0) as Int32, forKey: "isCreator") + try container.encode((self.value.isDefault ? 1 : 0) as Int32, forKey: "isDefault") + + try container.encodeIfPresent(self.value.installCount, forKey: "installCount") + } +} + +public final class TelegramTheme: Equatable { public let id: Int64 public let accessHash: Int64 public let slug: String @@ -112,42 +177,6 @@ public final class TelegramTheme: OrderedItemListEntryContents, Equatable { self.installCount = installCount } - public init(decoder: PostboxDecoder) { - self.id = decoder.decodeInt64ForKey("id", orElse: 0) - self.accessHash = decoder.decodeInt64ForKey("accessHash", orElse: 0) - self.slug = decoder.decodeStringForKey("slug", orElse: "") - self.title = decoder.decodeStringForKey("title", orElse: "") - self.file = decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as? TelegramMediaFile - self.settings = decoder.decodeObjectForKey("settings", decoder: { TelegramThemeSettings(decoder: $0) }) as? TelegramThemeSettings - self.isCreator = decoder.decodeInt32ForKey("isCreator", orElse: 0) != 0 - self.isDefault = decoder.decodeInt32ForKey("isDefault", orElse: 0) != 0 - self.installCount = decoder.decodeOptionalInt32ForKey("installCount") - } - - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeInt64(self.id, forKey: "id") - encoder.encodeInt64(self.accessHash, forKey: "accessHash") - encoder.encodeString(self.slug, forKey: "slug") - encoder.encodeString(self.title, forKey: "title") - if let file = self.file { - encoder.encodeObject(file, forKey: "file") - } else { - encoder.encodeNil(forKey: "file") - } - if let settings = self.settings { - encoder.encodeObject(settings, forKey: "settings") - } else { - encoder.encodeNil(forKey: "settings") - } - encoder.encodeInt32(self.isCreator ? 1 : 0, forKey: "isCreator") - encoder.encodeInt32(self.isDefault ? 1 : 0, forKey: "isDefault") - if let installCount = self.installCount { - encoder.encodeInt32(installCount, forKey: "installCount") - } else { - encoder.encodeNil(forKey: "installCount") - } - } - public static func ==(lhs: TelegramTheme, rhs: TelegramTheme) -> Bool { if lhs.id != rhs.id { return false diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramWallpaper.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramWallpaper.swift index 05e7b0224d..3645af6204 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramWallpaper.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_TelegramWallpaper.swift @@ -1,6 +1,6 @@ import Postbox -public struct WallpaperSettings: PostboxCoding, Equatable { +public struct WallpaperSettings: Codable, Equatable { public var blur: Bool public var motion: Bool public var colors: [UInt32] @@ -15,37 +15,33 @@ public struct WallpaperSettings: PostboxCoding, Equatable { self.rotation = rotation } - public init(decoder: PostboxDecoder) { - self.blur = decoder.decodeInt32ForKey("b", orElse: 0) != 0 - self.motion = decoder.decodeInt32ForKey("m", orElse: 0) != 0 - if let topColor = decoder.decodeOptionalInt32ForKey("c").flatMap(UInt32.init(bitPattern:)) { + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + self.blur = try container.decode(Int32.self, forKey: "b") != 0 + self.motion = try container.decode(Int32.self, forKey: "m") != 0 + if let topColor = (try container.decodeIfPresent(Int32.self, forKey: "c")).flatMap(UInt32.init(bitPattern:)) { var colors: [UInt32] = [topColor] - if let bottomColor = decoder.decodeOptionalInt32ForKey("bc").flatMap(UInt32.init(bitPattern:)) { + if let bottomColor = (try container.decodeIfPresent(Int32.self, forKey: "bc")).flatMap(UInt32.init(bitPattern:)) { colors.append(bottomColor) } self.colors = colors } else { - self.colors = decoder.decodeInt32ArrayForKey("colors").map(UInt32.init(bitPattern:)) + self.colors = (try container.decode([Int32].self, forKey: "colors")).map(UInt32.init(bitPattern:)) } - self.intensity = decoder.decodeOptionalInt32ForKey("i") - self.rotation = decoder.decodeOptionalInt32ForKey("r") + self.intensity = try container.decodeIfPresent(Int32.self, forKey: "i") + self.rotation = try container.decodeIfPresent(Int32.self, forKey: "r") } - public func encode(_ encoder: PostboxEncoder) { - encoder.encodeInt32(self.blur ? 1 : 0, forKey: "b") - encoder.encodeInt32(self.motion ? 1 : 0, forKey: "m") - encoder.encodeInt32Array(self.colors.map(Int32.init(bitPattern:)), forKey: "colors") - if let intensity = self.intensity { - encoder.encodeInt32(intensity, forKey: "i") - } else { - encoder.encodeNil(forKey: "i") - } - if let rotation = self.rotation { - encoder.encodeInt32(rotation, forKey: "r") - } else { - encoder.encodeNil(forKey: "r") - } + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + try container.encode((self.blur ? 1 : 0) as Int32, forKey: "b") + try container.encode((self.motion ? 1 : 0) as Int32, forKey: "m") + try container.encode(self.colors.map(Int32.init(bitPattern:)), forKey: "colors") + try container.encodeIfPresent(self.intensity, forKey: "i") + try container.encodeIfPresent(self.rotation, forKey: "r") } public static func ==(lhs: WallpaperSettings, rhs: WallpaperSettings) -> Bool { @@ -68,7 +64,108 @@ public struct WallpaperSettings: PostboxCoding, Equatable { } } -public enum TelegramWallpaper: OrderedItemListEntryContents, Equatable { +public struct TelegramWallpaperNativeCodable: Codable { + public let value: TelegramWallpaper + + public init(_ value: TelegramWallpaper) { + self.value = value + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: StringCodingKey.self) + + switch try container.decode(Int32.self, forKey: "v") { + case 0: + let settings = try container.decode(WallpaperSettings.self, forKey: "settings") + self.value = .builtin(settings) + case 1: + self.value = .color(UInt32(bitPattern: try container.decode(Int32.self, forKey: "c"))) + case 2: + let settings = try container.decode(WallpaperSettings.self, forKey: "settings") + let representations = (try container.decode([AdaptedPostboxDecoder.RawObjectData].self, forKey: "i")).map { itemData in + return TelegramMediaImageRepresentation(decoder: PostboxDecoder(buffer: MemoryBuffer(data: itemData.data))) + } + self.value = .image(representations, settings) + case 3: + let settings = try container.decode(WallpaperSettings.self, forKey: "settings") + if let fileData = try container.decodeIfPresent(AdaptedPostboxDecoder.RawObjectData.self, forKey: "file") { + let file = TelegramMediaFile(decoder: PostboxDecoder(buffer: MemoryBuffer(data: fileData.data))) + self.value = .file(TelegramWallpaper.File( + id: try container.decode(Int64.self, forKey: "id"), + accessHash: try container.decode(Int64.self, forKey: "accessHash"), + isCreator: try container.decode(Int32.self, forKey: "isCreator") != 0, + isDefault: try container.decode(Int32.self, forKey: "isDefault") != 0, + isPattern: try container.decode(Int32.self, forKey: "isPattern") != 0, + isDark: try container.decode(Int32.self, forKey: "isDark") != 0, + slug: try container.decode(String.self, forKey: "slug"), + file: file, + settings: settings + )) + } else { + self.value = .color(0xffffff) + } + case 4: + let settings = try container.decode(WallpaperSettings.self, forKey: "settings") + + var colors: [UInt32] = [] + + if let topColor = (try container.decodeIfPresent(Int32.self, forKey: "c1")).flatMap(UInt32.init(bitPattern:)) { + colors.append(topColor) + if let bottomColor = (try container.decodeIfPresent(Int32.self, forKey: "c2")).flatMap(UInt32.init(bitPattern:)) { + colors.append(bottomColor) + } + } else { + colors = (try container.decode([Int32].self, forKey: "colors")).map(UInt32.init(bitPattern:)) + } + + self.value = .gradient(TelegramWallpaper.Gradient( + id: try container.decodeIfPresent(Int64.self, forKey: "id"), + colors: colors, + settings: settings + )) + default: + assertionFailure() + self.value = .color(0xffffff) + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: StringCodingKey.self) + + switch self.value { + case let .builtin(settings): + try container.encode(0 as Int32, forKey: "v") + try container.encode(settings, forKey: "settings") + case let .color(color): + try container.encode(1 as Int32, forKey: "v") + try container.encode(Int32(bitPattern: color), forKey: "c") + case let .gradient(gradient): + try container.encode(4 as Int32, forKey: "v") + try container.encodeIfPresent(gradient.id, forKey: "id") + try container.encode(gradient.colors.map(Int32.init(bitPattern:)), forKey: "colors") + try container.encode(gradient.settings, forKey: "settings") + case let .image(representations, settings): + try container.encode(2 as Int32, forKey: "v") + try container.encode(representations.map { item in + return PostboxEncoder().encodeObjectToRawData(item) + }, forKey: "i") + try container.encode(settings, forKey: "settings") + case let .file(file): + try container.encode(3 as Int32, forKey: "v") + try container.encode(file.id, forKey: "id") + try container.encode(file.accessHash, forKey: "accessHash") + try container.encode((file.isCreator ? 1 : 0) as Int32, forKey: "isCreator") + try container.encode((file.isDefault ? 1 : 0) as Int32, forKey: "isDefault") + try container.encode((file.isPattern ? 1 : 0) as Int32, forKey: "isPattern") + try container.encode((file.isDark ? 1 : 0) as Int32, forKey: "isDark") + try container.encode(file.slug, forKey: "slug") + try container.encode(PostboxEncoder().encodeObjectToRawData(file.file), forKey: "file") + try container.encode(file.settings, forKey: "settings") + } + } +} + +public enum TelegramWallpaper: Equatable { public struct Gradient: Equatable { public var id: Int64? public var colors: [UInt32] @@ -125,44 +222,6 @@ public enum TelegramWallpaper: OrderedItemListEntryContents, Equatable { case image([TelegramMediaImageRepresentation], WallpaperSettings) case file(File) - public init(decoder: PostboxDecoder) { - switch decoder.decodeInt32ForKey("v", orElse: 0) { - case 0: - let settings = decoder.decodeObjectForKey("settings", decoder: { WallpaperSettings(decoder: $0) }) as? WallpaperSettings ?? WallpaperSettings() - self = .builtin(settings) - case 1: - self = .color(UInt32(bitPattern: decoder.decodeInt32ForKey("c", orElse: 0))) - case 2: - let settings = decoder.decodeObjectForKey("settings", decoder: { WallpaperSettings(decoder: $0) }) as? WallpaperSettings ?? WallpaperSettings() - self = .image(decoder.decodeObjectArrayWithDecoderForKey("i"), settings) - case 3: - let settings = decoder.decodeObjectForKey("settings", decoder: { WallpaperSettings(decoder: $0) }) as? WallpaperSettings ?? WallpaperSettings() - if let file = decoder.decodeObjectForKey("file", decoder: { TelegramMediaFile(decoder: $0) }) as? TelegramMediaFile { - self = .file(File(id: decoder.decodeInt64ForKey("id", orElse: 0), accessHash: decoder.decodeInt64ForKey("accessHash", orElse: 0), isCreator: decoder.decodeInt32ForKey("isCreator", orElse: 0) != 0, isDefault: decoder.decodeInt32ForKey("isDefault", orElse: 0) != 0, isPattern: decoder.decodeInt32ForKey("isPattern", orElse: 0) != 0, isDark: decoder.decodeInt32ForKey("isDark", orElse: 0) != 0, slug: decoder.decodeStringForKey("slug", orElse: ""), file: file, settings: settings)) - } else { - self = .color(0xffffff) - } - case 4: - let settings = decoder.decodeObjectForKey("settings", decoder: { WallpaperSettings(decoder: $0) }) as? WallpaperSettings ?? WallpaperSettings() - - var colors: [UInt32] = [] - - if let topColor = decoder.decodeOptionalInt32ForKey("c1").flatMap(UInt32.init(bitPattern:)) { - colors.append(topColor) - if let bottomColor = decoder.decodeOptionalInt32ForKey("c2").flatMap(UInt32.init(bitPattern:)) { - colors.append(bottomColor) - } - } else { - colors = decoder.decodeInt32ArrayForKey("colors").map(UInt32.init(bitPattern:)) - } - - self = .gradient(Gradient(id: decoder.decodeOptionalInt64ForKey("id"), colors: colors, settings: settings)) - default: - assertionFailure() - self = .color(0xffffff) - } - } - public var hasWallpaper: Bool { switch self { case .color: @@ -172,41 +231,6 @@ public enum TelegramWallpaper: OrderedItemListEntryContents, Equatable { } } - public func encode(_ encoder: PostboxEncoder) { - switch self { - case let .builtin(settings): - encoder.encodeInt32(0, forKey: "v") - encoder.encodeObject(settings, forKey: "settings") - case let .color(color): - encoder.encodeInt32(1, forKey: "v") - encoder.encodeInt32(Int32(bitPattern: color), forKey: "c") - case let .gradient(gradient): - encoder.encodeInt32(4, forKey: "v") - if let id = gradient.id { - encoder.encodeInt64(id, forKey: "id") - } else { - encoder.encodeNil(forKey: "id") - } - encoder.encodeInt32Array(gradient.colors.map(Int32.init(bitPattern:)), forKey: "colors") - encoder.encodeObject(gradient.settings, forKey: "settings") - case let .image(representations, settings): - encoder.encodeInt32(2, forKey: "v") - encoder.encodeObjectArray(representations, forKey: "i") - encoder.encodeObject(settings, forKey: "settings") - case let .file(file): - encoder.encodeInt32(3, forKey: "v") - encoder.encodeInt64(file.id, forKey: "id") - encoder.encodeInt64(file.accessHash, forKey: "accessHash") - encoder.encodeInt32(file.isCreator ? 1 : 0, forKey: "isCreator") - encoder.encodeInt32(file.isDefault ? 1 : 0, forKey: "isDefault") - encoder.encodeInt32(file.isPattern ? 1 : 0, forKey: "isPattern") - encoder.encodeInt32(file.isDark ? 1 : 0, forKey: "isDark") - encoder.encodeString(file.slug, forKey: "slug") - encoder.encodeObject(file.file, forKey: "file") - encoder.encodeObject(file.settings, forKey: "settings") - } - } - public static func ==(lhs: TelegramWallpaper, rhs: TelegramWallpaper) -> Bool { switch lhs { case let .builtin(settings): diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_ThemeSettings.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_ThemeSettings.swift index 9a28cee8bd..b213c8e88b 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_ThemeSettings.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_ThemeSettings.swift @@ -10,19 +10,14 @@ public final class ThemeSettings: Codable, Equatable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: StringCodingKey.self) - if let currentThemeData = try container.decodeIfPresent(AdaptedPostboxDecoder.RawObjectData.self, forKey: "t") { - self.currentTheme = TelegramTheme(decoder: PostboxDecoder(buffer: MemoryBuffer(data: currentThemeData.data))) - } else { - self.currentTheme = nil - } + self.currentTheme = (try container.decodeIfPresent(TelegramThemeNativeCodable.self, forKey: "t"))?.value } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: StringCodingKey.self) if let currentTheme = self.currentTheme { - let currentThemeData = PostboxEncoder().encodeObjectToRawData(currentTheme) - try container.encode(currentThemeData, forKey: "t") + try container.encode(TelegramThemeNativeCodable(currentTheme), forKey: "t") } else { try container.encodeNil(forKey: "t") } diff --git a/submodules/TelegramCore/Sources/SyncCore/SyncCore_wallapersState.swift b/submodules/TelegramCore/Sources/SyncCore/SyncCore_wallapersState.swift index 8e44e097ca..bd2a589bd5 100644 --- a/submodules/TelegramCore/Sources/SyncCore/SyncCore_wallapersState.swift +++ b/submodules/TelegramCore/Sources/SyncCore/SyncCore_wallapersState.swift @@ -18,7 +18,7 @@ public struct WallpapersState: Codable, Equatable { let wallpapersData = try container.decode([Data].self, forKey: "wallpapers") self.wallpapers = wallpapersData.map { data in - return TelegramWallpaper(decoder: PostboxDecoder(buffer: MemoryBuffer(data: data))) + return (try! AdaptedPostboxDecoder().decode(TelegramWallpaperNativeCodable.self, from: data)).value } } @@ -26,9 +26,7 @@ public struct WallpapersState: Codable, Equatable { var container = encoder.container(keyedBy: StringCodingKey.self) let wallpapersData: [Data] = self.wallpapers.map { wallpaper in - let innerEncoder = PostboxEncoder() - wallpaper.encode(innerEncoder) - return innerEncoder.makeData() + return try! AdaptedPostboxEncoder().encode(TelegramWallpaperNativeCodable(wallpaper)) } try container.encode(wallpapersData, forKey: "wallpapers") diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Messages/RecentlyUsedHashtags.swift b/submodules/TelegramCore/Sources/TelegramEngine/Messages/RecentlyUsedHashtags.swift index 4588580322..5455c81eaf 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Messages/RecentlyUsedHashtags.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Messages/RecentlyUsedHashtags.swift @@ -25,7 +25,9 @@ private struct RecentHashtagItemId { func addRecentlyUsedHashtag(transaction: Transaction, string: String) { if let itemId = RecentHashtagItemId(string) { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.RecentlyUsedHashtags, item: OrderedItemListEntry(id: itemId.rawValue, contents: RecentHashtagItem()), removeTailIfCountExceeds: 100) + if let entry = CodableEntry(RecentHashtagItem()) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.RecentlyUsedHashtags, item: OrderedItemListEntry(id: itemId.rawValue, contents: entry), removeTailIfCountExceeds: 100) + } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentPeers.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentPeers.swift index e5ccd9eaf3..d595bae9a2 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentPeers.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentPeers.swift @@ -204,8 +204,12 @@ func _internal_managedRecentlyUsedInlineBots(postbox: Postbox, network: Network, let sortedPeersWithRating = peersWithRating.sorted(by: { $0.1 > $1.1 }) - transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudRecentInlineBots, items: sortedPeersWithRating.map { (peerId, rating) in - return OrderedItemListEntry(id: RecentPeerItemId(peerId).rawValue, contents: RecentPeerItem(rating: rating)) + transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudRecentInlineBots, items: sortedPeersWithRating.compactMap { (peerId, rating) in + if let entry = CodableEntry(RecentPeerItem(rating: rating)) { + return OrderedItemListEntry(id: RecentPeerItemId(peerId).rawValue, contents: entry) + } else { + return nil + } }) } } else { @@ -220,11 +224,13 @@ func _internal_addRecentlyUsedInlineBot(postbox: Postbox, peerId: PeerId) -> Sig return postbox.transaction { transaction -> Void in var maxRating = 1.0 for entry in transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudRecentInlineBots) { - if let contents = entry.contents as? RecentPeerItem { + if let contents = entry.contents.get(RecentPeerItem.self) { maxRating = max(maxRating, contents.rating) } } - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentInlineBots, item: OrderedItemListEntry(id: RecentPeerItemId(peerId).rawValue, contents: RecentPeerItem(rating: maxRating)), removeTailIfCountExceeds: 20) + if let entry = CodableEntry(RecentPeerItem(rating: maxRating)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.CloudRecentInlineBots, item: OrderedItemListEntry(id: RecentPeerItemId(peerId).rawValue, contents: entry), removeTailIfCountExceeds: 20) + } } } @@ -237,7 +243,7 @@ func _internal_recentlyUsedInlineBots(postbox: Postbox) -> Signal<[(Peer, Double if let view = view.views[.orderedItemList(id: Namespaces.OrderedItemList.CloudRecentInlineBots)] as? OrderedItemListView { for item in view.items { let peerId = RecentPeerItemId(item.id).peerId - if let peer = transaction.getPeer(peerId), let contents = item.contents as? RecentPeerItem { + if let peer = transaction.getPeer(peerId), let contents = item.contents.get(RecentPeerItem.self) { peers.append((peer, contents.rating)) } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentlySearchedPeerIds.swift b/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentlySearchedPeerIds.swift index 21dcd8b3f5..a3e7e1ff4e 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentlySearchedPeerIds.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Peers/RecentlySearchedPeerIds.swift @@ -5,7 +5,9 @@ import SwiftSignalKit func _internal_addRecentlySearchedPeer(postbox: Postbox, peerId: PeerId) -> Signal { return postbox.transaction { transaction -> Void in - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.RecentlySearchedPeerIds, item: OrderedItemListEntry(id: RecentPeerItemId(peerId).rawValue, contents: RecentPeerItem(rating: 0.0)), removeTailIfCountExceeds: 20) + if let entry = CodableEntry(RecentPeerItem(rating: 0.0)) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: Namespaces.OrderedItemList.RecentlySearchedPeerIds, item: OrderedItemListEntry(id: RecentPeerItemId(peerId).rawValue, contents: entry), removeTailIfCountExceeds: 20) + } } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Stickers/SearchStickers.swift b/submodules/TelegramCore/Sources/TelegramEngine/Stickers/SearchStickers.swift index 04e39fc56d..21449c8dbc 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Stickers/SearchStickers.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Stickers/SearchStickers.swift @@ -71,7 +71,8 @@ func _internal_randomGreetingSticker(account: Account) -> Signal take(1) |> map { items -> FoundStickerItem? in - if let randomItem = items?.randomElement(), let item = randomItem.contents as? RecentMediaItem, let file = item.media as? TelegramMediaFile { + if let randomItem = items?.randomElement(), let item = randomItem.contents.get(RecentMediaItem.self) { + let file = item.media return FoundStickerItem(file: file, stringRepresentations: []) } return nil @@ -90,7 +91,7 @@ func _internal_searchStickers(account: Account, query: String, scope: SearchStic var result: [FoundStickerItem] = [] if scope.contains(.installed) { for entry in transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudSavedStickers) { - if let item = entry.contents as? SavedStickerItem { + if let item = entry.contents.get(SavedStickerItem.self) { for representation in item.stringRepresentations { if representation.hasPrefix(query) { result.append(FoundStickerItem(file: item.file, stringRepresentations: item.stringRepresentations)) @@ -107,7 +108,9 @@ func _internal_searchStickers(account: Account, query: String, scope: SearchStic var matchingRecentItemsIds = Set() for entry in transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudRecentStickers) { - if let item = entry.contents as? RecentMediaItem, let file = item.media as? TelegramMediaFile { + if let item = entry.contents.get(RecentMediaItem.self) { + let file = item.media + if !currentItems.contains(file.fileId) { for case let .Sticker(displayText, _, _) in file.attributes { if displayText.hasPrefix(query) { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Stickers/StickerPackInteractiveOperations.swift b/submodules/TelegramCore/Sources/TelegramEngine/Stickers/StickerPackInteractiveOperations.swift index b1e1143232..4c40991bdd 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Stickers/StickerPackInteractiveOperations.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Stickers/StickerPackInteractiveOperations.swift @@ -98,10 +98,12 @@ func _internal_markFeaturedStickerPacksAsSeenInteractively(postbox: Postbox, ids var items = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudFeaturedStickerPacks) var readIds = Set() for i in 0 ..< items.count { - let item = (items[i].contents as! FeaturedStickerPackItem) + let item = items[i].contents.get(FeaturedStickerPackItem.self)! if item.unread && idsSet.contains(item.info.id) { readIds.insert(item.info.id) - items[i] = OrderedItemListEntry(id: items[i].id, contents: FeaturedStickerPackItem(info: item.info, topItems: item.topItems, unread: false)) + if let entry = CodableEntry(FeaturedStickerPackItem(info: item.info, topItems: item.topItems, unread: false)) { + items[i] = OrderedItemListEntry(id: items[i].id, contents: entry) + } } } if !readIds.isEmpty { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift b/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift index 84d65e7462..13bea9442f 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Themes/ChatThemes.swift @@ -23,19 +23,16 @@ public struct ChatTheme: Codable, Equatable { self.emoji = try container.decode(String.self, forKey: "e") - let themeData = try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "t") - self.theme = TelegramTheme(decoder: PostboxDecoder(buffer: MemoryBuffer(data: themeData.data))) - - let darkThemeData = try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "dt") - self.darkTheme = TelegramTheme(decoder: PostboxDecoder(buffer: MemoryBuffer(data: darkThemeData.data))) + self.theme = (try container.decode(TelegramThemeNativeCodable.self, forKey: "t")).value + self.darkTheme = (try container.decode(TelegramThemeNativeCodable.self, forKey: "dt")).value } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: StringCodingKey.self) try container.encode(self.emoji, forKey: "e") - try container.encode(PostboxEncoder().encodeObjectToRawData(self.theme), forKey: "t") - try container.encode(PostboxEncoder().encodeObjectToRawData(self.darkTheme), forKey: "dt") + try container.encode(TelegramThemeNativeCodable(self.theme), forKey: "t") + try container.encode(TelegramThemeNativeCodable(self.darkTheme), forKey: "dt") } } diff --git a/submodules/TelegramCore/Sources/Themes.swift b/submodules/TelegramCore/Sources/Themes.swift index 5bed3c4841..92fef899b2 100644 --- a/submodules/TelegramCore/Sources/Themes.swift +++ b/submodules/TelegramCore/Sources/Themes.swift @@ -49,7 +49,9 @@ public func telegramThemes(postbox: Postbox, network: Network, accountManager: A for item in items { var intValue = Int32(entries.count) let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) - entries.append(OrderedItemListEntry(id: id, contents: item)) + if let entry = CodableEntry(TelegramThemeNativeCodable(item)) { + entries.append(OrderedItemListEntry(id: id, contents: entry)) + } } transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: entries) if let entry = CodableEntry(CachedThemesConfiguration(hash: hash)) { @@ -61,7 +63,7 @@ public func telegramThemes(postbox: Postbox, network: Network, accountManager: A postbox.combinedView(keys: [PostboxViewKey.orderedItemList(id: Namespaces.OrderedItemList.CloudThemes)]) |> map { view -> [TelegramTheme] in if let view = view.views[.orderedItemList(id: Namespaces.OrderedItemList.CloudThemes)] as? OrderedItemListView { - return view.items.compactMap { $0.contents as? TelegramTheme } + return view.items.compactMap { $0.contents.get(TelegramThemeNativeCodable.self)?.value } } else { return [] } @@ -75,7 +77,7 @@ public func telegramThemes(postbox: Postbox, network: Network, accountManager: A return postbox.transaction { transaction -> ([TelegramTheme], Int64?) in let configuration = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedThemesConfiguration, key: ValueBoxKey(length: 0)))?.get(CachedThemesConfiguration.self) let items = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) - return (items.map { $0.contents as! TelegramTheme }, configuration?.hash) + return (items.compactMap { $0.contents.get(TelegramThemeNativeCodable.self)?.value }, configuration?.hash) } |> mapToSignal { current, hash -> Signal<[TelegramTheme], NoError> in return .single(current) @@ -126,7 +128,7 @@ private func checkThemeUpdated(network: Network, theme: TelegramTheme) -> Signal private func saveUnsaveTheme(account: Account, accountManager: AccountManager, theme: TelegramTheme, unsave: Bool) -> Signal { return account.postbox.transaction { transaction -> Signal in let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) - var items = entries.map { $0.contents as! TelegramTheme } + var items = entries.compactMap { $0.contents.get(TelegramThemeNativeCodable.self)?.value } items = items.filter { $0.id != theme.id } if !unsave { items.insert(theme, at: 0) @@ -135,7 +137,9 @@ private func saveUnsaveTheme(account: Account, accountManager: AccountManager CreateThemeResult in let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) - var items = entries.map { $0.contents as! TelegramTheme } + var items = entries.compactMap { $0.contents.get(TelegramThemeNativeCodable.self)?.value } items.insert(theme, at: 0) var updatedEntries: [OrderedItemListEntry] = [] for item in items { var intValue = Int32(updatedEntries.count) let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) - updatedEntries.append(OrderedItemListEntry(id: id, contents: item)) + if let entry = CodableEntry(TelegramThemeNativeCodable(item)) { + updatedEntries.append(OrderedItemListEntry(id: id, contents: entry)) + } } transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) return .result(theme) @@ -343,13 +349,15 @@ public func createTheme(account: Account, title: String, resource: MediaResource return account.postbox.transaction { transaction -> CreateThemeResult in let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) - var items = entries.map { $0.contents as! TelegramTheme } + var items = entries.compactMap { $0.contents.get(TelegramThemeNativeCodable.self)?.value } items.insert(theme, at: 0) var updatedEntries: [OrderedItemListEntry] = [] for item in items { var intValue = Int32(updatedEntries.count) let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) - updatedEntries.append(OrderedItemListEntry(id: id, contents: item)) + if let entry = CodableEntry(TelegramThemeNativeCodable(item)) { + updatedEntries.append(OrderedItemListEntry(id: id, contents: entry)) + } } transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudThemes, items: updatedEntries) return .result(theme) @@ -431,7 +439,7 @@ public func updateTheme(account: Account, accountManager: AccountManager CreateThemeResult in let entries = transaction.getOrderedListItems(collectionId: Namespaces.OrderedItemList.CloudThemes) let items = entries.map { entry -> TelegramTheme in - let theme = entry.contents as! TelegramTheme + let theme = entry.contents.get(TelegramThemeNativeCodable.self)!.value if theme.id == updatedTheme.id { return updatedTheme } else { @@ -442,7 +450,9 @@ public func updateTheme(account: Account, accountManager: AccountManager TelegramTheme in - let theme = entry.contents as! TelegramTheme + let theme = entry.contents.get(TelegramThemeNativeCodable.self)!.value if theme.id == updatedTheme.id { return updatedTheme } else { @@ -512,7 +522,9 @@ func managedThemesUpdates(accountManager: AccountManager map { view -> [TelegramTheme] in if let view = view.views[.orderedItemList(id: Namespaces.OrderedItemList.CloudThemes)] as? OrderedItemListView { - return view.items.compactMap { $0.contents as? TelegramTheme } + return view.items.compactMap { $0.contents.get(TelegramThemeNativeCodable.self)?.value } } else { return [] } diff --git a/submodules/TelegramCore/Sources/Wallpapers.swift b/submodules/TelegramCore/Sources/Wallpapers.swift index 891b43380f..8deb15b1e3 100644 --- a/submodules/TelegramCore/Sources/Wallpapers.swift +++ b/submodules/TelegramCore/Sources/Wallpapers.swift @@ -43,7 +43,9 @@ public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: for item in items { var intValue = Int32(entries.count) let id = MemoryBuffer(data: Data(bytes: &intValue, count: 4)) - entries.append(OrderedItemListEntry(id: id, contents: item)) + if let entry = CodableEntry(TelegramWallpaperNativeCodable(item)) { + entries.append(OrderedItemListEntry(id: id, contents: entry)) + } } transaction.replaceOrderedItemListItems(collectionId: Namespaces.OrderedItemList.CloudWallpapers, items: entries) if let entry = CodableEntry(CachedWallpapersConfiguration(hash: hash)) { @@ -63,7 +65,7 @@ public func telegramWallpapers(postbox: Postbox, network: Network, forceUpdate: if items.count == 0 { return ([.builtin(WallpaperSettings())], 0) } else { - return (items.map { $0.contents as! TelegramWallpaper }, configuration?.hash) + return (items.map { $0.contents.get(TelegramWallpaperNativeCodable.self)!.value }, configuration?.hash) } } |> mapToSignal { current, hash -> Signal<[TelegramWallpaper], NoError> in diff --git a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift index 6af0656c74..e5f27ae7d9 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationThemeCodable.swift @@ -64,18 +64,24 @@ private func encodeColorList(_ values: inout KeyedEncodingContainer, _ try values.encode(stringList, forKey: key) } -extension TelegramWallpaper: Codable { - public init(from decoder: Decoder) throws { +struct TelegramWallpaperStandardizedCodable: Codable { + let value: TelegramWallpaper + + init(_ value: TelegramWallpaper) { + self.value = value + } + + init(from decoder: Decoder) throws { let values = try decoder.singleValueContainer() if let value = try? values.decode(String.self) { switch value.lowercased() { case "builtin": - self = .builtin(WallpaperSettings()) + self.value = .builtin(WallpaperSettings()) default: let optionKeys = ["motion", "blur"] if [6, 8].contains(value.count), let color = UIColor(hexString: value) { - self = .color(color.argb) + self.value = .color(color.argb) } else { let components = value.components(separatedBy: " ") var blur = false @@ -117,9 +123,9 @@ extension TelegramWallpaper: Codable { } if let slug = slug { - self = .file(TelegramWallpaper.File(id: 0, accessHash: 0, isCreator: false, isDefault: false, isPattern: !colors.isEmpty, isDark: false, slug: slug, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: WallpaperDataResource(slug: slug), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(blur: blur, motion: motion, colors: colors.map { $0.argb }, intensity: intensity, rotation: rotation))) + self.value = .file(TelegramWallpaper.File(id: 0, accessHash: 0, isCreator: false, isDefault: false, isPattern: !colors.isEmpty, isDark: false, slug: slug, file: TelegramMediaFile(fileId: MediaId(namespace: 0, id: 0), partialReference: nil, resource: WallpaperDataResource(slug: slug), previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: "", size: nil, attributes: []), settings: WallpaperSettings(blur: blur, motion: motion, colors: colors.map { $0.argb }, intensity: intensity, rotation: rotation))) } else if colors.count > 1 { - self = .gradient(TelegramWallpaper.Gradient(id: nil, colors: colors.map { $0.argb }, settings: WallpaperSettings(blur: blur, motion: motion, rotation: rotation))) + self.value = .gradient(TelegramWallpaper.Gradient(id: nil, colors: colors.map { $0.argb }, settings: WallpaperSettings(blur: blur, motion: motion, rotation: rotation))) } else { throw PresentationThemeDecodingError.generic } @@ -130,9 +136,9 @@ extension TelegramWallpaper: Codable { } } - public func encode(to encoder: Encoder) throws { + func encode(to encoder: Encoder) throws { var container = encoder.singleValueContainer() - switch self { + switch self.value { case .builtin: try container.encode("builtin") case let .color(color): @@ -155,7 +161,7 @@ extension TelegramWallpaper: Codable { case let .file(file): var components: [String] = [] components.append(file.slug) - if self.isPattern { + if self.value.isPattern { if file.settings.colors.count >= 1 { components.append(String(format: "%06x", file.settings.colors[0])) } @@ -1659,7 +1665,7 @@ extension PresentationThemeChat: Codable { public convenience init(from decoder: Decoder) throws { let values = try decoder.container(keyedBy: CodingKeys.self) - var wallpaper = try values.decode(TelegramWallpaper.self, forKey: .defaultWallpaper) + var wallpaper = (try values.decode(TelegramWallpaperStandardizedCodable.self, forKey: .defaultWallpaper)).value if let decoder = decoder as? PresentationThemeDecoding { if case .file = wallpaper, let resolvedWallpaper = decoder.resolvedWallpaper { wallpaper = resolvedWallpaper @@ -1678,7 +1684,7 @@ extension PresentationThemeChat: Codable { public func encode(to encoder: Encoder) throws { var values = encoder.container(keyedBy: CodingKeys.self) - try values.encode(self.defaultWallpaper, forKey: .defaultWallpaper) + try values.encode(TelegramWallpaperStandardizedCodable(self.defaultWallpaper), forKey: .defaultWallpaper) try values.encode(self.animateMessageColors, forKey: .animateMessageColors) try values.encode(self.message, forKey: .message) try values.encode(self.serviceMessage, forKey: .serviceMessage) diff --git a/submodules/TelegramUI/Sources/ChatMediaInputGifPane.swift b/submodules/TelegramUI/Sources/ChatMediaInputGifPane.swift index 00e647e07f..8b99eb83bd 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputGifPane.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputGifPane.swift @@ -300,7 +300,7 @@ final class ChatMediaInputGifPane: ChatMediaInputPane, UIScrollViewDelegate { if let recentGifs = recentGifs { saved = recentGifs.items.map { item in - let file = (item.contents as! RecentMediaItem).media as! TelegramMediaFile + let file = item.contents.get(RecentMediaItem.self)!.media return MultiplexedVideoNodeFile(file: .savedGif(media: file), contextResult: nil) } } else { diff --git a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift index 4a2ad092b0..b07064aaf4 100644 --- a/submodules/TelegramUI/Sources/ChatMediaInputNode.swift +++ b/submodules/TelegramUI/Sources/ChatMediaInputNode.swift @@ -176,7 +176,7 @@ func chatMediaInputPanelEntries(view: ItemCollectionsView, savedStickers: Ordere var savedStickerIds = Set() if let savedStickers = savedStickers, !savedStickers.items.isEmpty { for i in 0 ..< savedStickers.items.count { - if let item = savedStickers.items[i].contents as? SavedStickerItem { + if let item = savedStickers.items[i].contents.get(SavedStickerItem.self) { savedStickerIds.insert(item.file.fileId.id) } } @@ -184,7 +184,7 @@ func chatMediaInputPanelEntries(view: ItemCollectionsView, savedStickers: Ordere if let recentStickers = recentStickers, !recentStickers.items.isEmpty { var found = false for item in recentStickers.items { - if let item = item.contents as? RecentMediaItem, let _ = item.media as? TelegramMediaFile, let mediaId = item.media.id { + if let item = item.contents.get(RecentMediaItem.self), let mediaId = item.media.id { if !savedStickerIds.contains(mediaId.id) { found = true break @@ -273,7 +273,7 @@ func chatMediaInputGridEntries(view: ItemCollectionsView, savedStickers: Ordered if let savedStickers = savedStickers, !savedStickers.items.isEmpty { let packInfo = StickerPackCollectionInfo(id: ItemCollectionId(namespace: ChatMediaInputPanelAuxiliaryNamespace.savedStickers.rawValue, id: 0), flags: [], accessHash: 0, title: strings.Stickers_FavoriteStickers.uppercased(), shortName: "", thumbnail: nil, immediateThumbnailData: nil, hash: 0, count: 0) for i in 0 ..< savedStickers.items.count { - if let item = savedStickers.items[i].contents as? SavedStickerItem { + if let item = savedStickers.items[i].contents.get(SavedStickerItem.self) { savedStickerIds.insert(item.file.fileId.id) let index = ItemCollectionItemIndex(index: Int32(i), id: item.file.fileId.id) let stickerItem = StickerPackItem(index: index, file: item.file, indexKeys: []) @@ -294,7 +294,9 @@ func chatMediaInputGridEntries(view: ItemCollectionsView, savedStickers: Ordered if addedCount >= 20 { break } - if let item = recentStickers.items[i].contents as? RecentMediaItem, let file = item.media as? TelegramMediaFile, let mediaId = item.media.id { + if let item = recentStickers.items[i].contents.get(RecentMediaItem.self), let mediaId = item.media.id { + let file = item.media + if !savedStickerIds.contains(mediaId.id) { let index = ItemCollectionItemIndex(index: Int32(i), id: mediaId.id) let stickerItem = StickerPackItem(index: index, file: file, indexKeys: []) diff --git a/submodules/TelegramUI/Sources/DeclareEncodables.swift b/submodules/TelegramUI/Sources/DeclareEncodables.swift index fb6a3a086f..e9ec2a4b80 100644 --- a/submodules/TelegramUI/Sources/DeclareEncodables.swift +++ b/submodules/TelegramUI/Sources/DeclareEncodables.swift @@ -19,9 +19,6 @@ private var telegramUIDeclaredEncodables: Void = { declareEncodable(LocalFileGifMediaResource.self, f: { LocalFileGifMediaResource(decoder: $0) }) declareEncodable(PhotoLibraryMediaResource.self, f: { PhotoLibraryMediaResource(decoder: $0) }) declareEncodable(ICloudFileResource.self, f: { ICloudFileResource(decoder: $0) }) - declareEncodable(RecentWebSearchQueryItem.self, f: { RecentWebSearchQueryItem(decoder: $0) }) - declareEncodable(RecentWallpaperSearchQueryItem.self, f: { RecentWallpaperSearchQueryItem(decoder: $0) }) - declareEncodable(RecentSettingsSearchQueryItem.self, f: { RecentSettingsSearchQueryItem(decoder: $0) }) return }() diff --git a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift index 7800057498..f6501a0ef4 100644 --- a/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/PresentationThemeSettings.swift @@ -67,14 +67,14 @@ public struct PresentationLocalTheme: PostboxCoding, Equatable { public init(decoder: PostboxDecoder) { self.title = decoder.decodeStringForKey("title", orElse: "") self.resource = decoder.decodeObjectForKey("resource", decoder: { LocalFileMediaResource(decoder: $0) }) as! LocalFileMediaResource - self.resolvedWallpaper = decoder.decodeObjectForKey("wallpaper", decoder: { TelegramWallpaper(decoder: $0) }) as? TelegramWallpaper + self.resolvedWallpaper = decoder.decode(TelegramWallpaperNativeCodable.self, forKey: "wallpaper")?.value } public func encode(_ encoder: PostboxEncoder) { encoder.encodeString(self.title, forKey: "title") encoder.encodeObject(self.resource, forKey: "resource") if let resolvedWallpaper = self.resolvedWallpaper { - encoder.encodeObject(resolvedWallpaper, forKey: "wallpaper") + encoder.encode(TelegramWallpaperNativeCodable(resolvedWallpaper), forKey: "wallpaper") } else { encoder.encodeNil(forKey: "wallpaper") } @@ -106,15 +106,15 @@ public struct PresentationCloudTheme: PostboxCoding, Equatable { } public init(decoder: PostboxDecoder) { - self.theme = decoder.decodeObjectForKey("theme", decoder: { TelegramTheme(decoder: $0) }) as! TelegramTheme - self.resolvedWallpaper = decoder.decodeObjectForKey("wallpaper", decoder: { TelegramWallpaper(decoder: $0) }) as? TelegramWallpaper + self.theme = decoder.decode(TelegramThemeNativeCodable.self, forKey: "theme")!.value + self.resolvedWallpaper = decoder.decode(TelegramWallpaperNativeCodable.self, forKey: "wallpaper")?.value self.creatorAccountId = decoder.decodeOptionalInt64ForKey("account").flatMap { AccountRecordId(rawValue: $0) } } public func encode(_ encoder: PostboxEncoder) { - encoder.encodeObject(self.theme, forKey: "theme") + encoder.encode(TelegramThemeNativeCodable(self.theme), forKey: "theme") if let resolvedWallpaper = self.resolvedWallpaper { - encoder.encodeObject(resolvedWallpaper, forKey: "wallpaper") + encoder.encode(TelegramWallpaperNativeCodable(resolvedWallpaper), forKey: "wallpaper") } else { encoder.encodeNil(forKey: "wallpaper") } @@ -480,7 +480,7 @@ public struct PresentationThemeAccentColor: PostboxCoding, Equatable { } } - self.wallpaper = decoder.decodeObjectForKey("w", decoder: { TelegramWallpaper(decoder: $0) }) as? TelegramWallpaper + self.wallpaper = decoder.decode(TelegramWallpaperNativeCodable.self, forKey: "w")?.value self.themeIndex = decoder.decodeOptionalInt64ForKey("t") } @@ -494,7 +494,7 @@ public struct PresentationThemeAccentColor: PostboxCoding, Equatable { } encoder.encodeInt32Array(self.bubbleColors.map(Int32.init(bitPattern:)), forKey: "bubbleColors") if let wallpaper = self.wallpaper { - encoder.encodeObject(wallpaper, forKey: "w") + encoder.encode(TelegramWallpaperNativeCodable(wallpaper), forKey: "w") } else { encoder.encodeNil(forKey: "w") } @@ -649,11 +649,10 @@ public struct PresentationThemeSettings: Codable { self.theme = .builtin(.dayClassic) } - let themeSpecificChatWallpapersDict = try container.decode([DictionaryKey: AdaptedPostboxDecoder.RawObjectData].self, forKey: "themeSpecificChatWallpapers") + let themeSpecificChatWallpapersDict = try container.decode([DictionaryKey: TelegramWallpaperNativeCodable].self, forKey: "themeSpecificChatWallpapers") var mappedThemeSpecificChatWallpapers: [Int64: TelegramWallpaper] = [:] for (key, value) in themeSpecificChatWallpapersDict { - let innerDecoder = PostboxDecoder(buffer: MemoryBuffer(data: value.data)) - mappedThemeSpecificChatWallpapers[key.key] = TelegramWallpaper(decoder: innerDecoder) + mappedThemeSpecificChatWallpapers[key.key] = value.value } self.themeSpecificChatWallpapers = mappedThemeSpecificChatWallpapers @@ -689,9 +688,9 @@ public struct PresentationThemeSettings: Codable { } try container.encode(mappedThemeSpecificAccentColors, forKey: "themeSpecificAccentColors") - var mappedThemeSpecificChatWallpapers: [DictionaryKey: AdaptedPostboxEncoder.RawObjectData] = [:] + var mappedThemeSpecificChatWallpapers: [DictionaryKey: TelegramWallpaperNativeCodable] = [:] for (key, value) in self.themeSpecificChatWallpapers { - mappedThemeSpecificChatWallpapers[DictionaryKey(key)] = PostboxEncoder().encodeObjectToRawData(value) + mappedThemeSpecificChatWallpapers[DictionaryKey(key)] = TelegramWallpaperNativeCodable(value) } try container.encode(mappedThemeSpecificChatWallpapers, forKey: "themeSpecificChatWallpapers") diff --git a/submodules/WallpaperResources/Sources/WallpaperCache.swift b/submodules/WallpaperResources/Sources/WallpaperCache.swift index 97d4d182b5..29f42cdbe4 100644 --- a/submodules/WallpaperResources/Sources/WallpaperCache.swift +++ b/submodules/WallpaperResources/Sources/WallpaperCache.swift @@ -17,14 +17,13 @@ public final class CachedWallpaper: Codable { public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: StringCodingKey.self) - let wallpaperData = try container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: "wallpaper") - self.wallpaper = TelegramWallpaper(decoder: PostboxDecoder(buffer: MemoryBuffer(data: wallpaperData.data))) + self.wallpaper = (try container.decode(TelegramWallpaperNativeCodable.self, forKey: "wallpaper")).value } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: StringCodingKey.self) - try container.encode(PostboxEncoder().encodeObjectToRawData(self.wallpaper), forKey: "wallpaper") + try container.encode(TelegramWallpaperNativeCodable(self.wallpaper), forKey: "wallpaper") } } diff --git a/submodules/WatchBridge/Sources/WatchRequestHandlers.swift b/submodules/WatchBridge/Sources/WatchRequestHandlers.swift index dca4e0f729..923ac1176d 100644 --- a/submodules/WatchBridge/Sources/WatchRequestHandlers.swift +++ b/submodules/WatchBridge/Sources/WatchRequestHandlers.swift @@ -313,11 +313,11 @@ private func mediaForSticker(documentId: Int64, account: Account) -> Signal map { view -> TelegramMediaFile? in for view in view.orderedItemListsViews { for entry in view.items { - if let file = (entry.contents as? SavedStickerItem)?.file { + if let file = entry.contents.get(SavedStickerItem.self)?.file { if file.id?.id == documentId { return file } - } else if let file = (entry.contents as? RecentMediaItem)?.media as? TelegramMediaFile { + } else if let file = entry.contents.get(RecentMediaItem.self)?.media { if file.id?.id == documentId { return file } @@ -618,12 +618,12 @@ final class WatchStickersHandler: WatchRequestHandler { var added: Set = [] outer: for view in view.orderedItemListsViews { for entry in view.items { - if let file = (entry.contents as? SavedStickerItem)?.file { + if let file = entry.contents.get(SavedStickerItem.self)?.file { if let sticker = makeBridgeDocument(file), !added.contains(sticker.documentId) { stickers.append(sticker) added.insert(sticker.documentId) } - } else if let file = (entry.contents as? RecentMediaItem)?.media as? TelegramMediaFile { + } else if let file = entry.contents.get(RecentMediaItem.self)?.media { if let sticker = makeBridgeDocument(file), !added.contains(sticker.documentId) { stickers.append(sticker) added.insert(sticker.documentId) diff --git a/submodules/WebSearchUI/Sources/WebSearchRecentQueries.swift b/submodules/WebSearchUI/Sources/WebSearchRecentQueries.swift index bad36c2911..184f592585 100644 --- a/submodules/WebSearchUI/Sources/WebSearchRecentQueries.swift +++ b/submodules/WebSearchUI/Sources/WebSearchRecentQueries.swift @@ -24,21 +24,23 @@ private struct WebSearchRecentQueryItemId { } } -public final class RecentWebSearchQueryItem: OrderedItemListEntryContents { +public final class RecentWebSearchQueryItem: Codable { init() { } - public init(decoder: PostboxDecoder) { + public init(from decoder: Decoder) throws { } - public func encode(_ encoder: PostboxEncoder) { + public func encode(to encoder: Encoder) throws { } } func addRecentWebSearchQuery(postbox: Postbox, string: String) -> Signal { return postbox.transaction { transaction in if let itemId = WebSearchRecentQueryItemId(string) { - transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries, item: OrderedItemListEntry(id: itemId.rawValue, contents: RecentWebSearchQueryItem()), removeTailIfCountExceeds: 100) + if let entry = CodableEntry(RecentWebSearchQueryItem()) { + transaction.addOrMoveToFirstPositionOrderedItemListItem(collectionId: ApplicationSpecificOrderedItemListCollectionId.webSearchRecentQueries, item: OrderedItemListEntry(id: itemId.rawValue, contents: entry), removeTailIfCountExceeds: 100) + } } } }