Warning, /network/kdeconnect-ios/KDE Connect/KDE Connect/Swift Backend/NetworkChangeMonitor.swift is written in an unsupported language. File is not indexed.
0001 /* 0002 * SPDX-FileCopyrightText: 2023 Apollo Zhu <public-apollonian@outlook.com> 0003 * 0004 * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL 0005 */ 0006 0007 // Original header below: 0008 // 0009 // NetworkChangeMonitor.swift 0010 // KDE Connect 0011 // 0012 // Created by Apollo Zhu on 3/1/23. 0013 // 0014 0015 import Network 0016 import Combine 0017 0018 @objc 0019 public protocol NetworkChangeMonitorDelegate: AnyObject { 0020 func onNetworkChange() 0021 } 0022 0023 @objcMembers 0024 public class NetworkChangeMonitor: NSObject { 0025 private let monitor = NWPathMonitor() 0026 private let queue = DispatchQueue(label: "org.kde.kdeconnect.queue.NetworkChangeMonitor") 0027 private var isMonitoring = false 0028 private let publisher = PassthroughSubject<NWPath, Never>() 0029 private var cancellables = Set<AnyCancellable>() 0030 0031 private let logger = Logger() 0032 0033 public weak var delegate: NetworkChangeMonitorDelegate? 0034 0035 public func startMonitoring() { 0036 isMonitoring = true 0037 monitor.start(queue: queue) 0038 monitor.pathUpdateHandler = { [weak self] path in 0039 self?.publisher.send(path) 0040 } 0041 publisher 0042 .removeDuplicates { 0043 // The default NWPath equality changes even for the same network 0044 // so use a less strict equality comparison that's good enough 0045 $0.status == $1.status 0046 && $0.isExpensive == $1.isConstrained 0047 && $0.isConstrained == $1.isConstrained 0048 && $0.gateways == $1.gateways 0049 && $0.supportsDNS == $1.supportsDNS 0050 && $0.supportsIPv4 == $1.supportsIPv4 0051 && $0.supportsIPv6 == $1.supportsIPv6 0052 } 0053 .dropFirst() // ignore when first open app 0054 .sink { [weak self, logger] path in 0055 logger.debug("\(path.debugDescription)") 0056 self?.delegate?.onNetworkChange() 0057 } 0058 .store(in: &cancellables) 0059 } 0060 0061 public func stopMonitoring() { 0062 isMonitoring = false 0063 monitor.cancel() 0064 } 0065 0066 deinit { 0067 stopMonitoring() 0068 } 0069 }