mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
Temp
This commit is contained in:
@@ -1,17 +1,102 @@
|
||||
import Foundation
|
||||
import MurMurHash32
|
||||
|
||||
extension _AdaptedPostboxEncoder {
|
||||
final class UnkeyedContainer {
|
||||
var codingPath: [CodingKey]
|
||||
var userInfo: [CodingUserInfoKey: Any]
|
||||
fileprivate enum Item {
|
||||
case int32(Int32)
|
||||
case int64(Int64)
|
||||
case string(String)
|
||||
case object(Data)
|
||||
case data(Data)
|
||||
}
|
||||
|
||||
let codingPath: [CodingKey]
|
||||
let userInfo: [CodingUserInfoKey: Any]
|
||||
|
||||
fileprivate var items: [Item] = []
|
||||
|
||||
var count: Int {
|
||||
preconditionFailure()
|
||||
return self.items.count
|
||||
}
|
||||
|
||||
init(codingPath: [CodingKey], userInfo: [CodingUserInfoKey : Any]) {
|
||||
self.codingPath = codingPath
|
||||
self.userInfo = userInfo
|
||||
}
|
||||
|
||||
func makeData() -> (Data, ValueType) {
|
||||
if self.items.isEmpty {
|
||||
let buffer = WriteBuffer()
|
||||
|
||||
var length: Int32 = Int32(self.items.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
return (buffer.makeData(), .Int32Array)
|
||||
} else if self.items.allSatisfy({ if case .int32 = $0 { return true } else { return false } }) {
|
||||
let buffer = WriteBuffer()
|
||||
|
||||
var length: Int32 = Int32(self.items.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
for case .int32(var value) in self.items {
|
||||
buffer.write(&value, offset: 0, length: 4)
|
||||
}
|
||||
|
||||
return (buffer.makeData(), .Int32Array)
|
||||
} else if self.items.allSatisfy({ if case .int64 = $0 { return true } else { return false } }) {
|
||||
let buffer = WriteBuffer()
|
||||
|
||||
var length: Int32 = Int32(self.items.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
for case .int64(var value) in self.items {
|
||||
buffer.write(&value, offset: 0, length: 4)
|
||||
}
|
||||
|
||||
return (buffer.makeData(), .Int64Array)
|
||||
} else if self.items.allSatisfy({ if case .string = $0 { return true } else { return false } }) {
|
||||
let buffer = WriteBuffer()
|
||||
|
||||
var length: Int32 = Int32(self.items.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
for case .string(let value) in self.items {
|
||||
let data = value.data(using: .utf8, allowLossyConversion: true) ?? (String("").data(using: .utf8)!)
|
||||
var valueLength: Int32 = Int32(data.count)
|
||||
buffer.write(&valueLength, offset: 0, length: 4)
|
||||
buffer.write(data)
|
||||
}
|
||||
|
||||
return (buffer.makeData(), .StringArray)
|
||||
} else if self.items.allSatisfy({ if case .object = $0 { return true } else { return false } }) {
|
||||
let buffer = WriteBuffer()
|
||||
|
||||
var length: Int32 = Int32(self.items.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
for case .object(let data) in self.items {
|
||||
buffer.write(data)
|
||||
}
|
||||
|
||||
return (buffer.makeData(), .ObjectArray)
|
||||
} else if self.items.allSatisfy({ if case .data = $0 { return true } else { return false } }) {
|
||||
let buffer = WriteBuffer()
|
||||
|
||||
var length: Int32 = Int32(self.items.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
for case .data(let data) in self.items {
|
||||
var valueLength: Int32 = Int32(data.count)
|
||||
buffer.write(&valueLength, offset: 0, length: 4)
|
||||
buffer.write(data)
|
||||
}
|
||||
|
||||
return (buffer.makeData(), .BytesArray)
|
||||
} else {
|
||||
preconditionFailure()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +106,37 @@ extension _AdaptedPostboxEncoder.UnkeyedContainer: UnkeyedEncodingContainer {
|
||||
}
|
||||
|
||||
func encode<T>(_ value: T) throws where T : Encodable {
|
||||
preconditionFailure()
|
||||
let innerEncoder = _AdaptedPostboxEncoder()
|
||||
try! value.encode(to: innerEncoder)
|
||||
|
||||
let (data, _) = innerEncoder.makeData()
|
||||
|
||||
let buffer = WriteBuffer()
|
||||
var typeHash: Int32 = murMurHashString32("\(type(of: value))")
|
||||
buffer.write(&typeHash, offset: 0, length: 4)
|
||||
|
||||
var length: Int32 = Int32(data.count)
|
||||
buffer.write(&length, offset: 0, length: 4)
|
||||
|
||||
buffer.write(data)
|
||||
|
||||
self.items.append(.object(buffer.makeData()))
|
||||
}
|
||||
|
||||
func encode(_ value: Int32) throws {
|
||||
self.items.append(.int32(value))
|
||||
}
|
||||
|
||||
func encode(_ value: Int64) throws {
|
||||
self.items.append(.int64(value))
|
||||
}
|
||||
|
||||
func encode(_ value: String) throws {
|
||||
self.items.append(.string(value))
|
||||
}
|
||||
|
||||
func encode(_ value: Data) throws {
|
||||
self.items.append(.data(value))
|
||||
}
|
||||
|
||||
func nestedContainer<NestedKey>(keyedBy keyType: NestedKey.Type) -> KeyedEncodingContainer<NestedKey> where NestedKey : CodingKey {
|
||||
|
||||
Reference in New Issue
Block a user