JoinNetworkViewController.m 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. //
  2. // JoinNetworkViewController.m
  3. // ZeroTier One
  4. //
  5. // Created by Grant Limberg on 8/7/16.
  6. // Copyright © 2016 ZeroTier, Inc. All rights reserved.
  7. //
  8. #import "JoinNetworkViewController.h"
  9. #import "ServiceCom.h"
  10. #import "AppDelegate.h"
  11. NSString * const JoinedNetworksKey = @"com.zerotier.one.joined-networks";
  12. @interface NSString (extra)
  13. - (BOOL)contains:(NSString*)find;
  14. @end
  15. @implementation NSString (extra)
  16. - (BOOL)contains:(NSString*)find {
  17. NSRange range = [self rangeOfString:find];
  18. return range.location != NSNotFound;
  19. }
  20. @end
  21. @implementation JoinNetworkViewController
  22. - (void)viewDidLoad {
  23. [super viewDidLoad];
  24. // Do view setup here.
  25. [self.network setDelegate:self];
  26. [self.network setDataSource:self];
  27. }
  28. - (void)viewWillAppear {
  29. [super viewWillAppear];
  30. self.allowManagedCheckBox.state = NSOnState;
  31. self.allowGlobalCheckBox.state = NSOffState;
  32. self.allowDefaultCheckBox.state = NSOffState;
  33. self.network.stringValue = @"";
  34. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  35. NSMutableArray<NSString*> *vals = [[defaults stringArrayForKey:JoinedNetworksKey] mutableCopy];
  36. if(vals) {
  37. self.values = vals;
  38. }
  39. }
  40. - (void)viewWillDisappear {
  41. [super viewWillDisappear];
  42. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  43. [defaults setObject:self.values forKey:JoinedNetworksKey];
  44. }
  45. - (IBAction)onJoinClicked:(id)sender {
  46. NSString *networkId = self.network.stringValue;
  47. NSError *error = nil;
  48. [[ServiceCom sharedInstance] joinNetwork:networkId
  49. allowManaged:(self.allowManagedCheckBox.state == NSOnState)
  50. allowGlobal:(self.allowGlobalCheckBox.state == NSOnState)
  51. allowDefault:(self.allowDefaultCheckBox.state == NSOnState)
  52. error:&error];
  53. if(error) {
  54. NSAlert *alert = [NSAlert alertWithError:error];
  55. alert.alertStyle = NSCriticalAlertStyle;
  56. [alert addButtonWithTitle:@"Ok"];
  57. [alert runModal];
  58. return;
  59. }
  60. self.network.stringValue = @"";
  61. if(![self.values containsObject:networkId]) {
  62. [self.values insertObject:networkId atIndex:0];
  63. while([self.values count] > 20) {
  64. [self.values removeLastObject];
  65. }
  66. }
  67. [self.appDelegate closeJoinNetworkPopover];
  68. }
  69. // NSComboBoxDelegate methods
  70. - (void)controlTextDidChange:(NSNotification *)obj {
  71. NSComboBox *cb = (NSComboBox*)obj.object;
  72. NSString *value = cb.stringValue;
  73. NSString *allowedCharacters = @"abcdefABCDEF0123456789";
  74. NSString *outValue = @"";
  75. for(int i = 0; i < [value length]; ++i) {
  76. if(![allowedCharacters contains:[NSString stringWithFormat:@"%C", [value characterAtIndex:i]]]) {
  77. NSBeep();
  78. }
  79. else {
  80. outValue = [outValue stringByAppendingString:[NSString stringWithFormat:@"%C", [value characterAtIndex:i]]];
  81. }
  82. }
  83. if([outValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding] == 16) {
  84. self.joinButton.enabled = YES;
  85. }
  86. else {
  87. if([outValue lengthOfBytesUsingEncoding:NSUTF8StringEncoding] > 16) {
  88. NSRange range = {0, 16};
  89. range = [outValue rangeOfComposedCharacterSequencesForRange:range];
  90. outValue = [outValue substringWithRange:range];
  91. NSBeep();
  92. self.joinButton.enabled = YES;
  93. }
  94. else {
  95. self.joinButton.enabled = NO;
  96. }
  97. }
  98. cb.stringValue = outValue;
  99. }
  100. // end NSComboBoxDelegate methods
  101. // NSComboBoxDataSource methods
  102. - (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox {
  103. return [self.values count];
  104. }
  105. - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index {
  106. return [self.values objectAtIndex:index];
  107. }
  108. - (NSUInteger)comboBox:(NSComboBox *)aComboBox indexOfItemWithStringValue:(NSString *)string {
  109. NSUInteger counter = 0;
  110. for(NSString *val in self.values) {
  111. if([val isEqualToString:string]) {
  112. return counter;
  113. }
  114. counter += 1;
  115. }
  116. return NSNotFound;
  117. }
  118. - (NSString*)comboBox:(NSComboBox *)aComboBox completedString:(NSString *)string {
  119. for(NSString *val in self.values) {
  120. if([val hasPrefix:string]) {
  121. return val;
  122. }
  123. }
  124. return nil;
  125. }
  126. // end NSComboBoxDataSource methods
  127. @end