ShowNetworksViewController.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. //
  2. // ShowNetworksViewController.swift
  3. // ZeroTier One
  4. //
  5. // Created by Grant Limberg on 5/14/16.
  6. // Copyright © 2016 ZeroTier, Inc. All rights reserved.
  7. //
  8. import Cocoa
  9. class ShowNetworksViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
  10. @IBOutlet var tableView: NSTableView!
  11. var networkList: [Network] = [Network]()
  12. var timer: NSTimer? = nil
  13. override func viewDidLoad() {
  14. super.viewDidLoad()
  15. // Do view setup here.
  16. tableView.setDelegate(self)
  17. tableView.setDataSource(self)
  18. tableView.backgroundColor = NSColor.clearColor()
  19. }
  20. private func dataFile() -> String {
  21. var appSupport = NSFileManager.defaultManager().URLsForDirectory(.ApplicationSupportDirectory, inDomains: .UserDomainMask)[0]
  22. appSupport = appSupport.URLByAppendingPathComponent("ZeroTier").URLByAppendingPathComponent("One").URLByAppendingPathComponent("networks.dat")
  23. return appSupport.path!
  24. }
  25. private func findNetworkWithID(id: UInt64) -> Int {
  26. for (index, element) in networkList.enumerate() {
  27. if element.nwid == id {
  28. return index
  29. }
  30. }
  31. return NSNotFound
  32. }
  33. override func viewWillAppear() {
  34. super.viewWillAppear()
  35. updateNetworkInfo()
  36. self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: #selector(updateNetworkInfo), userInfo: nil, repeats: true)
  37. }
  38. override func viewWillDisappear() {
  39. super.viewWillDisappear()
  40. self.timer?.invalidate()
  41. let filePath = dataFile()
  42. NSKeyedArchiver.archiveRootObject(self.networkList, toFile: filePath)
  43. }
  44. func deleteNetworkFromList(nwid: String) {
  45. if let nwid = UInt64(nwid, radix: 16) {
  46. let index = findNetworkWithID(nwid)
  47. if index != NSNotFound {
  48. networkList.removeAtIndex(index)
  49. tableView.reloadData()
  50. }
  51. }
  52. }
  53. func updateNetworkInfo() {
  54. let filePath = self.dataFile()
  55. if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
  56. self.networkList = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network]
  57. ServiceCom.getNetworkList() { (networkList) -> Void in
  58. for nw in networkList {
  59. let index = self.findNetworkWithID(nw.nwid)
  60. if index != NSNotFound {
  61. self.networkList[index] = nw
  62. }
  63. else {
  64. self.networkList.append(nw)
  65. }
  66. }
  67. NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
  68. self.networkList.sortInPlace({ (left, right) -> Bool in
  69. if left.nwid < right.nwid {
  70. return true
  71. }
  72. return false
  73. })
  74. self.tableView.reloadData()
  75. }
  76. }
  77. }
  78. else {
  79. ServiceCom.getNetworkList() { (networkList) -> Void in
  80. NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
  81. self.networkList.sortInPlace({ (left, right) -> Bool in
  82. if left.nwid < right.nwid {
  83. return true
  84. }
  85. return false
  86. })
  87. self.networkList = networkList
  88. self.tableView.reloadData()
  89. }
  90. }
  91. }
  92. }
  93. // NSTableViewDataSource
  94. func numberOfRowsInTableView(tableView: NSTableView) -> Int {
  95. return networkList.count
  96. }
  97. // end NSTableViewDataSource
  98. // NSTableViewDelegate
  99. func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView? {
  100. if let cell = tableView.makeViewWithIdentifier("NetworkInfoCell", owner: nil) as? NetworkInfoCell {
  101. let network = networkList[row]
  102. cell.parent = self
  103. cell.networkIdField.stringValue = String(network.nwid, radix: 16)
  104. cell.networkNameField.stringValue = network.name
  105. cell.statusField.stringValue = network.status.description
  106. cell.typeField.stringValue = network.type.description
  107. cell.macField.stringValue = network.mac
  108. cell.mtuField.stringValue = String(network.mtu)
  109. cell.broadcastField.stringValue = network.broadcastEnabled ? "ENABLED" : "DISABLED"
  110. cell.bridgingField.stringValue = network.bridge ? "ENABLED" : "DISABLED"
  111. cell.deviceField.stringValue = network.portDeviceName
  112. cell.addressesField.stringValue = ""
  113. for nw in network.assignedAddresses {
  114. cell.addressesField.stringValue += nw
  115. cell.addressesField.stringValue += "\n"
  116. }
  117. if network.connected {
  118. cell.connectedCheckbox.state = NSOnState
  119. }
  120. else {
  121. cell.connectedCheckbox.state = NSOffState
  122. }
  123. return cell
  124. }
  125. return nil
  126. }
  127. // end NSTableViewDelegate
  128. }