mirror of
https://github.com/ZeroTier/ZeroTierOne
synced 2025-07-16 10:03:14 -07:00
Factored network updates into its own class. Delivered via notification
This commit is contained in:
parent
bae0060552
commit
c8f85ffec9
6 changed files with 145 additions and 81 deletions
116
ZeroTier One/NetworkMonitor.swift
Normal file
116
ZeroTier One/NetworkMonitor.swift
Normal file
|
@ -0,0 +1,116 @@
|
|||
//
|
||||
// NetworkMonitor.swift
|
||||
// ZeroTier One
|
||||
//
|
||||
// Created by Grant Limberg on 6/16/16.
|
||||
// Copyright © 2016 ZeroTier, Inc. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
let networkUpdateKey = "com.zerotier.one.network-list"
|
||||
|
||||
class NetworkMonitor: NSObject {
|
||||
|
||||
var timer: NSTimer? = nil
|
||||
|
||||
var savedNetworks: [Network] = [Network]()
|
||||
var receivedNetworks: [Network] = [Network]()
|
||||
var allNetworks: [Network] = [Network]()
|
||||
|
||||
override init() {
|
||||
super.init()
|
||||
|
||||
timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
|
||||
target: self,
|
||||
selector: #selector(updateNetworkInfo),
|
||||
userInfo: nil,
|
||||
repeats: true)
|
||||
}
|
||||
|
||||
deinit {
|
||||
timer?.invalidate()
|
||||
}
|
||||
|
||||
private func dataFile() -> String {
|
||||
var appSupport = NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask)[0]
|
||||
appSupport = appSupport.URLByAppendingPathComponent("ZeroTier").URLByAppendingPathComponent("One").URLByAppendingPathComponent("networks.dat")
|
||||
return appSupport.path!
|
||||
}
|
||||
|
||||
func updateNetworkInfo() {
|
||||
let filePath = dataFile()
|
||||
|
||||
if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
|
||||
self.savedNetworks = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network]
|
||||
|
||||
}
|
||||
|
||||
ServiceCom.getNetworkList() { (networkList) -> Void in
|
||||
self.receivedNetworks = networkList
|
||||
|
||||
NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
|
||||
self.internal_updateNetworkInfo()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func deleteSavedNetwork(nwid: String) {
|
||||
if let nwid = UInt64(nwid, radix: 16) {
|
||||
let index = findNetworkWithID(nwid)
|
||||
|
||||
if index != NSNotFound {
|
||||
allNetworks.removeAtIndex(index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Only to be called by updateNetworkInfo()
|
||||
private func internal_updateNetworkInfo() {
|
||||
var networks = self.savedNetworks
|
||||
|
||||
for nw in receivedNetworks {
|
||||
let index = findNetworkWithID(nw.nwid)
|
||||
|
||||
if index != NSNotFound {
|
||||
networks[index] = nw
|
||||
}
|
||||
networks.sortInPlace({ (left, right) -> Bool in
|
||||
if left.nwid < right.nwid {
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
})
|
||||
|
||||
objc_sync_enter(allNetworks)
|
||||
allNetworks = networks
|
||||
objc_sync_exit(allNetworks)
|
||||
|
||||
saveNetworks()
|
||||
|
||||
let nc = NSNotificationCenter.defaultCenter()
|
||||
|
||||
nc.postNotificationName(networkUpdateKey, object: nil, userInfo: ["networks": networks])
|
||||
}
|
||||
}
|
||||
|
||||
private func findNetworkWithID(nwid: UInt64) -> Int {
|
||||
for (index, element) in allNetworks.enumerate() {
|
||||
|
||||
if element.nwid == nwid {
|
||||
return index
|
||||
}
|
||||
}
|
||||
|
||||
return NSNotFound
|
||||
}
|
||||
|
||||
private func saveNetworks() {
|
||||
let file = dataFile()
|
||||
|
||||
objc_sync_enter(allNetworks)
|
||||
NSKeyedArchiver.archiveRootObject(self.allNetworks, toFile: file)
|
||||
objc_sync_exit(allNetworks)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue