mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Refactor IndexSet to RangeSet
This commit is contained in:
parent
699f709f2e
commit
f7641fb550
@ -3,6 +3,7 @@ import Postbox
|
|||||||
import TelegramCore
|
import TelegramCore
|
||||||
import SwiftSignalKit
|
import SwiftSignalKit
|
||||||
import TelegramUIPreferences
|
import TelegramUIPreferences
|
||||||
|
import RangeSet
|
||||||
|
|
||||||
public enum FetchManagerCategory: Int32 {
|
public enum FetchManagerCategory: Int32 {
|
||||||
case image
|
case image
|
||||||
@ -151,7 +152,7 @@ public enum FetchManagerPriority: Comparable {
|
|||||||
public protocol FetchManager {
|
public protocol FetchManager {
|
||||||
var queue: Queue { get }
|
var queue: Queue { get }
|
||||||
|
|
||||||
func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: IndexSet, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<Void, NoError>
|
func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: RangeSet<Int64>, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<Void, NoError>
|
||||||
func cancelInteractiveFetches(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource)
|
func cancelInteractiveFetches(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, resource: MediaResource)
|
||||||
func cancelInteractiveFetches(resourceId: String)
|
func cancelInteractiveFetches(resourceId: String)
|
||||||
func toggleInteractiveFetchPaused(resourceId: String, isPaused: Bool)
|
func toggleInteractiveFetchPaused(resourceId: String, isPaused: Bool)
|
||||||
|
@ -4,6 +4,7 @@ import TelegramCore
|
|||||||
import Postbox
|
import Postbox
|
||||||
import SwiftSignalKit
|
import SwiftSignalKit
|
||||||
import TelegramUIPreferences
|
import TelegramUIPreferences
|
||||||
|
import RangeSet
|
||||||
|
|
||||||
public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func freeMediaFileInteractiveFetched(account: Account, fileReference: FileMediaReference) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource))
|
return fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource))
|
||||||
@ -12,7 +13,7 @@ public func freeMediaFileInteractiveFetched(account: Account, fileReference: Fil
|
|||||||
public func freeMediaFileInteractiveFetched(fetchManager: FetchManager, fileReference: FileMediaReference, priority: FetchManagerPriority) -> Signal<Void, NoError> {
|
public func freeMediaFileInteractiveFetched(fetchManager: FetchManager, fileReference: FileMediaReference, priority: FetchManagerPriority) -> Signal<Void, NoError> {
|
||||||
let file = fileReference.media
|
let file = fileReference.media
|
||||||
let mediaReference = AnyMediaReference.standalone(media: fileReference.media)
|
let mediaReference = AnyMediaReference.standalone(media: fileReference.media)
|
||||||
return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(PeerId(0)), locationKey: .free, mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: IndexSet(integersIn: 0 ..< Int(Int64.max) as Range<Int>), statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: false, priority: priority, storeToDownloadsPeerType: nil)
|
return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(PeerId(0)), locationKey: .free, mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: RangeSet<Int64>(0 ..< Int64.max), statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: false, priority: priority, storeToDownloadsPeerType: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func freeMediaFileResourceInteractiveFetched(account: Account, fileReference: FileMediaReference, resource: MediaResource) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
public func freeMediaFileResourceInteractiveFetched(account: Account, fileReference: FileMediaReference, resource: MediaResource) -> Signal<FetchResourceSourceType, FetchResourceError> {
|
||||||
@ -37,7 +38,7 @@ public func messageMediaFileInteractiveFetched(context: AccountContext, message:
|
|||||||
return messageMediaFileInteractiveFetched(fetchManager: context.fetchManager, messageId: message.id, messageReference: MessageReference(message), file: file, userInitiated: userInitiated, priority: .userInitiated)
|
return messageMediaFileInteractiveFetched(fetchManager: context.fetchManager, messageId: message.id, messageReference: MessageReference(message), file: file, userInitiated: userInitiated, priority: .userInitiated)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func messageMediaFileInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, file: TelegramMediaFile, ranges: IndexSet = IndexSet(integersIn: 0 ..< Int(Int64.max) as Range<Int>), userInitiated: Bool, priority: FetchManagerPriority) -> Signal<Void, NoError> {
|
public func messageMediaFileInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, file: TelegramMediaFile, ranges: RangeSet<Int64> = RangeSet<Int64>(0 ..< Int64.max), userInitiated: Bool, priority: FetchManagerPriority) -> Signal<Void, NoError> {
|
||||||
let mediaReference = AnyMediaReference.message(message: messageReference, media: file)
|
let mediaReference = AnyMediaReference.message(message: messageReference, media: file)
|
||||||
return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(messageId.peerId), locationKey: .messageId(messageId), mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: ranges, statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: userInitiated, priority: priority, storeToDownloadsPeerType: nil)
|
return fetchManager.interactivelyFetched(category: fetchCategoryForFile(file), location: .chat(messageId.peerId), locationKey: .messageId(messageId), mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(file.resource), ranges: ranges, statsCategory: statsCategoryForFileWithAttributes(file.attributes), elevatedPriority: false, userInitiated: userInitiated, priority: priority, storeToDownloadsPeerType: nil)
|
||||||
}
|
}
|
||||||
@ -52,11 +53,11 @@ public func messageMediaImageInteractiveFetched(context: AccountContext, message
|
|||||||
|
|
||||||
public func messageMediaImageInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, image: TelegramMediaImage, resource: MediaResource, range: Range<Int64>? = nil, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<Void, NoError> {
|
public func messageMediaImageInteractiveFetched(fetchManager: FetchManager, messageId: MessageId, messageReference: MessageReference, image: TelegramMediaImage, resource: MediaResource, range: Range<Int64>? = nil, userInitiated: Bool, priority: FetchManagerPriority, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<Void, NoError> {
|
||||||
let mediaReference = AnyMediaReference.message(message: messageReference, media: image)
|
let mediaReference = AnyMediaReference.message(message: messageReference, media: image)
|
||||||
let ranges: IndexSet
|
let ranges: RangeSet<Int64>
|
||||||
if let range = range {
|
if let range = range {
|
||||||
ranges = IndexSet(integersIn: Int(range.lowerBound) ..< Int(range.upperBound))
|
ranges = RangeSet(range.lowerBound ..< range.upperBound)
|
||||||
} else {
|
} else {
|
||||||
ranges = IndexSet(integersIn: Int(0) ..< Int(Int64.max))
|
ranges = RangeSet(0 ..< Int64.max)
|
||||||
}
|
}
|
||||||
return fetchManager.interactivelyFetched(category: .image, location: .chat(messageId.peerId), locationKey: .messageId(messageId), mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(resource), ranges: ranges, statsCategory: .image, elevatedPriority: false, userInitiated: userInitiated, priority: priority, storeToDownloadsPeerType: storeToDownloadsPeerType)
|
return fetchManager.interactivelyFetched(category: .image, location: .chat(messageId.peerId), locationKey: .messageId(messageId), mediaReference: mediaReference, resourceReference: mediaReference.resourceReference(resource), ranges: ranges, statsCategory: .image, elevatedPriority: false, userInitiated: userInitiated, priority: priority, storeToDownloadsPeerType: storeToDownloadsPeerType)
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,7 @@ public final class DirectMediaImageCache {
|
|||||||
).start()
|
).start()
|
||||||
|
|
||||||
let dataSignal: Signal<Data?, NoError>
|
let dataSignal: Signal<Data?, NoError>
|
||||||
if resourceSizeLimit < Int(Int64.max) {
|
if resourceSizeLimit < Int64.max {
|
||||||
dataSignal = self.account.postbox.mediaBox.resourceData(resource.resource, size: resourceSizeLimit, in: 0 ..< resourceSizeLimit)
|
dataSignal = self.account.postbox.mediaBox.resourceData(resource.resource, size: resourceSizeLimit, in: 0 ..< resourceSizeLimit)
|
||||||
|> map { data, _ -> Data? in
|
|> map { data, _ -> Data? in
|
||||||
return data
|
return data
|
||||||
|
@ -16,6 +16,7 @@ swift_library(
|
|||||||
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
|
"//submodules/TelegramUIPreferences:TelegramUIPreferences",
|
||||||
"//submodules/AccountContext:AccountContext",
|
"//submodules/AccountContext:AccountContext",
|
||||||
"//submodules/MediaPlayer:UniversalMediaPlayer",
|
"//submodules/MediaPlayer:UniversalMediaPlayer",
|
||||||
|
"//submodules/Utils/RangeSet:RangeSet",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -6,6 +6,7 @@ import Postbox
|
|||||||
import TelegramUIPreferences
|
import TelegramUIPreferences
|
||||||
import AccountContext
|
import AccountContext
|
||||||
import UniversalMediaPlayer
|
import UniversalMediaPlayer
|
||||||
|
import RangeSet
|
||||||
|
|
||||||
public struct FetchManagerLocationEntryId: Hashable {
|
public struct FetchManagerLocationEntryId: Hashable {
|
||||||
public let location: FetchManagerLocation
|
public let location: FetchManagerLocation
|
||||||
@ -41,15 +42,15 @@ private final class FetchManagerLocationEntry {
|
|||||||
var userInitiated: Bool = false
|
var userInitiated: Bool = false
|
||||||
var storeToDownloadsPeerType: MediaAutoDownloadPeerType?
|
var storeToDownloadsPeerType: MediaAutoDownloadPeerType?
|
||||||
let references = Bag<FetchManagerPriority>()
|
let references = Bag<FetchManagerPriority>()
|
||||||
let ranges = Bag<IndexSet>()
|
let ranges = Bag<RangeSet<Int64>>()
|
||||||
var elevatedPriorityReferenceCount: Int32 = 0
|
var elevatedPriorityReferenceCount: Int32 = 0
|
||||||
var userInitiatedPriorityIndices: [Int32] = []
|
var userInitiatedPriorityIndices: [Int32] = []
|
||||||
var isPaused: Bool = false
|
var isPaused: Bool = false
|
||||||
|
|
||||||
var combinedRanges: IndexSet {
|
var combinedRanges: RangeSet<Int64> {
|
||||||
var result = IndexSet()
|
var result = RangeSet<Int64>()
|
||||||
if self.userInitiated {
|
if self.userInitiated {
|
||||||
result.insert(integersIn: 0 ..< Int(Int64.max))
|
result.insert(contentsOf: 0 ..< Int64.max)
|
||||||
} else {
|
} else {
|
||||||
for range in self.ranges.copyItems() {
|
for range in self.ranges.copyItems() {
|
||||||
result.formUnion(range)
|
result.formUnion(range)
|
||||||
@ -77,7 +78,7 @@ private final class FetchManagerLocationEntry {
|
|||||||
|
|
||||||
private final class FetchManagerActiveContext {
|
private final class FetchManagerActiveContext {
|
||||||
let userInitiated: Bool
|
let userInitiated: Bool
|
||||||
var ranges = IndexSet()
|
var ranges = RangeSet<Int64>()
|
||||||
var disposable: Disposable?
|
var disposable: Disposable?
|
||||||
|
|
||||||
init(userInitiated: Bool) {
|
init(userInitiated: Bool) {
|
||||||
@ -224,12 +225,13 @@ private final class FetchManagerCategoryContext {
|
|||||||
let entryCompleted = self.entryCompleted
|
let entryCompleted = self.entryCompleted
|
||||||
let storeManager = self.storeManager
|
let storeManager = self.storeManager
|
||||||
let parsedRanges: [(Range<Int64>, MediaBoxFetchPriority)]?
|
let parsedRanges: [(Range<Int64>, MediaBoxFetchPriority)]?
|
||||||
if ranges.count == 1 && ranges.min() == 0 && ranges.max() == Int(Int64.max) {
|
|
||||||
|
if ranges == RangeSet<Int64>(0 ..< Int64.max) {
|
||||||
parsedRanges = nil
|
parsedRanges = nil
|
||||||
} else {
|
} else {
|
||||||
var resultRanges: [(Range<Int64>, MediaBoxFetchPriority)] = []
|
var resultRanges: [(Range<Int64>, MediaBoxFetchPriority)] = []
|
||||||
for range in ranges.rangeView {
|
for range in ranges.ranges {
|
||||||
resultRanges.append((Int64(range.lowerBound) ..< Int64(range.upperBound), .default))
|
resultRanges.append((range, .default))
|
||||||
}
|
}
|
||||||
parsedRanges = resultRanges
|
parsedRanges = resultRanges
|
||||||
}
|
}
|
||||||
@ -312,14 +314,14 @@ private final class FetchManagerCategoryContext {
|
|||||||
var count = 0
|
var count = 0
|
||||||
var isCompleteRange = false
|
var isCompleteRange = false
|
||||||
var isVideoPreload = false
|
var isVideoPreload = false
|
||||||
for range in ranges.rangeView {
|
for range in ranges.ranges {
|
||||||
count += 1
|
count += 1
|
||||||
if range.lowerBound == 0 && range.upperBound == Int(Int64.max) {
|
if range.lowerBound == 0 && range.upperBound == Int64.max {
|
||||||
isCompleteRange = true
|
isCompleteRange = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if count == 2, let range = ranges.rangeView.first, range.lowerBound == 0 && range.upperBound == 2 * 1024 * 1024 {
|
if count == 2, let range = ranges.ranges.first, range.lowerBound == 0 && range.upperBound == 2 * 1024 * 1024 {
|
||||||
isVideoPreload = true
|
isVideoPreload = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,8 +329,8 @@ private final class FetchManagerCategoryContext {
|
|||||||
parsedRanges = nil
|
parsedRanges = nil
|
||||||
} else {
|
} else {
|
||||||
var resultRanges: [(Range<Int64>, MediaBoxFetchPriority)] = []
|
var resultRanges: [(Range<Int64>, MediaBoxFetchPriority)] = []
|
||||||
for range in ranges.rangeView {
|
for range in ranges.ranges {
|
||||||
resultRanges.append((Int64(range.lowerBound) ..< Int64(range.upperBound), .default))
|
resultRanges.append((range, .default))
|
||||||
}
|
}
|
||||||
parsedRanges = resultRanges
|
parsedRanges = resultRanges
|
||||||
}
|
}
|
||||||
@ -709,7 +711,7 @@ public final class FetchManagerImpl: FetchManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: IndexSet, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority = .userInitiated, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<Void, NoError> {
|
public func interactivelyFetched(category: FetchManagerCategory, location: FetchManagerLocation, locationKey: FetchManagerLocationKey, mediaReference: AnyMediaReference?, resourceReference: MediaResourceReference, ranges: RangeSet<Int64>, statsCategory: MediaResourceStatsCategory, elevatedPriority: Bool, userInitiated: Bool, priority: FetchManagerPriority = .userInitiated, storeToDownloadsPeerType: MediaAutoDownloadPeerType?) -> Signal<Void, NoError> {
|
||||||
let queue = self.queue
|
let queue = self.queue
|
||||||
return Signal { [weak self] subscriber in
|
return Signal { [weak self] subscriber in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user