From d5620288d56085e749c04ae5bb9908a61238aaa4 Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Tue, 17 May 2016 19:41:54 -0700 Subject: [PATCH] Parse JSON network list into Network objects for the view --- ZeroTier One.xcodeproj/project.pbxproj | 4 + ZeroTier One/Network.swift | 112 ++++++++++++++++++ ZeroTier One/ServiceCom.swift | 13 +- ZeroTier One/ShowNetworksViewController.swift | 23 +++- ZeroTier One/ShowNetworksViewController.xib | 48 +------- 5 files changed, 151 insertions(+), 49 deletions(-) create mode 100644 ZeroTier One/Network.swift diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index d0441a5cb..0fcc78605 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 9330F1351CEAB4C400687EC8 /* ServiceCom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */; }; + 9330F1371CEBF87200687EC8 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9330F1361CEBF87200687EC8 /* Network.swift */; }; 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */; }; 93326BDE1CE7C816005CA2AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDD1CE7C816005CA2AC /* Assets.xcassets */; }; 93326BE11CE7C816005CA2AC /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BDF1CE7C816005CA2AC /* MainMenu.xib */; }; @@ -19,6 +20,7 @@ /* Begin PBXFileReference section */ 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ServiceCom.swift; sourceTree = ""; }; + 9330F1361CEBF87200687EC8 /* Network.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; 93326BD81CE7C816005CA2AC /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 93326BDD1CE7C816005CA2AC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -62,6 +64,7 @@ children = ( 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, 93326BE81CE7D9B9005CA2AC /* JoinNetworkViewController.swift */, + 9330F1361CEBF87200687EC8 /* Network.swift */, 93326BEC1CE7DA30005CA2AC /* ShowNetworksViewController.swift */, 9330F1341CEAB4C400687EC8 /* ServiceCom.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, @@ -145,6 +148,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9330F1371CEBF87200687EC8 /* Network.swift in Sources */, 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, 93326BEA1CE7D9B9005CA2AC /* JoinNetworkViewController.swift in Sources */, 93326BEE1CE7DA30005CA2AC /* ShowNetworksViewController.swift in Sources */, diff --git a/ZeroTier One/Network.swift b/ZeroTier One/Network.swift new file mode 100644 index 000000000..4ee2f7486 --- /dev/null +++ b/ZeroTier One/Network.swift @@ -0,0 +1,112 @@ +// +// Network.swift +// ZeroTier One +// +// Created by Grant Limberg on 5/17/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +import Cocoa + +enum NetworkStatus : 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: CustomStringConvertible { + case PUBLIC + case PRIVATE + + var description: String { + switch self { + case .PUBLIC: return "PUBLIC" + case .PRIVATE: return "PRIVATE" + } + } +} + +class Network: NSObject { + var assignedAddresses: [String] = [String]() + var bridge: Bool = false + var broadcastEnabled: Bool = false + var dhcp: Bool = false + var mac: String = "" + var mtu: Int = 0 + var multicastSubscriptions: [String] = [String]() + 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 + + init(jsonData: [String: AnyObject]) { + super.init() + + let aa = jsonData["assignedAddresses"] as! [String] + for a in aa { + assignedAddresses.append(a) + } + + bridge = (jsonData["bridge"] as! NSNumber).boolValue + broadcastEnabled = (jsonData["broadcastEnabled"] as! NSNumber).boolValue + dhcp = (jsonData["dhcp"] as! NSNumber).boolValue + mac = jsonData["mac"] as! String + mtu = (jsonData["mtu"] as! NSNumber).integerValue + + let multSubs = jsonData["multicastSubscriptions"] as! [String] + for ms in multSubs { + multicastSubscriptions.append(ms) + } + + name = jsonData["name"] as! String + netconfRevision = (jsonData["netconfRevision"] as! NSNumber).integerValue + nwid = UInt64((jsonData["nwid"] as! String), radix: 16)! + portDeviceName = jsonData["portDeviceName"] as! String + portError = (jsonData["portError"] as! NSNumber).integerValue + + 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 + } + + let typeStr = jsonData["type"] as! String + switch typeStr { + case "PRIVATE": + type = .PRIVATE + case "PUBLIC": + type = .PUBLIC + default: + break + } + } +} diff --git a/ZeroTier One/ServiceCom.swift b/ZeroTier One/ServiceCom.swift index a1bb0a3c2..bdb59792a 100644 --- a/ZeroTier One/ServiceCom.swift +++ b/ZeroTier One/ServiceCom.swift @@ -12,7 +12,7 @@ class ServiceCom: NSObject { static let baseURL = "http://localhost:9993" static var key: NSString? = "ddeb3b1e6996b6b4f2d12d10" - static func getNetworkList() { + static func getNetworkList(completionHandler: ([Network]) -> Void) { let urlString = baseURL + "/network?auth=\(ServiceCom.key!)" @@ -27,11 +27,16 @@ class ServiceCom: NSObject { if status == 200 { do { - let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) - print("\(json)") + let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions()) as! [[String: AnyObject]] + + var networks = [Network]() + for jobj in json { + networks.append(Network(jsonData: jobj)) + } + + completionHandler(networks) } catch { - print("JSON Error: \(error)") } } } diff --git a/ZeroTier One/ShowNetworksViewController.swift b/ZeroTier One/ShowNetworksViewController.swift index 0e8fd4b6b..d914c30e3 100644 --- a/ZeroTier One/ShowNetworksViewController.swift +++ b/ZeroTier One/ShowNetworksViewController.swift @@ -8,19 +8,36 @@ import Cocoa -class ShowNetworksViewController: NSViewController { +class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource { @IBOutlet var tableView: NSTableView! + var networkList: [Network] = [Network]() + override func viewDidLoad() { super.viewDidLoad() // Do view setup here. + + tableView.setDelegate(self) + tableView.setDataSource(self) } override func viewWillAppear() { super.viewWillAppear() - ServiceCom.getNetworkList() + ServiceCom.getNetworkList() { (networkList) -> Void in + NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in + self.networkList = networkList + self.tableView.reloadData() + } + } } - + + // NSTableViewDataSource + + func numberOfRowsInTableView(tableView: NSTableView) -> Int { + return networkList.count + } + + // end NSTableViewDataSource } diff --git a/ZeroTier One/ShowNetworksViewController.xib b/ZeroTier One/ShowNetworksViewController.xib index e17bc5a97..fcc6cbfa7 100644 --- a/ZeroTier One/ShowNetworksViewController.xib +++ b/ZeroTier One/ShowNetworksViewController.xib @@ -20,17 +20,17 @@ - + - - + + - + @@ -44,7 +44,7 @@ - + @@ -62,44 +62,12 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -