mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
Refactoring
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
|
||||
public typealias EngineExportedPeerInvitation = ExportedInvitation
|
||||
|
||||
public extension TelegramEngine.EngineData.Item {
|
||||
enum Peer {
|
||||
public struct Peer: TelegramEngineDataItem, TelegramEngineMapKeyDataItem, PostboxViewDataItem {
|
||||
@@ -192,5 +194,39 @@ public extension TelegramEngine.EngineData.Item {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public struct ExportedInvitation: TelegramEngineDataItem, PostboxViewDataItem {
|
||||
public typealias Result = Optional<EngineExportedPeerInvitation>
|
||||
|
||||
fileprivate var id: EnginePeer.Id
|
||||
public var mapKey: EnginePeer.Id {
|
||||
return self.id
|
||||
}
|
||||
|
||||
public init(id: EnginePeer.Id) {
|
||||
self.id = id
|
||||
}
|
||||
|
||||
var key: PostboxViewKey {
|
||||
return .cachedPeerData(peerId: self.id)
|
||||
}
|
||||
|
||||
func extract(view: PostboxView) -> Result {
|
||||
guard let view = view as? CachedPeerDataView else {
|
||||
preconditionFailure()
|
||||
}
|
||||
guard let cachedPeerData = view.cachedPeerData else {
|
||||
return nil
|
||||
}
|
||||
switch cachedPeerData {
|
||||
case let channel as CachedChannelData:
|
||||
return channel.exportedInvitation
|
||||
case let group as CachedGroupData:
|
||||
return group.exportedInvitation
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,27 +3,27 @@ import Postbox
|
||||
import SwiftSignalKit
|
||||
import TelegramApi
|
||||
|
||||
func addMessageMediaResourceIdsToRemove(media: Media, resourceIds: inout [WrappedMediaResourceId]) {
|
||||
func addMessageMediaResourceIdsToRemove(media: Media, resourceIds: inout [MediaResourceId]) {
|
||||
if let image = media as? TelegramMediaImage {
|
||||
for representation in image.representations {
|
||||
resourceIds.append(WrappedMediaResourceId(representation.resource.id))
|
||||
resourceIds.append(representation.resource.id)
|
||||
}
|
||||
} else if let file = media as? TelegramMediaFile {
|
||||
for representation in file.previewRepresentations {
|
||||
resourceIds.append(WrappedMediaResourceId(representation.resource.id))
|
||||
resourceIds.append(representation.resource.id)
|
||||
}
|
||||
resourceIds.append(WrappedMediaResourceId(file.resource.id))
|
||||
resourceIds.append(file.resource.id)
|
||||
}
|
||||
}
|
||||
|
||||
func addMessageMediaResourceIdsToRemove(message: Message, resourceIds: inout [WrappedMediaResourceId]) {
|
||||
func addMessageMediaResourceIdsToRemove(message: Message, resourceIds: inout [MediaResourceId]) {
|
||||
for media in message.media {
|
||||
addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds)
|
||||
}
|
||||
}
|
||||
|
||||
public func _internal_deleteMessages(transaction: Transaction, mediaBox: MediaBox, ids: [MessageId], deleteMedia: Bool = true, manualAddMessageThreadStatsDifference: ((MessageId, Int, Int) -> Void)? = nil) {
|
||||
var resourceIds: [WrappedMediaResourceId] = []
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
if deleteMedia {
|
||||
for id in ids {
|
||||
if id.peerId.namespace == Namespaces.Peer.SecretChat {
|
||||
@@ -57,7 +57,7 @@ public func _internal_deleteMessages(transaction: Transaction, mediaBox: MediaBo
|
||||
}
|
||||
|
||||
func _internal_deleteAllMessagesWithAuthor(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, authorId: PeerId, namespace: MessageId.Namespace) {
|
||||
var resourceIds: [WrappedMediaResourceId] = []
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
transaction.removeAllMessagesWithAuthor(peerId, authorId: authorId, namespace: namespace, forEachMedia: { media in
|
||||
addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds)
|
||||
})
|
||||
@@ -67,7 +67,7 @@ func _internal_deleteAllMessagesWithAuthor(transaction: Transaction, mediaBox: M
|
||||
}
|
||||
|
||||
func _internal_deleteAllMessagesWithForwardAuthor(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, forwardAuthorId: PeerId, namespace: MessageId.Namespace) {
|
||||
var resourceIds: [WrappedMediaResourceId] = []
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
transaction.removeAllMessagesWithForwardAuthor(peerId, forwardAuthorId: forwardAuthorId, namespace: namespace, forEachMedia: { media in
|
||||
addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds)
|
||||
})
|
||||
@@ -78,7 +78,7 @@ func _internal_deleteAllMessagesWithForwardAuthor(transaction: Transaction, medi
|
||||
|
||||
func _internal_clearHistory(transaction: Transaction, mediaBox: MediaBox, peerId: PeerId, namespaces: MessageIdNamespaces) {
|
||||
if peerId.namespace == Namespaces.Peer.SecretChat {
|
||||
var resourceIds: [WrappedMediaResourceId] = []
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
transaction.withAllMessages(peerId: peerId, { message in
|
||||
addMessageMediaResourceIdsToRemove(message: message, resourceIds: &resourceIds)
|
||||
return true
|
||||
|
||||
@@ -1,17 +1,5 @@
|
||||
import Postbox
|
||||
|
||||
public final class EngineMediaResource {
|
||||
private let resource: MediaResource
|
||||
|
||||
public init(_ resource: MediaResource) {
|
||||
self.resource = resource
|
||||
}
|
||||
|
||||
public func _asResource() -> MediaResource {
|
||||
return self.resource
|
||||
}
|
||||
}
|
||||
|
||||
public enum EngineMedia {
|
||||
public typealias Id = MediaId
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ func managedApplyPendingScheduledMessagesActions(postbox: Postbox, network: Netw
|
||||
})
|
||||
|> then(
|
||||
postbox.transaction { transaction -> Void in
|
||||
var resourceIds: [WrappedMediaResourceId] = []
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
transaction.deleteMessages([entry.id], forEachMedia: { media in
|
||||
addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds)
|
||||
})
|
||||
|
||||
@@ -544,7 +544,7 @@ func _internal_fetchAndUpdateCachedPeerData(accountPeerId: PeerId, peerId rawPee
|
||||
})
|
||||
|
||||
if let minAvailableMessageId = minAvailableMessageId, minAvailableMessageIdUpdated {
|
||||
var resourceIds: [WrappedMediaResourceId] = []
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
transaction.deleteMessagesInRange(peerId: peerId, namespace: minAvailableMessageId.namespace, minId: 1, maxId: minAvailableMessageId.id, forEachMedia: { media in
|
||||
addMessageMediaResourceIdsToRemove(media: media, resourceIds: &resourceIds)
|
||||
})
|
||||
|
||||
@@ -47,7 +47,7 @@ private enum CollectCacheUsageStatsError {
|
||||
private final class CacheUsageStatsState {
|
||||
var media: [PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]] = [:]
|
||||
var mediaResourceIds: [MediaId: [MediaResourceId]] = [:]
|
||||
var allResourceIds = Set<WrappedMediaResourceId>()
|
||||
var allResourceIds = Set<MediaResourceId>()
|
||||
var lowerBound: MessageIndex?
|
||||
var upperBound: MessageIndex?
|
||||
}
|
||||
@@ -61,10 +61,10 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
|
||||
let state = Atomic<CacheUsageStatsState>(value: initialState)
|
||||
|
||||
let excludeResourceIds = account.postbox.transaction { transaction -> Set<WrappedMediaResourceId> in
|
||||
var result = Set<WrappedMediaResourceId>()
|
||||
let excludeResourceIds = account.postbox.transaction { transaction -> Set<MediaResourceId> in
|
||||
var result = Set<MediaResourceId>()
|
||||
transaction.enumeratePreferencesEntries({ entry in
|
||||
result.formUnion(entry.relatedResources.map(WrappedMediaResourceId.init))
|
||||
result.formUnion(entry.relatedResources)
|
||||
return true
|
||||
})
|
||||
return result
|
||||
@@ -85,7 +85,7 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
}
|
||||
}
|
||||
|
||||
var resourceIdToMediaId: [WrappedMediaResourceId: (MediaId, PeerCacheUsageCategory)] = [:]
|
||||
var resourceIdToMediaId: [MediaResourceId: (MediaId, PeerCacheUsageCategory)] = [:]
|
||||
var mediaResourceIds: [MediaId: [MediaResourceId]] = [:]
|
||||
var resourceIds: [MediaResourceId] = []
|
||||
for (id, media) in mediaRefs {
|
||||
@@ -112,7 +112,7 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
if let image = media as? TelegramMediaImage {
|
||||
for representation in image.representations {
|
||||
resourceIds.append(representation.resource.id)
|
||||
resourceIdToMediaId[WrappedMediaResourceId(representation.resource.id)] = (id, .image)
|
||||
resourceIdToMediaId[representation.resource.id] = (id, .image)
|
||||
mediaResourceIds[id]!.append(representation.resource.id)
|
||||
}
|
||||
} else if let file = media as? TelegramMediaFile {
|
||||
@@ -131,11 +131,11 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
}
|
||||
for representation in file.previewRepresentations {
|
||||
resourceIds.append(representation.resource.id)
|
||||
resourceIdToMediaId[WrappedMediaResourceId(representation.resource.id)] = (id, category)
|
||||
resourceIdToMediaId[representation.resource.id] = (id, category)
|
||||
mediaResourceIds[id]!.append(representation.resource.id)
|
||||
}
|
||||
resourceIds.append(file.resource.id)
|
||||
resourceIdToMediaId[WrappedMediaResourceId(file.resource.id)] = (id, category)
|
||||
resourceIdToMediaId[file.resource.id] = (id, category)
|
||||
mediaResourceIds[id]!.append(file.resource.id)
|
||||
}
|
||||
}
|
||||
@@ -165,13 +165,13 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
for (id, ids) in mediaResourceIds {
|
||||
state.mediaResourceIds[id] = ids
|
||||
for resourceId in ids {
|
||||
state.allResourceIds.insert(WrappedMediaResourceId(resourceId))
|
||||
state.allResourceIds.insert(resourceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
if updatedLowerBound == nil {
|
||||
if peerId != nil {
|
||||
let (finalMedia, finalMediaResourceIds, _) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set<WrappedMediaResourceId>) in
|
||||
let (finalMedia, finalMediaResourceIds, _) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set<MediaResourceId>) in
|
||||
return (state.media, state.mediaResourceIds, state.allResourceIds)
|
||||
}
|
||||
return account.postbox.transaction { transaction -> CacheUsageStats in
|
||||
@@ -191,7 +191,7 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
}
|
||||
}
|
||||
|
||||
let (finalMedia, finalMediaResourceIds, allResourceIds) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set<WrappedMediaResourceId>) in
|
||||
let (finalMedia, finalMediaResourceIds, allResourceIds) = state.with { state -> ([PeerId: [PeerCacheUsageCategory: [MediaId: Int64]]], [MediaId: [MediaResourceId]], Set<MediaResourceId>) in
|
||||
return (state.media, state.mediaResourceIds, state.allResourceIds)
|
||||
}
|
||||
|
||||
@@ -290,6 +290,6 @@ func _internal_collectCacheUsageStats(account: Account, peerId: PeerId? = nil, a
|
||||
}
|
||||
}
|
||||
|
||||
func _internal_clearCachedMediaResources(account: Account, mediaResourceIds: Set<WrappedMediaResourceId>) -> Signal<Void, NoError> {
|
||||
func _internal_clearCachedMediaResources(account: Account, mediaResourceIds: Set<MediaResourceId>) -> Signal<Void, NoError> {
|
||||
return account.postbox.mediaBox.removeCachedResources(mediaResourceIds)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,150 @@
|
||||
import Foundation
|
||||
import SwiftSignalKit
|
||||
import Postbox
|
||||
|
||||
public final class EngineMediaResource: Equatable {
|
||||
public struct ByteRange {
|
||||
public enum Priority {
|
||||
case `default`
|
||||
case elevated
|
||||
case maximum
|
||||
}
|
||||
|
||||
public var range: Range<Int>
|
||||
public var priority: Priority
|
||||
|
||||
public init(range: Range<Int>, priority: Priority) {
|
||||
self.range = range
|
||||
self.priority = priority
|
||||
}
|
||||
}
|
||||
|
||||
public final class Fetch {
|
||||
public enum Result {
|
||||
case dataPart(resourceOffset: Int, data: Data, range: Range<Int>, complete: Bool)
|
||||
case resourceSizeUpdated(Int)
|
||||
case progressUpdated(Float)
|
||||
case replaceHeader(data: Data, range: Range<Int>)
|
||||
case moveLocalFile(path: String)
|
||||
case moveTempFile(file: TempBoxFile)
|
||||
case copyLocalItem(MediaResourceDataFetchCopyLocalItem)
|
||||
case reset
|
||||
}
|
||||
|
||||
public enum Error {
|
||||
case generic
|
||||
}
|
||||
|
||||
public let signal: (
|
||||
Signal<[EngineMediaResource.ByteRange], NoError>
|
||||
) -> Signal<Result, Error>
|
||||
|
||||
public init(_ signal: @escaping (
|
||||
Signal<[EngineMediaResource.ByteRange], NoError>
|
||||
) -> Signal<Result, Error>) {
|
||||
self.signal = signal
|
||||
}
|
||||
}
|
||||
|
||||
public final class ResourceData {
|
||||
public let path: String
|
||||
public let availableSize: Int
|
||||
public let isComplete: Bool
|
||||
|
||||
public init(
|
||||
path: String,
|
||||
availableSize: Int,
|
||||
isComplete: Bool
|
||||
) {
|
||||
self.path = path
|
||||
self.availableSize = availableSize
|
||||
self.isComplete = isComplete
|
||||
}
|
||||
}
|
||||
|
||||
public struct Id: Equatable, Hashable {
|
||||
public var stringRepresentation: String
|
||||
|
||||
public init(_ stringRepresentation: String) {
|
||||
self.stringRepresentation = stringRepresentation
|
||||
}
|
||||
|
||||
public init(_ id: MediaResourceId) {
|
||||
self.stringRepresentation = id.stringRepresentation
|
||||
}
|
||||
}
|
||||
|
||||
private let resource: MediaResource
|
||||
|
||||
public init(_ resource: MediaResource) {
|
||||
self.resource = resource
|
||||
}
|
||||
|
||||
public func _asResource() -> MediaResource {
|
||||
return self.resource
|
||||
}
|
||||
|
||||
public var id: Id {
|
||||
return Id(self.resource.id)
|
||||
}
|
||||
|
||||
public static func ==(lhs: EngineMediaResource, rhs: EngineMediaResource) -> Bool {
|
||||
return lhs.resource.isEqual(to: rhs.resource)
|
||||
}
|
||||
}
|
||||
|
||||
public extension MediaResource {
|
||||
func fetch(engine: TelegramEngine, parameters: MediaResourceFetchParameters?) -> EngineMediaResource.Fetch {
|
||||
return EngineMediaResource.Fetch { ranges in
|
||||
return Signal { subscriber in
|
||||
return engine.account.postbox.mediaBox.fetchResource!(
|
||||
self,
|
||||
ranges |> map { ranges -> [(Range<Int>, MediaBoxFetchPriority)] in
|
||||
return ranges.map { range -> (Range<Int>, MediaBoxFetchPriority) in
|
||||
let mappedPriority: MediaBoxFetchPriority
|
||||
switch range.priority {
|
||||
case .default:
|
||||
mappedPriority = .default
|
||||
case .elevated:
|
||||
mappedPriority = .elevated
|
||||
case .maximum:
|
||||
mappedPriority = .maximum
|
||||
}
|
||||
return (range.range, mappedPriority)
|
||||
}
|
||||
},
|
||||
parameters
|
||||
).start(next: { result in
|
||||
let mappedResult: EngineMediaResource.Fetch.Result
|
||||
switch result {
|
||||
case let .dataPart(resourceOffset, data, range, complete):
|
||||
mappedResult = .dataPart(resourceOffset: resourceOffset, data: data, range: range, complete: complete)
|
||||
case let .resourceSizeUpdated(size):
|
||||
mappedResult = .resourceSizeUpdated(size)
|
||||
case let .progressUpdated(progress):
|
||||
mappedResult = .progressUpdated(progress)
|
||||
case let .replaceHeader(data, range):
|
||||
mappedResult = .replaceHeader(data: data, range: range)
|
||||
case let .moveLocalFile(path):
|
||||
mappedResult = .moveLocalFile(path: path)
|
||||
case let .moveTempFile(file):
|
||||
mappedResult = .moveTempFile(file: file)
|
||||
case let .copyLocalItem(item):
|
||||
mappedResult = .copyLocalItem(item)
|
||||
case .reset:
|
||||
mappedResult = .reset
|
||||
}
|
||||
subscriber.putNext(mappedResult)
|
||||
}, error: { _ in
|
||||
subscriber.putError(.generic)
|
||||
}, completed: {
|
||||
subscriber.putCompletion()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public extension TelegramEngine {
|
||||
final class Resources {
|
||||
private let account: Account
|
||||
@@ -17,8 +161,20 @@ public extension TelegramEngine {
|
||||
return _internal_collectCacheUsageStats(account: self.account, peerId: peerId, additionalCachePaths: additionalCachePaths, logFilesPath: logFilesPath)
|
||||
}
|
||||
|
||||
public func clearCachedMediaResources(mediaResourceIds: Set<WrappedMediaResourceId>) -> Signal<Void, NoError> {
|
||||
public func clearCachedMediaResources(mediaResourceIds: Set<MediaResourceId>) -> Signal<Void, NoError> {
|
||||
return _internal_clearCachedMediaResources(account: self.account, mediaResourceIds: mediaResourceIds)
|
||||
}
|
||||
|
||||
public func data(id: String) -> Signal<EngineMediaResource.ResourceData, NoError> {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
public func fetch(id: String, fetch: EngineMediaResource.Fetch) -> Signal<Never, NoError> {
|
||||
preconditionFailure()
|
||||
}
|
||||
|
||||
public func cancelAllFetches(id: String) {
|
||||
preconditionFailure()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user