summaryrefslogblamecommitdiffstats
path: root/mDNSResponder/mDNSMacOSX/SettingsBundle/BonjourSettingsController.m
blob: 86e4ae7a0c9660ab4f92506bcb0453f7ff68a9a6 (plain) (tree)














































































































































                                                                                                                                                                                                    
/*
 *
 * Copyright (c) 2016 Apple Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#import "BonjourSettingsController.h"
#import "HostnameController.h"
#import "BonjourSCStore.h"
#import "CNBrowseDomainsController.h"
#import <AssertMacros.h>

#define LocalizedStringFromMyBundle(key, comment)     \
    NSLocalizedStringFromTableInBundle(key, @"Localizable", [NSBundle bundleForClass: [self class]], comment)

@interface BonjourSettingsController ()

@property (strong) NSString *               bonjourHostname;
@property (strong) NSArray *                browseDomainsA;

@end

@implementation BonjourSettingsController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if (self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil])
    {
        [self commonInit];
    }
    return(self);
}

- (void)commonInit
{
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear: animated];
    [self readPreferences];
    [self reloadSpecifiers];
}

- (id) getDomainCount:(PSSpecifier *)specifier
{
    (void)specifier;    // Unused
    return [NSNumber numberWithInteger: [_browseDomainsA filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"(%K == %@)", (NSString *)SC_DYNDNS_ENABLED_KEY, @YES]].count].stringValue;
}

- (id) getHostname:(PSSpecifier *)specifier
{
    (void)specifier;    // Unused
    return _bonjourHostname.length ? _bonjourHostname : LocalizedStringFromMyBundle(@"_bonjour.hostname.unset", nil);
}

- (NSArray *)specifiers
{
    if (!_specifiers) {
        PSSpecifier * specifier;
        NSMutableArray * specifiers = [NSMutableArray array];
        
        specifier = [PSSpecifier groupSpecifierWithName: LocalizedStringFromMyBundle(@"_bonjour.hostname.groupname", nil)];
        [specifiers addObject: specifier];
        specifier = [PSSpecifier preferenceSpecifierNamed: LocalizedStringFromMyBundle(@"_bonjour.hostname.name", nil)
                                                   target: self
                                                      set: nil
                                                      get: @selector(getHostname:)
                                                   detail: [HostnameController class]
                                                     cell: PSLinkListCell
                                                     edit: nil];
        [specifier setProperty: @"hostnameID"
                        forKey: PSIDKey];
        [specifiers addObject: specifier];
        
        specifier = [PSSpecifier groupSpecifierWithName: LocalizedStringFromMyBundle(@"_bonjour.browse.groupname", nil)];
        [specifiers addObject: specifier];
        specifier = [PSSpecifier preferenceSpecifierNamed: LocalizedStringFromMyBundle(@"_bonjour.browse.name", nil)
                                                   target: self
                                                      set: nil
                                                      get: @selector(getDomainCount:)
                                                   detail: [CNBrowseDomainsController class]
                                                     cell: PSLinkListCell
                                                     edit: nil];
        [specifier setProperty: @"browseID"
                        forKey: PSIDKey];
        [specifiers addObject: specifier];
       
        _specifiers = specifiers;
    }
    return _specifiers;
}

-(void)readPreferences
{
    self.browseDomainsA = [BonjourSCStore objectForKey: (NSString *)SC_DYNDNS_BROWSEDOMAINS_KEY];
    
    NSArray * hostArray;
    hostArray = [BonjourSCStore objectForKey: (NSString *)SC_DYNDNS_HOSTNAMES_KEY];
    if (hostArray && [hostArray count] > 0)
    {
        self.bonjourHostname = hostArray[0][(NSString *)SC_DYNDNS_DOMAIN_KEY];
    }
    else self.bonjourHostname = nil;
    
    if (!_browseDomainsA) self.browseDomainsA = [NSMutableArray array];
    if (!_bonjourHostname) self.bonjourHostname = [NSString string];
}

#pragma mark - TableView Delegates

- (void)listItemSelected:(NSIndexPath *)indexPath //sender is NSIndexPath of selection
{
    if (indexPath.section == 0)
    {
        HostnameController * c = [[HostnameController alloc] initWithStyle: UITableViewStyleGrouped];
        c.bonjourHostname = _bonjourHostname;
        c.title = LocalizedStringFromMyBundle(@"_bonjour.hostname.name", nil);
        [self.navigationController pushViewController: c animated: YES];
    }
    else if (indexPath.section == 1)
    {
        CNBrowseDomainsController * c = [[CNBrowseDomainsController alloc] initWithStyle: UITableViewStyleGrouped];
        c.browseDomainsA = _browseDomainsA;
        c.title = LocalizedStringFromMyBundle(@"_bonjour.browse.name", nil);
        [self.navigationController pushViewController: c animated: YES];
    }
    
    [_table deselectRowAtIndexPath: indexPath animated: YES];
}

@end