import Foundation import UIKit import LegacyComponents import Postbox import TelegramCore import SyncCore import SwiftSignalKit final class LegacyImageDownloadActor: ASActor { private let disposable = MetaDisposable() deinit { self.disposable.dispose() } override static func genericPath() -> String! { return "/img/@"; } override func execute(_ options: [AnyHashable : Any]!) { let actualPath = self.path as NSString var url: String var processor: TGImageProcessor? var cacheUrl: String if actualPath.hasPrefix("/img/({filter:") { let range = actualPath.range(of: "}") if range.location == NSNotFound { ActionStageInstance().nodeRetrieveFailed(self.path) return } let processorName = actualPath.substring(with: NSMakeRange(14, range.location - 14)) processor = TGRemoteImageView.imageProcessor(forName: processorName) url = actualPath.substring(with: NSMakeRange(range.location + 1, actualPath.length - range.location - 1 - 1)) cacheUrl = "{filter:\(processorName)}\(url)" } else { url = actualPath.substring(with: NSMakeRange(6, actualPath.length - 6 - 1)) cacheUrl = url } if url.hasPrefix("placeholder://") { let path = self.path let token = TGImageManager.instance().beginLoadingImageAsync(withUri: url, decode: true, progress: nil, partialCompletion: nil, completion: { image in ActionStageInstance().actionCompleted(path, result: SGraphObjectNode(object: image)) }) let disposable = ActionDisposable { TGImageManager.instance().cancelTask(withId: token) } self.disposable.set(disposable) } else if let resource = resourceFromLegacyImageUri(url) { let disposables = DisposableSet() self.disposable.set(disposables) if let account = legacyContextGet()?.account { let path = self.path disposables.add(account.postbox.mediaBox.resourceData(resource).start(next: { data in if data.complete { ActionStageInstance().globalStageDispatchQueue().async { if let image = UIImage(contentsOfFile: data.path) { var updatedImage: UIImage? = image if let processor = processor { updatedImage = processor(image) } TGRemoteImageView.sharedCache().cacheImage(updatedImage, with: nil, url: cacheUrl, availability: Int32(TGCacheMemory.rawValue)) ActionStageInstance().actionCompleted(path, result: SGraphObjectNode(object: updatedImage)) } } } })) disposables.add(account.postbox.mediaBox.fetchedResource(resource, parameters: nil).start()) } } } override func cancel() { self.disposable.dispose() } }