From dcf0ecd0877c4bbfdd54d487956d5a222b27dc53 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 18 Apr 2022 23:26:42 +0400 Subject: [PATCH 1/4] Debug: print open file list --- .../Postbox/Sources/TimeBasedCleanup.swift | 58 ++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/submodules/Postbox/Sources/TimeBasedCleanup.swift b/submodules/Postbox/Sources/TimeBasedCleanup.swift index 6f46d82a2c..2510fad261 100644 --- a/submodules/Postbox/Sources/TimeBasedCleanup.swift +++ b/submodules/Postbox/Sources/TimeBasedCleanup.swift @@ -13,6 +13,58 @@ private struct ScanFilesResult { var totalSize: UInt64 = 0 } +private func printOpenFiles() { + var flags: Int32 = 0 + var fd: Int32 = 0 + var buf = Data(count: Int(MAXPATHLEN) + 1) + + while fd < FD_SETSIZE { + errno = 0; + flags = fcntl(fd, F_GETFD, 0); + if flags == -1 && errno != 0 { + if errno != EBADF { + return + } else { + continue + } + } + + buf.withUnsafeMutableBytes { buffer -> Void in + let _ = fcntl(fd, F_GETPATH, buffer.baseAddress!) + let string = String(cString: buffer.baseAddress!.assumingMemoryBound(to: CChar.self)) + print(string) + } + + fd += 1 + } +} + +/* + +(void) lsof + { + int flags; + int fd; + char buf[MAXPATHLEN+1] ; + int n = 1 ; + + for (fd = 0; fd < (int) FD_SETSIZE; fd++) { + errno = 0; + flags = fcntl(fd, F_GETFD, 0); + if (flags == -1 && errno) { + if (errno != EBADF) { + return ; + } + else + continue; + } + fcntl(fd , F_GETPATH, buf ) ; + NSLog( @"File Descriptor %d number %d in use for: %s",fd,n , buf ) ; + ++n ; + } + } + + */ + private func scanFiles(at path: String, olderThan minTimestamp: Int32, inodes: inout [InodeInfo]) -> ScanFilesResult { var result = ScanFilesResult() @@ -208,8 +260,12 @@ private final class TimeBasedCleanupImpl { mapFiles(paths: paths, inodes: &inodes, removeSize: totalLimitSize - bytesLimit) } + #if DEBUG + //printOpenFiles() + #endif + if removedShortLivedCount != 0 || removedGeneralCount != 0 || removedGeneralLimitCount != 0 { - print("[TimeBasedCleanup] \(CFAbsoluteTimeGetCurrent() - startTime) s removed \(removedShortLivedCount) short-lived files, \(removedGeneralCount) general files, \(removedGeneralLimitCount) limit files") + postboxLog("[TimeBasedCleanup] \(CFAbsoluteTimeGetCurrent() - startTime) s removed \(removedShortLivedCount) short-lived files, \(removedGeneralCount) general files, \(removedGeneralLimitCount) limit files") } subscriber.putCompletion() } From c879e53158868ac8764e7b1df1227b43b28efdb7 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Mon, 18 Apr 2022 23:26:55 +0400 Subject: [PATCH 2/4] Remove debugging --- submodules/TelegramVoip/Sources/GroupCallContext.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/submodules/TelegramVoip/Sources/GroupCallContext.swift b/submodules/TelegramVoip/Sources/GroupCallContext.swift index f3165ef105..00c5c23326 100644 --- a/submodules/TelegramVoip/Sources/GroupCallContext.swift +++ b/submodules/TelegramVoip/Sources/GroupCallContext.swift @@ -144,9 +144,9 @@ final class NetworkBroadcastPartSource: BroadcastPartSource { } |> deliverOn(self.queue) - #if DEBUG + /*#if DEBUG let debugDumpDirectory = self.debugDumpDirectory - #endif + #endif*/ return signal.start(next: { result in guard let result = result else { completion(OngoingGroupCallBroadcastPart(timestampMilliseconds: timestampIdMilliseconds, responseTimestamp: Double(timestampIdMilliseconds), status: .notReady, oggData: Data())) @@ -155,11 +155,11 @@ final class NetworkBroadcastPartSource: BroadcastPartSource { let part: OngoingGroupCallBroadcastPart switch result.status { case let .data(dataValue): - #if DEBUG + /*#if DEBUG let tempFilePath = debugDumpDirectory.path + "/\(timestampMilliseconds).mp4" let _ = try? dataValue.subdata(in: 32 ..< dataValue.count).write(to: URL(fileURLWithPath: tempFilePath)) print("Dump stream part: \(tempFilePath)") - #endif + #endif*/ part = OngoingGroupCallBroadcastPart(timestampMilliseconds: timestampIdMilliseconds, responseTimestamp: result.responseTimestamp, status: .success, oggData: dataValue) case .notReady: part = OngoingGroupCallBroadcastPart(timestampMilliseconds: timestampIdMilliseconds, responseTimestamp: result.responseTimestamp, status: .notReady, oggData: Data()) From 990cfe7aad596a21bac843b292f96a8afd7fe6d9 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 19 Apr 2022 10:45:20 +0400 Subject: [PATCH 3/4] Increase animation duration --- submodules/ContextUI/Sources/ContextController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/submodules/ContextUI/Sources/ContextController.swift b/submodules/ContextUI/Sources/ContextController.swift index 78a9855c95..05886acf23 100644 --- a/submodules/ContextUI/Sources/ContextController.swift +++ b/submodules/ContextUI/Sources/ContextController.swift @@ -880,7 +880,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi if let validLayout = self.validLayout { self.updateLayout( layout: validLayout, - transition: .animated(duration: 0.25, curve: .easeInOut), + transition: .animated(duration: 0.35, curve: .easeInOut), previousActionsContainerNode: nil ) } From a3aba873305378c2b39b78ae92d4d3d8b54bde21 Mon Sep 17 00:00:00 2001 From: Ali <> Date: Tue, 19 Apr 2022 23:26:29 +0400 Subject: [PATCH 4/4] Voip updates --- .../Sources/CallKitIntegration.swift | 2 +- .../Sources/State/CallSessionManager.swift | 9 +++-- .../TelegramUI/Sources/AppDelegate.swift | 22 ++++++++++++ .../Sources/OngoingCallContext.swift | 18 +++++++++- .../Sources/OngoingCallThreadLocalContext.mm | 36 ++++++++++++------- submodules/TgVoipWebrtc/tgcalls | 2 +- third-party/webrtc/BUILD | 4 +++ 7 files changed, 76 insertions(+), 17 deletions(-) diff --git a/submodules/TelegramCallsUI/Sources/CallKitIntegration.swift b/submodules/TelegramCallsUI/Sources/CallKitIntegration.swift index 3e5259e716..edef84fe11 100644 --- a/submodules/TelegramCallsUI/Sources/CallKitIntegration.swift +++ b/submodules/TelegramCallsUI/Sources/CallKitIntegration.swift @@ -81,7 +81,7 @@ public final class CallKitIntegration { } } - func dropCall(uuid: UUID) { + public func dropCall(uuid: UUID) { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { (sharedProviderDelegate as? CallKitProviderDelegate)?.dropCall(uuid: uuid) } diff --git a/submodules/TelegramCore/Sources/State/CallSessionManager.swift b/submodules/TelegramCore/Sources/State/CallSessionManager.swift index 1f7e2ebeff..234b29fc0c 100644 --- a/submodules/TelegramCore/Sources/State/CallSessionManager.swift +++ b/submodules/TelegramCore/Sources/State/CallSessionManager.swift @@ -537,9 +537,14 @@ private final class CallSessionManagerContext { guard let strongSelf = self else { return } - strongSelf.contexts.removeValue(forKey: internalId) - strongSelf.contextIdByStableId.removeValue(forKey: stableId) + context.state = .terminated(id: nil, accessHash: nil, reason: .ended(.missed), reportRating: false, sendDebugLogs: false) + strongSelf.contextUpdated(internalId: internalId) strongSelf.ringingStatesUpdated() + if context.isEmpty { + strongSelf.contexts.removeValue(forKey: internalId) + } + + strongSelf.contextIdByStableId.removeValue(forKey: stableId) } })) self.contextIdByStableId[stableId] = internalId diff --git a/submodules/TelegramUI/Sources/AppDelegate.swift b/submodules/TelegramUI/Sources/AppDelegate.swift index 7804de99ff..4beacfcc2b 100644 --- a/submodules/TelegramUI/Sources/AppDelegate.swift +++ b/submodules/TelegramUI/Sources/AppDelegate.swift @@ -247,6 +247,7 @@ private func extractAccountManagerState(records: AccountRecordsView? private let voipTokenPromise = Promise() @@ -1582,14 +1583,35 @@ private func extractAccountManagerState(records: AccountRecordsView take(1) |> deliverOnMainQueue).start(next: { activeAccounts in + var processed = false for (_, context, _) in activeAccounts.accounts { if context.account.id == accountId { context.account.stateManager.processIncomingCallUpdate(data: updateData, completion: { _ in }) + //callUpdate.callId + let disposable = MetaDisposable() + self.watchedCallsDisposables.add(disposable) + + disposable.set((context.account.callSessionManager.callState(internalId: CallSessionManager.getStableIncomingUUID(stableId: callUpdate.callId)) + |> deliverOnMainQueue).start(next: { state in + switch state.state { + case .terminated: + callKitIntegration.dropCall(uuid: CallSessionManager.getStableIncomingUUID(stableId: callUpdate.callId)) + default: + break + } + })) + + processed = true + break } } + + if !processed { + callKitIntegration.dropCall(uuid: CallSessionManager.getStableIncomingUUID(stableId: callUpdate.callId)) + } }) sharedApplicationContext.wakeupManager.allowBackgroundTimeExtension(timeout: 2.0) diff --git a/submodules/TelegramVoip/Sources/OngoingCallContext.swift b/submodules/TelegramVoip/Sources/OngoingCallContext.swift index 68860c76e2..e1e177c300 100644 --- a/submodules/TelegramVoip/Sources/OngoingCallContext.swift +++ b/submodules/TelegramVoip/Sources/OngoingCallContext.swift @@ -18,8 +18,19 @@ private func callConnectionDescription(_ connection: CallSessionConnection) -> O private func callConnectionDescriptionsWebrtc(_ connection: CallSessionConnection) -> [OngoingCallConnectionDescriptionWebrtc] { switch connection { - case .reflector: + case let .reflector(reflector): + #if DEBUG + var result: [OngoingCallConnectionDescriptionWebrtc] = [] + if !reflector.ip.isEmpty { + result.append(OngoingCallConnectionDescriptionWebrtc(connectionId: reflector.id, hasStun: false, hasTurn: true, ip: reflector.ip, port: reflector.port, username: "reflector", password: hexString(reflector.peerTag))) + } + if !reflector.ipv6.isEmpty { + result.append(OngoingCallConnectionDescriptionWebrtc(connectionId: reflector.id, hasStun: false, hasTurn: true, ip: reflector.ipv6, port: reflector.port, username: "reflector", password: hexString(reflector.peerTag))) + } + return result + #else return [] + #endif case let .webRtcReflector(reflector): var result: [OngoingCallConnectionDescriptionWebrtc] = [] if !reflector.ip.isEmpty { @@ -686,6 +697,11 @@ public final class OngoingCallContext { let _ = setupLogs OngoingCallThreadLocalContext.applyServerConfig(serializedData) + #if DEBUG + let version = "4.1.2" + let allowP2P = false + #endif + self.internalId = internalId self.account = account self.callSessionManager = callSessionManager diff --git a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm index 8f6e7c171e..290fbe744d 100644 --- a/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm +++ b/submodules/TgVoipWebrtc/Sources/OngoingCallThreadLocalContext.mm @@ -5,6 +5,7 @@ #import "Instance.h" #import "InstanceImpl.h" #import "v2/InstanceV2Impl.h" +#import "v2/InstanceV2ReferenceImpl.h" #import "v2_4_0_0/InstanceV2_4_0_0Impl.h" #include "StaticThreads.h" @@ -800,14 +801,29 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; return 92; } ++ (void)ensureRegisteredImplementations { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + tgcalls::Register(); + tgcalls::Register(); + tgcalls::Register(); + tgcalls::Register(); + }); +} + + (NSArray * _Nonnull)versionsWithIncludeReference:(bool)includeReference { + [self ensureRegisteredImplementations]; + NSMutableArray *list = [[NSMutableArray alloc] init]; - [list addObject:@"2.7.7"]; - [list addObject:@"3.0.0"]; - if (includeReference) { - [list addObject:@"4.0.0"]; + + for (const auto &version : tgcalls::Meta::Versions()) { + [list addObject:[NSString stringWithUTF8String:version.c_str()]]; } - [list addObject:@"4.0.1"]; + + [list sortUsingComparator:^NSComparisonResult(NSString * _Nonnull lhs, NSString * _Nonnull rhs) { + return [lhs compare:rhs]; + }]; + return list; } @@ -915,15 +931,11 @@ static void (*InternalVoipLoggingFunction)(NSString *) = NULL; tgcalls::EncryptionKey encryptionKey(encryptionKeyValue, isOutgoing); - __weak OngoingCallThreadLocalContextWebrtc *weakSelf = self; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - tgcalls::Register(); - tgcalls::Register(); - tgcalls::Register(); - }); + [OngoingCallThreadLocalContextWebrtc ensureRegisteredImplementations]; + __weak OngoingCallThreadLocalContextWebrtc *weakSelf = self; _tgVoip = tgcalls::Meta::Create([version UTF8String], (tgcalls::Descriptor){ + .version = [version UTF8String], .config = config, .persistentState = (tgcalls::PersistentState){ derivedStateValue }, .endpoints = endpoints, diff --git a/submodules/TgVoipWebrtc/tgcalls b/submodules/TgVoipWebrtc/tgcalls index b7460dd957..3ce2c38805 160000 --- a/submodules/TgVoipWebrtc/tgcalls +++ b/submodules/TgVoipWebrtc/tgcalls @@ -1 +1 @@ -Subproject commit b7460dd9572173aed1e3838f5eb33b813a1e6b31 +Subproject commit 3ce2c38805ea5af7a05b8fe93a26becaf9e76bd3 diff --git a/third-party/webrtc/BUILD b/third-party/webrtc/BUILD index e4fb9b3fc4..61971e0edb 100644 --- a/third-party/webrtc/BUILD +++ b/third-party/webrtc/BUILD @@ -3256,6 +3256,7 @@ common_flags = [ "-DWEBRTC_USE_H264", "-DHAVE_SCTP", "-DWEBRTC_HAVE_USRSCTP", + "-DWEBRTC_HAVE_SCTP", "-Ithird-party/openh264", "-DWEBRTC_NS_FLOAT", "-DRTC_DISABLE_TRACE_EVENTS", @@ -3392,6 +3393,7 @@ cc_library( "-DPACKAGE_VERSION=''", "-DHAVE_SCTP", "-DWEBRTC_HAVE_USRSCTP", + "-DWEBRTC_HAVE_SCTP", "-DNON_WINDOWS_DEFINE", ] + arch_specific_cflags + optimization_flags, visibility = ["//visibility:public"], @@ -3472,6 +3474,7 @@ cc_library( "-DPACKAGE_STRING='\"\"'", "-DHAVE_SCTP", "-DWEBRTC_HAVE_USRSCTP", + "-DWEBRTC_HAVE_SCTP", ] + arch_specific_cflags + optimization_flags, deps = [ "//third-party/boringssl:crypto", @@ -3522,6 +3525,7 @@ objc_library( "-DPACKAGE_VERSION='\"\"'", "-DHAVE_SCTP", "-DWEBRTC_HAVE_USRSCTP", + "-DWEBRTC_HAVE_SCTP", "-DNO_MAIN_THREAD_WRAPPING", "-DRTC_DISABLE_TRACE_EVENTS", "-DRTC_DISABLE_METRICS",