summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2016-06-13 19:46:54 -0700
committerGrant Limberg <glimberg@gmail.com>2016-06-13 19:46:54 -0700
commitb085329bca3e1eb1300045bf2cd2df52039e99d9 (patch)
treef07c06414d4b2a8064fe2b1644ac8432bed21d1c
parent188f8021f806ff922924949054b94e53dc0fed30 (diff)
downloadinfinitytier-b085329bca3e1eb1300045bf2cd2df52039e99d9.tar.gz
infinitytier-b085329bca3e1eb1300045bf2cd2df52039e99d9.zip
Base functionality complete. Can join/leave/list networks. Can disconnect from networks without removing them from the network list.
-rw-r--r--ZeroTier One/Network.swift62
-rw-r--r--ZeroTier One/ShowNetworksViewController.swift89
2 files changed, 143 insertions, 8 deletions
diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift
index 4ee2f748..28f3eda6 100644
--- a/ZeroTier One/Network.swift
+++ b/ZeroTier One/Network.swift
@@ -8,7 +8,7 @@
import Cocoa
-enum NetworkStatus : CustomStringConvertible {
+enum NetworkStatus : Int, CustomStringConvertible {
case REQUESTING_CONFIGURATION
case OK
case ACCESS_DENIED
@@ -28,7 +28,7 @@ enum NetworkStatus : CustomStringConvertible {
}
}
-enum NetworkType: CustomStringConvertible {
+enum NetworkType: Int, CustomStringConvertible {
case PUBLIC
case PRIVATE
@@ -40,7 +40,25 @@ enum NetworkType: CustomStringConvertible {
}
}
-class Network: NSObject {
+
+struct PropertyKeys {
+ static let addressesKey = "addresses"
+ static let bridgeKey = "bridge"
+ static let broadcastKey = "broadcast"
+ static let dhcpKey = "dhcp"
+ static let macKey = "mac"
+ static let mtuKey = "mtu"
+ static let multicastKey = "multicast"
+ static let nameKey = "name"
+ static let netconfKey = "netconf"
+ static let nwidKey = "nwid"
+ static let portNameKey = "port"
+ static let portErrorKey = "portError"
+ static let statusKey = "status"
+ static let typeKey = "type"
+}
+
+class Network: NSObject, NSCoding {
var assignedAddresses: [String] = [String]()
var bridge: Bool = false
var broadcastEnabled: Bool = false
@@ -55,6 +73,7 @@ class Network: NSObject {
var portError: Int = 0
var status: NetworkStatus = .REQUESTING_CONFIGURATION
var type: NetworkType = .PRIVATE
+ var connected: Bool = false // NOT PERSISTED. Set to true if loaded via JSON
init(jsonData: [String: AnyObject]) {
super.init()
@@ -108,5 +127,42 @@ class Network: NSObject {
default:
break
}
+
+ // if it's being initialized via JSON, it's connected
+ connected = true
+ }
+
+ required init?(coder aDecoder: NSCoder) {
+ self.assignedAddresses = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String]
+ self.bridge = aDecoder.decodeBoolForKey(PropertyKeys.bridgeKey)
+ self.broadcastEnabled = aDecoder.decodeBoolForKey(PropertyKeys.broadcastKey)
+ self.dhcp = aDecoder.decodeBoolForKey(PropertyKeys.dhcpKey)
+ self.mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String
+ self.mtu = aDecoder.decodeIntegerForKey(PropertyKeys.mtuKey)
+ self.multicastSubscriptions = aDecoder.decodeObjectForKey(PropertyKeys.multicastKey) as! [String]
+ self.name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String
+ self.netconfRevision = aDecoder.decodeIntegerForKey(PropertyKeys.netconfKey)
+ self.nwid = (aDecoder.decodeObjectForKey(PropertyKeys.nwidKey) as! NSNumber).unsignedLongLongValue
+ self.portDeviceName = aDecoder.decodeObjectForKey(PropertyKeys.portNameKey) as! String
+ self.portError = aDecoder.decodeIntegerForKey(PropertyKeys.portErrorKey)
+ self.status = NetworkStatus(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.statusKey))!
+ self.type = NetworkType(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.typeKey))!
+ }
+
+ func encodeWithCoder(aCoder: NSCoder) {
+ aCoder.encodeObject(self.assignedAddresses, forKey: PropertyKeys.addressesKey)
+ aCoder.encodeBool(self.bridge, forKey: PropertyKeys.bridgeKey)
+ aCoder.encodeBool(self.broadcastEnabled, forKey: PropertyKeys.broadcastKey)
+ aCoder.encodeBool(self.dhcp, forKey: PropertyKeys.dhcpKey)
+ aCoder.encodeObject(self.mac, forKey: PropertyKeys.macKey)
+ aCoder.encodeInteger(self.mtu, forKey: PropertyKeys.mtuKey)
+ aCoder.encodeObject(self.multicastSubscriptions, forKey: PropertyKeys.multicastKey)
+ aCoder.encodeObject(self.name, forKey: PropertyKeys.nameKey)
+ aCoder.encodeInteger(self.netconfRevision, forKey: PropertyKeys.netconfKey)
+ aCoder.encodeObject(NSNumber(unsignedLongLong: self.nwid), forKey: PropertyKeys.nwidKey)
+ aCoder.encodeObject(self.portDeviceName, forKey: PropertyKeys.portNameKey)
+ aCoder.encodeInteger(self.portError, forKey: PropertyKeys.portErrorKey)
+ aCoder.encodeInteger(self.status.rawValue, forKey: PropertyKeys.statusKey)
+ aCoder.encodeInteger(self.type.rawValue, forKey: PropertyKeys.typeKey)
}
}
diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift
index 33148f83..ed2479d1 100644
--- a/ZeroTier One/ShowNetworksViewController.swift
+++ b/ZeroTier One/ShowNetworksViewController.swift
@@ -23,19 +23,92 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable
tableView.backgroundColor = NSColor.clearColor()
}
+ 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!
+ }
+
+
+ private func findNetworkWithID(id: UInt64) -> Int {
+
+ for (index, element) in networkList.enumerate() {
+
+ if element.nwid == id {
+ return index
+ }
+ }
+
+ return NSNotFound
+ }
+
override func viewWillAppear() {
super.viewWillAppear()
- ServiceCom.getNetworkList() { (networkList) -> Void in
- NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
- self.networkList = networkList
- self.tableView.reloadData()
+ let filePath = dataFile()
+
+ if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
+ networkList = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network]
+
+ ServiceCom.getNetworkList() { (networkList) -> Void in
+
+ for nw in networkList {
+ let index = self.findNetworkWithID(nw.nwid)
+
+ if index != NSNotFound {
+ self.networkList[index] = nw
+ }
+ else {
+ self.networkList.append(nw)
+ }
+ }
+
+ NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
+ self.networkList.sortInPlace({ (left, right) -> Bool in
+ if left.nwid < right.nwid {
+ return true
+ }
+
+ return false
+ })
+ self.tableView.reloadData()
+ }
+ }
+ }
+ else {
+ ServiceCom.getNetworkList() { (networkList) -> Void in
+ NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
+ self.networkList.sortInPlace({ (left, right) -> Bool in
+ if left.nwid < right.nwid {
+ return true
+ }
+
+ return false
+ })
+
+ self.networkList = networkList
+ self.tableView.reloadData()
+ }
}
}
}
+ override func viewWillDisappear() {
+ super.viewWillDisappear()
+
+ let filePath = dataFile()
+ NSKeyedArchiver.archiveRootObject(self.networkList, toFile: filePath)
+ }
+
func deleteNetworkFromList(nwid: String) {
-
+ if let nwid = UInt64(nwid, radix: 16) {
+ let index = findNetworkWithID(nwid)
+
+ if index != NSNotFound {
+ networkList.removeAtIndex(index)
+ tableView.reloadData()
+ }
+ }
}
// NSTableViewDataSource
@@ -71,6 +144,12 @@ class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTable
cell.addressesField.stringValue += "\n"
}
+ if network.connected {
+ cell.connectedCheckbox.state = NSOnState
+ }
+ else {
+ cell.connectedCheckbox.state = NSOffState
+ }
return cell
}