mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-24 07:05:35 +00:00
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
This commit is contained in:
@@ -1171,3 +1171,54 @@ public func TelegramMediaResource_serialize(resource: TelegramMediaResource, fla
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
public extension TelegramCore_TelegramMediaResource {
|
||||
var id: MediaResourceId {
|
||||
switch self.valueType {
|
||||
case .telegrammediaresourceCloudfilemediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_CloudFileMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
return MediaResourceId(CloudFileMediaResourceId(datacenterId: Int(value.datacenterId), volumeId: value.volumeId, localId: value.localId, secret: value.secret).uniqueId)
|
||||
case .telegrammediaresourceClouddocumentsizemediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_CloudDocumentSizeMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
return MediaResourceId(CloudDocumentSizeMediaResourceId(datacenterId: Int32(value.datacenterId), documentId: value.documentId, sizeSpec: value.sizeSpec).uniqueId)
|
||||
case .telegrammediaresourceCloudphotosizemediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_CloudPhotoSizeMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
return MediaResourceId(CloudPhotoSizeMediaResourceId(datacenterId: Int32(value.datacenterId), photoId: value.photoId, sizeSpec: value.sizeSpec).uniqueId)
|
||||
case .telegrammediaresourceCloudpeerphotosizemediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_CloudPeerPhotoSizeMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
let sizeSpec: CloudPeerPhotoSizeSpec
|
||||
switch value.sizeSpec {
|
||||
case .small:
|
||||
sizeSpec = .small
|
||||
case .fullSize:
|
||||
sizeSpec = .fullSize
|
||||
}
|
||||
return MediaResourceId(CloudPeerPhotoSizeMediaResourceId(datacenterId: Int32(value.datacenterId), photoId: value.photoId, sizeSpec: sizeSpec, volumeId: value.volumeId, localId: value.localId).uniqueId)
|
||||
case .telegrammediaresourceCloudstickerpackthumbnailmediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_CloudStickerPackThumbnailMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
return MediaResourceId(CloudStickerPackThumbnailMediaResourceId(datacenterId: Int32(value.datacenterId), thumbVersion: value.thumbVersion, volumeId: value.volumeId, localId: value.localId).uniqueId)
|
||||
case .telegrammediaresourceClouddocumentmediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_CloudDocumentMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
return MediaResourceId(CloudDocumentMediaResourceId(datacenterId: Int(value.datacenterId), fileId: value.fileId).uniqueId)
|
||||
case .telegrammediaresourceLocalfilemediaresource:
|
||||
guard let value = self.value(type: TelegramCore_TelegramMediaResource_LocalFileMediaResource.self) else {
|
||||
return MediaResourceId("")
|
||||
}
|
||||
return MediaResourceId(LocalFileMediaResourceId(fileId: value.fileId).uniqueId)
|
||||
case .none_:
|
||||
return MediaResourceId("")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1473,25 +1473,11 @@ public final class InstantPage: PostboxCoding, Equatable {
|
||||
return try InstantPageBlock(flatBuffersObject: flatBuffersObject.blocks(at: i)!)
|
||||
}
|
||||
|
||||
//TODO:release support other media types
|
||||
var media: [MediaId: Media] = [:]
|
||||
for i in 0 ..< flatBuffersObject.mediaCount {
|
||||
let mediaItem = flatBuffersObject.media(at: i)!
|
||||
switch mediaItem.valueType {
|
||||
case .mediaTelegrammediafile:
|
||||
guard let value = mediaItem.value(type: TelegramCore_Media_TelegramMediaFile.self) else {
|
||||
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
|
||||
}
|
||||
let parsedMedia = try TelegramMediaFile(flatBuffersObject: value.file)
|
||||
media[parsedMedia.fileId] = parsedMedia
|
||||
case .mediaTelegrammediaimage:
|
||||
guard let value = mediaItem.value(type: TelegramCore_Media_TelegramMediaImage.self) else {
|
||||
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
|
||||
}
|
||||
let parsedMedia = try TelegramMediaImage(flatBuffersObject: value.image)
|
||||
media[parsedMedia.imageId] = parsedMedia
|
||||
case .none_:
|
||||
throw FlatBuffersError.missingRequiredField(file: #file, line: #line)
|
||||
let parsedMedia = try TelegramMedia_parse(flatBuffersObject: flatBuffersObject.media(at: i)!)
|
||||
if let id = parsedMedia.id {
|
||||
media[id] = parsedMedia
|
||||
}
|
||||
}
|
||||
self.media = media
|
||||
@@ -1510,21 +1496,8 @@ public final class InstantPage: PostboxCoding, Equatable {
|
||||
|
||||
var mediaOffsets: [Offset] = []
|
||||
for (_, media) in self.media.sorted(by: { $0.key < $1.key }) {
|
||||
switch media {
|
||||
case let file as TelegramMediaFile:
|
||||
let fileOffset = file.encodeToFlatBuffers(builder: &builder)
|
||||
let start = TelegramCore_Media_TelegramMediaFile.startMedia_TelegramMediaFile(&builder)
|
||||
TelegramCore_Media_TelegramMediaFile.add(file: fileOffset, &builder)
|
||||
let offset = TelegramCore_Media_TelegramMediaFile.endMedia_TelegramMediaFile(&builder, start: start)
|
||||
mediaOffsets.append(TelegramCore_Media.createMedia(&builder, valueType: .mediaTelegrammediafile, valueOffset: offset))
|
||||
case let image as TelegramMediaImage:
|
||||
let imageOffset = image.encodeToFlatBuffers(builder: &builder)
|
||||
let start = TelegramCore_Media_TelegramMediaImage.startMedia_TelegramMediaImage(&builder)
|
||||
TelegramCore_Media_TelegramMediaImage.add(image: imageOffset, &builder)
|
||||
let offset = TelegramCore_Media_TelegramMediaImage.endMedia_TelegramMediaImage(&builder, start: start)
|
||||
mediaOffsets.append(TelegramCore_Media.createMedia(&builder, valueType: .mediaTelegrammediaimage, valueOffset: offset))
|
||||
default:
|
||||
assertionFailure()
|
||||
if let offset = TelegramMedia_serialize(media: media, flatBuffersBuilder: &builder) {
|
||||
mediaOffsets.append(offset)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1573,13 +1546,88 @@ public extension InstantPage {
|
||||
|
||||
public static func ==(lhs: InstantPage.Accessor, rhs: InstantPage.Accessor) -> Bool {
|
||||
if let lhsWrappedInstantPage = lhs._wrappedInstantPage, let rhsWrappedInstantPage = rhs._wrappedInstantPage {
|
||||
return lhsWrappedInstantPage === rhsWrappedInstantPage
|
||||
return lhsWrappedInstantPage == rhsWrappedInstantPage
|
||||
} else if let lhsWrappedData = lhs._wrappedData, let rhsWrappedData = rhs._wrappedData {
|
||||
return lhsWrappedData == rhsWrappedData
|
||||
} else {
|
||||
assertionFailure()
|
||||
return lhs._parse() == rhs._parse()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public extension InstantPage.Accessor {
|
||||
struct MediaIterator: Sequence, IteratorProtocol {
|
||||
private let accessor: InstantPage.Accessor
|
||||
private var wrappedInstantPageIterator: Dictionary<MediaId, Media>.Iterator?
|
||||
private var wrappedCurrentIndex: Int32 = 0
|
||||
|
||||
init(_ accessor: InstantPage.Accessor) {
|
||||
self.accessor = accessor
|
||||
|
||||
if let wrappedInstantPage = accessor._wrappedInstantPage {
|
||||
self.wrappedInstantPageIterator = wrappedInstantPage.media.makeIterator()
|
||||
} else {
|
||||
self.wrappedInstantPageIterator = nil
|
||||
}
|
||||
}
|
||||
|
||||
mutating public func next() -> (MediaId, TelegramMedia.Accessor)? {
|
||||
if self.wrappedInstantPageIterator != nil {
|
||||
guard let (id, value) = self.wrappedInstantPageIterator!.next() else {
|
||||
return nil
|
||||
}
|
||||
return (id, TelegramMedia.Accessor(value))
|
||||
}
|
||||
|
||||
if self.wrappedCurrentIndex >= self.accessor._wrapped!.mediaCount {
|
||||
return nil
|
||||
}
|
||||
let index = self.wrappedCurrentIndex
|
||||
self.wrappedCurrentIndex += 1
|
||||
let media = self.accessor._wrapped!.media(at: index)!
|
||||
let parsedMedia = TelegramMedia.Accessor(media)
|
||||
if let id = parsedMedia.id {
|
||||
return (id, parsedMedia)
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var isComplete: Bool {
|
||||
if let wrappedInstantPage = self._wrappedInstantPage {
|
||||
return wrappedInstantPage.isComplete
|
||||
}
|
||||
|
||||
return self._wrapped!.isComplete
|
||||
}
|
||||
|
||||
var media: MediaIterator {
|
||||
return MediaIterator(self)
|
||||
}
|
||||
|
||||
var views: Int32? {
|
||||
if let wrappedInstantPage = self._wrappedInstantPage {
|
||||
return wrappedInstantPage.views
|
||||
}
|
||||
|
||||
return self._wrapped!.views == Int32.min ? nil : self._wrapped!.views
|
||||
}
|
||||
|
||||
var url: String {
|
||||
if let wrappedInstantPage = self._wrappedInstantPage {
|
||||
return wrappedInstantPage.url
|
||||
}
|
||||
|
||||
return self._wrapped!.url
|
||||
}
|
||||
|
||||
var rtl: Bool {
|
||||
if let wrappedInstantPage = self._wrappedInstantPage {
|
||||
return wrappedInstantPage.rtl
|
||||
}
|
||||
|
||||
return self._wrapped!.rtl
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import Postbox
|
||||
import FlatBuffers
|
||||
import FlatSerialization
|
||||
|
||||
private enum TelegramMediaWebpageAttributeTypes: Int32 {
|
||||
case unsupported
|
||||
@@ -177,7 +179,7 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable {
|
||||
public let file: TelegramMediaFile?
|
||||
public let story: TelegramMediaStory?
|
||||
public let attributes: [TelegramMediaWebpageAttribute]
|
||||
public let instantPage: InstantPage?
|
||||
public let instantPage: InstantPage.Accessor?
|
||||
|
||||
public init(
|
||||
url: String,
|
||||
@@ -218,7 +220,7 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable {
|
||||
self.file = file
|
||||
self.story = story
|
||||
self.attributes = attributes
|
||||
self.instantPage = instantPage
|
||||
self.instantPage = instantPage.flatMap(InstantPage.Accessor.init)
|
||||
}
|
||||
|
||||
public init(decoder: PostboxDecoder) {
|
||||
@@ -272,8 +274,11 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable {
|
||||
}
|
||||
self.attributes = effectiveAttributes
|
||||
|
||||
if let instantPage = decoder.decodeObjectForKey("ip", decoder: { InstantPage(decoder: $0) }) as? InstantPage {
|
||||
self.instantPage = instantPage
|
||||
if let serializedInstantPageData = decoder.decodeDataForKey("ipd") {
|
||||
var byteBuffer = ByteBuffer(data: serializedInstantPageData)
|
||||
self.instantPage = InstantPage.Accessor(FlatBuffers_getRoot(byteBuffer: &byteBuffer) as TelegramCore_InstantPage, serializedInstantPageData)
|
||||
} else if let instantPage = decoder.decodeObjectForKey("ip", decoder: { InstantPage(decoder: $0) }) as? InstantPage {
|
||||
self.instantPage = InstantPage.Accessor(instantPage)
|
||||
} else {
|
||||
self.instantPage = nil
|
||||
}
|
||||
@@ -355,9 +360,19 @@ public final class TelegramMediaWebpageLoadedContent: PostboxCoding, Equatable {
|
||||
encoder.encodeObjectArray(self.attributes, forKey: "attr")
|
||||
|
||||
if let instantPage = self.instantPage {
|
||||
encoder.encodeObject(instantPage, forKey: "ip")
|
||||
if let instantPageData = instantPage._wrappedData {
|
||||
encoder.encodeData(instantPageData, forKey: "ipd")
|
||||
} else if let instantPage = instantPage._wrappedInstantPage {
|
||||
var builder = FlatBufferBuilder(initialSize: 1024)
|
||||
let value = instantPage.encodeToFlatBuffers(builder: &builder)
|
||||
builder.finish(offset: value)
|
||||
let serializedInstantPage = builder.data
|
||||
encoder.encodeData(serializedInstantPage, forKey: "ipd")
|
||||
} else {
|
||||
preconditionFailure()
|
||||
}
|
||||
} else {
|
||||
encoder.encodeNil(forKey: "ip")
|
||||
encoder.encodeNil(forKey: "ipd")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user