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 }