You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
7.3 KiB
229 lines
7.3 KiB
// |
|
// Network.swift |
|
// ZeroTier One |
|
// |
|
// Created by Grant Limberg on 5/17/16. |
|
// Copyright © 2016 ZeroTier, Inc. All rights reserved. |
|
// |
|
|
|
import Cocoa |
|
|
|
enum NetworkStatus : Int, CustomStringConvertible { |
|
case REQUESTING_CONFIGURATION |
|
case OK |
|
case ACCESS_DENIED |
|
case NOT_FOUND |
|
case PORT_ERROR |
|
case CLIENT_TOO_OLD |
|
|
|
var description: String { |
|
switch self { |
|
case .REQUESTING_CONFIGURATION: return "REQUESTING_CONFIGURATION" |
|
case .OK: return "OK" |
|
case .ACCESS_DENIED: return "ACCESS_DENIED" |
|
case .NOT_FOUND: return "NOT_FOUND" |
|
case .PORT_ERROR: return "PORT_ERROR" |
|
case .CLIENT_TOO_OLD: return "CLIENT_TOO_OLD" |
|
} |
|
} |
|
} |
|
|
|
enum NetworkType: Int, CustomStringConvertible { |
|
case PUBLIC |
|
case PRIVATE |
|
|
|
var description: String { |
|
switch self { |
|
case .PUBLIC: return "PUBLIC" |
|
case .PRIVATE: return "PRIVATE" |
|
} |
|
} |
|
} |
|
|
|
|
|
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 |
|
var dhcp: Bool = false |
|
var mac: String = "" |
|
var mtu: Int = 0 |
|
var name: String = "" |
|
var netconfRevision: Int = 232 |
|
var nwid: UInt64 = 0 |
|
var portDeviceName: String = "" |
|
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() |
|
|
|
if let aa = jsonData["assignedAddresses"] as? [String] { |
|
for a in aa { |
|
assignedAddresses.append(a) |
|
} |
|
} |
|
|
|
if let b = jsonData["bridge"] as? NSNumber { |
|
bridge = b.boolValue |
|
} |
|
|
|
if let b = jsonData["broadcastEnabled"] as? NSNumber { |
|
broadcastEnabled = b.boolValue |
|
} |
|
|
|
if let d = jsonData["dhcp"] as? NSNumber { |
|
dhcp = d.boolValue |
|
} |
|
|
|
if let m = jsonData["mac"] as? String { |
|
mac = m |
|
} |
|
|
|
if let m = jsonData["mtu"] as? NSNumber { |
|
mtu = m.integerValue |
|
} |
|
|
|
if let n = jsonData["name"] as? String { |
|
name = n |
|
} |
|
|
|
if let n = jsonData["netconfRevision"] as? NSNumber { |
|
netconfRevision = n.integerValue |
|
} |
|
|
|
if let n = UInt64((jsonData["nwid"] as! String), radix: 16) { |
|
nwid = n |
|
} |
|
|
|
if let p = jsonData["portDeviceName"] as? String { |
|
portDeviceName = p |
|
} |
|
|
|
if let p = jsonData["portError"] as? NSNumber { |
|
portError = p.integerValue |
|
} |
|
|
|
if let statusStr = jsonData["status"] as? String { |
|
switch statusStr { |
|
case "REQUESTING_CONFIGURATION": |
|
status = .REQUESTING_CONFIGURATION |
|
case "OK": |
|
status = .OK |
|
case "ACCESS_DENIED": |
|
status = .ACCESS_DENIED |
|
case "NOT_FOUND": |
|
status = .NOT_FOUND |
|
case "PORT_ERROR": |
|
status = .PORT_ERROR |
|
case "CLIENT_TOO_OLD": |
|
status = .CLIENT_TOO_OLD |
|
default: |
|
break |
|
} |
|
} |
|
|
|
if let typeStr = jsonData["type"] as? String { |
|
switch typeStr { |
|
case "PRIVATE": |
|
type = .PRIVATE |
|
case "PUBLIC": |
|
type = .PUBLIC |
|
default: |
|
break |
|
} |
|
} |
|
|
|
// if it's being initialized via JSON, it's connected |
|
connected = true |
|
} |
|
|
|
required init?(coder aDecoder: NSCoder) { |
|
if aDecoder.containsValueForKey(PropertyKeys.addressesKey) { |
|
self.assignedAddresses = aDecoder.decodeObjectForKey(PropertyKeys.addressesKey) as! [String] |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.bridgeKey) { |
|
self.bridge = aDecoder.decodeBoolForKey(PropertyKeys.bridgeKey) |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.broadcastKey) { |
|
self.broadcastEnabled = aDecoder.decodeBoolForKey(PropertyKeys.broadcastKey) |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.dhcpKey) { |
|
self.dhcp = aDecoder.decodeBoolForKey(PropertyKeys.dhcpKey) |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.macKey) { |
|
self.mac = aDecoder.decodeObjectForKey(PropertyKeys.macKey) as! String |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.mtuKey) { |
|
self.mtu = aDecoder.decodeIntegerForKey(PropertyKeys.mtuKey) |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.nameKey) { |
|
self.name = aDecoder.decodeObjectForKey(PropertyKeys.nameKey) as! String |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.netconfKey) { |
|
self.netconfRevision = aDecoder.decodeIntegerForKey(PropertyKeys.netconfKey) |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.nwidKey) { |
|
self.nwid = (aDecoder.decodeObjectForKey(PropertyKeys.nwidKey) as! NSNumber).unsignedLongLongValue |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.portNameKey) { |
|
self.portDeviceName = aDecoder.decodeObjectForKey(PropertyKeys.portNameKey) as! String |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.portErrorKey) { |
|
self.portError = aDecoder.decodeIntegerForKey(PropertyKeys.portErrorKey) |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.statusKey) { |
|
self.status = NetworkStatus(rawValue: aDecoder.decodeIntegerForKey(PropertyKeys.statusKey))! |
|
} |
|
|
|
if aDecoder.containsValueForKey(PropertyKeys.typeKey) { |
|
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.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) |
|
} |
|
}
|
|
|