summaryrefslogtreecommitdiff
path: root/ZeroTier One/NetworkMonitor.swift
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2016-06-16 20:53:55 -0700
committerGrant Limberg <glimberg@gmail.com>2016-06-16 20:53:55 -0700
commitc8f85ffec97206174dbffbf6290ebcdcf84355ac (patch)
tree4fcbbdc014e5bf42edaca8cade22ec3babb632ec /ZeroTier One/NetworkMonitor.swift
parentbae0060552e652559937287f160a550622a5cab8 (diff)
downloadinfinitytier-c8f85ffec97206174dbffbf6290ebcdcf84355ac.tar.gz
infinitytier-c8f85ffec97206174dbffbf6290ebcdcf84355ac.zip
Factored network updates into its own class. Delivered via notification
Diffstat (limited to 'ZeroTier One/NetworkMonitor.swift')
-rw-r--r--ZeroTier One/NetworkMonitor.swift116
1 files changed, 116 insertions, 0 deletions
diff --git a/ZeroTier One/NetworkMonitor.swift b/ZeroTier One/NetworkMonitor.swift
new file mode 100644
index 00000000..124fce26
--- /dev/null
+++ b/ZeroTier One/NetworkMonitor.swift
@@ -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)
+ }
+}