Swiftgram/TelegramCore/CallSessionManager.swift
2017-04-08 17:23:13 +03:00

81 lines
1.7 KiB
Swift

import Foundation
#if os(macOS)
import PostboxMac
import MtProtoKitMac
import SwiftSignalKitMac
#else
import Postbox
import MtProtoKitDynamic
import SwiftSignalKit
#endif
private struct CallSessionId: Hashable {
let id: Int64
init(_ id: Int64) {
self.id = id
}
var hashValue: Int {
return self.id.hashValue
}
static func ==(lhs: CallSessionId, rhs: CallSessionId) -> Bool {
return lhs.id == rhs.id
}
}
private final class CallSessionContext {
let peerId: PeerId
var state: CallSessionState
init(peerId: PeerId, state: CallSessionState) {
self.peerId = peerId
self.state = state
}
}
private final class CallSessionManagerContext {
private let queue: Queue
private var contexts: [CallSessionId: CallSessionContext] = [:]
init(queue: Queue) {
self.queue = queue
}
deinit {
assert(self.queue.isCurrent())
}
}
final class CallSessionManager {
private let queue = Queue()
private var contextRef: Unmanaged<CallSessionManagerContext>?
init() {
self.queue.async {
let context = CallSessionManagerContext(queue: self.queue)
self.contextRef = Unmanaged.passRetained(context)
}
}
deinit {
let contextRef = self.contextRef
self.queue.async {
contextRef?.release()
}
}
private func withContext(_ f: @escaping (CallSessionManagerContext) -> Void) {
self.queue.async {
if let contextRef = self.contextRef {
let context = contextRef.takeUnretainedValue()
f(context)
}
}
}
}