summaryrefslogtreecommitdiff
path: root/ZeroTier One
diff options
context:
space:
mode:
authorGrant Limberg <glimberg@gmail.com>2016-08-07 17:25:34 -0700
committerGrant Limberg <glimberg@gmail.com>2016-08-07 17:25:34 -0700
commita91187e60ef1f022b9ed19f85d0650e000de3c7b (patch)
tree4e9494a0baa344c8e50e6a06b092d01f86da37d4 /ZeroTier One
parent179324e44af06fbdb9316e9c1ef6f2f70e61eb5c (diff)
downloadinfinitytier-a91187e60ef1f022b9ed19f85d0650e000de3c7b.tar.gz
infinitytier-a91187e60ef1f022b9ed19f85d0650e000de3c7b.zip
Convert NetworkMonitor to obj-c
Diffstat (limited to 'ZeroTier One')
-rw-r--r--ZeroTier One/Network.m10
-rw-r--r--ZeroTier One/NetworkMonitor.h35
-rw-r--r--ZeroTier One/NetworkMonitor.m200
-rw-r--r--ZeroTier One/NetworkMonitor.swift164
-rw-r--r--ZeroTier One/ZeroTier One-Bridging-Header.h1
5 files changed, 241 insertions, 169 deletions
diff --git a/ZeroTier One/Network.m b/ZeroTier One/Network.m
index 5e759574..30b3f884 100644
--- a/ZeroTier One/Network.m
+++ b/ZeroTier One/Network.m
@@ -155,7 +155,7 @@ NSString *NetworkAllowDefaultKey = @"allowDefault";
}
if([aDecoder containsValueForKey:NetworkMtuKey]) {
- _mtu = [aDecoder decodeIntegerForKey:NetworkMtuKey];
+ _mtu = (int)[aDecoder decodeIntegerForKey:NetworkMtuKey];
}
if([aDecoder containsValueForKey:NetworkNameKey]) {
@@ -163,7 +163,7 @@ NSString *NetworkAllowDefaultKey = @"allowDefault";
}
if([aDecoder containsValueForKey:NetworkNetconfKey]) {
- _netconfRevision = [aDecoder decodeIntegerForKey:NetworkNetconfKey];
+ _netconfRevision = (int)[aDecoder decodeIntegerForKey:NetworkNetconfKey];
}
if([aDecoder containsValueForKey:NetworkNwidKey]) {
@@ -175,15 +175,15 @@ NSString *NetworkAllowDefaultKey = @"allowDefault";
}
if([aDecoder containsValueForKey:NetworkPortErrorKey]) {
- _portError = [aDecoder decodeIntegerForKey:NetworkPortErrorKey];
+ _portError = (int)[aDecoder decodeIntegerForKey:NetworkPortErrorKey];
}
if([aDecoder containsValueForKey:NetworkStatusKey]) {
- _status = [aDecoder decodeIntegerForKey:NetworkStatusKey];
+ _status = (enum NetworkStatus)[aDecoder decodeIntegerForKey:NetworkStatusKey];
}
if([aDecoder containsValueForKey:NetworkTypeKey]) {
- _type = [aDecoder decodeIntegerForKey:NetworkTypeKey];
+ _type = (enum NetworkType)[aDecoder decodeIntegerForKey:NetworkTypeKey];
}
if([aDecoder containsValueForKey:NetworkAllowManagedKey]) {
diff --git a/ZeroTier One/NetworkMonitor.h b/ZeroTier One/NetworkMonitor.h
new file mode 100644
index 00000000..0bd94814
--- /dev/null
+++ b/ZeroTier One/NetworkMonitor.h
@@ -0,0 +1,35 @@
+//
+// NetworkMonitor.h
+// ZeroTier One
+//
+// Created by Grant Limberg on 8/7/16.
+// Copyright © 2016 ZeroTier, Inc. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+extern NSString * const NetworkUpdateKey;
+extern NSString * const StatusUpdateKey;
+
+@class Network;
+
+@interface NetworkMonitor : NSObject
+{
+ NSMutableArray<Network*> *_savedNetworks;
+ NSArray<Network*> *_receivedNetworks;
+ NSMutableArray<Network*> *_allNetworks;
+
+ NSTimer *_timer;
+}
+
+- (id)init;
+- (void)dealloc;
+
+- (void)start;
+- (void)stop;
+
+- (void)updateNetworkInfo;
+
+- (void)deleteSavedNetwork:(NSString*)networkId;
+
+@end
diff --git a/ZeroTier One/NetworkMonitor.m b/ZeroTier One/NetworkMonitor.m
new file mode 100644
index 00000000..466d7db1
--- /dev/null
+++ b/ZeroTier One/NetworkMonitor.m
@@ -0,0 +1,200 @@
+//
+// NetworkMonitor.m
+// ZeroTier One
+//
+// Created by Grant Limberg on 8/7/16.
+// Copyright © 2016 ZeroTier, Inc. All rights reserved.
+//
+
+#import "NetworkMonitor.h"
+#import "Network.h"
+#import "ServiceCom.h"
+#import "NodeStatus.h"
+
+NSString * const NetworkUpdateKey = @"com.zerotier.one.network-list";
+NSString * const StatusUpdateKey = @"com.zerotier.one.status";
+
+@interface NetworkMonitor (private)
+
+- (NSString*)dataFile;
+- (void)internal_updateNetworkInfo;
+- (NSInteger)findNetworkWithID:(UInt64)networkId;
+- (NSInteger)findSavedNetworkWithID:(UInt64)networkId;
+- (void)saveNetworks;
+
+@end
+
+@implementation NetworkMonitor
+
+- (id)init
+{
+ self = [super init];
+ if(self)
+ {
+ _savedNetworks = [NSMutableArray<Network*> array];
+ _receivedNetworks = [NSArray<Network*> array];
+ _allNetworks = [NSMutableArray<Network*> array];
+ _timer = nil;
+ }
+
+ return self;
+}
+
+- (void)dealloc
+{
+ [_timer invalidate];
+}
+
+- (void)start
+{
+ NSLog(@"ZeroTier monitor started");
+ _timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
+ target:self
+ selector:@selector(updateNetworkInfo)
+ userInfo:nil
+ repeats:YES];
+}
+
+- (void)stop
+{
+ NSLog(@"ZeroTier monitor stopped");
+ [_timer invalidate];
+ _timer = nil;
+}
+
+- (void)updateNetworkInfo
+{
+ NSString *filePath = [self dataFile];
+
+ if([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
+ NSArray<Network*> *networks = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
+
+ if(networks != nil) {
+ _savedNetworks = [networks mutableCopy];
+ }
+ }
+
+ [[ServiceCom sharedInstance] getNetworklist:^(NSArray<Network *> *networkList) {
+ _receivedNetworks = networkList;
+
+ [[NSOperationQueue mainQueue] addOperationWithBlock:^{
+ [self internal_updateNetworkInfo];
+ }];
+ }];
+
+ [[ServiceCom sharedInstance] getNodeStatus:^(NodeStatus *status) {
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObject:status forKey:@"status"];
+
+ [[NSOperationQueue mainQueue] addOperationWithBlock:^{
+ [[NSNotificationCenter defaultCenter] postNotificationName:StatusUpdateKey
+ object:nil
+ userInfo:userInfo];
+ }];
+ }];
+}
+
+- (void)deleteSavedNetwork:(NSString*)networkId
+{
+ UInt64 nwid = 0;
+ NSScanner *scanner = [NSScanner scannerWithString:networkId];
+ [scanner scanHexLongLong:&nwid];
+
+ NSInteger index = [self findNetworkWithID:nwid];
+
+ if(index != NSNotFound) {
+ [_allNetworks removeObjectAtIndex:index];
+ }
+
+ index = [self findSavedNetworkWithID:nwid];
+
+ if(index != NSNotFound) {
+ [_savedNetworks removeObjectAtIndex:index];
+ }
+
+ [self saveNetworks];
+}
+
+@end
+
+@implementation NetworkMonitor (private)
+- (NSString*)dataFile
+{
+ NSURL *appSupport = [[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
+ inDomains:NSUserDomainMask] objectAtIndex:0];
+
+ appSupport = [[[appSupport URLByAppendingPathComponent:@"ZeroTier"] URLByAppendingPathComponent:@"One"] URLByAppendingPathComponent:@"networkinfo.dat"];
+ return appSupport.path;
+}
+
+- (void)internal_updateNetworkInfo
+{
+ NSMutableArray<Network*> *networks = [_savedNetworks mutableCopy];
+
+ for(Network *nw in _receivedNetworks) {
+ NSInteger index = [self findSavedNetworkWithID:nw.nwid];
+
+ if(index != NSNotFound) {
+ [networks setObject:nw atIndexedSubscript:index];
+ }
+ else {
+ [networks addObject:nw];
+ }
+ }
+
+ [networks sortUsingComparator:^NSComparisonResult(Network *obj1, Network *obj2) {
+ if(obj1.nwid > obj2.nwid) {
+ return true;
+ }
+ return false;
+ }];
+
+ @synchronized(_allNetworks) {
+ _allNetworks = networks;
+ }
+
+ [self saveNetworks];
+
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObject:networks forKey:@"networks"];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName:NetworkUpdateKey
+ object:nil
+ userInfo:userInfo];
+}
+
+- (NSInteger)findNetworkWithID:(UInt64)networkId
+{
+ for(int i = 0; i < [_allNetworks count]; ++i) {
+ Network *nw = [_allNetworks objectAtIndex:i];
+
+ if(nw.nwid == networkId) {
+ return i;
+ }
+ }
+
+ return NSNotFound;
+}
+
+
+- (NSInteger)findSavedNetworkWithID:(UInt64)networkId
+{
+ for(int i = 0; i < [_savedNetworks count]; ++i) {
+ Network *nw = [_savedNetworks objectAtIndex:i];
+
+ if(nw.nwid == networkId) {
+ return i;
+ }
+ }
+
+ return NSNotFound;
+}
+
+- (void)saveNetworks
+{
+ NSString *filePath = [self dataFile];
+
+ @synchronized(_allNetworks) {
+ [NSKeyedArchiver archiveRootObject:_allNetworks toFile:filePath];
+ }
+}
+
+@end \ No newline at end of file
diff --git a/ZeroTier One/NetworkMonitor.swift b/ZeroTier One/NetworkMonitor.swift
deleted file mode 100644
index fda45ea4..00000000
--- a/ZeroTier One/NetworkMonitor.swift
+++ /dev/null
@@ -1,164 +0,0 @@
-//
-// 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"
-let statusUpdateKey = "com.zerotier.one.status"
-
-class NetworkMonitor: NSObject {
-
- var timer: NSTimer? = nil
-
- var savedNetworks: [Network] = [Network]()
- var receivedNetworks: [Network] = [Network]()
- var allNetworks: [Network] = [Network]()
-
- override init() {
- super.init()
- }
-
- deinit {
- timer?.invalidate()
- }
-
- func start() {
- NSLog("ZeroTier monitor started")
- timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
- target: self,
- selector: #selector(updateNetworkInfo),
- userInfo: nil,
- repeats: true)
- }
-
-
- func stop() {
- NSLog("ZeroTier monitor stopped")
- timer?.invalidate()
- timer = nil
- }
-
- 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() {
- //NSLog("updateNetworkInfo")
- let filePath = dataFile()
-
- if NSFileManager.defaultManager().fileExistsAtPath(filePath) {
- let networks = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! [Network]
-
- self.savedNetworks.removeAll()
-
- for n in networks {
- self.savedNetworks.append(n)
- }
- }
-
- ServiceCom.sharedInstance().getNetworklist() { (networkList) -> Void in
- self.receivedNetworks = networkList
-
- NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
- self.internal_updateNetworkInfo()
- }
- }
-
- ServiceCom.sharedInstance().getNodeStatus() { nodeStatus -> Void in
- NSOperationQueue.mainQueue().addOperationWithBlock() { () -> Void in
- let nc = NSNotificationCenter.defaultCenter()
-
- nc.postNotificationName(statusUpdateKey, object: nil, userInfo: ["status": nodeStatus])
- }
- }
- }
-
- func deleteSavedNetwork(nwid: String) {
- if let nwid = UInt64(nwid, radix: 16) {
- let index = findNetworkWithID(nwid)
-
- if index != NSNotFound {
- allNetworks.removeAtIndex(index)
- }
-
- let index2 = findSavedNetworkWithID(nwid)
-
- if index2 != NSNotFound {
- savedNetworks.removeAtIndex(index2)
- }
- }
-
- saveNetworks()
- }
-
- // Only to be called by updateNetworkInfo()
- private func internal_updateNetworkInfo() {
- var networks = self.savedNetworks
-
- for nw in receivedNetworks {
- let index = findSavedNetworkWithID(nw.nwid)
-
- if index != NSNotFound {
- networks[index] = nw
- }
- else {
- networks.append(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 findSavedNetworkWithID(nwid: UInt64) -> Int {
- for (index, element) in savedNetworks.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)
- }
-}
diff --git a/ZeroTier One/ZeroTier One-Bridging-Header.h b/ZeroTier One/ZeroTier One-Bridging-Header.h
index 3068e515..0ce854bc 100644
--- a/ZeroTier One/ZeroTier One-Bridging-Header.h
+++ b/ZeroTier One/ZeroTier One-Bridging-Header.h
@@ -8,3 +8,4 @@
#import "ServiceCom.h"
#import "AboutViewController.h"
#import "PreferencesViewController.h"
+#import "NetworkMonitor.h"