From 8d7f851b4e5938d06f1f8da03a249303b2ffd3cd Mon Sep 17 00:00:00 2001 From: Grant Limberg Date: Sun, 7 Aug 2016 20:19:36 -0700 Subject: Now translated. One minor crash to figure out. --- ZeroTier One.xcodeproj/project.pbxproj | 16 +- ZeroTier One/AppDelegate.h | 51 +++++ ZeroTier One/AppDelegate.m | 281 ++++++++++++++++++++++++++++ ZeroTier One/AppDelegate.swift | 264 -------------------------- ZeroTier One/Base.lproj/MainMenu.xib | 5 +- ZeroTier One/JoinNetworkViewController.xib | 2 +- ZeroTier One/ZeroTier One-Bridging-Header.h | 14 -- ZeroTier One/main.m | 13 ++ 8 files changed, 358 insertions(+), 288 deletions(-) create mode 100644 ZeroTier One/AppDelegate.h create mode 100644 ZeroTier One/AppDelegate.m delete mode 100644 ZeroTier One/AppDelegate.swift delete mode 100644 ZeroTier One/ZeroTier One-Bridging-Header.h create mode 100644 ZeroTier One/main.m diff --git a/ZeroTier One.xcodeproj/project.pbxproj b/ZeroTier One.xcodeproj/project.pbxproj index e3b9f551..49587b99 100644 --- a/ZeroTier One.xcodeproj/project.pbxproj +++ b/ZeroTier One.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 932D472F1D1CD499004BCFE2 /* ZeroTierIcon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */; }; 932D47331D1CD861004BCFE2 /* PreferencesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */; }; 932D47371D1CDC9B004BCFE2 /* AboutViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 932D47351D1CDC9B004BCFE2 /* AboutViewController.xib */; }; - 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 */; }; 93326BEB1CE7D9B9005CA2AC /* JoinNetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */; }; @@ -24,6 +23,8 @@ 93D167731D58093C00330C99 /* NetworkInfoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D167721D58093C00330C99 /* NetworkInfoCell.m */; }; 93D167761D580C3500330C99 /* ShowNetworksViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D167751D580C3500330C99 /* ShowNetworksViewController.m */; }; 93D167791D5815E600330C99 /* JoinNetworkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D167781D5815E600330C99 /* JoinNetworkViewController.m */; }; + 93D1677C1D58228A00330C99 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D1677B1D58228A00330C99 /* AppDelegate.m */; }; + 93D1679B1D58300F00330C99 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D1679A1D58300F00330C99 /* main.m */; }; 93DAFB271D3F0BEE004D5417 /* about.html in Resources */ = {isa = PBXBuildFile; fileRef = 93DAFB261D3F0BEE004D5417 /* about.html */; }; 93DAFE4B1CFE53CA00547CC4 /* AuthtokenCopy.m in Sources */ = {isa = PBXBuildFile; fileRef = 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */; }; /* End PBXBuildFile section */ @@ -33,7 +34,6 @@ 932D47311D1CD861004BCFE2 /* PreferencesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PreferencesViewController.xib; sourceTree = ""; }; 932D47351D1CDC9B004BCFE2 /* AboutViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AboutViewController.xib; 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 = ""; }; 93326BE01CE7C816005CA2AC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 93326BE21CE7C816005CA2AC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -57,8 +57,10 @@ 93D167751D580C3500330C99 /* ShowNetworksViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShowNetworksViewController.m; sourceTree = ""; }; 93D167771D5815E600330C99 /* JoinNetworkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JoinNetworkViewController.h; sourceTree = ""; }; 93D167781D5815E600330C99 /* JoinNetworkViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JoinNetworkViewController.m; sourceTree = ""; }; + 93D1677A1D58228A00330C99 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 93D1677B1D58228A00330C99 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 93D1679A1D58300F00330C99 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 93DAFB261D3F0BEE004D5417 /* about.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = about.html; sourceTree = ""; }; - 93DAFE491CFE53C900547CC4 /* ZeroTier One-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "ZeroTier One-Bridging-Header.h"; sourceTree = ""; }; 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AuthtokenCopy.m; sourceTree = ""; }; 93DAFE4C1CFE53DA00547CC4 /* AuthtokenCopy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuthtokenCopy.h; sourceTree = ""; }; /* End PBXFileReference section */ @@ -94,13 +96,11 @@ isa = PBXGroup; children = ( 932D472E1D1CD499004BCFE2 /* ZeroTierIcon.icns */, - 93326BDB1CE7C816005CA2AC /* AppDelegate.swift */, 93326BDD1CE7C816005CA2AC /* Assets.xcassets */, 93326BDF1CE7C816005CA2AC /* MainMenu.xib */, 93326BE21CE7C816005CA2AC /* Info.plist */, 93DAFE4A1CFE53CA00547CC4 /* AuthtokenCopy.m */, 93DAFE4C1CFE53DA00547CC4 /* AuthtokenCopy.h */, - 93DAFE491CFE53C900547CC4 /* ZeroTier One-Bridging-Header.h */, 93D1676E1D57FD3800330C99 /* NetworkMonitor.h */, 93D1676F1D57FD3800330C99 /* NetworkMonitor.m */, 93DAFB261D3F0BEE004D5417 /* about.html */, @@ -124,6 +124,9 @@ 93D167771D5815E600330C99 /* JoinNetworkViewController.h */, 93D167781D5815E600330C99 /* JoinNetworkViewController.m */, 93326BE91CE7D9B9005CA2AC /* JoinNetworkViewController.xib */, + 93D1677A1D58228A00330C99 /* AppDelegate.h */, + 93D1677B1D58228A00330C99 /* AppDelegate.m */, + 93D1679A1D58300F00330C99 /* main.m */, ); path = "ZeroTier One"; sourceTree = ""; @@ -204,14 +207,15 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 93D1679B1D58300F00330C99 /* main.m in Sources */, 93D167621D541BC200330C99 /* ServiceCom.m in Sources */, 93D167761D580C3500330C99 /* ShowNetworksViewController.m in Sources */, - 93326BDC1CE7C816005CA2AC /* AppDelegate.swift in Sources */, 93DAFE4B1CFE53CA00547CC4 /* AuthtokenCopy.m in Sources */, 93D167701D57FD3800330C99 /* NetworkMonitor.m in Sources */, 93D1675F1D54191C00330C99 /* NodeStatus.m in Sources */, 93D167691D57E7EA00330C99 /* AboutViewController.m in Sources */, 93D1676D1D57EB8400330C99 /* PreferencesViewController.m in Sources */, + 93D1677C1D58228A00330C99 /* AppDelegate.m in Sources */, 93D167731D58093C00330C99 /* NetworkInfoCell.m in Sources */, 93D167661D54308200330C99 /* Network.m in Sources */, 93D167791D5815E600330C99 /* JoinNetworkViewController.m in Sources */, diff --git a/ZeroTier One/AppDelegate.h b/ZeroTier One/AppDelegate.h new file mode 100644 index 00000000..efd1b313 --- /dev/null +++ b/ZeroTier One/AppDelegate.h @@ -0,0 +1,51 @@ +// +// AppDelegate.h +// ZeroTier One +// +// Created by Grant Limberg on 8/7/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +#import + +@class NetworkMonitor; +@class Network; +@class NodeStatus; + +@interface AppDelegate : NSObject + +@property (weak, nonatomic) IBOutlet NSWindow *window; + +@property (nonatomic) NSStatusItem *statusItem; + +@property (nonatomic) NSPopover *networkListPopover; +@property (nonatomic) NSPopover *joinNetworkPopover; +@property (nonatomic) NSPopover *preferencesPopover; +@property (nonatomic) NSPopover *aboutPopover; + +@property (nonatomic) id transientMonitor; + +@property (nonatomic) NetworkMonitor *monitor; + +@property (nonatomic) NSMutableArray *networks; + +@property (nonatomic) NodeStatus *status; + +@property (nonatomic) NSPasteboard *pasteboard; + +- (void)buildMenu; + +- (void)onNetworkListUpdated:(NSNotification*)note; +- (void)onNodeStatusUpdated:(NSNotification*)note; + +- (void)showNetworks; +- (void)joinNetwork; +- (void)showPreferences; +- (void)showAbout; +- (void)quit; +- (void)toggleNetwork:(NSMenuItem*)sender; +- (void)copyNodeID; +- (void)menuWillOpen:(NSMenu*)menu; +- (void)menuDidClose:(NSMenu*)menu; + +@end diff --git a/ZeroTier One/AppDelegate.m b/ZeroTier One/AppDelegate.m new file mode 100644 index 00000000..13c70262 --- /dev/null +++ b/ZeroTier One/AppDelegate.m @@ -0,0 +1,281 @@ +// +// AppDelegate.m +// ZeroTier One +// +// Created by Grant Limberg on 8/7/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +#import "AppDelegate.h" +#import "NetworkMonitor.h" +#import "Network.h" +#import "NodeStatus.h" +#import "JoinNetworkViewController.h" +#import "ShowNetworksViewController.h" +#import "PreferencesViewController.h" +#import "AboutViewController.h" +#import "ServiceCom.h" + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { + self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:-2.0f]; + self.networkListPopover = [[NSPopover alloc] init]; + self.joinNetworkPopover = [[NSPopover alloc] init]; + self.preferencesPopover = [[NSPopover alloc] init]; + self.aboutPopover = [[NSPopover alloc] init]; + self.transientMonitor = nil; + self.monitor = [[NetworkMonitor alloc] init]; + self.networks = [NSMutableArray array]; + self.status = nil; + self.pasteboard = [NSPasteboard generalPasteboard]; + + [self.pasteboard declareTypes:[NSArray arrayWithObject:NSPasteboardTypeString] owner:nil]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + NSDictionary *defaultsDict = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:@"firstRun"]; + [defaults registerDefaults:defaultsDict]; + + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; + + [nc addObserver:self + selector:@selector(onNetworkListUpdated:) + name:NetworkUpdateKey + object:nil]; + [nc addObserver:self + selector:@selector(onNodeStatusUpdated:) + name:StatusUpdateKey + object:nil]; + + self.statusItem.image = [NSImage imageNamed:@"MenuBarIconMac"]; + + [self buildMenu]; + + self.joinNetworkPopover.contentViewController = [[JoinNetworkViewController alloc] initWithNibName:@"JoinNetworkViewController" bundle:nil]; + self.joinNetworkPopover.behavior = NSPopoverBehaviorTransient; + + ShowNetworksViewController *showNetworksView = [[ShowNetworksViewController alloc] initWithNibName:@"ShowNetworksViewController" bundle:nil]; + showNetworksView.netMonitor = self.monitor; + self.networkListPopover.contentViewController = showNetworksView; + self.networkListPopover.behavior = NSPopoverBehaviorTransient; + + PreferencesViewController *prefsView = [[PreferencesViewController alloc] initWithNibName:@"PreferencesViewController" bundle:nil]; + self.preferencesPopover.contentViewController = prefsView; + self.preferencesPopover.behavior = NSPopoverBehaviorTransient; + + self.aboutPopover.contentViewController = [[AboutViewController alloc] initWithNibName:@"AboutViewController" bundle:nil]; + self.aboutPopover.behavior = NSPopoverBehaviorTransient; + + BOOL firstRun = [defaults boolForKey:@"firstRun"]; + + if(firstRun) { + [defaults setBool:NO forKey:@"firstRun"]; + [defaults synchronize]; + + [prefsView setLaunchAtLoginEnabled:YES]; + + [[NSOperationQueue mainQueue] addOperationWithBlock:^{ + [self showAbout]; + }]; + } + + [self.monitor updateNetworkInfo]; + [self.monitor start]; +} + +- (void)applicationWillTerminate:(NSNotification *)aNotification { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +- (void)showNetworks { + if(self.statusItem.button != nil) { + NSStatusBarButton *button = self.statusItem.button; + [self.networkListPopover showRelativeToRect:button.bounds + ofView:button + preferredEdge:NSMinYEdge]; + + if(self.transientMonitor == nil) { + self.transientMonitor = + [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDown|NSRightMouseDown|NSOtherMouseDown) + handler:^(NSEvent * _Nonnull e) { + [NSEvent removeMonitor:self.transientMonitor]; + self.transientMonitor = nil; + [self.networkListPopover close]; + }]; + } + } +} + +- (void)joinNetwork { + if(self.statusItem.button != nil) { + NSStatusBarButton *button = self.statusItem.button; + [self.joinNetworkPopover showRelativeToRect:button.bounds + ofView:button + preferredEdge:NSMinYEdge]; + if(self.transientMonitor == nil) { + self.transientMonitor = + [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDown|NSRightMouseDown|NSOtherMouseDown) + handler:^(NSEvent * _Nonnull e) { + [NSEvent removeMonitor:self.transientMonitor]; + self.transientMonitor = nil; + [self.joinNetworkPopover close]; + }]; + } + } +} + +- (void)showPreferences { + if(self.statusItem.button != nil) { + NSStatusBarButton *button = self.statusItem.button; + [self.preferencesPopover showRelativeToRect:button.bounds + ofView:button + preferredEdge:NSMinYEdge]; + if(self.transientMonitor == nil) { + [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDown|NSRightMouseDown|NSOtherMouseDown) + handler:^(NSEvent * _Nonnull e) { + [NSEvent removeMonitor:self.transientMonitor]; + self.transientMonitor = nil; + [self.preferencesPopover close]; + }]; + } + } +} + +- (void)showAbout { + if(self.statusItem.button != nil) { + NSStatusBarButton *button = self.statusItem.button; + [self.aboutPopover showRelativeToRect:button.bounds + ofView:button + preferredEdge:NSMinYEdge]; + if(self.transientMonitor == nil) { + [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDown|NSRightMouseDown|NSOtherMouseDown) + handler:^(NSEvent * _Nonnull e) { + [NSEvent removeMonitor:self.transientMonitor]; + self.transientMonitor = nil; + [self.aboutPopover close]; + }]; + } + } + +} + +- (void)quit { + [NSApp performSelector:@selector(terminate:) withObject:nil afterDelay:0.0]; +} + +- (void)onNetworkListUpdated:(NSNotification*)note { + NSArray *netList = [note.userInfo objectForKey:@"networks"]; + [(ShowNetworksViewController*)self.networkListPopover.contentViewController setNetworks:netList]; + self.networks = [netList mutableCopy]; + + [self buildMenu]; +} + +- (void)onNodeStatusUpdated:(NSNotification*)note { + NodeStatus *status = [note.userInfo objectForKey:@"status"]; + self.status = status; + + [self buildMenu]; +} + +- (void)buildMenu { + NSMenu *menu = [[NSMenu alloc] init]; + menu.delegate = self; + + if(self.status != nil) { + NSString *nodeId = @"Node ID: "; + nodeId = [nodeId stringByAppendingString:self.status.address]; + [menu addItem:[[NSMenuItem alloc] initWithTitle:nodeId + action:@selector(copyNodeID) + keyEquivalent:@""]]; + [menu addItem:[NSMenuItem separatorItem]]; + } + + [menu addItem:[[NSMenuItem alloc] initWithTitle:@"Network Details..." + action:@selector(showNetworks) + keyEquivalent:@"n"]]; + [menu addItem:[[NSMenuItem alloc] initWithTitle:@"Join Network..." + action:@selector(joinNetwork) + keyEquivalent:@"j"]]; + + [menu addItem:[NSMenuItem separatorItem]]; + + if([self.networks count] > 0) { + for(Network *net in self.networks) { + NSString *nwid = [NSString stringWithFormat:@"%10llx", net.nwid]; + NSString *networkName = @""; + if([net.name lengthOfBytesUsingEncoding:NSUTF8StringEncoding] == 0) { + networkName = nwid; + } + else { + networkName = [NSString stringWithFormat:@"%@ (%@)", nwid, net.name]; + } + + if(net.allowDefault && net.connected) { + networkName = [networkName stringByAppendingString:@" [default]"]; + } + + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:networkName + action:@selector(toggleNetwork:) + keyEquivalent:@""]; + if(net.connected) { + item.state = NSOnState; + } + else { + item.state = NSOffState; + } + + item.representedObject = net; + + [menu addItem:item]; + } + + [menu addItem:[NSMenuItem separatorItem]]; + } + + [menu addItem:[[NSMenuItem alloc] initWithTitle:@"About ZeroTier One..." + action:@selector(showAbout) + keyEquivalent:@""]]; + [menu addItem:[[NSMenuItem alloc] initWithTitle:@"Preferences..." + action:@selector(showPreferences) + keyEquivalent:@""]]; + + [menu addItem:[NSMenuItem separatorItem]]; + + [menu addItem:[[NSMenuItem alloc] initWithTitle:@"Quit" + action:@selector(quit) + keyEquivalent:@"q"]]; + + self.statusItem.menu = menu; +} + +- (void)toggleNetwork:(NSMenuItem*)sender { + Network *network = sender.representedObject; + NSString *nwid = [NSString stringWithFormat:@"%10llx", network.nwid]; + + if(network.connected) { + [[ServiceCom sharedInstance] leaveNetwork:nwid]; + } + else { + [[ServiceCom sharedInstance] joinNetwork:nwid + allowManaged:network.allowManaged + allowGlobal:network.allowGlobal + allowDefault:(network.allowDefault && ![Network defaultRouteExists:self.networks])]; + } +} + +- (void)copyNodeID { + if(self.status != nil) { + [self.pasteboard setString:self.status.address forType:NSPasteboardTypeString]; + } +} + +- (void)menuWillOpen:(NSMenu*)menu { + +} + +- (void)menuDidClose:(NSMenu*)menu { + +} + +@end diff --git a/ZeroTier One/AppDelegate.swift b/ZeroTier One/AppDelegate.swift deleted file mode 100644 index 400b67bf..00000000 --- a/ZeroTier One/AppDelegate.swift +++ /dev/null @@ -1,264 +0,0 @@ -// -// AppDelegate.swift -// ZeroTier One -// -// Created by Grant Limberg on 5/14/16. -// Copyright © 2016 ZeroTier, Inc. All rights reserved. -// - -import Cocoa - -@NSApplicationMain -class AppDelegate: NSObject, NSApplicationDelegate, NSMenuDelegate { - - @IBOutlet weak var window: NSWindow! - - - let statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-2.0) - - let networkListPopover = NSPopover() - let joinNetworkPopover = NSPopover() - let preferencesPopover = NSPopover() - let aboutPopover = NSPopover() - - var transientMonitor: AnyObject? = nil - - let monitor = NetworkMonitor() - - var networks = [Network]() - - var status: NodeStatus? = nil - - var pasteboard = NSPasteboard.generalPasteboard() - - func applicationDidFinishLaunching(aNotification: NSNotification) { - pasteboard.declareTypes([NSPasteboardTypeString], owner: nil) - - let defaults = NSUserDefaults.standardUserDefaults() - let defaultsDict = ["firstRun": true] - defaults.registerDefaults(defaultsDict) - - - - - let nc = NSNotificationCenter.defaultCenter() - nc.addObserver(self, selector: #selector(onNetworkListUpdated(_:)), name: NetworkUpdateKey, object: nil) - nc.addObserver(self, selector: #selector(onNodeStatusUpdated(_:)), name: StatusUpdateKey, object: nil) - - statusItem.image = NSImage(named: "MenuBarIconMac") - - buildMenu() - - joinNetworkPopover.contentViewController = JoinNetworkViewController( - nibName: "JoinNetworkViewController", bundle: nil) - joinNetworkPopover.behavior = .Transient - - let showNetworksView = ShowNetworksViewController( - nibName: "ShowNetworksViewController", bundle: nil) - showNetworksView?.netMonitor = monitor - - networkListPopover.contentViewController = showNetworksView - networkListPopover.behavior = .Transient - - let prefsView = PreferencesViewController(nibName: "PreferencesViewController", bundle: nil) - preferencesPopover.contentViewController = prefsView - preferencesPopover.behavior = .Transient - - aboutPopover.contentViewController = AboutViewController( - nibName: "AboutViewController", bundle: nil) - aboutPopover.behavior = .Transient - - let firstRun = defaults.boolForKey("firstRun") - - if firstRun { - defaults.setBool(false, forKey: "firstRun") - defaults.synchronize() - - prefsView?.setLaunchAtLoginEnabled(true) - } - - if firstRun { - NSOperationQueue.mainQueue().addOperationWithBlock() { - self.showAbout() - } - } - - monitor.updateNetworkInfo() - monitor.start() - } - - func applicationWillTerminate(aNotification: NSNotification) { - // Insert code here to tear down your application - let nc = NSNotificationCenter.defaultCenter() - nc.removeObserver(self) - } - - - func showNetworks() { - if let button = statusItem.button { - networkListPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) - - if transientMonitor == nil { - transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( - [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in - - NSEvent.removeMonitor(self.transientMonitor!) - self.transientMonitor = nil - self.networkListPopover.close() - } - } - } - } - - func joinNetwork() { - if let button = statusItem.button { - joinNetworkPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) - - if transientMonitor == nil { - transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( - [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in - - NSEvent.removeMonitor(self.transientMonitor!) - self.transientMonitor = nil - self.joinNetworkPopover.close() - - } - } - } - } - - func showPreferences() { - if let button = statusItem.button { - preferencesPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) - - if transientMonitor == nil { - transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( - [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in - - NSEvent.removeMonitor(self.transientMonitor!) - self.transientMonitor = nil - self.preferencesPopover.close() - } - } - } - } - - func showAbout() { - if let button = statusItem.button { - aboutPopover.showRelativeToRect(button.bounds, ofView: button, preferredEdge: .MinY) - - if transientMonitor == nil { - transientMonitor = NSEvent.addGlobalMonitorForEventsMatchingMask( - [.LeftMouseDownMask, .RightMouseDownMask, .OtherMouseDownMask]) { (event: NSEvent) -> Void in - - NSEvent.removeMonitor(self.transientMonitor!) - self.transientMonitor = nil - self.aboutPopover.close() - } - } - } - } - - func quit() { - NSApp.performSelector(#selector(NSApp.terminate(_:)), withObject: nil, afterDelay: 0.0) - } - - func onNetworkListUpdated(note: NSNotification) { - let netList = note.userInfo!["networks"] as! [Network] - (networkListPopover.contentViewController as! ShowNetworksViewController).setNetworks(netList) - - self.networks = netList - - buildMenu() - } - - func onNodeStatusUpdated(note: NSNotification) { - let status = note.userInfo!["status"] as! NodeStatus - self.status = status - - buildMenu() - } - - func buildMenu() { - let menu = NSMenu() - menu.delegate = self - - if let s = self.status { - menu.addItem(NSMenuItem(title: "Node ID: \(s.address)", action: #selector(AppDelegate.copyNodeID), keyEquivalent: "")) - menu.addItem(NSMenuItem.separatorItem()) - } - - menu.addItem(NSMenuItem(title: "Network Details...", action: #selector(AppDelegate.showNetworks), keyEquivalent: "n")) - menu.addItem(NSMenuItem(title: "Join Network...", action: #selector(AppDelegate.joinNetwork), keyEquivalent: "j")) - menu.addItem(NSMenuItem.separatorItem()) - - if networks.count > 0 { - for net in networks { - let id = String(net.nwid, radix: 16) - var networkName = "" - if net.name.isEmpty { - networkName = "\(id)" - } - else { - networkName = "\(id) (\(net.name))" - } - - if net.allowDefault && net.connected { - networkName += " [default]" - } - let item = NSMenuItem(title: networkName, action: #selector(AppDelegate.toggleNetwork(_:)), keyEquivalent: "") - - if net.connected { - item.state = NSOnState - } - else { - item.state = NSOffState - } - - item.representedObject = net - - menu.addItem(item) - } - - menu.addItem(NSMenuItem.separatorItem()) - } - - menu.addItem(NSMenuItem(title: "About ZeroTier One...", action: #selector(AppDelegate.showAbout), keyEquivalent: "")) - menu.addItem(NSMenuItem(title: "Preferences...", action: #selector(AppDelegate.showPreferences), keyEquivalent: ",")) - - menu.addItem(NSMenuItem.separatorItem()) - - menu.addItem(NSMenuItem(title: "Quit ZeroTier One", action: #selector(AppDelegate.quit), keyEquivalent: "q")) - - statusItem.menu = menu - } - - func toggleNetwork(sender: NSMenuItem) { - NSLog("\(sender.title)") - - let network = sender.representedObject as! Network - - let id = String(network.nwid, radix: 16) - - if network.connected { - ServiceCom.sharedInstance().leaveNetwork(id) - } - else { - ServiceCom.sharedInstance().joinNetwork(id, allowManaged: true, allowGlobal: false, allowDefault: false) - } - } - - func copyNodeID() { - if let s = self.status { - pasteboard.setString(s.address, forType: NSPasteboardTypeString) - } - } - - func menuWillOpen(menu: NSMenu) { - //monitor.updateNetworkInfo() - } - - func menuDidClose(menu: NSMenu) { - } -} - diff --git a/ZeroTier One/Base.lproj/MainMenu.xib b/ZeroTier One/Base.lproj/MainMenu.xib index 4722fac2..6b6da2a6 100644 --- a/ZeroTier One/Base.lproj/MainMenu.xib +++ b/ZeroTier One/Base.lproj/MainMenu.xib @@ -1,7 +1,6 @@ - + - @@ -12,7 +11,7 @@ - + diff --git a/ZeroTier One/JoinNetworkViewController.xib b/ZeroTier One/JoinNetworkViewController.xib index 338d35ee..2ef43442 100644 --- a/ZeroTier One/JoinNetworkViewController.xib +++ b/ZeroTier One/JoinNetworkViewController.xib @@ -1,5 +1,5 @@ - + diff --git a/ZeroTier One/ZeroTier One-Bridging-Header.h b/ZeroTier One/ZeroTier One-Bridging-Header.h deleted file mode 100644 index 60700eeb..00000000 --- a/ZeroTier One/ZeroTier One-Bridging-Header.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import "AuthtokenCopy.h" -#import "NodeStatus.h" -#import "Network.h" -#import "ServiceCom.h" -#import "AboutViewController.h" -#import "PreferencesViewController.h" -#import "NetworkMonitor.h" -#import "NetworkInfoCell.h" -#import "ShowNetworksViewController.h" -#import "JoinNetworkViewController.h" diff --git a/ZeroTier One/main.m b/ZeroTier One/main.m new file mode 100644 index 00000000..399c483d --- /dev/null +++ b/ZeroTier One/main.m @@ -0,0 +1,13 @@ +// +// main.m +// testapp +// +// Created by Grant Limberg on 8/7/16. +// Copyright © 2016 ZeroTier, Inc. All rights reserved. +// + +#import + +int main(int argc, const char * argv[]) { + return NSApplicationMain(argc, argv); +} -- cgit v1.2.3