mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-17 19:09:56 +00:00
47 lines
2.5 KiB
Swift
47 lines
2.5 KiB
Swift
import Foundation
|
|
|
|
#if os(macOS)
|
|
import PostboxMac
|
|
import SwiftSignalKitMac
|
|
#else
|
|
import Postbox
|
|
import SwiftSignalKit
|
|
import Photos
|
|
#endif
|
|
|
|
private func fetchCloudMediaLocation(account: Account, resource: TelegramMultipartFetchableResource, size: Int?, ranges: Signal<IndexSet, NoError>, tag: MediaResourceFetchTag?) -> Signal<MediaResourceDataFetchResult, NoError> {
|
|
return multipartFetch(account: account, resource: resource, size: size, ranges: ranges, tag: tag)
|
|
}
|
|
|
|
private func fetchLocalFileResource(path: String, move: Bool) -> Signal<MediaResourceDataFetchResult, NoError> {
|
|
return Signal { subscriber in
|
|
if move {
|
|
subscriber.putNext(.moveLocalFile(path: path))
|
|
subscriber.putCompletion()
|
|
} else {
|
|
if let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: [.mappedRead]) {
|
|
subscriber.putNext(.dataPart(resourceOffset: 0, data: data, range: 0 ..< data.count, complete: true))
|
|
subscriber.putCompletion()
|
|
} else {
|
|
subscriber.putNext(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: false))
|
|
}
|
|
}
|
|
return EmptyDisposable
|
|
}
|
|
}
|
|
|
|
func fetchResource(account: Account, resource: MediaResource, ranges: Signal<IndexSet, NoError>, tag: MediaResourceFetchTag?) -> Signal<MediaResourceDataFetchResult, NoError>? {
|
|
if let _ = resource as? EmptyMediaResource {
|
|
return .single(.reset) |> then(.never())
|
|
} else if let secretFileResource = resource as? SecretFileMediaResource {
|
|
return .single(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: false)) |> then(fetchSecretFileResource(account: account, resource: secretFileResource, ranges: ranges, tag: tag))
|
|
} else if let cloudResource = resource as? TelegramMultipartFetchableResource {
|
|
return .single(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: false)) |> then(fetchCloudMediaLocation(account: account, resource: cloudResource, size: resource.size == 0 ? nil : resource.size, ranges: ranges, tag: tag))
|
|
} else if let localFileResource = resource as? LocalFileReferenceMediaResource {
|
|
return fetchLocalFileResource(path: localFileResource.localFilePath, move: localFileResource.isUniquelyReferencedTemporaryFile)
|
|
} else if let httpReference = resource as? HttpReferenceMediaResource {
|
|
return .single(.dataPart(resourceOffset: 0, data: Data(), range: 0 ..< 0, complete: false)) |> then(fetchHttpResource(url: httpReference.url))
|
|
}
|
|
return nil
|
|
}
|