6 changed files with 145 additions and 81 deletions
@ -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…
Reference in new issue