Delete App Store build scheme

Deletes all iCloud related code as well
This commit is contained in:
Michael
2024-06-30 21:12:51 -04:00
parent f0c5c8b158
commit e72e64f9ca
78 changed files with 338 additions and 4755 deletions
@@ -1,15 +0,0 @@
// The main project of Textual, its extensions, and its XPC services
// all inherit one of these configuration files to allow them to
// selectively disable code based on which features are enabled.
// These macros that are used to disable and enable the inclusion
// of certain segments of code. Toggling one of these flags does not
// guarantee that the toggled feature will work. These only toggle the code.
// Not add additional resource files that the code may be dependent on.
// To add new feature flags, modify UpdateFeatureFlags.sh
TEXTUAL_BUILT_INSIDE_SANDBOX=1
TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION=1
TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT=1
TEXTUAL_BUILT_FOR_APP_STORE_DISTRIBUTION=1
@@ -1,8 +0,0 @@
#include "../Common/Foundation.xcconfig"
#include "Textual.xcconfig"
#include "../Common/Textual App.xcconfig"
CODE_SIGN_ENTITLEMENTS = ${PROJECT_DIR}/Configurations/Sandbox/App Store.entitlements
TEXTUAL_PRODUCT_NAME = Textual 7
@@ -1,4 +0,0 @@
#include "../Common/Foundation.xcconfig"
#include "Textual.xcconfig"
#include "../Common/Textual Extensions.xcconfig"
@@ -1,13 +0,0 @@
#include "../Common/Textual.xcconfig"
#include "Enabled Features.xcconfig"
TEXTUAL_PRODUCT_NAME = Textual
TEXTUAL_BUNDLE_IDENTIFIER = com.codeux.apps.textual-mas
TEXTUAL_GROUP_CONTAINER_IDENTIFIER = 8482Q6EPL6.com.codeux.irc.textual
TEXTUAL_BUILD_SCHEME_TOKEN = appstore
TEXTUAL_EXTENSION_BUILD_SCHEME = Release
TEXTUAL_FRAMEWORK_BUILD_SCHEME = Release
TEXTUAL_XPC_SERVICE_BUILD_SCHEME = Release (App Store)
@@ -1,4 +0,0 @@
#include "../Common/Foundation.xcconfig"
#include "Textual.xcconfig"
#include "../Common/XPC Service - ICL Extensions.xcconfig"
@@ -1,5 +0,0 @@
#include "XPC Services.xcconfig"
#include "../Common/XPC Service - ICL.xcconfig"
ICL_EXTENSION_BUILD_SCHEME = Release
@@ -1,4 +0,0 @@
#include "../Common/Foundation.xcconfig"
#include "Textual.xcconfig"
#include "../Common/XPC Services.xcconfig"
@@ -11,7 +11,6 @@ echo "
featureNames=("TEXTUAL_BUILT_INSIDE_SANDBOX"
"TEXTUAL_BUILT_WITH_SPARKLE_ENABLED"
"TEXTUAL_BUILT_WITH_LICENSE_MANAGER"
"TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT"
"TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION"
"TEXTUAL_BUILT_FOR_APP_STORE_DISTRIBUTION"
"TEXTUAL_BUILT_AS_UNIVERSAL_BINARY")
@@ -8,11 +8,7 @@ cd "${TEXTUAL_WORKSPACE_TEMP_DIR}/"
# This will be the Info.plist file manipulated with the version
# information that is generated below.
if [ "${TEXTUAL_BUILD_SCHEME_TOKEN}" == "appstore" ]; then
infoPlistSource="${PROJECT_DIR}/Resources/Property Lists/Application Properties/InfoAppStore.plist"
else
infoPlistSource="${PROJECT_DIR}/Resources/Property Lists/Application Properties/Info.plist"
fi
infoPlistSource="${PROJECT_DIR}/Resources/Property Lists/Application Properties/Info.plist"
infoPlistTarget="${TEXTUAL_WORKSPACE_TEMP_DIR}/Info.plist"
@@ -58,7 +58,6 @@
#import "IRCWorldPrivate.h"
#import "TPCApplicationInfoPrivate.h"
#import "TPCPreferencesLocalPrivate.h"
#import "TPCPreferencesCloudSyncPrivate.h"
#import "TPCPreferencesUserDefaults.h"
#import "TPCResourceManagerPrivate.h"
#import "TPCThemeControllerPrivate.h"
@@ -158,12 +157,6 @@ NS_ASSUME_NONNULL_BEGIN
- (void)applicationWakeStepOne
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
/* Cloud files are synced regardless of user preference
so we still have to initialize it at some point. */
[sharedCloudManager() prepareInitialState];
#endif
self.world = [IRCWorld new];
}
@@ -410,19 +403,12 @@ NS_ASSUME_NONNULL_BEGIN
BOOL condition2 = (TVCLogControllerHistoricLogSharedInstance().isSaving == NO &&
self.terminateHistoricLogSaveFinished);
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
/* iCloud is syncing */
BOOL condition3 = sharedCloudManager().isTerminated;
#else
BOOL condition3 = YES;
#endif
LogToConsoleTerminationProgress("Conditions: %@ %@ %@",
StringFromBOOL(condition1),
StringFromBOOL(condition2),
StringFromBOOL(condition3));
StringFromBOOL(condition2));
return (condition1 && condition2 && condition3);
return (condition1 && condition2);
}
- (void)performApplicationTerminationStepOne
@@ -461,10 +447,6 @@ NS_ASSUME_NONNULL_BEGIN
[TVCLogControllerInlineMediaSharedInstance() prepareForApplicationTermination];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[sharedCloudManager() prepareForApplicationTermination];
#endif
#if TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION == 1
[sharedEncryptionManager() prepareForApplicationTermination];
#endif
@@ -494,8 +476,7 @@ NS_ASSUME_NONNULL_BEGIN
/* We want certain things to 100% happen before the app completely closes.
This block that is performed below loops until all these actions are completed.
Notable actions: gracefully leaving IRC, saving historic logs, and closing
down iCloud syncing (if applicable). */
Notable actions: gracefully leaving IRC, saving historic logs, etc. */
XRPerformBlockAsynchronouslyOnGlobalQueueWithPriority(^{
do {
/* We wait until this value reaches zero so that
@@ -46,7 +46,6 @@
#import "IRCISupportInfo.h"
#import "IRCUser.h"
#import "IRCWorldPrivate.h"
#import "IRCWorldPrivateCloudExtension.h"
#import "TVCBasicTableView.h"
#import "TVCLogController.h"
#import "TVCLogViewPrivate.h"
@@ -77,7 +76,6 @@
#import "TDCServerPropertiesSheetPrivate.h"
#import "TDCWelcomeSheetPrivate.h"
#import "TPCPathInfoPrivate.h"
#import "TPCPreferencesCloudSyncExtension.h"
#import "TPCPreferencesImportExport.h"
#import "TPCPreferencesLocalPrivate.h"
#import "TPCPreferencesReload.h"
@@ -1597,45 +1595,16 @@ NS_ASSUME_NONNULL_BEGIN
return;
}
NSString *suppressionText = nil;
BOOL suppressionResult = NO;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
BOOL deleteFromCloudCheckboxShown = NO;
if ([TPCPreferences syncPreferencesToTheCloud]) {
if (u.config.excludedFromCloudSyncing == NO) {
deleteFromCloudCheckboxShown = YES;
suppressionText = TXTLS(@"Prompts[5zs-h0]");
}
}
#endif
BOOL result = [TDCAlert modalAlertWithMessage:TXTLS(@"Prompts[etl-ss]")
title:TXTLS(@"Prompts[0kz-wd]")
defaultButton:TXTLS(@"Prompts[mvh-ms]")
alternateButton:TXTLS(@"Prompts[99q-gg]")
suppressionKey:nil
suppressionText:suppressionText
suppressionResponse:&suppressionResult];
alternateButton:TXTLS(@"Prompts[99q-gg]")];
if (result == NO) {
return;
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if (deleteFromCloudCheckboxShown && suppressionResult == NO) {
[worldController() destroyClient:u skipCloud:NO];
} else {
#endif
[worldController() destroyClient:u skipCloud:YES];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
}
#endif
[worldController() destroyClient:u];
[worldController() save];
}
@@ -2478,7 +2447,6 @@ NS_ASSUME_NONNULL_BEGIN
@(MTMMHelpPrivacyPolicy) : @"https://help.codeux.com/textual/Privacy-Policy.kb",
@(MTMMHelpFrequentlyAskedQuestions) : @"https://help.codeux.com/textual/Frequently-Asked-Questions.kb",
@(MTMMHelpKBMenuKnowledgeBaseHome) : @"https://help.codeux.com/textual/home.kb",
@(MTMMHelpKBMenuUsingICloudWithApp) : @"https://help.codeux.com/textual/iCloud-Syncing.kb",
@(MTMMHelpKBMenuChatEncryption) : @"https://help.codeux.com/textual/Off-the-Record-Messaging.kb",
@(MTMMHelpKBMenuCommandReference) : @"https://help.codeux.com/textual/Command-Reference.kb",
@(MTMMHelpKBMenuFeatureRequests) : @"https://help.codeux.com/textual/Support.kb",
@@ -2496,11 +2464,6 @@ NS_ASSUME_NONNULL_BEGIN
[TLOpenLink openWithString:link inBackground:NO];
}
- (void)openMacAppStoreWebpage:(id)sender
{
[TLOpenLink openWithString:@"https://www.textualapp.com/mac-app-store" inBackground:NO];
}
- (void)openStandaloneStoreWebpage:(id)sender
{
[TLOpenLink openWithString:@"https://www.textualapp.com/standalone-store" inBackground:NO];
@@ -3547,13 +3510,6 @@ NS_ASSUME_NONNULL_BEGIN
[worldController() save];
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (void)serverPropertiesSheet:(TDCServerPropertiesSheet *)sender removeClientFromCloud:(NSString *)clientId
{
[worldController() cloud_addClientToListOfDeletedClients:clientId];
}
#endif
- (void)serverPropertiesSheetWillClose:(TDCServerPropertiesSheet *)sender
{
[windowController() removeWindowFromWindowList:sender];
@@ -3843,11 +3799,6 @@ NS_ASSUME_NONNULL_BEGIN
[menuController() openStandaloneStoreWebpage:sender];
}
- (void)openMacAppStoreWebpage:(id)sender
{
[menuController() openMacAppStoreWebpage:sender];
}
- (void)manageLicense:(id)sender
{
[menuController() manageLicense:sender];
@@ -42,7 +42,6 @@
#import "TXMasterController.h"
#import "TXMenuController.h"
#import "TXWindowControllerPrivate.h"
#import "TPCPreferencesCloudSync.h"
#import "TPCThemeController.h"
#import "THOPluginManagerPrivate.h"
#import "IRCWorld.h"
@@ -76,10 +75,6 @@ NSString * const TXErrorDomain = @"TextualErrorDomain";
_defineSharedInstance(sharedAppearance, TXAppearance, new)
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
_defineSharedInstance(sharedCloudSyncManager, TPCPreferencesCloudSync, new)
#endif
#if TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION == 1
_defineSharedInstance(sharedEncryptionManager, TLOEncryptionManager, new)
#endif
@@ -78,11 +78,6 @@ NS_ASSUME_NONNULL_BEGIN
[menuController() openStandaloneStoreWebpage:nil];
}
+ (void)openMacAppStore
{
[menuController() openMacAppStoreWebpage:nil];
}
@end
#endif
@@ -143,11 +143,6 @@ NS_ASSUME_NONNULL_BEGIN
[TDCLicenseUpgradeCommonActions purchaseUpgradeForLicense:sender.licenseKey];
}
- (void)upgradeEligibilitySheetPurchaseMacAppStore:(TDCLicenseUpgradeEligibilitySheet *)sender
{
[TDCLicenseUpgradeCommonActions openMacAppStore];
}
- (void)upgradeEligibilitySheetPurchaseStandalone:(TDCLicenseUpgradeEligibilitySheet *)sender
{
[TDCLicenseUpgradeCommonActions openStandaloneStore];
@@ -62,7 +62,6 @@ NS_ASSUME_NONNULL_BEGIN
- (IBAction)actionActivateLicense:(id)sender;
- (IBAction)actionPurchaseUpgrade:(id)sender;
- (IBAction)actionPurchaseStandalone:(id)sender;
- (IBAction)actionPurchaseMacAppStore:(id)sender;
- (IBAction)actionClose:(id)sender;
@end
@@ -321,11 +320,6 @@ NS_ASSUME_NONNULL_BEGIN
[self.delegate upgradeEligibilitySheetPurchaseUpgrade:self];
}
- (void)actionPurchaseMacAppStore:(id)sender
{
[self.delegate upgradeEligibilitySheetPurchaseMacAppStore:self];
}
- (void)actionPurchaseStandalone:(id)sender
{
[self.delegate upgradeEligibilitySheetPurchaseStandalone:self];
@@ -36,16 +36,10 @@
*
*********************************************************************** */
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
#warning TODO: Radio groups that are manually set need to be updated when iCloud syncs.
#endif
#import "NSViewHelper.h"
#import "TXMasterController.h"
#import "TXMenuController.h"
#import "TPCPathInfoPrivate.h"
#import "TPCPreferencesCloudSyncPrivate.h"
#import "TPCPreferencesCloudSyncExtensionPrivate.h"
#import "TPCPreferencesLocalPrivate.h"
#import "TPCPreferencesReload.h"
#import "TPCPreferencesUserDefaults.h"
@@ -149,9 +143,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, strong) IBOutlet NSView *contentViewOffRecordMessaging;
#endif
@property (nonatomic, strong) IBOutlet NSView *contentViewICloud;
@property (nonatomic, strong) IBOutlet NSView *contentViewHiddenPreferences;
@property (nonatomic, weak) IBOutlet NSButton *checkForUpdatesDontCheck;
@property (nonatomic, weak) IBOutlet NSButton *checkForUpdatesAutomaticallyCheck;
@property (nonatomic, weak) IBOutlet NSButton *checkForUpdatesAutomaticallyDownload;
@@ -175,8 +167,6 @@ NS_ASSUME_NONNULL_BEGIN
- (IBAction)onChangedCheckForUpdates:(id)sender;
- (IBAction)onChangedCheckForBetaUpdates:(id)sender;
- (IBAction)onChangedChannelViewArrangement:(id)sender;
- (IBAction)onChangedCloudSyncingServices:(id)sender;
- (IBAction)onChangedCloudSyncingServicesServersOnly:(id)sender;
- (IBAction)onChangedDisableNicknameColorHashing:(id)sender;
- (IBAction)onChangedForwardNoticeTo:(id)sender;
- (IBAction)onChangedHighlightLogging:(id)sender;
@@ -196,13 +186,10 @@ NS_ASSUME_NONNULL_BEGIN
- (IBAction)onChangedUserListModeSortOrder:(id)sender;
- (IBAction)onFileTransferDownloadDestinationFolderChanged:(id)sender;
- (IBAction)onFileTransferIPAddressDetectionMethodChanged:(id)sender;
- (IBAction)onManageICloudButtonClicked:(id)sender; // changed
- (IBAction)onModifyUserStyleSheetRules:(id)sender;
- (IBAction)onOpenPathToCloudFolder:(id)sender;
- (IBAction)onOpenPathToScripts:(id)sender;
- (IBAction)onOpenPathToTheme:(id)sender; // changed
- (IBAction)onPrefPaneSelected:(id)sender;
- (IBAction)onPurgeOfCloudDataRequested:(id)sender;
- (IBAction)onResetServerListUnreadBadgeColorsToDefault:(id)sender;
- (IBAction)onResetUserListModeColorsToDefaults:(id)sender;
- (IBAction)onSelectNewFont:(id)sender;
@@ -288,17 +275,10 @@ NS_ASSUME_NONNULL_BEGIN
];
[RZNotificationCenter() addObserver:self
selector:@selector(onCloudSyncControllerDidChangeThemeName:)
selector:@selector(onThemeListDidChange:)
name:TPCThemeControllerThemeListDidChangeNotification
object:nil];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[RZNotificationCenter() addObserver:self
selector:@selector(onCloudSyncControllerDidChangeThemeName:)
name:TPCPreferencesCloudSyncDidChangeThemeNameNotification
object:nil];
#endif
[RZNotificationCenter() addObserver:self
selector:@selector(onThemeWillReload:)
name:TVCMainWindowWillReloadThemeNotification
@@ -309,12 +289,6 @@ NS_ASSUME_NONNULL_BEGIN
name:TVCMainWindowDidReloadThemeNotification
object:nil];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 0
/* Hide "Share data between devices" when iCloud support is not enabled. */
[self.contentViewGeneralStackView setVisibilityPriority:NSStackViewVisibilityPriorityNotVisible
forView:self.contentViewGeneralShareDataView];
#endif
#if TEXTUAL_BUILT_WITH_SPARKLE_ENABLED == 0
/* Hide preferences for updates when support is not enabled. */
[self.contentViewGeneralStackView setVisibilityPriority:NSStackViewVisibilityPriorityNotVisible
@@ -806,22 +780,6 @@ NS_ASSUME_NONNULL_BEGIN
[TPCPreferences setLogToDisk:logTranscript];
}
- (BOOL)syncPreferencesToTheCloud
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
return [TPCPreferences syncPreferencesToTheCloud];
#else
return NO;
#endif
}
- (void)setSyncPreferencesToTheCloud:(BOOL)syncPreferencesToTheCloud
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[TPCPreferences setSyncPreferencesToTheCloud:syncPreferencesToTheCloud];
#endif
}
- (BOOL)inlineMediaLimitToBasics
{
return [TPCPreferences inlineMediaLimitToBasics];
@@ -924,29 +882,6 @@ NS_ASSUME_NONNULL_BEGIN
#pragma mark -
#pragma mark File Transfer Destination Folder Popup
- (BOOL)panel:(id)sender validateURL:(NSURL *)url error:(NSError **)outError
{
NSString *cloudPath = [[TPCPathInfo userHome] stringByAppendingPathComponent:@"/Library/Mobile Documents/"];
if ([url.path hasPrefix:cloudPath]) {
if (outError) {
NSMutableDictionary *userInfo = [NSMutableDictionary dictionary];
userInfo[NSURLErrorKey] = url;
userInfo[NSLocalizedDescriptionKey] = TXTLS(@"TDCPreferencesController[x3n-to]");
userInfo[NSLocalizedRecoverySuggestionErrorKey] = TXTLS(@"TDCPreferencesController[gz8-dt]");
*outError = [NSError errorWithDomain:TXErrorDomain code:27984 userInfo:userInfo];
}
return NO;
}
return YES;
}
- (void)updateFileTransferDownloadDestinationFolder
{
TDCFileTransferDialog *transferController = [TXSharedApplication sharedFileTransferDialog];
@@ -977,8 +912,6 @@ NS_ASSUME_NONNULL_BEGIN
if (self.fileTransferDownloadDestinationButton.selectedTag == 2) {
NSOpenPanel *d = [NSOpenPanel openPanel];
d.delegate = (id)self;
d.allowsMultipleSelection = NO;
d.canChooseDirectories = YES;
d.canChooseFiles = NO;
@@ -1052,8 +985,6 @@ NS_ASSUME_NONNULL_BEGIN
if (self.transcriptFolderButton.selectedTag == 2) {
NSOpenPanel *d = [NSOpenPanel openPanel];
d.delegate = (id)self;
d.allowsMultipleSelection = NO;
d.canChooseDirectories = YES;
d.canChooseFiles = NO;
@@ -1469,16 +1400,6 @@ NS_ASSUME_NONNULL_BEGIN
[RZUserDefaults() setObject:nil forKey:@"User List Mode Badge Colors -> +v"];
[RZUserDefaults() setObject:nil forKey:@"User List Mode Badge Colors -> no mode"];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> +y"];
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> +q"];
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> +a"];
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> +o"];
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> +h"];
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> +v"];
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"User List Mode Badge Colors -> no mode"];
#endif
[self onChangedUserListModeColor:nil];
}
@@ -1490,10 +1411,6 @@ NS_ASSUME_NONNULL_BEGIN
[self didChangeValueForKey:@"serverListUnreadCountBadgeHighlightColor"];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[sharedCloudManager() removeObjectForKeyNextUpstreamSync:@"Server List Unread Message Count Badge Colors -> Highlight"];
#endif
[self onChangedServerListUnreadBadgeColor:sender];
}
@@ -1603,90 +1520,11 @@ NS_ASSUME_NONNULL_BEGIN
[TPCPreferences performReloadAction:TPCPreferencesReloadActionScrollbackVisibleLimit];
}
- (void)onOpenPathToCloudFolder:(id)sender
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[TPCPathInfo openApplicationUbiquitousContainer];
#endif
}
- (void)onOpenPathToScripts:(id)sender
{
[RZWorkspace() openURL:[TPCPathInfo groupContainerApplicationSupportURL]];
}
- (void)onManageICloudButtonClicked:(id)sender
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[self firstPane:self.contentViewICloud selectedItem:_toolbarItemIndexAdvanced];
#endif
}
- (void)onChangedCloudSyncingServices:(id)sender
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
[sharedCloudManager() resetDataToSync];
} else {
[RZUbiquitousKeyValueStore() synchronize];
[sharedCloudManager() syncEverythingNextSync];
[sharedCloudManager() synchronizeFromCloud];
}
#endif
}
- (void)onChangedCloudSyncingServicesServersOnly:(id)sender
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloudLimitedToServers]) {
return;
}
[RZUbiquitousKeyValueStore() synchronize];
[sharedCloudManager() synchronizeFromCloud];
#endif
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (void)onPurgeOfCloudDataRequestedCallback:(TDCAlertResponse)returnCode
{
if (returnCode != TDCAlertResponseDefault) {
return;
}
[sharedCloudManager() purgeDataStoredWithCloud];
NSError *deleteThemesError = nil;
if ([RZFileManager() removeItemAtPath:[TPCPathInfo cloudCustomThemes] error:&deleteThemesError] == NO) {
LogToConsoleError("Delete Error: %@",
deleteThemesError.localizedDescription);
}
}
#endif
- (void)onPurgeOfCloudDataRequested:(id)sender
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[TDCAlert alertSheetWithWindow:[NSApp keyWindow]
body:TXTLS(@"TDCPreferencesController[t8v-w8]")
title:TXTLS(@"TDCPreferencesController[r62-4k]")
defaultButton:TXTLS(@"Prompts[mvh-ms]")
alternateButton:TXTLS(@"Prompts[99q-gg]")
otherButton:nil
completionBlock:^(TDCAlertResponse buttonClicked, BOOL suppressed, id underlyingAlert) {
[self onPurgeOfCloudDataRequestedCallback:buttonClicked];
}];
#endif
}
- (void)openPathToThemesCallback:(TDCAlertResponse)returnCode withOriginalAlert:(NSAlert *)originalAlert
{
NSParameterAssert(originalAlert != nil);
@@ -1702,19 +1540,7 @@ NS_ASSUME_NONNULL_BEGIN
if (returnCode == TDCAlertResponseOther) {
[originalAlert.window orderOut:nil];
BOOL copyingToCloud = NO;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if (sharedCloudManager().ubiquitousContainerIsAvailable) {
copyingToCloud = YES;
}
#endif
if (copyingToCloud) {
[themeController() copyActiveThemeToDestinationLocation:TPCThemeStorageLocationCloud reloadOnCopy:YES openOnCopy:YES];
} else {
[themeController() copyActiveThemeToDestinationLocation:TPCThemeStorageLocationCustom reloadOnCopy:YES openOnCopy:YES];
}
[themeController() copyActiveThemeToDestinationLocation:TPCThemeStorageLocationCustom reloadOnCopy:YES openOnCopy:YES];
}
}
@@ -1744,10 +1570,7 @@ NS_ASSUME_NONNULL_BEGIN
[RZWorkspace() openURL:fileURL];
}
#pragma mark -
#pragma mark Cloud Work
- (void)onCloudSyncControllerDidChangeThemeName:(NSNotification *)aNote
- (void)onThemeListDidChange:(NSNotification *)aNote
{
[self updateThemeSelection];
}
@@ -116,7 +116,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, weak) IBOutlet NSButton *editAddressBookEntryButton;
@property (nonatomic, weak) IBOutlet NSButton *editChannelButton;
@property (nonatomic, weak) IBOutlet NSButton *editHighlightButton;
@property (nonatomic, weak) IBOutlet NSButton *excludedFromCloudSyncingCheck;
@property (nonatomic, weak) IBOutlet NSButton *hideAutojoinDelayedWarningsCheck;
@property (nonatomic, weak) IBOutlet NSButton *performDisconnectOnPongTimerCheck;
@property (nonatomic, weak) IBOutlet NSButton *pongTimerCheck;
@@ -175,17 +174,9 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy, nullable) NSString *lastServerAddressValue;
@property (nonatomic, copy, nullable) IRCServer *previousPrimaryServer;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@property (nonatomic, assign) BOOL requestRemovalFromCloudOnClose;
#endif
- (IBAction)proxyTypeChanged:(id)sender;
- (IBAction)toggleAdvancedEncodings:(id)sender;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (IBAction)toggleCloudSyncExclusion:(id)sender;
#endif
- (IBAction)addChannel:(id)sender;
- (IBAction)editChannel:(id)sender;
- (IBAction)deleteChannel:(id)sender;
@@ -709,14 +700,6 @@ NS_ASSUME_NONNULL_BEGIN
[self.delegate serverPropertiesSheet:self onOk:[self.config copy]];
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if (self.requestRemovalFromCloudOnClose) {
if ([self.delegate respondsToSelector:@selector(serverPropertiesSheet:removeClientFromCloud:)]) {
[self.delegate serverPropertiesSheet:self removeClientFromCloud:self.clientId];
}
}
#endif
[super ok:nil];
}
@@ -909,10 +892,6 @@ NS_ASSUME_NONNULL_BEGIN
self.autoReconnectCheck.state = self.config.autoReconnect;
self.autoDisconnectOnSleepCheck.state = self.config.autoSleepModeDisconnect;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
self.excludedFromCloudSyncingCheck.state = self.config.excludedFromCloudSyncing;
#endif
/* ZNC Bouncer */
self.zncIgnoreConfiguredAutojoinCheck.state = self.config.zncIgnoreConfiguredAutojoin;
self.zncIgnorePlaybackNotificationsCheck.state = self.config.zncIgnorePlaybackNotifications;
@@ -1073,10 +1052,6 @@ NS_ASSUME_NONNULL_BEGIN
self.config.autoReconnect = (self.autoReconnectCheck.state == NSControlStateValueOn);
self.config.autoSleepModeDisconnect = (self.autoDisconnectOnSleepCheck.state == NSControlStateValueOn);
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
self.config.excludedFromCloudSyncing = (self.excludedFromCloudSyncingCheck.state == NSControlStateValueOn);
#endif
/* ZNC Bouncer */
self.config.zncIgnoreConfiguredAutojoin = (self.zncIgnoreConfiguredAutojoinCheck.state == NSControlStateValueOn);
self.config.zncIgnorePlaybackNotifications = (self.zncIgnorePlaybackNotificationsCheck.state == NSControlStateValueOn);
@@ -1469,38 +1444,6 @@ NS_ASSUME_NONNULL_BEGIN
[self.fallbackEncodingButton selectItemWithTitle:fallbackEncoding];
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (void)toggleCloudSyncExclusion:(id)sender
{
if (self.clientId == nil) {
return;
}
if (self.excludedFromCloudSyncingCheck.state == NSControlStateValueOn)
{
NSWindow *window = self.sheet;
[TDCAlert alertSheetWithWindow:window
body:TXTLS(@"TDCServerPropertiesSheet[sqc-nw]")
title:TXTLS(@"TDCServerPropertiesSheet[x08-ko]")
defaultButton:TXTLS(@"Prompts[mvh-ms]")
alternateButton:TXTLS(@"Prompts[99q-gg]")
otherButton:nil
completionBlock:^(TDCAlertResponse buttonClicked, BOOL suppressed, id underlyingAlert) {
if (buttonClicked == TDCAlertResponseAlternate) {
self.requestRemovalFromCloudOnClose = NO;
} else {
self.requestRemovalFromCloudOnClose = YES;
}
}];
}
else // state == NSControlStateValueOn
{
self.requestRemovalFromCloudOnClose = NO;
}
}
#endif
- (void)preferredInternetProtocolChanged:(id)sender
{
TEXTUAL_IGNORE_DEPRECATION_BEGIN
@@ -51,11 +51,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (readonly) BOOL autoReconnect;
@property (readonly) BOOL autoSleepModeDisconnect;
@property (readonly) BOOL autojoinWaitsForNickServ;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@property (readonly) BOOL excludedFromCloudSyncing;
#endif
@property (readonly) BOOL hideAutojoinDelayedWarnings;
@property (readonly) BOOL hideNetworkUnavailabilityNotices;
@property (readonly) BOOL performDisconnectOnPongTimer;
@@ -117,11 +112,6 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, assign, readwrite) BOOL autoReconnect;
@property (nonatomic, assign, readwrite) BOOL autoSleepModeDisconnect;
@property (nonatomic, assign, readwrite) BOOL autojoinWaitsForNickServ;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@property (nonatomic, assign, readwrite) BOOL excludedFromCloudSyncing;
#endif
@property (nonatomic, assign, readwrite) BOOL hideAutojoinDelayedWarnings;
@property (nonatomic, assign, readwrite) BOOL hideNetworkUnavailabilityNotices;
@property (nonatomic, assign, readwrite) BOOL performDisconnectOnPongTimer;
@@ -47,11 +47,6 @@ NS_ASSUME_NONNULL_BEGIN
BOOL _autoSleepModeDisconnect;
BOOL _autojoinWaitsForNickServ;
BOOL _connectionPrefersIPv4;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
BOOL _excludedFromCloudSyncing;
#endif
BOOL _hideAutojoinDelayedWarnings;
BOOL _hideNetworkUnavailabilityNotices;
BOOL _performDisconnectOnPongTimer;
@@ -58,7 +58,6 @@ NS_ASSUME_NONNULL_BEGIN
- (void)updateConfig:(IRCChannelConfig *)config fireChangedNotification:(BOOL)fireChangedNotification updateStoredChannelList:(BOOL)updateStoredChannelList;
- (NSDictionary<NSString *, id> *)configurationDictionary;
- (NSDictionary<NSString *, id> *)configurationDictionaryForCloud;
#if TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION == 1
- (void)noteEncryptionStateDidChange;
@@ -67,10 +67,7 @@ enum {
- (void)updateConfig:(IRCClientConfig *)config;
- (void)updateConfig:(IRCClientConfig *)config updateSelection:(BOOL)updateSelection;
- (void)updateConfigFromTheCloud:(IRCClientConfig *)config;
- (NSDictionary<NSString *, id> *)configurationDictionary;
- (NSDictionary<NSString *, id> *)configurationDictionaryForCloud;
- (void)addChannel:(IRCChannel *)channel;
- (void)addChannel:(IRCChannel *)channel atPosition:(NSUInteger)position;
@@ -67,7 +67,7 @@ NS_ASSUME_NONNULL_BEGIN
- (IRCChannel *)createPrivateMessage:(NSString *)nickname onClient:(IRCClient *)client asType:(IRCChannelType)type;
- (void)destroyClient:(IRCClient *)client skipCloud:(BOOL)skipCloud;
- (void)destroyClient:(IRCClient *)client;
- (void)destroyChannel:(IRCChannel *)channel reload:(BOOL)reload;
- (void)destroyChannel:(IRCChannel *)channel reload:(BOOL)reload part:(BOOL)partChannel;
@@ -1,58 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "IRCWorld.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
TEXTUAL_EXTERN NSString * const IRCWorldControllerCloudClientItemDefaultsKeyPrefix;
TEXTUAL_EXTERN NSString * const IRCWorldControllerCloudListOfDeletedClientsDefaultsKey;
@interface IRCWorld (IRCWorldCloudExtension)
- (NSDictionary<NSString *, id> *)cloud_clientConfigurations;
- (void)cloud_destroyClient:(IRCClient *)client;
- (void)cloud_addClientToListOfDeletedClients:(NSString *)clientId;
- (void)cloud_removeClientFromListOfDeletedClients:(NSString *)clientId;
- (void)cloud_processDeletedClientsList:(NSArray<NSString *> *)deletedClients;
@end
#endif
NS_ASSUME_NONNULL_END
@@ -44,7 +44,6 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)purchaseUpgradeForLicense:(NSString *)licenseKey;
+ (void)learnMore;
+ (void)openStandaloneStore;
+ (void)openMacAppStore;
@end
#endif
@@ -65,7 +65,6 @@ typedef NS_ENUM(NSUInteger, TLOLicenseUpgradeEligibility) {
- (void)upgradeEligibilitySheetContactSupport:(TDCLicenseUpgradeEligibilitySheet *)sender;
- (void)upgradeEligibilitySheetActivateLicense:(TDCLicenseUpgradeEligibilitySheet *)sender;
- (void)upgradeEligibilitySheetPurchaseUpgrade:(TDCLicenseUpgradeEligibilitySheet *)sender;
- (void)upgradeEligibilitySheetPurchaseMacAppStore:(TDCLicenseUpgradeEligibilitySheet *)sender;
- (void)upgradeEligibilitySheetPurchaseStandalone:(TDCLicenseUpgradeEligibilitySheet *)sender;
- (void)upgradeEligibilitySheetChanged:(TDCLicenseUpgradeEligibilitySheet *)sender;
- (void)upgradeEligibilitySheetWillClose:(TDCLicenseUpgradeEligibilitySheet *)sender;
@@ -77,10 +77,6 @@ typedef NS_ENUM(NSUInteger, TDCServerPropertiesSheetSelection) {
- (void)serverPropertiesSheet:(TDCServerPropertiesSheet *)sender onOk:(IRCClientConfig *)config;
- (void)serverPropertiesSheetWillClose:(TDCServerPropertiesSheet *)sender;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (void)serverPropertiesSheet:(TDCServerPropertiesSheet *)sender removeClientFromCloud:(NSString *)clientId;
#endif
@end
NS_ASSUME_NONNULL_END
@@ -1,51 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "TPCPreferencesCloudSyncExtension.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@interface TPCPreferences (TPCPreferencesCloudSyncPrivate)
+ (void)setSyncPreferencesToTheCloud:(BOOL)syncPreferencesToTheCloud;
+ (void)fixThemeNameMissingDuringSync;
+ (void)fixThemeFontNameMissingDuringSync;
@end
#endif
NS_ASSUME_NONNULL_END
@@ -1,61 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "TPCPreferencesCloudSync.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@interface TPCPreferencesCloudSync ()
- (BOOL)isTerminated;
- (void)setValue:(nullable id)value forKey:(NSString *)key;
- (void)removeObjectForKey:(NSString *)key;
- (void)removeObjectForKeyNextUpstreamSync:(NSString *)key;
- (void)resetDataToSync;
- (void)syncEverythingNextSync;
- (void)synchronizeFromCloud;
- (void)purgeDataStoredWithCloud;
@end
#endif
NS_ASSUME_NONNULL_END
@@ -43,9 +43,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (void)import:(id)object withKey:(NSString *)key;
+ (void)importContentsOfDictionary:(NSDictionary<NSString *, id> *)aDict;
+ (void)importClientConfiguration:(NSDictionary<NSString *, id> *)config isImportedFromCloud:(BOOL)isImportedFromCloud;
+ (NSDictionary<NSString *, id> *)exportedPreferencesDictionaryForCloud;
+ (void)importClientConfiguration:(NSDictionary<NSString *, id> *)config;
@end
NS_ASSUME_NONNULL_END
@@ -46,13 +46,6 @@ NS_ASSUME_NONNULL_BEGIN
- (void)load;
- (void)reload;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
/* We should probably do this internally by monitoring for
a notification that access to the cloud container changed,
but I don't want to touch the iCloud code. It's gross. */
- (void)reloadThemeMonitoring;
#endif
- (void)recreateTemporaryCopyOfThemeIfNecessary;
- (void)copyActiveThemeToDestinationLocation:(TPCThemeStorageLocation)destinationLocation reloadOnCopy:(BOOL)reloadOnCopy openOnCopy:(BOOL)openOnCopy;
@@ -88,7 +88,6 @@ NS_ASSUME_NONNULL_BEGIN
- (IBAction)manageLicense:(id)sender;
- (IBAction)openStandaloneStoreWebpage:(id)sender;
- (IBAction)openMacAppStoreWebpage:(id)sender;
@end
NS_ASSUME_NONNULL_END
@@ -44,7 +44,6 @@ NS_ASSUME_NONNULL_BEGIN
#define sharedNotificationController() [TXSharedApplication sharedNotificationController]
#define sharedPluginManager() [TXSharedApplication sharedPluginManager]
#define sharedCloudManager() [TXSharedApplication sharedCloudSyncManager]
@class OELReachability;
@class THOPluginManager;
@@ -53,10 +52,6 @@ NS_ASSUME_NONNULL_BEGIN
@class TVCLogControllerPrintingOperationQueue;
@class TXWindowController;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@class TPCPreferencesCloudSync;
#endif
#if TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION == 1
@class TLOEncryptionManager;
#endif
@@ -66,10 +61,6 @@ NS_ASSUME_NONNULL_BEGIN
#endif
@interface TXSharedApplication ()
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
+ (TPCPreferencesCloudSync *)sharedCloudSyncManager;
#endif
#if TEXTUAL_BUILT_WITH_ADVANCED_ENCRYPTION == 1
+ (TLOEncryptionManager *)sharedEncryptionManager;
#endif
-14
View File
@@ -117,18 +117,4 @@ NS_ASSUME_NONNULL_BEGIN
@property (readonly, class, copy, nullable) NSURL *userPreferencesURL;
@end
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@interface TPCPathInfo (TPCPathInfoCloudExtension)
@property (readonly, class, copy, nullable) NSString *applicationUbiquitousContainer;
@property (readonly, class, copy, nullable) NSURL *applicationUbiquitousContainerURL;
+ (void)openApplicationUbiquitousContainer;
@property (readonly, class, copy, nullable) NSString *cloudCustomThemes;
@property (readonly, class, copy, nullable) NSURL *cloudCustomThemesURL;
+ (void)openCloudCustomThemes;
@end
#endif
NS_ASSUME_NONNULL_END
@@ -1,51 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@interface TPCPreferencesCloudSync : NSObject
- (nullable id)valueForKey:(NSString *)key;
@property (readonly, copy, nullable) NSURL *ubiquitousContainerURL;
@property (readonly, copy, nullable) NSString *ubiquitousContainerPath;
@property (readonly) BOOL ubiquitousContainerIsAvailable;
@end
#endif
NS_ASSUME_NONNULL_END
@@ -1,55 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "TPCPreferences.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
TEXTUAL_EXTERN NSString * const TPCPreferencesCloudSyncServicesEnabledDefaultsKey;
TEXTUAL_EXTERN NSString * const TPCPreferencesCloudSyncServicesLimitedToServersDefaultsKey;
TEXTUAL_EXTERN NSNotificationName const TPCPreferencesCloudSyncDidChangeThemeFontNotification;
TEXTUAL_EXTERN NSNotificationName const TPCPreferencesCloudSyncDidChangeThemeNameNotification;
@interface TPCPreferences (TPCPreferencesCloudSync)
+ (BOOL)syncPreferencesToTheCloud;
+ (BOOL)syncPreferencesToTheCloudLimitedToServers;
@end
#endif
NS_ASSUME_NONNULL_END
+1 -2
View File
@@ -53,8 +53,7 @@ typedef NS_ENUM(NSUInteger, TPCThemeAppearanceType) {
typedef NS_ENUM(NSUInteger, TPCThemeStorageLocation) {
TPCThemeStorageLocationUnknown = 0,
TPCThemeStorageLocationBundle,
TPCThemeStorageLocationCustom,
TPCThemeStorageLocationCloud
TPCThemeStorageLocationCustom
};
typedef NS_ENUM(NSUInteger, TPCThemeSettingsNicknameColorStyle) {
@@ -40,9 +40,6 @@
NS_ASSUME_NONNULL_BEGIN
TEXTUAL_EXTERN NSString * const TPCThemeControllerCloudThemeNameBasicPrefix;
TEXTUAL_EXTERN NSString * const TPCThemeControllerCloudThemeNameCompletePrefix;
TEXTUAL_EXTERN NSString * const TPCThemeControllerCustomThemeNameBasicPrefix;
TEXTUAL_EXTERN NSString * const TPCThemeControllerCustomThemeNameCompletePrefix;
@@ -221,8 +221,6 @@ enum
MTMMHelpKnowledgeBaseMenu = 905, // "Knowledge Base"
MTMMHelpKBMenuKnowledgeBaseHome = 9050000, // "Knowledge Base Home"
MTMMHelpKBMenuKnowledgeBaseHomeSeparator = 9050001, // "-"
MTMMHelpKBMenuUsingICloudWithApp = 9050002, // "Using iCloud with Textual"
MTMMHelpKBMenuUsingICloudWithAppSeparator = 9050003, // "-"
MTMMHelpKBMenuChatEncryption = 9050004, // "Chat Encryption"
MTMMHelpKBMenuCommandReference = 9050005, // "Command Reference"
MTMMHelpKBMenuFeatureRequests = 9050006, // "Feature Requests"
@@ -447,8 +445,7 @@ enum
- (IBAction)onNextHighlight:(id)sender;
- (IBAction)onPreviousHighlight:(id)sender;
- (IBAction)openStandaloneStoreWebpage:(id)sender;
- (IBAction)openMacAppStoreWebpage:(id)sender;
- (IBAction)openStandaloneStoreWebpage:(id)sender;;
- (IBAction)openChannelLogs:(id)sender;
- (IBAction)openLogLocation:(id)sender;
-2
View File
@@ -100,8 +100,6 @@
/* Preferences */
#import "TPCApplicationInfo.h"
#import "TPCPathInfo.h"
#import "TPCPreferencesCloudSync.h"
#import "TPCPreferencesCloudSyncExtension.h"
#import "TPCPreferencesImportExport.h"
#import "TPCPreferencesLocal.h"
#import "TPCPreferencesReload.h"
-5
View File
@@ -158,11 +158,6 @@ NSString * const IRCChannelConfigurationWasUpdatedNotification = @"IRCChannelCon
return [self.config dictionaryValue];
}
- (NSDictionary<NSString *, id> *)configurationDictionaryForCloud
{
return [self.config dictionaryValueForCloud];
}
- (id)copyWithZone:(nullable NSZone *)zone
{
/* Implement this method to allow channel to be
+4 -4
View File
@@ -189,20 +189,20 @@ NS_ASSUME_NONNULL_BEGIN
- (NSDictionary<NSString *, id> *)dictionaryValue
{
return [self _dictionaryValueForCopyOperation:NO isCloudDictionary:NO];
return [self _dictionaryValueForCopyOperation:NO];
}
- (NSDictionary<NSString *, id> *)dictionaryValueForCloud
{
return [self _dictionaryValueForCopyOperation:NO isCloudDictionary:YES];
return [self _dictionaryValueForCopyOperation:NO];
}
- (NSDictionary<NSString *, id> *)dictionaryValueForCopy
{
return [self _dictionaryValueForCopyOperation:YES isCloudDictionary:NO];
return [self _dictionaryValueForCopyOperation:YES];
}
- (NSDictionary<NSString *, id> *)_dictionaryValueForCopyOperation:(BOOL)isCopyOperation isCloudDictionary:(BOOL)isCloudDictionary
- (NSDictionary<NSString *, id> *)_dictionaryValueForCopyOperation:(BOOL)isCopyOperation
{
NSMutableDictionary<NSString *, id> *dic = [NSMutableDictionary dictionary];
+1 -52
View File
@@ -85,7 +85,6 @@
#import "GCDAsyncSocketExtensions.h"
#import "TPCApplicationInfo.h"
#import "TPCPathInfo.h"
#import "TPCPreferencesCloudSyncExtension.h"
#import "TPCPreferencesLocalPrivate.h"
#import "TPCPreferencesUserDefaults.h"
#import "TPCResourceManager.h"
@@ -153,7 +152,6 @@
#import "IRCUserPrivate.h"
#import "IRCUserRelationsPrivate.h"
#import "IRCWorldPrivate.h"
#import "IRCWorldPrivateCloudExtension.h"
#import "IRCClientPrivate.h"
NS_ASSUME_NONNULL_BEGIN
@@ -410,40 +408,12 @@ NSString * const IRCClientUserNicknameChangedNotification = @"IRCClientUserNickn
[self cancelPerformRequests];
}
- (void)updateConfigFromTheCloud:(IRCClientConfig *)config
{
NSParameterAssert(config != nil);
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
IRCClientConfig *currentConfig = self.config;
#endif
[self updateConfig:config updateSelection:YES importingFromCloud:YES];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
if (self.config.excludedFromCloudSyncing != currentConfig.excludedFromCloudSyncing &&
self.config.excludedFromCloudSyncing == NO)
{
[worldController() cloud_removeClientFromListOfDeletedClients:self.uniqueIdentifier];
}
#endif
}
- (void)updateConfig:(IRCClientConfig *)config
{
[self updateConfig:config updateSelection:YES];
}
- (void)updateConfig:(IRCClientConfig *)config updateSelection:(BOOL)updateSelection
{
[self updateConfig:config updateSelection:updateSelection importingFromCloud:NO];
}
- (void)updateConfig:(IRCClientConfig *)config updateSelection:(BOOL)updateSelection importingFromCloud:(BOOL)importingFromCloud
{
NSParameterAssert(config != nil);
@@ -463,16 +433,7 @@ NSString * const IRCClientUserNicknameChangedNotification = @"IRCClientUserNickn
return;
}
/* Populate new configuration */
/* Some configuration properties (such as -identityClientSideCertificate) cannot be synced
between devices. So that this property is not lost when importing a configuration from
iCloud that is missing it, the configurations are merged, instead of copying.
This process has overhead which means its only used for cloud imports. */
if (importingFromCloud) {
self.config = [IRCClientConfig newConfigByMerging:currentConfig with:config];
} else {
self.config = config;
}
self.config = config;
/* Update channel list */
{
@@ -684,13 +645,6 @@ NSString * const IRCClientUserNicknameChangedNotification = @"IRCClientUserNickn
return [self.config dictionaryValue];
}
- (NSDictionary<NSString *, id> *)configurationDictionaryForCloud
{
[self updateStoredConfiguration];
return [self.config dictionaryValueForCloud];
}
- (void)prepareForApplicationTermination
{
self.isTerminating = YES;
@@ -4034,11 +3988,6 @@ NSString * const IRCClientUserNicknameChangedNotification = @"IRCClientUserNickn
NSString *buildScheme = [TPCApplicationInfo applicationBuildScheme];
NSString *downloadSource = @""; // Assume standalone by default
if ([buildScheme isEqualToString:@"appstore"]) {
downloadSource = TXTLS(@"IRC[9fp-8h]");
}
NSString *buildType = @""; // Assume universal binary by default
#if TEXTUAL_BUILT_AS_UNIVERSAL_BINARY == 0
+7 -34
View File
@@ -85,7 +85,6 @@ NS_ASSUME_NONNULL_BEGIN
defaults[@"cachedLastServerTimeCapabilityReceivedAtTimestamp"] = @(0);
defaults[@"cipherSuites"] = @(RCMCipherSuiteCollectionDefault);
defaults[@"connectionName"] = TXTLS(@"BasicLanguage[vfu-c0]");
defaults[@"excludedFromCloudSyncing"] = @(NO);
defaults[@"fallbackEncoding"] = @(TXDefaultFallbackStringEncoding);
defaults[@"floodControlDelayTimerInterval"] = @(IRCConnectionConfigFloodControlDefaultDelayInterval);
defaults[@"floodControlMaximumMessages"] = @(IRCConnectionConfigFloodControlDefaultMessageCount);
@@ -288,11 +287,6 @@ NS_ASSUME_NONNULL_BEGIN
[defaultsMutable assignBoolTo:&self->_autoReconnect forKey:@"autoReconnect"];
[defaultsMutable assignBoolTo:&self->_autoSleepModeDisconnect forKey:@"autoSleepModeDisconnect"];
[defaultsMutable assignBoolTo:&self->_autojoinWaitsForNickServ forKey:@"autojoinWaitsForNickServ"];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[defaultsMutable assignBoolTo:&self->_excludedFromCloudSyncing forKey:@"excludedFromCloudSyncing"];
#endif
[defaultsMutable assignBoolTo:&self->_hideAutojoinDelayedWarnings forKey:@"hideAutojoinDelayedWarnings"];
[defaultsMutable assignBoolTo:&self->_hideNetworkUnavailabilityNotices forKey:@"hideNetworkUnavailabilityNotices"];
[defaultsMutable assignBoolTo:&self->_performDisconnectOnPongTimer forKey:@"performDisconnectOnPongTimer"];
@@ -679,20 +673,20 @@ TEXTUAL_IGNORE_DEPRECATION_END
- (NSDictionary<NSString *, id> *)dictionaryValue
{
return [self _dictionaryValueForCopyOperation:NO isCloudDictionary:NO];
return [self _dictionaryValueForCopyOperation:NO];
}
- (NSDictionary<NSString *, id> *)dictionaryValueForCloud
{
return [self _dictionaryValueForCopyOperation:NO isCloudDictionary:YES];
return [self _dictionaryValueForCopyOperation:NO];
}
- (NSDictionary<NSString *, id> *)dictionaryValueForCopy
{
return [self _dictionaryValueForCopyOperation:YES isCloudDictionary:NO];
return [self _dictionaryValueForCopyOperation:YES];
}
- (NSDictionary<NSString *, id> *)_dictionaryValueForCopyOperation:(BOOL)isCopyOperation isCloudDictionary:(BOOL)isCloudDictionary
- (NSDictionary<NSString *, id> *)_dictionaryValueForCopyOperation:(BOOL)isCopyOperation
{
NSMutableDictionary<NSString *, id> *dic = [NSMutableDictionary dictionary];
@@ -715,11 +709,6 @@ TEXTUAL_IGNORE_DEPRECATION_END
[dic setBool:self.autoReconnect forKey:@"autoReconnect"];
[dic setBool:self.autoSleepModeDisconnect forKey:@"autoSleepModeDisconnect"];
[dic setBool:self.autojoinWaitsForNickServ forKey:@"autojoinWaitsForNickServ"];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[dic setBool:self.excludedFromCloudSyncing forKey:@"excludedFromCloudSyncing"];
#endif
[dic setBool:self.hideAutojoinDelayedWarnings forKey:@"hideAutojoinDelayedWarnings"];
[dic setBool:self.hideNetworkUnavailabilityNotices forKey:@"hideNetworkUnavailabilityNotices"];
[dic setBool:self.performDisconnectOnPongTimer forKey:@"performDisconnectOnPongTimer"];
@@ -747,13 +736,11 @@ TEXTUAL_IGNORE_DEPRECATION_END
/* These are items that cannot be synced over iCloud because they access data specific to
this device or only contain state information which is not useful to other devices. */
if (isCloudDictionary == NO) {
[dic maybeSetObject:self.identityClientSideCertificate forKey:@"identityClientSideCertificate"];
[dic maybeSetObject:self.identityClientSideCertificate forKey:@"identityClientSideCertificate"];
[dic setBool:self.sidebarItemExpanded forKey:@"sidebarItemExpanded"];
[dic setBool:self.sidebarItemExpanded forKey:@"sidebarItemExpanded"];
[dic setDouble:self.lastMessageServerTime forKey:@"cachedLastServerTimeCapabilityReceivedAtTimestamp"];
}
[dic setDouble:self.lastMessageServerTime forKey:@"cachedLastServerTimeCapabilityReceivedAtTimestamp"];
/* Deprecated */
/* These values are inserted here for backwards compatibility
@@ -1014,11 +1001,6 @@ TEXTUAL_IGNORE_DEPRECATION_END
@dynamic cipherSuites;
@dynamic connectionName;
@dynamic connectionPrefersIPv4;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@dynamic excludedFromCloudSyncing;
#endif
@dynamic fallbackEncoding;
@dynamic floodControlDelayTimerInterval;
@dynamic floodControlMaximumMessages;
@@ -1103,15 +1085,6 @@ TEXTUAL_IGNORE_DEPRECATION_END
TEXTUAL_DEPRECATED_WARNING
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (void)setExcludedFromCloudSyncing:(BOOL)excludedFromCloudSyncing
{
if (self->_excludedFromCloudSyncing != excludedFromCloudSyncing) {
self->_excludedFromCloudSyncing = excludedFromCloudSyncing;
}
}
#endif
- (void)setHideAutojoinDelayedWarnings:(BOOL)hideAutojoinDelayedWarnings
{
if (self->_hideAutojoinDelayedWarnings != hideAutojoinDelayedWarnings) {
-14
View File
@@ -66,15 +66,12 @@ NS_ASSUME_NONNULL_BEGIN
acknowledgements — Open acknowledgements file
activate-license — Activate a license key
application-support-folder — Open the Application Support folder
appstore-page — Open our Mac App Store page
contributors — Open contributors file
custom-scripts-folder – Open the custom scripts storage location folder
custom-style-folder — Open the custom style storage location folder
custom-styles-folder — Open the custom style storage location folder
diagnostic-reports-folder — System diagnostic reports folder
goto — Navigate to an item
icloud-style-folder — Open the custom style storage location folder on iCloud
icloud-styles-folder — Open the custom style storage location folder on iCloud
knowledge-base — Open the homepage of our knowledge base
newsletter — Open the subscription page for the newsletter
support-channel — Connect to the #textual channel
@@ -97,10 +94,6 @@ NS_ASSUME_NONNULL_BEGIN
}
#endif
else if ([action isEqualToString:@"appstore-page"])
{
[menuController() openMacAppStoreWebpage:nil];
}
else if ([action isEqualToString:@"application-support-folder"])
{
[RZWorkspace() openURL:[TPCPathInfo groupContainerApplicationSupportURL]];
@@ -131,13 +124,6 @@ NS_ASSUME_NONNULL_BEGIN
[menuController() navigateToTreeItemAtURL:url];
}
else if ([action isEqualToString:@"icloud-style-folder"] ||
[action isEqualToString:@"icloud-styles-folder"])
{
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
[TPCPathInfo openCloudCustomThemes];
#endif
}
else if ([action isEqualToString:@"knowledge-base"])
{
[TLOpenLink openWithString:@"https://help.codeux.com/textual/" inBackground:NO];
+1 -13
View File
@@ -52,7 +52,6 @@
#import "IRCServer.h"
#import "IRCTreeItemPrivate.h"
#import "IRCWorldPrivate.h"
#import "IRCWorldPrivateCloudExtension.h"
NS_ASSUME_NONNULL_BEGIN
@@ -659,11 +658,6 @@ NSString * const IRCWorldWillDestroyChannelNotification = @"IRCWorldWillDestroyC
}
- (void)destroyClient:(IRCClient *)client
{
[self destroyClient:client skipCloud:NO];
}
- (void)destroyClient:(IRCClient *)client skipCloud:(BOOL)skipCloud
{
NSParameterAssert(client != nil);
@@ -674,7 +668,7 @@ NSString * const IRCWorldWillDestroyChannelNotification = @"IRCWorldWillDestroyC
__weak IRCClient *weakClient = client;
client.disconnectCallback = ^{
[weakSelf destroyClient:weakClient skipCloud:skipCloud];
[weakSelf destroyClient:weakClient];
};
[client quit];
@@ -688,12 +682,6 @@ NSString * const IRCWorldWillDestroyChannelNotification = @"IRCWorldWillDestroyC
[client prepareForPermanentDestruction];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if (skipCloud == NO) {
[self cloud_destroyClient:client];
}
#endif
@try {
[mainWindowServerList() removeItemFromList:client];
}
@@ -1,167 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "TPCPreferencesCloudSyncExtension.h"
#import "TPCPreferencesCloudSyncPrivate.h"
#import "IRCClientConfig.h"
#import "IRCClientPrivate.h"
#import "IRCWorldPrivate.h"
#import "IRCWorldPrivateCloudExtension.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
NSString * const IRCWorldControllerCloudListOfDeletedClientsDefaultsKey = @"World Controller -> Cloud Deleted Clients";
NSString * const IRCWorldControllerCloudClientItemDefaultsKeyPrefix = @"World Controller -> Cloud Synced Client -> ";
@implementation IRCWorld (IRCWorldCloudExtension)
- (NSDictionary<NSString *, id> *)cloud_clientConfigurations
{
NSMutableDictionary<NSString *, id> *dic = [NSMutableDictionary dictionary];
for (IRCClient *u in self.clientList) {
if (u.config.excludedFromCloudSyncing) {
continue;
}
NSDictionary *dictionaryValue = [u configurationDictionaryForCloud];
NSString *dictionaryKey = [IRCWorldControllerCloudClientItemDefaultsKeyPrefix stringByAppendingString:u.uniqueIdentifier];
dic[dictionaryKey] = dictionaryValue;
}
return [dic copy];
}
- (void)cloud_destroyClient:(IRCClient *)client
{
NSParameterAssert(client != nil);
if (client.config.excludedFromCloudSyncing) {
return;
}
[self cloud_addClientToListOfDeletedClients:client.uniqueIdentifier];
[self cloud_removeClientConfigurationCloudEntry:client.uniqueIdentifier];
}
- (void)cloud_addClientToListOfDeletedClients:(NSString *)clientId
{
NSParameterAssert(clientId != nil);
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
NSArray *deletedClients = [sharedCloudManager() valueForKey:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey];
if (deletedClients == nil) {
deletedClients = @[clientId];
} else {
if ([deletedClients containsObject:clientId]) {
return;
}
deletedClients = [deletedClients arrayByAddingObject:clientId];
}
[sharedCloudManager() setValue:deletedClients forKey:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey];
}
/* If a client set locally was set to not be synced from the cloud, but its UUID appears as a
deleted item from another client, then remove that UUID from the deleted clients list if that
client is again set to sync to the cloud. */
- (void)cloud_removeClientFromListOfDeletedClients:(NSString *)clientId
{
NSParameterAssert(clientId != nil);
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
NSArray *deletedClients = [sharedCloudManager() valueForKey:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey];
if (deletedClients) {
NSUInteger clientIndex = [deletedClients indexOfObject:clientId];
if (clientIndex == NSNotFound) {
return;
}
deletedClients = [deletedClients arrayByRemovingObjectAtIndex:clientIndex];
[sharedCloudManager() setValue:deletedClients forKey:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey];
}
}
- (void)cloud_removeClientConfigurationCloudEntry:(NSString *)clientId
{
NSParameterAssert(clientId != nil);
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
NSString *prefKey = [IRCWorldControllerCloudClientItemDefaultsKeyPrefix stringByAppendingString:clientId];
[sharedCloudManager() removeObjectForKey:prefKey];
}
- (void)cloud_processDeletedClientsList:(NSArray<NSString *> *)deletedClients
{
NSParameterAssert(deletedClients != nil);
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
[deletedClients enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) {
IRCClient *u = [self findClientWithId:object];
if (u && u.config.excludedFromCloudSyncing == NO) {
[self destroyClient:u skipCloud:YES];
}
}];
}
@end
#endif
NS_ASSUME_NONNULL_END
@@ -40,7 +40,6 @@
#import "TDCAlert.h"
#import "TLOLocalization.h"
#import "TPCPreferencesLocal.h"
#import "TPCPreferencesCloudSyncPrivate.h"
#import "TPCPreferencesUserDefaults.h"
#import "TPCPathInfoPrivate.h"
@@ -558,83 +557,6 @@ NS_ASSUME_NONNULL_BEGIN
@end
#pragma mark -
#pragma mark iCloud
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
@implementation TPCPathInfo (TPCPathInfoCloudExtension)
+ (nullable NSString *)applicationUbiquitousContainer
{
return sharedCloudManager().ubiquitousContainerPath;
}
+ (nullable NSURL *)applicationUbiquitousContainerURL
{
return sharedCloudManager().ubiquitousContainerURL;
}
+ (nullable NSString *)cloudCustomThemes
{
NSURL *sourceURL = self.cloudCustomThemesURL;
if (sourceURL == nil) {
return nil;
}
return sourceURL.path;
}
+ (nullable NSURL *)cloudCustomThemesURL
{
NSURL *sourceURL = self.applicationUbiquitousContainerURL;
if (sourceURL == nil) {
return nil;
}
NSURL *baseURL = [sourceURL URLByAppendingPathComponent:@"/Documents/Styles/"];
[self _createDirectoryAtURL:baseURL];
return baseURL;
}
+ (void)_openCloudPathOrErrorIfUnavailable:(NSString *)path
{
NSParameterAssert(path != nil);
if (sharedCloudManager().ubiquitousContainerIsAvailable == NO) {
[TDCAlert alertSheetWithWindow:[NSApp keyWindow]
body:TXTLS(@"Prompts[wjn-f1]")
title:TXTLS(@"Prompts[rn7-08]")
defaultButton:TXTLS(@"Prompts[68u-z9]")
alternateButton:nil
otherButton:nil];
return;
}
[RZWorkspace() openFile:path];
}
+ (void)openApplicationUbiquitousContainer
{
NSString *sourcePath = self.applicationUbiquitousContainer;
[self _openCloudPathOrErrorIfUnavailable:sourcePath];
}
+ (void)openCloudCustomThemes
{
NSString *sourcePath = self.cloudCustomThemes;
[self _openCloudPathOrErrorIfUnavailable:sourcePath];
}
@end
#endif
#pragma mark -
#pragma mark Transcript URL
@@ -38,7 +38,6 @@
#import "IRCClientConfig.h"
#import "IRCClientPrivate.h"
#import "IRCWorldPrivate.h"
#import "IRCWorldPrivateCloudExtension.h"
#import "TXMasterController.h"
#import "TDCAlert.h"
#import "TLOLocalization.h"
@@ -194,7 +193,7 @@ NS_ASSUME_NONNULL_BEGIN
}
[object enumerateObjectsUsingBlock:^(id object, NSUInteger index, BOOL *stop) {
[self importClientConfiguration:object isImportedFromCloud:NO];
[self importClientConfiguration:object];
}];
}
else if ([key isEqualToString:@"World Controller"])
@@ -209,22 +208,13 @@ NS_ASSUME_NONNULL_BEGIN
[self import:clientList withKey:IRCWorldClientListDefaultsKey];
}
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
else if ([key hasPrefix:IRCWorldControllerCloudClientItemDefaultsKeyPrefix] ||
[key hasPrefix:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey])
{
; // Ignore key...
}
#endif
else
{
[RZUserDefaults() setObject:object forKey:key];
}
}
+ (void)importClientConfiguration:(NSDictionary<NSString *, id> *)config isImportedFromCloud:(BOOL)isImportedFromCloud
+ (void)importClientConfiguration:(NSDictionary<NSString *, id> *)config
{
NSParameterAssert(config != nil);
@@ -232,20 +222,8 @@ NS_ASSUME_NONNULL_BEGIN
IRCClient *client = [worldController() findClientWithId:clientConfig.uniqueIdentifier];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if (isImportedFromCloud) {
if (client && client.config.excludedFromCloudSyncing) {
return;
}
}
#endif
if (client) {
if (isImportedFromCloud) {
[client updateConfigFromTheCloud:clientConfig];
} else {
[client updateConfig:clientConfig];
}
[client updateConfig:clientConfig];
} else {
[worldController() createClientWithConfig:clientConfig reload:YES];
}
@@ -271,11 +249,6 @@ NS_ASSUME_NONNULL_BEGIN
[TPCPreferencesUserDefaults keyIsObsolete:key]);
}
+ (NSDictionary<NSString *, id> *)exportedPreferencesDictionaryForCloud
{
return [self exportedPreferencesDictionary:YES filterDefaults:NO];
}
+ (NSDictionary<NSString *, id> *)exportedPreferencesDictionary
{
return [self exportedPreferencesDictionary:YES filterDefaults:YES];
@@ -44,7 +44,6 @@
#import "TDCProgressIndicatorSheetPrivate.h"
#import "TLOLocalization.h"
#import "TPCPathInfo.h"
#import "TPCPreferencesCloudSync.h"
#import "TPCPreferencesLocalPrivate.h"
#import "TPCPreferencesReload.h"
#import "TPCResourceManager.h"
@@ -53,9 +52,6 @@
NS_ASSUME_NONNULL_BEGIN
NSString * const TPCThemeControllerCloudThemeNameBasicPrefix = @"cloud";
NSString * const TPCThemeControllerCloudThemeNameCompletePrefix = @"cloud:";
NSString * const TPCThemeControllerCustomThemeNameBasicPrefix = @"user";
NSString * const TPCThemeControllerCustomThemeNameCompletePrefix = @"user:";
@@ -89,7 +85,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
@property (nonatomic, strong, nullable) TPCThemeControllerCopyOperation *currentCopyOperation;
@property (nonatomic, strong) TPCThemeControllerThemeListMutable bundledThemes;
@property (nonatomic, strong) TPCThemeControllerThemeListMutable customThemes;
@property (nonatomic, strong) TPCThemeControllerThemeListMutable cloudThemes;
@property (nonatomic, strong) XRFileSystemMonitor *themeMonitor;
@end
@@ -113,7 +108,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
self.bundledThemes = [NSMutableDictionary dictionary];
self.customThemes = [NSMutableDictionary dictionary];
self.cloudThemes = [NSMutableDictionary dictionary];
[self populateThemes];
@@ -300,12 +294,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
return nil;
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if ([RZFileManager() isUbiquitousItemAtURLDownloaded:url] == NO) {
return nil;
}
#endif
theme = [[TPCTheme alloc] initWithURL:url inStorageLocation:storageLocation];
[self addTheme:theme withFilename:name storageLocation:storageLocation];
@@ -408,14 +396,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
return [TPCPathInfo customThemes];
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
case TPCThemeStorageLocationCloud:
{
return [TPCPathInfo cloudCustomThemes];
}
#endif
default:
{
break;
@@ -438,14 +418,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
return self.customThemes;
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
case TPCThemeStorageLocationCloud:
{
return self.cloudThemes;
}
#endif
default:
{
break;
@@ -477,7 +449,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
};
_addStorageLocation(TPCThemeStorageLocationCustom);
_addStorageLocation(TPCThemeStorageLocationCloud);
__weak TPCThemeController *weakSelf = self;
@@ -504,15 +475,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
self.themeMonitor = nil;
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
- (void)reloadThemeMonitoring
{
[self stopMonitoringThemes];
[self startMonitoringThemes];
}
#endif
- (void)reactToMonitoringEvents:(NSArray<XRFileSystemEvent *> *)events
{
NSParameterAssert(events != nil);
@@ -603,7 +565,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
[self populateThemesFromStorageLocation:TPCThemeStorageLocationBundle];
[self populateThemesFromStorageLocation:TPCThemeStorageLocationCustom];
[self populateThemesFromStorageLocation:TPCThemeStorageLocationCloud];
}
- (void)populateThemesFromStorageLocation:(TPCThemeStorageLocation)storageLocation
@@ -701,10 +662,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
_mapByName(TPCThemeStorageLocationBundle);
_mapByName(TPCThemeStorageLocationCustom);
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
_mapByName(TPCThemeStorageLocationCloud);
#endif
/* Create sorted list of themes */
NSArray *themeNamesSorted = themesMappedByName.sortedDictionaryKeys;
@@ -1064,67 +1021,11 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
} // theme source bundled
else if ([themeSource isEqualToString:TPCThemeControllerCustomThemeNameBasicPrefix])
{
/* Even if the current theme is custom and is valid, we still will validate whether
a cloud variant of it exists and if it does, prefer that over the custom. */
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
NSString *cloudTheme = [self.class buildFilename:themeName forStorageLocation:TPCThemeStorageLocationCloud];
if ([self themeExists:cloudTheme]) {
/* If the theme exists in the cloud, then we go to that. */
if ( suggestedThemeName) {
*suggestedThemeName = cloudTheme;
keyChanged = YES;
}
} else { // theme exists
#endif
/* If there is no cloud theme, then we continue validation. */
if ([self themeExists:validatedTheme] == NO) {
NSString *bundledTheme = [self.class buildFilename:themeName forStorageLocation:TPCThemeStorageLocationBundle];
if ([self themeExists:bundledTheme]) {
/* Use a bundled theme with the same name if available. */
if ( suggestedThemeName) {
*suggestedThemeName = bundledTheme;
keyChanged = YES;
}
} else {
/* Revert back to the default theme if no recovery is possible. */
if ( suggestedThemeName) {
*suggestedThemeName = [TPCPreferences themeNameDefault];
keyChanged = YES;
}
} // bundled theme exists
} // preferred theme exists
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
} // cloud theme exists
#endif
} // theme source custom
else if ([themeSource isEqualToString:TPCThemeControllerCloudThemeNameBasicPrefix])
{
if ([self themeExists:validatedTheme] == NO) {
/* If the current theme stored in the cloud is not valid, then we try to revert
to a custom one or a bundled one depending which one is available. */
NSString *customTheme = [self.class buildFilename:themeName forStorageLocation:TPCThemeStorageLocationCustom];
NSString *bundledTheme = [self.class buildFilename:themeName forStorageLocation:TPCThemeStorageLocationBundle];
if ([self themeExists:customTheme]) {
/* Use a custom theme with the same name if available. */
if ( suggestedThemeName) {
*suggestedThemeName = customTheme;
keyChanged = YES;
}
} else if ([self themeExists:bundledTheme]) {
if ([self themeExists:bundledTheme]) {
/* Use a bundled theme with the same name if available. */
if ( suggestedThemeName) {
*suggestedThemeName = bundledTheme;
@@ -1138,9 +1039,9 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
keyChanged = YES;
}
}
}
} // theme source
} // bundled theme exists
} // preferred theme exists
} // theme source custom
return (keyChanged == NO);
}
@@ -1184,10 +1085,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
return [TPCThemeControllerCustomThemeNameCompletePrefix stringByAppendingString:name];
}
case TPCThemeStorageLocationCloud:
{
return [TPCThemeControllerCloudThemeNameCompletePrefix stringByAppendingString:name];
}
default:
{
break;
@@ -1208,10 +1105,6 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
return TXTLS(@"BasicLanguage[bm2-4p]");
}
case TPCThemeStorageLocationCloud:
{
return TXTLS(@"BasicLanguage[aqy-6c]");
}
default:
{
break;
@@ -1225,8 +1118,7 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
NSParameterAssert(source != nil);
if ([source hasPrefix:TPCThemeControllerCloudThemeNameCompletePrefix] == NO &&
[source hasPrefix:TPCThemeControllerCustomThemeNameCompletePrefix] == NO &&
if ([source hasPrefix:TPCThemeControllerCustomThemeNameCompletePrefix] == NO &&
[source hasPrefix:TPCThemeControllerBundledThemeNameCompletePrefix] == NO)
{
return nil;
@@ -1241,8 +1133,7 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
NSParameterAssert(source != nil);
if ([source hasPrefix:TPCThemeControllerCloudThemeNameCompletePrefix] == NO &&
[source hasPrefix:TPCThemeControllerCustomThemeNameCompletePrefix] == NO &&
if ([source hasPrefix:TPCThemeControllerCustomThemeNameCompletePrefix] == NO &&
[source hasPrefix:TPCThemeControllerBundledThemeNameCompletePrefix] == NO)
{
return nil;
@@ -1263,9 +1154,7 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
{
NSParameterAssert(themeName != nil);
if ([themeName hasPrefix:TPCThemeControllerCloudThemeNameCompletePrefix]) {
return TPCThemeStorageLocationCloud;
} else if ([themeName hasPrefix:TPCThemeControllerCustomThemeNameCompletePrefix]) {
if ([themeName hasPrefix:TPCThemeControllerCustomThemeNameCompletePrefix]) {
return TPCThemeStorageLocationCustom;
} else if ([themeName hasPrefix:TPCThemeControllerBundledThemeNameCompletePrefix]) {
return TPCThemeStorageLocationBundle;
@@ -1349,102 +1238,24 @@ typedef NSMutableDictionary <NSString *, TPCTheme *> *TPCThemeControllerThemeLi
NSURL *destinationURL = [NSURL fileURLWithPath:self.pathBeingCopiedTo isDirectory:YES];
#define _cancelOperationAndReturn [self cancelOperation]; \
\
return;
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
if (self.destinationLocation == TPCThemeStorageLocationCloud)
if ([RZFileManager() replaceItemAtURL:destinationURL
withItemAtURL:sourceURL
moveToDestination:NO
moveDestinationToTrash:YES] == NO)
{
/* When copying to iCloud, we copy the style to a temporary folder then
have OS X handle the transfer of said folder to iCloud on our behalf. */
if ([RZFileManager() fileExistsAtURL:destinationURL]) {
NSError *trashItemError = nil;
[self cancelOperation];
if ([RZFileManager() trashItemAtURL:destinationURL resultingItemURL:NULL error:&trashItemError]) {
LogToConsoleInfo("A copy of the theme being copied already exists at the destination path. This copy has been moved to the trash.");
} else {
LogToConsoleError("Failed to trash destination: '%@': %@",
destinationURL.path, trashItemError.localizedDescription);
_cancelOperationAndReturn
}
}
/* Copy to temporary location */
NSURL *fakeDestinationURL = [[TPCPathInfo applicationTemporaryURL] URLByAppendingPathComponent:[NSString stringWithUUID]];
NSError *copyFileError = nil;
if ([RZFileManager() copyItemAtURL:sourceURL toURL:fakeDestinationURL error:&copyFileError] == NO) {
LogToConsoleError("Failed to perform copy: '%@' -> '%@': %@",
sourceURL.path, fakeDestinationURL.path, copyFileError.localizedDescription);
_cancelOperationAndReturn
}
/* Move item to iCloud */
NSError *setUbiquitousError = nil;
if ([RZFileManager() setUbiquitous:YES itemAtURL:fakeDestinationURL destinationURL:destinationURL error:&setUbiquitousError] == NO) {
LogToConsoleError("Failed to set item as ubiquitous: '%@': %@",
fakeDestinationURL.path, setUbiquitousError.localizedDescription);
_cancelOperationAndReturn
}
/* Once the operation is completed, we can try to delete the temporary folder. */
/* As the folder is only a temporary one, we don't care if this process errors out. */
[RZFileManager() removeItemAtURL:fakeDestinationURL error:NULL];
return;
}
else
{
#endif
if ([RZFileManager() replaceItemAtURL:destinationURL
withItemAtURL:sourceURL
moveToDestination:NO
moveDestinationToTrash:YES] == NO)
{
_cancelOperationAndReturn
}
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
}
#endif
[self completeOperation];
#undef _cancelOperationAndReturn
}
- (void)_defineDestinationPath
{
NSString *destinationPath = nil;
if (self.destinationLocation == TPCThemeStorageLocationCustom)
{
destinationPath = [TPCPathInfo customThemes];
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
}
else if (self.destinationLocation == TPCThemeStorageLocationCloud)
{
/* If the destination was set for the cloud, but the cloud is not available,
then we update our destinationLocation property so that the theme controller
actually will know where to look for the new theme. */
if (sharedCloudManager().ubiquitousContainerIsAvailable == NO) {
self.destinationLocation = TPCThemeStorageLocationCustom;
destinationPath = [TPCPathInfo customThemes];
} else {
destinationPath = [TPCPathInfo cloudCustomThemes];
}
#endif
}
destinationPath = [TPCPathInfo customThemes];
destinationPath = [destinationPath stringByAppendingPathComponent:self.themeName];
/* Cast as nonnull to make static analyzer happy */
@@ -1,831 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2018 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "TXMasterController.h"
#import "IRCWorldPrivateCloudExtension.h"
#import "TPCThemeControllerPrivate.h"
#import "TPCPreferencesCloudSyncExtensionPrivate.h"
#import "TPCPreferencesLocal.h"
#import "TPCPreferencesImportExportPrivate.h"
#import "TPCPreferencesReload.h"
#import "TPCPreferencesUserDefaults.h"
#import "TPCPreferencesCloudSyncPrivate.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
/* Internal cloud work is divided into two timers. Important work such as
syncing upstream to the cloud is put on a per-minute timer. This timer
also checks if a theme stored in the temporary store now exists. */
/* The second timer is ten-minute (roughly) based and handles less important
tasks. When this comment was written, it only handled the checking of
whether fonts exist, but it could be changed to include more later. */
#define _localKeysUpstreamSyncTimerInterval_1 60.0 // 1 minute
#define _localKeysUpstreamSyncTimerInterval_2 630.0 // 10 minutes, 30 seconds
@interface TPCPreferencesCloudSync ()
@property (nonatomic, strong, nullable) id ubiquityIdentityToken;
@property (nonatomic, assign) BOOL pushAllLocalKeysNextSync;
@property (nonatomic, strong) dispatch_queue_t workerQueue;
@property (nonatomic, strong) NSTimer *cloudOneMinuteSyncTimer;
@property (nonatomic, strong) NSTimer *cloudTenMinuteSyncTimer;
@property (nonatomic, copy, nullable, readwrite) NSURL *ubiquitousContainerURL;
@property (nonatomic, strong) NSMutableArray<NSString *> *keysToSync;
@property (nonatomic, strong) NSMutableArray<NSString *> *keysToRemove;
@property (nonatomic, copy) NSArray<NSString *> *remoteKeysBeingSynced;
@property (nonatomic, assign, readwrite) BOOL isTerminated;
@property (nonatomic, assign) BOOL isSyncingLocalKeysDownstream;
@property (nonatomic, assign) BOOL isSyncingLocalKeysUpstream;
@property (nonatomic, assign) BOOL hasUncommittedDataStoredInCloud;
@end
@implementation TPCPreferencesCloudSync
#pragma mark -
#pragma mark Public API
- (void)setValue:(nullable id)value forKey:(NSString *)key
{
NSParameterAssert(key != nil);
NSString *keyHashed = key.md5;
if (value == nil) {
[RZUbiquitousKeyValueStore() removeObjectForKey:keyHashed];
return;
}
NSDictionary *valueDic = @{
@"key" : key,
@"value" : value
};
[RZUbiquitousKeyValueStore() setObject:valueDic forKey:keyHashed];
}
- (nullable id)valueForKey:(NSString *)key
{
NSParameterAssert(key != nil);
NSString *keyHashed = key.md5;
return [self valueForHashedKey:keyHashed unhashedKey:NULL];
}
- (nullable id)valueForHashedKey:(NSString *)hashedKey unhashedKey:(NSString * _Nullable * _Nullable)unhashedKey /* @private */
{
NSParameterAssert(hashedKey != nil);
id dictObject = [RZUbiquitousKeyValueStore() objectForKey:hashedKey];
NSObjectIsKindOfClassAssertReturn(dictObject, NSDictionary, nil)
id keyValue = dictObject[@"key"];
if (keyValue == nil) {
return nil;
}
id objectValue = dictObject[@"value"];
if (objectValue == nil) {
return nil;
}
if ( unhashedKey) {
*unhashedKey = keyValue;
}
return objectValue;
}
- (void)removeObjectForKey:(NSString *)key
{
NSParameterAssert(key != nil);
NSString *keyHashed = key.md5;
[RZUbiquitousKeyValueStore() removeObjectForKey:keyHashed];
}
- (void)removeObjectForKeyNextUpstreamSync:(NSString *)key
{
NSParameterAssert(key != nil);
if (self.isTerminated) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
[self.keysToRemove addObject:key];
});
}
#pragma mark -
#pragma mark URL Management
- (void)setupUbiquitousContainerPath
{
if (self.isTerminated) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
NSURL *containerURL = [RZFileManager() URLForUbiquityContainerIdentifier:nil];
if (containerURL) {
self.ubiquitousContainerURL = containerURL;
} else {
self.ubiquitousContainerURL = nil;
LogToConsoleInfo("iCloud access is not available.");
}
[themeController() reloadThemeMonitoring];
});
}
- (nullable NSString *)ubiquitousContainerPath
{
return (self.ubiquitousContainerURL).path;
}
- (BOOL)ubiquitousContainerIsAvailable
{
return (self.ubiquitousContainerURL != nil);
}
#pragma mark -
#pragma mark Cloud Sync Management
- (void)synchronizeToCloud
{
[self syncPreferencesToCloud];
}
- (void)synchronizeFromCloud
{
[self syncPreferencesFromCloud:nil];
}
- (void)performTenMinuteTimeBasedMaintenance
{
if (self.isTerminated) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
[TPCPreferences fixThemeFontNameMissingDuringSync];
});
}
- (void)performOneMinuteTimeBasedMaintenance
{
if (self.isTerminated) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
[self synchronizeToCloud];
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
[TPCPreferences fixThemeNameMissingDuringSync];
});
}
- (void)syncPreferencesToCloud
{
if (self.isTerminated) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
/* Only perform sync if there is something to sync */
if (self.pushAllLocalKeysNextSync == NO && (self.keysToRemove).count == 0 && (self.keysToSync).count == 0) {
LogToConsoleDebug("iCloud: Upstream sync cancelled because nothing has changed");
return;
}
if (self.isSyncingLocalKeysDownstream) {
LogToConsoleDebug("iCloud: Upstream sync cancelled because a downstream sync is in progress");
return;
}
if (self.isSyncingLocalKeysUpstream) {
LogToConsoleDebug("iCloud: Upstream sync cancelled because an upstream sync is in progress");
return;
}
if (self.hasUncommittedDataStoredInCloud) {
LogToConsoleDebug("iCloud: Upstream sync cancelled because there is uncommitted data remaining in the cloud");
return;
}
LogToConsoleDebug("iCloud: Beginning sync upstream");
self.isSyncingLocalKeysUpstream = YES;
/* Compare to the remote */
NSDictionary *remoteValues = RZUbiquitousKeyValueStore().dictionaryRepresentation;
/* Gather dictionary representation of all local preferences */
NSMutableDictionary<NSString *, id> *changedValues = [NSMutableDictionary dictionary];
if (self.pushAllLocalKeysNextSync) {
self.pushAllLocalKeysNextSync = NO;
NSDictionary *exportedPreferences = [TPCPreferencesImportExport exportedPreferencesDictionaryForCloud];
[changedValues addEntriesFromDictionary:exportedPreferences];
} else {
for (NSString *key in self.keysToSync) {
id object = [RZUserDefaults() objectForKey:key];
if (object) {
changedValues[key] = object;
}
}
}
/* Remove keys to sync even if we are syncing all */
[self.keysToSync removeAllObjects];
/* If one of the values changed is our world controller, then we
intercept that key and replace it with a few special values. */
if ([changedValues containsKey:IRCWorldClientListDefaultsKey]) {
[changedValues removeObjectForKey:IRCWorldClientListDefaultsKey];
NSDictionary *clientDict = [worldController() cloud_clientConfigurations];
[changedValues addEntriesFromDictionary:clientDict];
}
/* Remove any keys that were marked for removal */
for (NSString *key in self.keysToRemove) {
LogToConsoleDebug("Key (%@) is being removed from iCloud as it was marked to be", key);
[self removeObjectForKey:key];
[changedValues removeObjectForKey:key];
};
[self.keysToRemove removeAllObjects];
/* Get a copy of our defaults */
static NSDictionary<NSString *, NSString *> *defaults = nil;
if (defaults == nil) {
defaults = [TPCPreferences defaultPreferences];
}
/* Set the remote dictionary */
[changedValues enumerateKeysAndObjectsUsingBlock:^(id key, id objectValue, BOOL *stop) {
/* Special save conditions */
if ([self keyIsNotPermittedInCloud:key]) {
return;
}
if ([key isEqualToString:TPCPreferencesThemeNameDefaultsKey]) {
BOOL missingTheme = [RZUserDefaults() boolForKey:TPCPreferencesThemeNameMissingLocallyDefaultsKey];
if (missingTheme) {
return;
}
} else if ([key isEqualToString:TPCPreferencesThemeFontNameDefaultsKey]) {
BOOL fontMissing = [RZUserDefaults() boolForKey:TPCPreferencesThemeFontNameMissingLocallyDefaultsKey];
if (fontMissing) {
return;
}
}
/* If the key does not already exist in the cloud, then we check
if its value matches the default value maintained internally. If
it has not changed from the default, why are we saving it? */
id defaultsValue = defaults[key];
id remoteValue = remoteValues[key];
if (defaultsValue != nil && remoteValue == nil) {
if ([defaultsValue isEqual:objectValue]) {
return;
}
}
/* Save value */
[self setValue:objectValue forKey:key];
}];
[RZUbiquitousKeyValueStore() synchronize];
self.isSyncingLocalKeysUpstream = NO;
LogToConsoleDebug("iCloud: Completing sync upstream");
});
}
- (void)syncPreferencesFromCloud:(NSArray<NSString *> *)keysChangedHashed
{
if (self.isTerminated) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
LogToConsoleDebug("iCloud: Beginning sync downstream");
self.isSyncingLocalKeysDownstream = YES;
if (keysChangedHashed == nil || keysChangedHashed.count == 0) {
NSDictionary *upstreamValues = RZUbiquitousKeyValueStore().dictionaryRepresentation;
self.remoteKeysBeingSynced = upstreamValues.allKeys;
} else {
self.remoteKeysBeingSynced = keysChangedHashed;
}
/* See the code of syncPreferencesToCloud: for an explanation of how these keys are hashed. */
NSMutableArray<NSDictionary *> *clientsImported = [NSMutableArray array];
NSMutableArray<NSString *> *keysChanged = [NSMutableArray array];
NSMutableArray<NSString *> *keysToRemove = [NSMutableArray array];
NSArray<NSString *> *listOfDeletedClients = nil;
for (NSString *hashedKey in self.remoteKeysBeingSynced) {
NSString *unhashedKey = nil;
id unhashedValue = [self valueForHashedKey:hashedKey unhashedKey:&unhashedKey];
/* Maybe remove certain keys from the local defaults store */
if (unhashedKey == nil || unhashedValue == nil) {
unhashedKey = [self unhashedKeyFromHashedKey:hashedKey];
LogToConsoleDebug("Hashed key (%@) is missing a value or key name. Possible key name: %@", hashedKey, unhashedKey);
if (unhashedKey) {
LogToConsoleDebug("Asking for permission to remove key (%@) from local defaults store", unhashedKey);
if ([self keyIsNotPermittedFromCloud:unhashedKey]) {
continue;
}
if ([self keyIsPermittedToBeRemovedThroughCloud:unhashedKey]) {
[keysToRemove addObject:unhashedKey];
[keysChanged addObject:unhashedKey];
}
}
continue;
}
if ([self keyIsNotPermittedFromCloud:unhashedKey]) {
continue;
}
/* Compare the local to the new */
/* This is for when we are going through the entire dictionary */
id localValue = [RZUserDefaults() objectForKey:unhashedKey];
if (localValue && [localValue isEqual:unhashedValue]) {
continue;
}
/* Set it to the new dictionary */
if ([unhashedKey isEqualToString:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey])
{
if ([unhashedValue isKindOfClass:[NSArray class]] == NO) {
continue;
}
listOfDeletedClients = unhashedValue;
}
else if ([unhashedKey hasPrefix:IRCWorldControllerCloudClientItemDefaultsKeyPrefix])
{
if ([unhashedValue isKindOfClass:[NSDictionary class]] == NO) {
continue;
}
[clientsImported addObject:unhashedValue];
}
else
{
[keysChanged addObject:unhashedKey];
[TPCPreferencesImportExport import:unhashedValue withKey:unhashedKey];
}
}
/* Perform reload */
XRPerformBlockAsynchronouslyOnMainQueue(^{
if (listOfDeletedClients.count > 0) {
[worldController() cloud_processDeletedClientsList:listOfDeletedClients];
}
for (NSString *key in keysToRemove) {
[RZUserDefaults() removeObjectForKey:key];
}
if (keysChanged.count > 0) {
[TPCPreferences performReloadActionForKeys:keysChanged];
}
for (NSDictionary *client in clientsImported) {
[TPCPreferencesImportExport importClientConfiguration:client isImportedFromCloud:YES];
}
});
self.hasUncommittedDataStoredInCloud = NO;
self.isSyncingLocalKeysDownstream = NO;
self.remoteKeysBeingSynced = nil;
LogToConsoleDebug("iCloud: Completing sync downstream");
});
}
- (void)resetDataToSync
{
if (self.isTerminated) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
self.pushAllLocalKeysNextSync = NO;
[self.keysToRemove removeAllObjects];
[self.keysToSync removeAllObjects];
});
}
- (void)syncEverythingNextSync
{
if (self.isTerminated) {
return;
}
self.pushAllLocalKeysNextSync = YES;
}
- (void)purgeDataStoredWithCloud
{
if (self.isTerminated) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
[RZUbiquitousKeyValueStore() synchronize];
NSDictionary *remoteValues = RZUbiquitousKeyValueStore().dictionaryRepresentation;
[remoteValues enumerateKeysAndObjectsUsingBlock:^(NSString *key, id object, BOOL *stop) {
[RZUbiquitousKeyValueStore() removeObjectForKey:key];
}];
[RZUserDefaults() removeObjectForKey:TPCPreferencesThemeFontNameMissingLocallyDefaultsKey];
[RZUserDefaults() removeObjectForKey:TPCPreferencesThemeNameMissingLocallyDefaultsKey];
self.pushAllLocalKeysNextSync = YES;
});
}
#pragma mark -
#pragma mark Key Conditions
- (BOOL)keyIsNotPermittedInCloud:(NSString *)key
{
NSParameterAssert(key != nil);
if ([TPCPreferences syncPreferencesToTheCloudLimitedToServers]) {
return ([key hasPrefix:IRCWorldControllerCloudClientItemDefaultsKeyPrefix] == NO);
}
return ([key isEqualToString:@"World Controller"] ||
[key isEqualToString:IRCWorldClientListDefaultsKey] ||
[key isEqualToString:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey] ||
[key isEqualToString:TPCPreferencesCloudSyncServicesEnabledDefaultsKey] ||
[key isEqualToString:TPCPreferencesCloudSyncServicesLimitedToServersDefaultsKey] ||
[key isEqualToString:TPCPreferencesThemeNameMissingLocallyDefaultsKey] ||
[key isEqualToString:TPCPreferencesThemeFontNameMissingLocallyDefaultsKey]);
}
- (BOOL)keyIsNotPermittedFromCloud:(NSString *)key
{
NSParameterAssert(key != nil);
if ([TPCPreferences syncPreferencesToTheCloudLimitedToServers]) {
return ([self keyIsRelatedToSavedServerState:key] == NO);
}
return ([key isEqualToString:@"World Controller"] ||
[key isEqualToString:IRCWorldClientListDefaultsKey] ||
[key isEqualToString:TPCPreferencesCloudSyncServicesEnabledDefaultsKey] ||
[key isEqualToString:TPCPreferencesCloudSyncServicesLimitedToServersDefaultsKey] ||
[key isEqualToString:TPCPreferencesThemeNameMissingLocallyDefaultsKey] ||
[key isEqualToString:TPCPreferencesThemeFontNameMissingLocallyDefaultsKey]);
}
- (BOOL)keyIsRelatedToSavedServerState:(NSString *)key
{
NSParameterAssert(key != nil);
return ([key isEqualToString:IRCWorldControllerCloudListOfDeletedClientsDefaultsKey] ||
[key hasPrefix:IRCWorldControllerCloudClientItemDefaultsKeyPrefix]);
}
- (nullable NSString *)unhashedKeyFromHashedKey:(NSString *)hashedKey
{
/* This method only lists specific keys that we need to know which cannot
be viewed directly by asking for the key-value entry in iCloud. */
/* It was at the point that I wrote this method that I realized how
fucking stupid Textual's implementation of iCloud is. */
NSParameterAssert(hashedKey != nil);
static NSDictionary<NSString *, NSString *> *cachedValues = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cachedValues = @{
@"eb2dc862342c6c653e29d7363f6d421e" : @"User List Mode Badge Colors -> +y",
@"0d6b24b13a7e43211762da51815b2064" : @"User List Mode Badge Colors -> +q",
@"74f61fa09dce30a57fd7c1331cd99ddb" : @"User List Mode Badge Colors -> +a",
@"1ceffaa7b5291aa3b15e7e229a50e272" : @"User List Mode Badge Colors -> +o",
@"4f8e8414604e9ccb757d980991d576a1" : @"User List Mode Badge Colors -> +h",
@"76248ae19d477d639cb821f1e0a6dae2" : @"User List Mode Badge Colors -> +v",
@"2a95c3cfc017173e986e24d536d517a4" : @"User List Mode Badge Colors -> no mode",
@"051baac72009cc4914d1815916e1ed49" : @"Server List Unread Message Count Badge Colors -> Highlight"
};
});
return cachedValues[hashedKey];
}
- (BOOL)keyIsPermittedToBeRemovedThroughCloud:(NSString *)key
{
/* List of keys that when synced downstream are allowed to be removed
from NSUserDefaults if they no longer exist in the cloud. */
NSParameterAssert(key != nil);
return ([key isEqualToString:@"User List Mode Badge Colors -> +y"] ||
[key isEqualToString:@"User List Mode Badge Colors -> +q"] ||
[key isEqualToString:@"User List Mode Badge Colors -> +a"] ||
[key isEqualToString:@"User List Mode Badge Colors -> +o"] ||
[key isEqualToString:@"User List Mode Badge Colors -> +h"] ||
[key isEqualToString:@"User List Mode Badge Colors -> +v"] ||
[key isEqualToString:@"User List Mode Badge Colors -> no mode"] ||
[key isEqualToString:@"Server List Unread Message Count Badge Colors -> Highlight"]);
}
#pragma mark -
#pragma mark Notifications
- (void)syncPreferenceFromCloudNotification:(NSNotification *)aNote
{
if (self.isTerminated) {
return;
}
NSInteger syncReason =
[aNote.userInfo integerForKey:NSUbiquitousKeyValueStoreChangeReasonKey];
if (syncReason == NSUbiquitousKeyValueStoreQuotaViolationChange) {
[self cloudStorageLimitExceeded];
} else if (syncReason == NSUbiquitousKeyValueStoreServerChange ||
syncReason == NSUbiquitousKeyValueStoreInitialSyncChange)
{
self.hasUncommittedDataStoredInCloud = YES;
NSArray<NSString *> *keysChangedHashed =
[aNote.userInfo arrayForKey:NSUbiquitousKeyValueStoreChangedKeysKey];
[self syncPreferencesFromCloud:keysChangedHashed];
}
}
- (void)localKeysDidChangeNotification:(NSNotification *)aNote
{
if (self.isTerminated) {
return;
}
if ([TPCPreferences syncPreferencesToTheCloud] == NO) {
return;
}
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
NSString *changedKey = aNote.userInfo[@"changedKey"];
if (changedKey == nil) {
return;
}
// If the key changed is in the list of the keys being imported at
// this time, then the key probably changed because we imported it.
if ([self.remoteKeysBeingSynced containsObject:changedKey]) {
return;
}
[self.keysToRemove removeObject:changedKey];
[self.keysToSync addObject:changedKey];
});
}
- (void)cloudStorageLimitExceeded
{
LogToConsoleError("The cloud storage limit was exceeded");
}
#pragma mark -
#pragma mark Session Management
- (void)iCloudAccountAvailabilityChanged:(NSNotification *)aNote
{
if (self.isTerminated) {
return;
}
id newToken = RZFileManager().cloudUbiquityIdentityToken;
id oldToken = self.ubiquityIdentityToken;
if (newToken && newToken != oldToken) {
self.pushAllLocalKeysNextSync = YES;
}
self.ubiquityIdentityToken = newToken;
[self setupUbiquitousContainerPath];
}
#pragma mark -
#pragma mark Initialization
- (void)prepareInitialState
{
LogToConsoleDebug("iCloud: Beginning session");
self.workerQueue =
XRCreateDispatchQueueWithPriority("Textual.TPCPreferencesCloudSync.iCloudSyncDispatchQueue", DISPATCH_QUEUE_SERIAL, QOS_CLASS_BACKGROUND);
self.ubiquityIdentityToken = RZFileManager().cloudUbiquityIdentityToken;
[self setupUbiquitousContainerPath];
self.keysToRemove = [NSMutableArray array];
self.keysToSync = [NSMutableArray array];
[RZNotificationCenter() addObserver:self
selector:@selector(localKeysDidChangeNotification:)
name:TPCPreferencesUserDefaultsDidChangeNotification
object:nil];
[RZNotificationCenter() addObserver:self
selector:@selector(iCloudAccountAvailabilityChanged:)
name:NSUbiquityIdentityDidChangeNotification
object:nil];
NSTimer *syncTimer1 = [NSTimer scheduledTimerWithTimeInterval:_localKeysUpstreamSyncTimerInterval_1
target:self
selector:@selector(performOneMinuteTimeBasedMaintenance)
userInfo:nil
repeats:YES];
self.cloudOneMinuteSyncTimer = syncTimer1;
NSTimer *syncTimer2 = [NSTimer scheduledTimerWithTimeInterval:_localKeysUpstreamSyncTimerInterval_2
target:self
selector:@selector(performTenMinuteTimeBasedMaintenance)
userInfo:nil
repeats:YES];
self.cloudTenMinuteSyncTimer = syncTimer2;
[RZNotificationCenter() addObserver:self
selector:@selector(syncPreferenceFromCloudNotification:)
name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification
object:nil];
[RZUbiquitousKeyValueStore() synchronize];
}
- (void)prepareForApplicationTermination
{
if (self.isTerminated) {
return;
}
/* The cloud session is closed from within the worker queue so that
any operations that aren't already finished will have time to do so. */
XRPerformBlockAsynchronouslyOnQueue(self.workerQueue, ^{
[self _closeCloudSyncSession];
});
}
- (void)_closeCloudSyncSession
{
if (self.isTerminated) {
return;
}
LogToConsoleDebug("iCloud: Closing session");
if ( self.cloudOneMinuteSyncTimer) {
[self.cloudOneMinuteSyncTimer invalidate];
self.cloudOneMinuteSyncTimer = nil;
}
if ( self.cloudTenMinuteSyncTimer) {
[self.cloudTenMinuteSyncTimer invalidate];
self.cloudTenMinuteSyncTimer = nil;
}
[RZNotificationCenter() removeObserver:self];
if (self.workerQueue) {
self.workerQueue = nil;
}
self.pushAllLocalKeysNextSync = NO;
self.keysToRemove = nil;
self.keysToSync = nil;
self.remoteKeysBeingSynced = nil;
self.isSyncingLocalKeysDownstream = NO;
self.isSyncingLocalKeysUpstream = NO;
self.ubiquityIdentityToken = nil;
self.ubiquitousContainerURL = nil;
self.isTerminated = YES;
}
@end
#endif
NS_ASSUME_NONNULL_END
@@ -1,138 +0,0 @@
/* *********************************************************************
* _____ _ _
* |_ _|____ _| |_ _ _ __ _| |
* | |/ _ \ \/ / __| | | |/ _` | |
* | | __/> <| |_| |_| | (_| | |
* |_|\___/_/\_\\__|\__,_|\__,_|_|
*
* Copyright (c) 2010 - 2020 Codeux Software, LLC & respective contributors.
* Please see Acknowledgements.pdf for additional information.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Textual, "Codeux Software, LLC", nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*********************************************************************** */
#import "TPCThemeController.h"
#import "TPCPreferencesCloudSyncPrivate.h"
#import "TPCPreferencesLocalPrivate.h"
#import "TPCPreferencesReload.h"
#import "TPCPreferencesUserDefaults.h"
#import "TPCPreferencesCloudSyncExtensionPrivate.h"
NS_ASSUME_NONNULL_BEGIN
#if TEXTUAL_BUILT_WITH_ICLOUD_SUPPORT == 1
#pragma mark -
#pragma mark Public
@implementation TPCPreferences (TPCPreferencesCloudSync)
NSString * const TPCPreferencesCloudSyncServicesEnabledDefaultsKey = @"SyncPreferencesToTheCloud";
NSString * const TPCPreferencesCloudSyncServicesLimitedToServersDefaultsKey = @"SyncPreferencesToTheCloudLimitedToServers";
NSString * const TPCPreferencesCloudSyncDidChangeThemeFontNotification = @"TPCPreferencesCloudSyncDidChangeThemeFontNotification";
NSString * const TPCPreferencesCloudSyncDidChangeThemeNameNotification = @"TPCPreferencesCloudSyncDidChangeThemeNameNotification";
+ (BOOL)syncPreferencesToTheCloud
{
return [RZUserDefaults() boolForKey:TPCPreferencesCloudSyncServicesEnabledDefaultsKey];
}
+ (BOOL)syncPreferencesToTheCloudLimitedToServers
{
return [RZUserDefaults() boolForKey:TPCPreferencesCloudSyncServicesLimitedToServersDefaultsKey];
}
@end
#pragma mark -
#pragma mark Private
@implementation TPCPreferences (TPCPreferencesCloudSyncPrivate)
+ (void)setSyncPreferencesToTheCloud:(BOOL)syncPreferencesToTheCloud
{
return [RZUserDefaults() setBool:syncPreferencesToTheCloud forKey:TPCPreferencesCloudSyncServicesEnabledDefaultsKey];
}
+ (void)fixThemeNameMissingDuringSync
{
BOOL missingTheme = [RZUserDefaults() boolForKey:TPCPreferencesThemeNameMissingLocallyDefaultsKey];
if (missingTheme == NO) {
return;
}
NSString *remoteValue = [sharedCloudManager() valueForKey:TPCPreferencesThemeNameDefaultsKey];
NSString *localValue = [TPCPreferences themeName];
if (remoteValue == nil || [localValue isEqualToString:remoteValue]) {
return;
}
if ([themeController() themeExists:remoteValue] == NO) {
return;
}
[TPCPreferences setThemeName:remoteValue]; // Will reset the BOOL
[TPCPreferences performReloadAction:TPCPreferencesReloadActionStyle];
[RZNotificationCenter() postNotificationName:TPCPreferencesCloudSyncDidChangeThemeNameNotification object:nil];
}
+ (void)fixThemeFontNameMissingDuringSync
{
BOOL fontMissing = [RZUserDefaults() boolForKey:TPCPreferencesThemeFontNameMissingLocallyDefaultsKey];
if (fontMissing == NO) {
return;
}
NSString *remoteValue = [sharedCloudManager() valueForKey:TPCPreferencesThemeFontNameDefaultsKey];
NSString *localValue = [TPCPreferences themeChannelViewFontName];
if (remoteValue == nil || [localValue isEqualToString:remoteValue]) {
return;
}
if ([NSFont fontIsAvailable:remoteValue] == NO) {
return;
}
[TPCPreferences setThemeChannelViewFontName:remoteValue]; // Will remove the BOOL
[TPCPreferences performReloadAction:TPCPreferencesReloadActionStyle];
[RZNotificationCenter() postNotificationName:TPCPreferencesCloudSyncDidChangeThemeFontNotification object:nil];
}
@end
#endif
NS_ASSUME_NONNULL_END
@@ -1,51 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.com.codeux.apps.textual-mas</string>
</array>
<key>com.apple.developer.icloud-services</key>
<array>
<string>CloudDocuments</string>
</array>
<key>com.apple.developer.ubiquity-container-identifiers</key>
<array>
<string>iCloud.com.codeux.apps.textual-mas</string>
</array>
<key>com.apple.developer.ubiquity-kvstore-identifier</key>
<string>8482Q6EPL6.com.codeux.apps.textual-mas</string>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>8482Q6EPL6.com.codeux.irc.textual</string>
</array>
<key>com.apple.security.automation.apple-events</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
<key>com.apple.security.files.downloads.read-write</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.network.server</key>
<true/>
<key>com.apple.security.print</key>
<true/>
<key>com.apple.security.temporary-exception.apple-events</key>
<array>
<string>com.apple.itunes</string>
<string>com.apple.safari</string>
</array>
<key>com.apple.security.temporary-exception.shared-preference.read-only</key>
<array>
<string>com.codeux.apps.textual</string>
</array>
</dict>
</plist>
@@ -77,7 +77,6 @@
"7lm-bq" = "Built-in";
"bm2-4p" = "Custom";
"aqy-6c" = "Custom — iCloud Drive";
"fo8-1h" = "Fill out this field";
@@ -165,7 +165,6 @@ Surround \002<token>\002 with double quotes (\") if it contains a space.";
/* /myversion/ command */
"pqj-1y" = "I am using %@";
"ccb-ur" = "%1$@ %2$@ (Build %3$@)%4$@%5$@";
"9fp-8h" = " (Mac App Store)";
"b8p-44" = " as classic binary on an %@ Mac.";
/* /timer/ command */
@@ -67,7 +67,6 @@
"0kz-wd" = "Do you want to delete the selection?";
"etl-ss" = "There is no undo and all data related to this server, except for logs, will be erased.";
"5zs-h0" = "Only delete server on this device";
"3l6-3z" = "You have clicked a link that will connect you to “%1$@“ and join the channel %2$@";
"mx1-qz" = "The connection named “%1$@“ is already configured to connect to this server address.
@@ -186,8 +185,5 @@ Information encrypted using: %2$@";
"2jq-t5" = "%1$@ with the cipher suite: %2$@";
"8ou-pu" = "%1$@ with the cipher suite: %2$@ (deprecated)";
"rn7-08" = "Unable to access iCloud";
"wjn-f1" = "Make sure you're logged in and that “iCloud Drive” or “Documents & Data” is enabled.";
"ujw-64" = "The “Inspect Element” feature of WebKit2 cannot be accessed on this version of macOS.";
"kig-m1" = "Disable WebKit2 or upgrade to a newer version of macOS.";
@@ -35,9 +35,6 @@
*
*********************************************************************** */
"r62-4k" = "Are you sure you want to delete everything uploaded to iCloud by Textual?";
"t8v-w8" = "This action will not effect the configuration of this device or others.";
"70s-c6" = "No Log Location Selected";
"721-ie" = "No Location Selected";
@@ -55,6 +52,3 @@ Click “Edit Style” to add your own style sheet rules. This feature can also
"77t-de" = "• Nickname Format";
"ddh-hr" = "• Timestamp Format";
"we8-i8" = "• Channel View Font";
"x3n-to" = "Please choose a location other than iCloud Drive to save data to";
"gz8-dt" = "";
@@ -39,10 +39,6 @@
"f7o-x4" = "User Ignore";
"b0g-0x" = "User Tracking";
/* Server properties iCloud options */
"x08-ko" = "Do you want to remove this server from devices it has been shared with?";
"sqc-nw" = "";
/* Server specific highlight entry things */
"61f-6b" = "All Channels";
"qcc-b4" = "Exclude";
@@ -1,115 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSApplicationCategoryType</key>
<string>public.app-category.social-networking</string>
<key>LSRequiresNativeExecution</key>
<false/>
<key>CFBundleSignature</key>
<string>TXTL</string>
<key>CFBundleDisplayName</key>
<string>Textual IRC Client</string>
<key>CFBundleIdentifier</key>
<string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleVersion</key>
<string>7.2.2</string>
<key>CFBundleShortVersionString</key>
<string>7.2.2</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2010 - 2023 Codeux Software, LLC. All rights reserved.</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string>applicationIcon.icns</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>NSMainNibFile</key>
<string>TXCMainMenu</string>
<key>LSMinimumSystemVersion</key>
<string>11.0</string>
<key>NSPrincipalClass</key>
<string>TXApplication</string>
<key>NSContactsUsageDescription</key>
<string>Textual accesses contacts to automatically populate certain forms with your name and/or e-mail address. Access to this information is not required.</string>
<key>NSAppleScriptEnabled</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>scpt</string>
</array>
<key>CFBundleTypeName</key>
<string>Textual IRC Client Script</string>
<key>CFBundleTypeOSTypes</key>
<array>
<string>****</string>
</array>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSTypeIsPackage</key>
<integer>0</integer>
<key>NSDocumentClass</key>
<string>TPCResourceManagerDocumentTypeImporter</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>bundle</string>
</array>
<key>CFBundleTypeName</key>
<string>Textual IRC Client Extension</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Alternate</string>
<key>LSTypeIsPackage</key>
<integer>1</integer>
<key>NSDocumentClass</key>
<string>TPCResourceManagerDocumentTypeImporter</string>
</dict>
</array>
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.com.codeux.apps.textual-mas</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>${PRODUCT_NAME}</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLIconFile</key>
<string>application</string>
<key>CFBundleURLName</key>
<string>Internet Relay Chat</string>
<key>CFBundleURLSchemes</key>
<array>
<string>irc</string>
<string>ircs</string>
<string>textual</string>
</array>
</dict>
</array>
</dict>
</plist>
@@ -236,10 +236,6 @@
<integer>0</integer>
<key>SwipeMinimumLength</key>
<integer>30</integer>
<key>SyncPreferencesToTheCloud</key>
<false/>
<key>SyncPreferencesToTheCloudLimitedToServers</key>
<false/>
<key>Tab Completion -&gt; Completion Suffix Cut Forward Until Space</key>
<false/>
<key>Tab Completion -&gt; Do Not Use Whitespace for Missing Completion Suffix</key>
@@ -1,10 +1,5 @@
If you are using a copy of Textual downloaded through the Mac
App Store, then custom scripts can be installed in the folder:
"~/Library/Application Scripts/com.codeux.apps.textual-mas/"
Otherwise, custom scripts can be installed in the folder:
Custom scripts can be installed in the folder:
"~/Library/Application Scripts/com.codeux.apps.textual/"
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17503.1" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="23077.2" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17503.1"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="23077.2"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -18,56 +17,43 @@
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="s7V-Ks-YGu" userLabel="Eligibility Check - Not">
<windowStyleMask key="styleMask" titled="YES"/>
<rect key="contentRect" x="128" y="143" width="370" height="260"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<view key="contentView" id="zmB-R2-bXm">
<rect key="frame" x="0.0" y="0.0" width="370" height="260"/>
<rect key="frame" x="0.0" y="0.0" width="370" height="209"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eX9-9T-nFn">
<rect key="frame" x="91" y="216" width="188" height="24"/>
<textField focusRingType="none" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eX9-9T-nFn">
<rect key="frame" x="91" y="165" width="188" height="24"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="You are not eligible." id="oiB-Uh-16m">
<font key="font" metaFont="systemBold" size="20"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="86o-pP-6Hi">
<rect key="frame" x="42" y="169" width="286" height="32"/>
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="86o-pP-6Hi">
<rect key="frame" x="42" y="118" width="286" height="32"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Unfortunately, you are not eligible for a free or discounted upgrade." id="axq-6T-VR5">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kly-4d-CEl">
<rect key="frame" x="40" y="59" width="290" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="38" id="Nqr-CV-KB4"/>
</constraints>
<buttonCell key="cell" type="smallSquare" title="Purchase in Mac App Store" bezelStyle="smallSquare" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="4On-qj-WpA">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system" size="15"/>
</buttonCell>
<connections>
<action selector="actionPurchaseMacAppStore:" target="-2" id="zsS-Ki-6qp"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Ln-qj-Yq8">
<rect key="frame" x="40" y="110" width="290" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="38" id="95Y-b1-mQ6"/>
<constraint firstAttribute="width" constant="290" id="Qdg-yS-3I1"/>
</constraints>
<rect key="frame" x="40" y="59" width="290" height="40"/>
<buttonCell key="cell" type="smallSquare" title="Purchase in Codeux Software Store" bezelStyle="smallSquare" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="cbV-gz-k63">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system" size="15"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="38" id="95Y-b1-mQ6"/>
<constraint firstAttribute="width" constant="290" id="Qdg-yS-3I1"/>
</constraints>
<connections>
<action selector="actionPurchaseStandalone:" target="-2" id="mAQ-mY-NVy"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="aEw-pj-DLf">
<rect key="frame" x="150" y="13" width="70" height="32"/>
<rect key="frame" x="151" y="13" width="69" height="32"/>
<buttonCell key="cell" type="push" title="Close" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="YZx-ou-Quq">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -82,17 +68,14 @@ Gw
</subviews>
<constraints>
<constraint firstItem="86o-pP-6Hi" firstAttribute="top" secondItem="eX9-9T-nFn" secondAttribute="bottom" constant="15" id="3Tz-Zv-TwS"/>
<constraint firstItem="kly-4d-CEl" firstAttribute="trailing" secondItem="0Ln-qj-Yq8" secondAttribute="trailing" id="Eg8-U9-E7I"/>
<constraint firstItem="aEw-pj-DLf" firstAttribute="centerX" secondItem="zmB-R2-bXm" secondAttribute="centerX" id="Hwr-CQ-GPg"/>
<constraint firstItem="86o-pP-6Hi" firstAttribute="leading" secondItem="zmB-R2-bXm" secondAttribute="leading" constant="44" id="L2Y-de-Tvu"/>
<constraint firstItem="0Ln-qj-Yq8" firstAttribute="top" secondItem="86o-pP-6Hi" secondAttribute="bottom" constant="20" id="MN6-ai-PDT"/>
<constraint firstAttribute="bottom" secondItem="aEw-pj-DLf" secondAttribute="bottom" constant="20" id="Qcu-ML-BJW"/>
<constraint firstItem="aEw-pj-DLf" firstAttribute="top" secondItem="kly-4d-CEl" secondAttribute="bottom" constant="20" id="RLO-Hn-t2Q"/>
<constraint firstItem="eX9-9T-nFn" firstAttribute="centerX" secondItem="zmB-R2-bXm" secondAttribute="centerX" id="SlH-Zp-lew"/>
<constraint firstItem="kly-4d-CEl" firstAttribute="leading" secondItem="0Ln-qj-Yq8" secondAttribute="leading" id="WWP-ae-rEX"/>
<constraint firstItem="eX9-9T-nFn" firstAttribute="top" secondItem="zmB-R2-bXm" secondAttribute="top" constant="20" id="ndK-Ox-HJg"/>
<constraint firstItem="aEw-pj-DLf" firstAttribute="top" secondItem="0Ln-qj-Yq8" secondAttribute="bottom" constant="20" id="phM-Re-3vP"/>
<constraint firstItem="86o-pP-6Hi" firstAttribute="centerX" secondItem="zmB-R2-bXm" secondAttribute="centerX" id="u7r-Br-f5x"/>
<constraint firstItem="kly-4d-CEl" firstAttribute="centerX" secondItem="zmB-R2-bXm" secondAttribute="centerX" id="xUU-b0-fXY"/>
<constraint firstItem="0Ln-qj-Yq8" firstAttribute="centerX" secondItem="zmB-R2-bXm" secondAttribute="centerX" id="zox-Pc-vQa"/>
</constraints>
</view>
@@ -104,12 +87,12 @@ Gw
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="Vqb-So-6Ho" userLabel="Eligibility Check - Reduced">
<windowStyleMask key="styleMask" titled="YES"/>
<rect key="contentRect" x="128" y="143" width="380" height="298"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/>
<view key="contentView" id="MHB-dt-yu8">
<rect key="frame" x="0.0" y="0.0" width="380" height="290"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<view key="contentView" misplaced="YES" id="MHB-dt-yu8">
<rect key="frame" x="0.0" y="0.0" width="380" height="298"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Oi-4c-Yln">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Oi-4c-Yln">
<rect key="frame" x="57" y="246" width="267" height="24"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Your upgrade is discounted!" id="4LA-tc-vdW">
<font key="font" metaFont="systemBold" size="20"/>
@@ -117,7 +100,7 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="svY-JN-wRd">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="svY-JN-wRd">
<rect key="frame" x="22" y="119" width="336" height="112"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="1V5-vh-2id">
<font key="font" metaFont="system"/>
@@ -131,7 +114,7 @@ When your order is finished being processed, click the “Activate Textual“ bu
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W1h-Tu-uqZ">
<rect key="frame" x="155" y="13" width="70" height="32"/>
<rect key="frame" x="156" y="13" width="69" height="32"/>
<buttonCell key="cell" type="push" title="Close" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="zYo-FM-XDl">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -145,28 +128,28 @@ Gw
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mIg-BY-n6R">
<rect key="frame" x="20" y="59" width="168" height="41"/>
<constraints>
<constraint firstAttribute="width" constant="168" id="gpP-f5-X4S"/>
<constraint firstAttribute="height" constant="39" id="pmZ-lK-JMG"/>
</constraints>
<buttonCell key="cell" type="smallSquare" title="Purchase Upgrade" bezelStyle="smallSquare" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Psq-Ta-ai7">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system" size="15"/>
</buttonCell>
<constraints>
<constraint firstAttribute="width" constant="168" id="gpP-f5-X4S"/>
<constraint firstAttribute="height" constant="39" id="pmZ-lK-JMG"/>
</constraints>
<connections>
<action selector="actionPurchaseUpgrade:" target="-2" id="fjD-RU-thi"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iK4-4C-6gn">
<rect key="frame" x="192" y="59" width="168" height="41"/>
<constraints>
<constraint firstAttribute="height" constant="39" id="daB-pF-r0B"/>
<constraint firstAttribute="width" constant="168" id="rPj-Hi-kCN"/>
</constraints>
<buttonCell key="cell" type="smallSquare" title="Activate Textual" bezelStyle="smallSquare" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="oDA-Wn-QrS">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system" size="15"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="39" id="daB-pF-r0B"/>
<constraint firstAttribute="width" constant="168" id="rPj-Hi-kCN"/>
</constraints>
<connections>
<action selector="actionActivateLicense:" target="-2" id="JQM-0j-h3l"/>
</connections>
@@ -195,12 +178,12 @@ Gw
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="NMV-Qs-7lz" userLabel="Eligibility Check - Free">
<windowStyleMask key="styleMask" titled="YES"/>
<rect key="contentRect" x="128" y="143" width="420" height="230"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1440"/>
<view key="contentView" id="TsN-yE-dfp">
<rect key="frame" x="0.0" y="0.0" width="420" height="225"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<view key="contentView" misplaced="YES" id="TsN-yE-dfp">
<rect key="frame" x="0.0" y="0.0" width="420" height="230"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="USW-SV-QEO">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="USW-SV-QEO">
<rect key="frame" x="110" y="181" width="200" height="24"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Your upgrade is free!" id="swW-rG-FFU">
<font key="font" metaFont="systemBold" size="20"/>
@@ -208,7 +191,7 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="PUt-g1-NNM">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="PUt-g1-NNM">
<rect key="frame" x="49" y="118" width="322" height="48"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="T1q-Ug-ZcD">
<font key="font" metaFont="system"/>
@@ -220,7 +203,7 @@ Click the “Activate Textual“ button to continue.</string>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="X2Q-y1-pP6">
<rect key="frame" x="175" y="13" width="70" height="32"/>
<rect key="frame" x="176" y="13" width="69" height="32"/>
<buttonCell key="cell" type="push" title="Close" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="IhF-mk-CHo">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@@ -234,14 +217,14 @@ Gw
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VXG-Ri-gpe">
<rect key="frame" x="128" y="59" width="165" height="40"/>
<constraints>
<constraint firstAttribute="height" constant="38" id="qmY-Qh-SWX"/>
<constraint firstAttribute="width" constant="165" id="uU3-fo-KWI"/>
</constraints>
<buttonCell key="cell" type="smallSquare" title="Activate Textual" bezelStyle="smallSquare" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="OZr-al-Gi8">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="systemBold" size="15"/>
</buttonCell>
<constraints>
<constraint firstAttribute="height" constant="38" id="qmY-Qh-SWX"/>
<constraint firstAttribute="width" constant="165" id="uU3-fo-KWI"/>
</constraints>
<connections>
<action selector="actionActivateLicense:" target="-2" id="ffc-z4-rzc"/>
</connections>
File diff suppressed because it is too large Load Diff
@@ -63,7 +63,6 @@
<outlet property="editAddressBookEntryButton" destination="1844" id="LTq-3U-HnM"/>
<outlet property="editChannelButton" destination="1795" id="1949"/>
<outlet property="editHighlightButton" destination="2448" id="2476"/>
<outlet property="excludedFromCloudSyncingCheck" destination="dLD-ut-ncd" id="aCB-R6-pq3"/>
<outlet property="fallbackEncodingButton" destination="1685" id="2275"/>
<outlet property="floodControlDelayTimerSlider" destination="O6l-eN-3Uc" id="l2j-Kb-PsN"/>
<outlet property="floodControlMessageCountSlider" destination="RXW-HB-aEa" id="whf-jb-XgS"/>
@@ -115,7 +114,7 @@
<rect key="frame" x="10" y="10" width="156" height="330"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="c7A-uX-FoM">
<rect key="frame" x="1" y="1" width="154" height="328"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="fullWidth" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="19" rowSizeStyle="automatic" usesAutomaticRowHeights="YES" viewBased="YES" floatsGroupRows="NO" indentationPerLevel="15" outlineTableColumn="9ke-X4-49Z" id="Uj0-Wm-eox" customClass="TVCContentNavigationOutlineView">
<rect key="frame" x="0.0" y="0.0" width="154" height="328"/>
@@ -137,9 +136,9 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView translatesAutoresizingMaskIntoConstraints="NO" id="yDz-eI-nqa">
<rect key="frame" x="1" y="1" width="152" height="19"/>
<rect key="frame" x="0.0" y="0.0" width="152" height="19"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="L6D-B7-wWc">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="L6D-B7-wWc">
<rect key="frame" x="0.0" y="2" width="152" height="15"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="VCb-YR-fs2">
<font key="font" metaFont="cellTitle"/>
@@ -269,7 +268,7 @@ Gw
</columns>
<gridCells>
<gridCell row="uAb-uY-dJ9" column="4RY-Yh-h0w" id="vk7-v2-TLn">
<textField key="contentView" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1538">
<textField key="contentView" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1538">
<rect key="frame" x="-2" y="112" width="117" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Connection Name:" id="1559">
<font key="font" metaFont="system"/>
@@ -279,7 +278,7 @@ Gw
</textField>
</gridCell>
<gridCell row="uAb-uY-dJ9" column="kwW-4Q-r7S" id="xlG-iw-qu0">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1539" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1539" customClass="TVCValidatedTextField">
<rect key="frame" x="121" y="108" width="239" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="9j5-dY-0rN"/>
@@ -295,7 +294,7 @@ Gw
</textField>
</gridCell>
<gridCell row="hUK-uO-DWz" column="4RY-Yh-h0w" id="NPD-Vl-B1D">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1540">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1540">
<rect key="frame" x="-2" y="76" width="117" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Server Address:" id="1557">
<font key="font" metaFont="system"/>
@@ -305,7 +304,7 @@ Gw
</textField>
</gridCell>
<gridCell row="hUK-uO-DWz" column="kwW-4Q-r7S" id="ZvZ-NZ-lR2">
<comboBox key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1548" customClass="TVCValidatedComboBox">
<comboBox key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1548" customClass="TVCValidatedComboBox">
<rect key="frame" x="120" y="70" width="243" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="6ls-al-2Lu"/>
@@ -321,7 +320,7 @@ Gw
</comboBox>
</gridCell>
<gridCell row="akK-h8-k22" column="4RY-Yh-h0w" id="Eny-p2-RoM">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1542">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1542">
<rect key="frame" x="-2" y="40" width="117" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Port:" id="1555">
<font key="font" metaFont="system"/>
@@ -334,7 +333,7 @@ Gw
<stackView key="contentView" distribution="fill" orientation="horizontal" alignment="firstBaseline" horizontalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="A6k-ee-dum">
<rect key="frame" x="121" y="36" width="239" height="22"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1541" customClass="TVCValidatedTextField">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1541" customClass="TVCValidatedTextField">
<rect key="frame" x="0.0" y="0.0" width="60" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="60" id="PuT-pr-arX"/>
@@ -376,7 +375,7 @@ Gw
</stackView>
</gridCell>
<gridCell row="FhT-p4-Yz2" column="4RY-Yh-h0w" id="h1R-6C-hYu">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1544">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1544">
<rect key="frame" x="-2" y="4" width="117" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Server Password:" id="1553">
<font key="font" metaFont="system"/>
@@ -386,7 +385,7 @@ Gw
</textField>
</gridCell>
<gridCell row="FhT-p4-Yz2" column="kwW-4Q-r7S" id="3cc-iU-xNw">
<textField key="contentView" toolTip="Password to be sent using the PASS command. This is NOT your password for NickServ." verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1543" customClass="NSSecureTextField">
<textField key="contentView" toolTip="Password to be sent using the PASS command. This is NOT your password for NickServ." focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1543" customClass="NSSecureTextField">
<rect key="frame" x="121" y="0.0" width="239" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="KsP-sC-2yd"/>
@@ -405,65 +404,39 @@ Gw
</gridCells>
</gridView>
<stackView distribution="equalSpacing" orientation="vertical" alignment="leading" spacing="6" verticalStackHuggingPriority="750" verticalHuggingPriority="750" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Z7k-zB-mgb">
<rect key="frame" x="113" y="47" width="295" height="82"/>
<rect key="frame" x="116" y="69" width="288" height="60"/>
<subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="1531">
<rect key="frame" x="-2" y="65" width="201" height="18"/>
<rect key="frame" x="-2" y="43" width="201" height="18"/>
<buttonCell key="cell" type="check" title="Connect when Textual opens" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="1536">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="1532">
<rect key="frame" x="-2" y="43" width="229" height="18"/>
<rect key="frame" x="-2" y="21" width="229" height="18"/>
<buttonCell key="cell" type="check" title="Perform reconnect on disconnect" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="1535">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="2250">
<rect key="frame" x="-2" y="21" width="290" height="18"/>
<rect key="frame" x="-2" y="-1" width="290" height="18"/>
<buttonCell key="cell" type="check" title="Perform reconnect when waking from sleep" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="2251">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="dLD-ut-ncd">
<rect key="frame" x="-2" y="-1" width="297" height="18"/>
<buttonCell key="cell" type="check" title="Do not share with other devices using iCloud" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="eql-rS-Io2">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleCloudSyncExclusion:" target="-2" id="LNF-gc-rmb"/>
<binding destination="iuc-Sg-eeB" name="hidden" keyPath="values.SyncPreferencesToTheCloud" id="n3y-63-lzE">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
<binding destination="iuc-Sg-eeB" name="hidden2" keyPath="values.System -&gt; Built with iCloud Support" previousBinding="n3y-63-lzE" id="phe-S6-jQH">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</binding>
</connections>
</button>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
@@ -492,7 +465,7 @@ Gw
</columns>
<gridCells>
<gridCell row="Zcw-cx-v0b" column="Lbn-2W-5bD" id="0yd-CU-QAD">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1596">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1596">
<rect key="frame" x="-2" y="76" width="144" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Nickname:" id="1618">
<font key="font" metaFont="system"/>
@@ -502,7 +475,7 @@ Gw
</textField>
</gridCell>
<gridCell row="Zcw-cx-v0b" column="w3Z-Ld-gYr" id="CPp-os-0C3">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1595" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1595" customClass="TVCValidatedTextField">
<rect key="frame" x="148" y="72" width="212" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="8E0-IE-YRt"/>
@@ -519,7 +492,7 @@ Gw
</textField>
</gridCell>
<gridCell row="O4O-Ig-L5p" column="Lbn-2W-5bD" id="gAl-oa-fGd">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2336">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2336">
<rect key="frame" x="-2" y="40" width="144" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Away Nickname:" id="2341">
<font key="font" metaFont="system"/>
@@ -529,7 +502,7 @@ Gw
</textField>
</gridCell>
<gridCell row="O4O-Ig-L5p" column="w3Z-Ld-gYr" id="kkb-Ih-JRo">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2335" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2335" customClass="TVCValidatedTextField">
<rect key="frame" x="148" y="36" width="212" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="zpG-Ug-YZW"/>
@@ -545,7 +518,7 @@ Gw
</textField>
</gridCell>
<gridCell row="H9A-aR-nQi" column="Lbn-2W-5bD" id="p1Q-6y-hrB">
<textField key="contentView" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1603">
<textField key="contentView" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1603">
<rect key="frame" x="-2" y="4" width="144" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Alternative Nicknames:" id="1611">
<font key="font" metaFont="system"/>
@@ -555,7 +528,7 @@ Gw
</textField>
</gridCell>
<gridCell row="H9A-aR-nQi" column="w3Z-Ld-gYr" id="oh0-Rt-XDV">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1602" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1602" customClass="TVCValidatedTextField">
<rect key="frame" x="148" y="0.0" width="212" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="uTp-8Y-0uU"/>
@@ -572,7 +545,7 @@ Gw
</gridCell>
</gridCells>
</gridView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1601" customClass="NSSecureTextField">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1601" customClass="NSSecureTextField">
<rect key="frame" x="228" y="98" width="212" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="gox-5X-KFr"/>
@@ -586,7 +559,7 @@ Gw
<accessibilityConnection property="title" destination="1623" id="9pE-K8-oT9"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1623">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1623">
<rect key="frame" x="100" y="102" width="122" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Personal Password:" id="1626">
<font key="font" metaFont="system"/>
@@ -617,7 +590,7 @@ Gw
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="A3c-XH-Q30">
<rect key="frame" x="100" y="234" width="320" height="5"/>
</box>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1604">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1604">
<rect key="frame" x="226" y="249" width="166" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" title="This field is space separated" id="1610">
<font key="font" metaFont="cellTitle"/>
@@ -640,7 +613,7 @@ Gw
</columns>
<gridCells>
<gridCell row="hv7-1e-ySA" column="s8y-m2-ky8" id="ODW-v7-wHU">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1598">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1598">
<rect key="frame" x="-2" y="40" width="144" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Username:" id="1616">
<font key="font" metaFont="system"/>
@@ -650,7 +623,7 @@ Gw
</textField>
</gridCell>
<gridCell row="hv7-1e-ySA" column="UoC-5W-n5F" id="cWe-EP-PjO">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1597" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1597" customClass="TVCValidatedTextField">
<rect key="frame" x="148" y="36" width="212" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="uho-Mt-WUG"/>
@@ -666,7 +639,7 @@ Gw
</textField>
</gridCell>
<gridCell row="DVI-Kz-YNY" column="s8y-m2-ky8" id="8cf-Vq-00Y">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1600">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1600">
<rect key="frame" x="-2" y="4" width="144" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Real name:" id="1614">
<font key="font" metaFont="system"/>
@@ -676,7 +649,7 @@ Gw
</textField>
</gridCell>
<gridCell row="DVI-Kz-YNY" column="UoC-5W-n5F" id="Rhp-1d-fOQ">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1599" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1599" customClass="TVCValidatedTextField">
<rect key="frame" x="148" y="0.0" width="212" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="nEL-Vg-sf4"/>
@@ -729,7 +702,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1627" userLabel="Messages View">
<rect key="frame" x="0.0" y="0.0" width="520" height="300"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1656">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1656">
<rect key="frame" x="33" y="224" width="132" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Part &amp; Quit Message:" id="1668">
<font key="font" metaFont="system"/>
@@ -737,7 +710,7 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1671">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1671">
<rect key="frame" x="33" y="125" width="193" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Computer Sleep Quit Message:" id="1674">
<font key="font" metaFont="system"/>
@@ -745,7 +718,7 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2290" customClass="TVCValidatedTextField">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2290" customClass="TVCValidatedTextField">
<rect key="frame" x="35" y="159" width="450" height="57"/>
<constraints>
<constraint firstAttribute="height" constant="57" id="rHd-qc-Mnq"/>
@@ -759,7 +732,7 @@ Gw
<accessibilityConnection property="title" destination="1656" id="9XF-4w-7xl"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2294" customClass="TVCValidatedTextField">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2294" customClass="TVCValidatedTextField">
<rect key="frame" x="35" y="60" width="450" height="57"/>
<constraints>
<constraint firstAttribute="height" constant="57" id="cao-zF-kqD"/>
@@ -805,7 +778,7 @@ Gw
</columns>
<gridCells>
<gridCell row="HQO-PZ-kkO" column="x37-9J-r9J" id="ORJ-7a-we5">
<textField key="contentView" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1687">
<textField key="contentView" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1687">
<rect key="frame" x="-2" y="35" width="65" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Encoding:" id="1690">
<font key="font" metaFont="system"/>
@@ -828,7 +801,7 @@ Gw
</popUpButton>
</gridCell>
<gridCell row="ZX4-Aw-6qI" column="x37-9J-r9J" id="y4D-Wl-eCA">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1686">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1686">
<rect key="frame" x="-2" y="3" width="65" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Fallback:" id="1691">
<font key="font" metaFont="system"/>
@@ -877,7 +850,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="2542" userLabel="ZNC View">
<rect key="frame" x="0.0" y="0.0" width="520" height="300"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2590">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2590">
<rect key="frame" x="84" y="133" width="352" height="30"/>
<textFieldCell key="cell" selectable="YES" sendsActionOnEndEditing="YES" title="Do not show notification bubbles or play sounds for messages that are part of the playback buffer." id="2591">
<font key="font" metaFont="cellTitle"/>
@@ -909,7 +882,7 @@ Gw
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="JCf-aC-VgE">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="JCf-aC-VgE">
<rect key="frame" x="84" y="86" width="252" height="15"/>
<textFieldCell key="cell" selectable="YES" sendsActionOnEndEditing="YES" title="This option requires the “playback” module." id="DES-Fw-k4c">
<font key="font" metaFont="cellTitle"/>
@@ -973,7 +946,7 @@ Gw
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2599">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2599">
<rect key="frame" x="120" y="20" width="281" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" title="These options target version 1.2 of ZNC and later." id="2600">
<font key="font" metaFont="smallSystemBold"/>
@@ -1284,7 +1257,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1817" userLabel="Ignores View">
<rect key="frame" x="0.0" y="0.0" width="520" height="300"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2358">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2358">
<rect key="frame" x="52" y="259" width="223" height="16"/>
<textFieldCell key="cell" selectable="YES" sendsActionOnEndEditing="YES" title="Ignore or track the following people:" id="2359">
<font key="font" metaFont="system"/>
@@ -1322,7 +1295,7 @@ Gw
<rect key="frame" x="54" y="54" width="412" height="197"/>
<clipView key="contentView" id="wXW-Pe-W5j">
<rect key="frame" x="1" y="1" width="410" height="195"/>
<autoresizingMask key="autoresizingMask"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" headerView="NHj-wb-YWi" id="1851" customClass="TVCBasicTableView">
<rect key="frame" x="0.0" y="0.0" width="410" height="167"/>
@@ -1426,7 +1399,7 @@ Gw
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="fNI-3k-yzt">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="fNI-3k-yzt">
<rect key="frame" x="313" y="254" width="152" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" alignment="right" title="This field is line separated" id="Mnf-Uj-ov2">
<font key="font" metaFont="cellTitle"/>
@@ -1466,7 +1439,7 @@ Gw
<accessibilityConnection property="title" destination="1881" id="LJb-a8-u9c"/>
</connections>
</scrollView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1881">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1881">
<rect key="frame" x="55" y="254" width="199" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" title="Perform commands on connect:" id="1882">
<font key="font" metaFont="system"/>
@@ -1511,7 +1484,7 @@ Gw
</columns>
<gridCells>
<gridCell row="Wux-ui-Afe" column="UfM-t2-7vL" id="utt-iw-5Mt">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1897">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1897">
<rect key="frame" x="-2" y="112" width="70" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Address:" id="1920">
<font key="font" metaFont="system"/>
@@ -1521,7 +1494,7 @@ Gw
</textField>
</gridCell>
<gridCell row="Wux-ui-Afe" column="GOB-Ox-jHY" id="Yfy-2w-str">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1901" customClass="TVCValidatedTextField">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1901" customClass="TVCValidatedTextField">
<rect key="frame" x="74" y="108" width="246" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="CHb-rL-Cpx"/>
@@ -1537,7 +1510,7 @@ Gw
</textField>
</gridCell>
<gridCell row="wAW-qX-GTz" column="UfM-t2-7vL" id="ECM-tm-H1X">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1898">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1898">
<rect key="frame" x="-2" y="76" width="70" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Port:" id="1919">
<font key="font" metaFont="system"/>
@@ -1550,7 +1523,7 @@ Gw
<stackView key="contentView" distribution="fill" orientation="horizontal" alignment="top" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Fud-jH-umc">
<rect key="frame" x="74" y="72" width="246" height="22"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="84A-gQ-HPC" customClass="TVCValidatedTextField">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="84A-gQ-HPC" customClass="TVCValidatedTextField">
<rect key="frame" x="0.0" y="0.0" width="60" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="3T9-ia-fvT"/>
@@ -1583,7 +1556,7 @@ Gw
</stackView>
</gridCell>
<gridCell row="Onw-AC-h2l" column="UfM-t2-7vL" id="SPp-ui-RaR">
<textField key="contentView" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1900">
<textField key="contentView" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1900">
<rect key="frame" x="-2" y="40" width="70" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Username:" id="1917">
<font key="font" metaFont="system"/>
@@ -1593,7 +1566,7 @@ Gw
</textField>
</gridCell>
<gridCell row="Onw-AC-h2l" column="GOB-Ox-jHY" id="RwZ-xF-727">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1904">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1904">
<rect key="frame" x="74" y="36" width="246" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="jly-CJ-SHw"/>
@@ -1609,7 +1582,7 @@ Gw
</textField>
</gridCell>
<gridCell row="cWB-GJ-DxE" column="UfM-t2-7vL" id="0Qw-1o-Faf">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1899">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1899">
<rect key="frame" x="-2" y="4" width="70" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Password:" id="1918">
<font key="font" metaFont="system"/>
@@ -1619,7 +1592,7 @@ Gw
</textField>
</gridCell>
<gridCell row="cWB-GJ-DxE" column="GOB-Ox-jHY" id="e8B-zt-fSc">
<secureTextField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1902">
<secureTextField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1902">
<rect key="frame" x="74" y="0.0" width="246" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="EPx-uC-UQ3"/>
@@ -1651,7 +1624,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="yql-kd-PP5">
<rect key="frame" x="0.0" y="73" width="520" height="176"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="P8N-qI-sG7">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="P8N-qI-sG7">
<rect key="frame" x="78" y="76" width="364" height="48"/>
<textFieldCell key="cell" controlSize="mini" selectable="YES" sendsActionOnEndEditing="YES" id="voS-R3-3c7">
<font key="font" metaFont="system"/>
@@ -1671,7 +1644,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="GFp-Qd-4ck">
<rect key="frame" x="0.0" y="73" width="520" height="176"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="fFG-yi-lT4">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="fFG-yi-lT4">
<rect key="frame" x="78" y="86" width="364" height="48"/>
<textFieldCell key="cell" controlSize="mini" selectable="YES" sendsActionOnEndEditing="YES" id="R86-j6-hCz">
<font key="font" metaFont="system"/>
@@ -1703,7 +1676,7 @@ Gw
<stackView distribution="fill" orientation="horizontal" alignment="firstBaseline" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Uxd-YG-qsq">
<rect key="frame" x="118" y="269" width="284" height="20"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1896">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1896">
<rect key="frame" x="-2" y="3" width="91" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Type of Proxy:" id="1921">
<font key="font" metaFont="system"/>
@@ -1743,7 +1716,7 @@ Gw
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1978">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="1978">
<rect key="frame" x="211" y="249" width="236" height="15"/>
<textFieldCell key="cell" selectable="YES" sendsActionOnEndEditing="YES" title="This option requires a reconnect to apply" id="1979">
<font key="font" metaFont="cellTitle"/>
@@ -1755,7 +1728,7 @@ Gw
<rect key="frame" x="48" y="30" width="424" height="43"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="Of6-s1-mF9">
<rect key="frame" x="0.0" y="0.0" width="424" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textView editable="NO" drawsBackground="NO" importsGraphics="NO" verticallyResizable="YES" findStyle="panel" id="hIR-WT-lAK">
<rect key="frame" x="0.0" y="42" width="424" height="43"/>
@@ -1856,7 +1829,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="2078" userLabel="Flood Control">
<rect key="frame" x="0.0" y="0.0" width="520" height="300"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1gq-lL-Ur6">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1gq-lL-Ur6">
<rect key="frame" x="93" y="35" width="335" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" title="The options presented above require a reconnect to apply." id="MJ0-IQ-dNi">
<font key="font" metaFont="cellTitle"/>
@@ -1864,7 +1837,7 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="CGo-eo-J2e">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="CGo-eo-J2e">
<rect key="frame" x="33" y="249" width="376" height="16"/>
<textFieldCell key="cell" selectable="YES" sendsActionOnEndEditing="YES" title="Do not send more than X number of commands in Y seconds." id="XQt-eN-ufQ">
<font key="font" metaFont="system"/>
@@ -1872,7 +1845,7 @@ Gw
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="rXs-B6-ItZ">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="rXs-B6-ItZ">
<rect key="frame" x="400" y="124" width="85" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" alignment="right" title="Current Value:" id="U5o-dB-jmW">
<font key="font" metaFont="cellTitle"/>
@@ -1887,7 +1860,7 @@ Gw
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="w11-kJ-IPr">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="w11-kJ-IPr">
<rect key="frame" x="402" y="181" width="85" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" sendsActionOnEndEditing="YES" alignment="right" title="Current Value:" id="eMt-al-rqd">
<font key="font" metaFont="cellTitle"/>
@@ -1902,7 +1875,7 @@ Gw
</binding>
</connections>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Itb-Ee-5gX">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Itb-Ee-5gX">
<rect key="frame" x="45" y="124" width="142" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Y: Number of seconds:" id="Jay-s8-9Xn">
<font key="font" metaFont="system"/>
@@ -1913,7 +1886,7 @@ Gw
<stackView distribution="fill" orientation="horizontal" alignment="centerY" spacing="7" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bJz-Am-LvT">
<rect key="frame" x="47" y="96" width="436" height="20"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9b4-kF-7N0">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9b4-kF-7N0">
<rect key="frame" x="-2" y="3" width="10" height="15"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="1" id="zP6-2E-iaW">
<font key="font" metaFont="cellTitle"/>
@@ -1932,7 +1905,7 @@ Gw
<binding destination="-2" name="value" keyPath="self.floodControlDelayTimerSliderTempValue" id="ICJ-8T-e2n"/>
</connections>
</slider>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pDB-qm-dyE">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pDB-qm-dyE">
<rect key="frame" x="418" y="3" width="20" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="60" id="9bE-uW-eqe">
<font key="font" metaFont="cellTitle"/>
@@ -1955,7 +1928,7 @@ Gw
<stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Lqs-Qy-WoE">
<rect key="frame" x="47" y="153" width="438" height="20"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kGJ-aW-aWu">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kGJ-aW-aWu">
<rect key="frame" x="-2" y="3" width="10" height="15"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="1" id="ZNS-JS-fS4">
<font key="font" metaFont="cellTitle"/>
@@ -1974,7 +1947,7 @@ Gw
<binding destination="-2" name="value" keyPath="self.floodControlMessageCountSliderTempValue" id="5Wa-WZ-Qhz"/>
</connections>
</slider>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sAt-Ob-XHX">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sAt-Ob-XHX">
<rect key="frame" x="420" y="3" width="20" height="15"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="60" id="y5u-45-pvs">
<font key="font" metaFont="cellTitle"/>
@@ -1994,7 +1967,7 @@ Gw
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Af-cs-B5g">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0Af-cs-B5g">
<rect key="frame" x="45" y="181" width="159" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="X: Number of commands:" id="jHb-Iz-2jU">
<font key="font" metaFont="system"/>
@@ -2072,7 +2045,7 @@ Gw
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="46W-2g-sYj">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="46W-2g-sYj">
<rect key="frame" x="33" y="71" width="88" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Cipher suites:" id="Qfh-rz-IdC">
<font key="font" metaFont="system"/>
@@ -2108,7 +2081,7 @@ Gw
<action selector="preferredCipherSuitesViewList:" target="-2" id="UQs-lq-m95"/>
</connections>
</button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="T3E-ox-F6h">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="T3E-ox-F6h">
<rect key="frame" x="33" y="216" width="96" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Connect using:" id="B8q-jl-QtB">
<font key="font" metaFont="system"/>
@@ -2185,7 +2158,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Ti4-Q4-cYX" userLabel="CertFP View">
<rect key="frame" x="0.0" y="0.0" width="520" height="300"/>
<subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zU1-IR-zpt">
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zU1-IR-zpt">
<rect key="frame" x="33" y="249" width="339" height="16"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Select a certificate to send when you connect securely." id="rIl-yx-VEH">
<font key="font" metaFont="system"/>
@@ -2244,7 +2217,7 @@ Gw
</columns>
<gridCells>
<gridCell row="y0w-uO-wey" column="mzu-pc-PbB" id="bNC-ND-dl8">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="vOo-Hg-7M0">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="vOo-Hg-7M0">
<rect key="frame" x="-2" y="132" width="141" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Certificate Name:" usesSingleLineMode="YES" id="pxF-PC-Aax">
<font key="font" metaFont="system"/>
@@ -2254,7 +2227,7 @@ Gw
</textField>
</gridCell>
<gridCell row="y0w-uO-wey" column="bSr-v0-1FE" id="rAb-fO-YcL">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="nly-3d-FIq">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="nly-3d-FIq">
<rect key="frame" x="143" y="132" width="279" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" title="Label" usesSingleLineMode="YES" id="bvj-Qr-Ebk">
<font key="font" metaFont="system"/>
@@ -2268,7 +2241,7 @@ Gw
</gridCell>
<gridCell row="y0w-uO-wey" column="70M-PD-rGb" id="0lV-42-QBZ"/>
<gridCell row="LVM-ri-oUP" column="mzu-pc-PbB" id="Pre-xR-cqo">
<textField key="contentView" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eya-pw-9DN">
<textField key="contentView" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eya-pw-9DN">
<rect key="frame" x="-2" y="87" width="141" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="SHA-512 Fingerprint:" usesSingleLineMode="YES" id="dJe-xa-bmY">
<font key="font" metaFont="system"/>
@@ -2278,7 +2251,7 @@ Gw
</textField>
</gridCell>
<gridCell row="LVM-ri-oUP" column="bSr-v0-1FE" id="7JN-IO-EJT">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Ou1-Bl-kz1">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Ou1-Bl-kz1">
<rect key="frame" x="143" y="87" width="279" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" title="Label" usesSingleLineMode="YES" id="Cy6-oh-U2a">
<font key="font" metaFont="system"/>
@@ -2304,7 +2277,7 @@ Gw
</button>
</gridCell>
<gridCell row="mRF-0R-krg" column="mzu-pc-PbB" id="fOI-GS-UCM">
<textField key="contentView" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fdC-a6-iNA">
<textField key="contentView" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fdC-a6-iNA">
<rect key="frame" x="-2" y="59" width="141" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="SHA-2 Fingerprint:" usesSingleLineMode="YES" id="jhF-Ix-th5">
<font key="font" metaFont="system"/>
@@ -2314,7 +2287,7 @@ Gw
</textField>
</gridCell>
<gridCell row="mRF-0R-krg" column="bSr-v0-1FE" id="QPa-gG-WYl">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2ie-9H-xb2">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="2ie-9H-xb2">
<rect key="frame" x="143" y="59" width="279" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" title="Label" usesSingleLineMode="YES" id="Gbb-jh-4mY">
<font key="font" metaFont="system"/>
@@ -2340,7 +2313,7 @@ Gw
</button>
</gridCell>
<gridCell row="1CG-bD-ulB" column="mzu-pc-PbB" id="IU7-Q5-HCF">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="h8M-bR-Uth">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="h8M-bR-Uth">
<rect key="frame" x="-2" y="31" width="141" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="SHA-1 Fingerprint:" usesSingleLineMode="YES" id="O13-rx-ewF">
<font key="font" metaFont="system"/>
@@ -2350,7 +2323,7 @@ Gw
</textField>
</gridCell>
<gridCell row="1CG-bD-ulB" column="bSr-v0-1FE" id="04Y-ei-D2h">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="nFm-83-7HQ">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="nFm-83-7HQ">
<rect key="frame" x="143" y="31" width="279" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" title="Label" usesSingleLineMode="YES" id="Sia-Zk-rSR">
<font key="font" metaFont="system"/>
@@ -2376,7 +2349,7 @@ Gw
</button>
</gridCell>
<gridCell row="DDA-TD-JgL" column="mzu-pc-PbB" id="Is8-DS-Eu3">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Fm4-76-q5h">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Fm4-76-q5h">
<rect key="frame" x="-2" y="3" width="141" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="MD5 Fingerprint:" usesSingleLineMode="YES" id="Mmj-Ja-V8x">
<font key="font" metaFont="system"/>
@@ -2386,7 +2359,7 @@ Gw
</textField>
</gridCell>
<gridCell row="DDA-TD-JgL" column="bSr-v0-1FE" id="abJ-zN-WA0">
<textField key="contentView" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Grr-p8-MOF">
<textField key="contentView" focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Grr-p8-MOF">
<rect key="frame" x="143" y="3" width="279" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" alignment="left" title="Label" usesSingleLineMode="YES" id="MCd-Ig-Szi">
<font key="font" metaFont="system"/>
@@ -2447,7 +2420,7 @@ Gw
<customView translatesAutoresizingMaskIntoConstraints="NO" id="O3J-xl-nwg" userLabel="Redundancy">
<rect key="frame" x="0.0" y="0.0" width="520" height="300"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="I5e-l8-5t3">
<textField focusRingType="none" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="I5e-l8-5t3">
<rect key="frame" x="33" y="217" width="454" height="48"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="SnQ-4b-NG2">
<font key="font" metaFont="system"/>
@@ -1008,13 +1008,6 @@ CQ
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" tag="9050001" id="VTu-dA-PTE"/>
<menuItem title="Using iCloud with Textual" tag="9050002" id="aO8-3y-WHh">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="openHelpMenuItem:" target="267" id="woi-33-SkS"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" tag="9050003" id="Lpo-5n-kp3"/>
<menuItem title="Chat Encryption" tag="9050004" id="w1H-u0-OYW">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
File diff suppressed because it is too large Load Diff
@@ -21,9 +21,6 @@
4C46A15B20EC6F3100094EA4 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C46A15C20EC6F3100094EA4 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C46A16020EC6F3100094EA4 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C46A16320EC6F3100094EA4 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C46A16420EC6F3100094EA4 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C46A16820EC6F3100094EA4 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C46A16C20EC6F3100094EA4 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C46A16D20EC6F3100094EA4 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4C46A16E20EC6F3100094EA4 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
@@ -135,7 +132,6 @@
4C46A15820EC6F3100094EA4 /* Build */ = {
isa = PBXGroup;
children = (
4C46A16120EC6F3100094EA4 /* App Store Release */,
4C46A16A20EC6F3100094EA4 /* Common */,
4C46A17D20EC6F3100094EA4 /* Debug */,
4C46A15920EC6F3100094EA4 /* Standard Release */,
@@ -154,16 +150,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4C46A16120EC6F3100094EA4 /* App Store Release */ = {
isa = PBXGroup;
children = (
4C46A16820EC6F3100094EA4 /* Enabled Features.xcconfig */,
4C46A16420EC6F3100094EA4 /* Textual Extensions.xcconfig */,
4C46A16320EC6F3100094EA4 /* Textual.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4C46A16A20EC6F3100094EA4 /* Common */ = {
isa = PBXGroup;
children = (
@@ -325,7 +311,6 @@
};
4CCD21E41FA41DE20056F5FE /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4C46A16420EC6F3100094EA4 /* Textual Extensions.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
@@ -23,9 +23,6 @@
4C1D108820EBF3C000E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D108920EBF3C000E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C1D108D20EBF3C000E72D80 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C1D109120EBF3C000E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D109220EBF3C000E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C1D109620EBF3C000E72D80 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C1D109B20EBF3C000E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D109C20EBF3C000E72D80 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4C1D109D20EBF3C000E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
@@ -108,7 +105,6 @@
4C1D108420EBF3C000E72D80 /* Build */ = {
isa = PBXGroup;
children = (
4C1D108E20EBF3C000E72D80 /* App Store Release */,
4C1D109820EBF3C000E72D80 /* Common */,
4C1D10AD20EBF3C000E72D80 /* Debug */,
4C1D108520EBF3C000E72D80 /* Standard Release */,
@@ -127,16 +123,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4C1D108E20EBF3C000E72D80 /* App Store Release */ = {
isa = PBXGroup;
children = (
4C1D109620EBF3C000E72D80 /* Enabled Features.xcconfig */,
4C1D109220EBF3C000E72D80 /* Textual Extensions.xcconfig */,
4C1D109120EBF3C000E72D80 /* Textual.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4C1D109820EBF3C000E72D80 /* Common */ = {
isa = PBXGroup;
children = (
@@ -384,7 +370,6 @@
};
4CCD21EE1FA41E390056F5FE /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4C1D109220EBF3C000E72D80 /* Textual Extensions.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
@@ -18,9 +18,6 @@
4C1D10E820EBF45200E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D10E920EBF45200E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C1D10ED20EBF45200E72D80 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C1D10F120EBF45200E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D10F220EBF45200E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C1D10F620EBF45200E72D80 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C1D10FB20EBF45200E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D10FC20EBF45200E72D80 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4C1D10FD20EBF45200E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
@@ -93,7 +90,6 @@
4C1D10E420EBF45200E72D80 /* Build */ = {
isa = PBXGroup;
children = (
4C1D10EE20EBF45200E72D80 /* App Store Release */,
4C1D10F820EBF45200E72D80 /* Common */,
4C1D110D20EBF45200E72D80 /* Debug */,
4C1D10E520EBF45200E72D80 /* Standard Release */,
@@ -112,16 +108,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4C1D10EE20EBF45200E72D80 /* App Store Release */ = {
isa = PBXGroup;
children = (
4C1D10F620EBF45200E72D80 /* Enabled Features.xcconfig */,
4C1D10F220EBF45200E72D80 /* Textual Extensions.xcconfig */,
4C1D10F120EBF45200E72D80 /* Textual.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4C1D10F820EBF45200E72D80 /* Common */ = {
isa = PBXGroup;
children = (
@@ -330,7 +316,6 @@
};
4C9580121FA41EA700F18BC8 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4C1D10F220EBF45200E72D80 /* Textual Extensions.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
@@ -29,9 +29,6 @@
4CE1439920EBF551000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1439A20EBF551000E01C9 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4CE1439E20EBF551000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE143A220EBF551000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE143A320EBF551000E01C9 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4CE143A720EBF551000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE143AC20EBF551000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE143AD20EBF551000E01C9 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4CE143AE20EBF551000E01C9 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
@@ -145,7 +142,6 @@
4CE1439520EBF551000E01C9 /* Build */ = {
isa = PBXGroup;
children = (
4CE1439F20EBF551000E01C9 /* App Store Release */,
4CE143A920EBF551000E01C9 /* Common */,
4CE143BE20EBF551000E01C9 /* Debug */,
4CE1439620EBF551000E01C9 /* Standard Release */,
@@ -164,16 +160,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4CE1439F20EBF551000E01C9 /* App Store Release */ = {
isa = PBXGroup;
children = (
4CE143A720EBF551000E01C9 /* Enabled Features.xcconfig */,
4CE143A320EBF551000E01C9 /* Textual Extensions.xcconfig */,
4CE143A220EBF551000E01C9 /* Textual.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4CE143A920EBF551000E01C9 /* Common */ = {
isa = PBXGroup;
children = (
@@ -338,7 +324,6 @@
};
4C95801E1FA41F6D00F18BC8 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4CE143A320EBF551000E01C9 /* Textual Extensions.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
@@ -21,9 +21,6 @@
4CE1433920EBF4F3000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1433A20EBF4F3000E01C9 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4CE1433E20EBF4F3000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1434220EBF4F3000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1434320EBF4F3000E01C9 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4CE1434720EBF4F3000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1434C20EBF4F3000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1434D20EBF4F3000E01C9 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4CE1434E20EBF4F3000E01C9 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
@@ -124,7 +121,6 @@
4CE1433520EBF4F3000E01C9 /* Build */ = {
isa = PBXGroup;
children = (
4CE1433F20EBF4F3000E01C9 /* App Store Release */,
4CE1434920EBF4F3000E01C9 /* Common */,
4CE1435E20EBF4F3000E01C9 /* Debug */,
4CE1433620EBF4F3000E01C9 /* Standard Release */,
@@ -143,16 +139,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4CE1433F20EBF4F3000E01C9 /* App Store Release */ = {
isa = PBXGroup;
children = (
4CE1434720EBF4F3000E01C9 /* Enabled Features.xcconfig */,
4CE1434320EBF4F3000E01C9 /* Textual Extensions.xcconfig */,
4CE1434220EBF4F3000E01C9 /* Textual.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4CE1434920EBF4F3000E01C9 /* Common */ = {
isa = PBXGroup;
children = (
@@ -306,7 +292,6 @@
};
4C9580181FA41EE300F18BC8 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4CE1434320EBF4F3000E01C9 /* Textual Extensions.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
@@ -17,9 +17,6 @@
4C1D102820EBF29F00E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D102920EBF29F00E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C1D102D20EBF29F00E72D80 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C1D103120EBF29F00E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D103220EBF29F00E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
4C1D103620EBF29F00E72D80 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4C1D103B20EBF29F00E72D80 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4C1D103C20EBF29F00E72D80 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4C1D103D20EBF29F00E72D80 /* Textual Extensions.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Textual Extensions.xcconfig"; sourceTree = "<group>"; };
@@ -94,7 +91,6 @@
4C1D102420EBF29F00E72D80 /* Build */ = {
isa = PBXGroup;
children = (
4C1D102E20EBF29F00E72D80 /* App Store Release */,
4C1D103820EBF29F00E72D80 /* Common */,
4C1D104D20EBF29F00E72D80 /* Debug */,
4C1D102520EBF29F00E72D80 /* Standard Release */,
@@ -113,16 +109,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4C1D102E20EBF29F00E72D80 /* App Store Release */ = {
isa = PBXGroup;
children = (
4C1D103620EBF29F00E72D80 /* Enabled Features.xcconfig */,
4C1D103220EBF29F00E72D80 /* Textual Extensions.xcconfig */,
4C1D103120EBF29F00E72D80 /* Textual.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4C1D103820EBF29F00E72D80 /* Common */ = {
isa = PBXGroup;
children = (
@@ -310,7 +296,6 @@
};
4C95802A1FA4204000F18BC8 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4C1D103220EBF29F00E72D80 /* Textual Extensions.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>8482Q6EPL6.com.codeux.irc.textual</string>
</array>
</dict>
</plist>
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 53;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -43,9 +43,6 @@
4CE145EB20EC0F7F000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE145EE20EC0F7F000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE145F020EC0F7F000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE145F420EC0F7F000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE145F720EC0F7F000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE145F920EC0F7F000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE145FE20EC0F7F000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE145FF20EC0F7F000E01C9 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4CE1460220EC0F7F000E01C9 /* Foundation.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Foundation.xcconfig; sourceTree = "<group>"; };
@@ -57,7 +54,6 @@
4CE1461320EC0F7F000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1461620EC0F7F000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE1461820EC0F7F000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1461B20EC0FAF000E01C9 /* App Store.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App Store.entitlements"; sourceTree = "<group>"; };
4CE1461C20EC0FAF000E01C9 /* Release.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
/* End PBXFileReference section */
@@ -250,7 +246,6 @@
4CE145E720EC0F7F000E01C9 /* Build */ = {
isa = PBXGroup;
children = (
4CE145F120EC0F7F000E01C9 /* App Store Release */,
4CE145FB20EC0F7F000E01C9 /* Common */,
4CE1461020EC0F7F000E01C9 /* Debug */,
4CE145E820EC0F7F000E01C9 /* Standard Release */,
@@ -269,16 +264,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4CE145F120EC0F7F000E01C9 /* App Store Release */ = {
isa = PBXGroup;
children = (
4CE145F920EC0F7F000E01C9 /* Enabled Features.xcconfig */,
4CE145F420EC0F7F000E01C9 /* Textual.xcconfig */,
4CE145F720EC0F7F000E01C9 /* XPC Services.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4CE145FB20EC0F7F000E01C9 /* Common */ = {
isa = PBXGroup;
children = (
@@ -314,7 +299,6 @@
4CE1461920EC0F7F000E01C9 /* Sandbox */ = {
isa = PBXGroup;
children = (
4CE1461B20EC0FAF000E01C9 /* App Store.entitlements */,
4CE1461C20EC0FAF000E01C9 /* Release.entitlements */,
);
name = Sandbox;
@@ -441,24 +425,6 @@
};
name = Release;
};
4C761BED1E15751C00A505B7 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4CE145F720EC0F7F000E01C9 /* XPC Services.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
};
4C761BEE1E15751C00A505B7 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "${PROJECT_DIR}/Configurations/Sandbox/App Store.entitlements";
GCC_PREFIX_HEADER = "${SRCROOT}/Classes/Headers/Private/HSLHistoricLogPCHPrivate.h";
INFOPLIST_FILE = "Resources/Property Lists/Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "com.codeux.app-utilities.Textual-ScrollbackHistoryManager";
PRODUCT_NAME = "Scrollback History Manager";
};
name = "Release (App Store)";
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -467,7 +433,6 @@
buildConfigurations = (
4C442C921E13B3D200B187F4 /* Debug */,
4C442C931E13B3D200B187F4 /* Release */,
4C761BED1E15751C00A505B7 /* Release (App Store) */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -477,7 +442,6 @@
buildConfigurations = (
4C442C951E13B3D200B187F4 /* Debug */,
4C442C961E13B3D200B187F4 /* Release */,
4C761BEE1E15751C00A505B7 /* Release (App Store) */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -1,14 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>8482Q6EPL6.com.codeux.irc.textual</string>
</array>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 53;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -78,9 +78,6 @@
4CE143F920EBF5DB000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE143FC20EBF5DB000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE143FE20EBF5DB000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1440220EBF5DB000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1440520EBF5DB000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE1440720EBF5DB000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1440C20EBF5DB000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1440D20EBF5DB000E01C9 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4CE1441020EBF5DB000E01C9 /* Foundation.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Foundation.xcconfig; sourceTree = "<group>"; };
@@ -94,7 +91,6 @@
4CE1442620EBF5DB000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1445520EBF641000E01C9 /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = System/Library/Frameworks/Network.framework; sourceTree = SDKROOT; };
4CE1448120EC0209000E01C9 /* Release.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
4CE1448220EC020A000E01C9 /* App Store.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App Store.entitlements"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -384,7 +380,6 @@
4CE143F520EBF5DB000E01C9 /* Build */ = {
isa = PBXGroup;
children = (
4CE143FF20EBF5DB000E01C9 /* App Store Release */,
4CE1440920EBF5DB000E01C9 /* Common */,
4CE1441E20EBF5DB000E01C9 /* Debug */,
4CE143F620EBF5DB000E01C9 /* Standard Release */,
@@ -403,16 +398,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4CE143FF20EBF5DB000E01C9 /* App Store Release */ = {
isa = PBXGroup;
children = (
4CE1440720EBF5DB000E01C9 /* Enabled Features.xcconfig */,
4CE1440220EBF5DB000E01C9 /* Textual.xcconfig */,
4CE1440520EBF5DB000E01C9 /* XPC Services.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4CE1440920EBF5DB000E01C9 /* Common */ = {
isa = PBXGroup;
children = (
@@ -448,7 +433,6 @@
4CE1442720EBF5DB000E01C9 /* Sandbox */ = {
isa = PBXGroup;
children = (
4CE1448220EC020A000E01C9 /* App Store.entitlements */,
4CE1448120EC0209000E01C9 /* Release.entitlements */,
);
name = Sandbox;
@@ -611,27 +595,6 @@
};
name = Release;
};
4C1406641F11965A00C73D53 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4CE1440520EBF5DB000E01C9 /* XPC Services.xcconfig */;
buildSettings = {
SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/Classes/Headers/Private/SwiftBridgingHeaderPrivate.h";
};
name = "Release (App Store)";
};
4C1406651F11965A00C73D53 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_ENTITLEMENTS = "${PROJECT_DIR}/Configurations/Sandbox/App Store.entitlements";
DEVELOPMENT_TEAM = "";
GCC_PREFIX_HEADER = "${PROJECT_DIR}/Classes/Headers/Private/RCMProcessPCHPrivate.h";
INFOPLIST_FILE = "Resources/Property Lists/Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "com.codeux.app-utilities.Textual-IRCConnectionHost";
PRODUCT_NAME = "IRC Connection Host";
};
name = "Release (App Store)";
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -640,7 +603,6 @@
buildConfigurations = (
4C14064C1F11942B00C73D53 /* Debug */,
4C14064D1F11942B00C73D53 /* Release */,
4C1406641F11965A00C73D53 /* Release (App Store) */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -650,7 +612,6 @@
buildConfigurations = (
4C14064F1F11942B00C73D53 /* Debug */,
4C1406501F11942B00C73D53 /* Release */,
4C1406651F11965A00C73D53 /* Release (App Store) */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>8482Q6EPL6.com.codeux.irc.textual</string>
</array>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
@@ -75,9 +75,6 @@
4CE145B220EC0D5A000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE145B620EC0D5A000E01C9 /* XPC Service - ICL Extensions.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "XPC Service - ICL Extensions.xcconfig"; sourceTree = "<group>"; };
4CE145B720EC0D5A000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE145BB20EC0D5A000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE145BF20EC0D5A000E01C9 /* XPC Service - ICL Extensions.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "XPC Service - ICL Extensions.xcconfig"; sourceTree = "<group>"; };
4CE145C020EC0D5A000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE145C520EC0D5A000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE145C620EC0D5A000E01C9 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4CE145C920EC0D5A000E01C9 /* Foundation.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Foundation.xcconfig; sourceTree = "<group>"; };
@@ -435,7 +432,6 @@
4CE145AE20EC0D5A000E01C9 /* Build */ = {
isa = PBXGroup;
children = (
4CE145B820EC0D5A000E01C9 /* App Store Release */,
4CE145C220EC0D5A000E01C9 /* Common */,
4CE145D720EC0D5A000E01C9 /* Debug */,
4CE145AF20EC0D5A000E01C9 /* Standard Release */,
@@ -454,16 +450,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4CE145B820EC0D5A000E01C9 /* App Store Release */ = {
isa = PBXGroup;
children = (
4CE145C020EC0D5A000E01C9 /* Enabled Features.xcconfig */,
4CE145BB20EC0D5A000E01C9 /* Textual.xcconfig */,
4CE145BF20EC0D5A000E01C9 /* XPC Service - ICL Extensions.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4CE145C220EC0D5A000E01C9 /* Common */ = {
isa = PBXGroup;
children = (
@@ -160,10 +160,6 @@
4CE1448920EC02A3000E01C9 /* XPC Service - ICL.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Service - ICL.xcconfig"; sourceTree = "<group>"; };
4CE1448A20EC02A3000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE1448C20EC02A3000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1449020EC02A3000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1449220EC02A3000E01C9 /* XPC Service - ICL.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Service - ICL.xcconfig"; sourceTree = "<group>"; };
4CE1449320EC02A3000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE1449520EC02A3000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE1449A20EC02A3000E01C9 /* Textual.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Textual.xcconfig; sourceTree = "<group>"; };
4CE1449B20EC02A3000E01C9 /* Preserve Symbols.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Preserve Symbols.xcconfig"; sourceTree = "<group>"; };
4CE1449D20EC02A3000E01C9 /* XPC Service - ICL.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Service - ICL.xcconfig"; sourceTree = "<group>"; };
@@ -178,7 +174,6 @@
4CE144B120EC02A3000E01C9 /* XPC Service - ICL.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Service - ICL.xcconfig"; sourceTree = "<group>"; };
4CE144B220EC02A3000E01C9 /* XPC Services.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "XPC Services.xcconfig"; sourceTree = "<group>"; };
4CE144B420EC02A3000E01C9 /* Enabled Features.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "Enabled Features.xcconfig"; sourceTree = "<group>"; };
4CE144E320EC02BD000E01C9 /* App Store.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "App Store.entitlements"; sourceTree = "<group>"; };
4CE144E420EC02BD000E01C9 /* Release.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = "<group>"; };
4CE144E520EC0381000E01C9 /* ICLInlineContentProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ICLInlineContentProtocol.h; path = Classes/Headers/Private/ICLInlineContentProtocol.h; sourceTree = SOURCE_ROOT; };
4CE58BA91F8A5F8500493E7C /* GRMustache.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GRMustache.framework; path = "../../Frameworks/Static Libraries/Libraries/GRMustache.framework"; sourceTree = SOURCE_ROOT; };
@@ -454,7 +449,6 @@
4CE1448320EC02A3000E01C9 /* Build */ = {
isa = PBXGroup;
children = (
4CE1448D20EC02A3000E01C9 /* App Store Release */,
4CE1449720EC02A3000E01C9 /* Common */,
4CE144AC20EC02A3000E01C9 /* Debug */,
4CE1448420EC02A3000E01C9 /* Standard Release */,
@@ -474,17 +468,6 @@
path = "Standard Release";
sourceTree = "<group>";
};
4CE1448D20EC02A3000E01C9 /* App Store Release */ = {
isa = PBXGroup;
children = (
4CE1449520EC02A3000E01C9 /* Enabled Features.xcconfig */,
4CE1449020EC02A3000E01C9 /* Textual.xcconfig */,
4CE1449220EC02A3000E01C9 /* XPC Service - ICL.xcconfig */,
4CE1449320EC02A3000E01C9 /* XPC Services.xcconfig */,
);
path = "App Store Release";
sourceTree = "<group>";
};
4CE1449720EC02A3000E01C9 /* Common */ = {
isa = PBXGroup;
children = (
@@ -523,7 +506,6 @@
4CE144B520EC02A3000E01C9 /* Sandbox */ = {
isa = PBXGroup;
children = (
4CE144E320EC02BD000E01C9 /* App Store.entitlements */,
4CE144E420EC02BD000E01C9 /* Release.entitlements */,
);
name = Sandbox;
@@ -714,24 +696,6 @@
};
name = Release;
};
4C1406641F11965A00C73D53 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 4CE1449220EC02A3000E01C9 /* XPC Service - ICL.xcconfig */;
buildSettings = {
};
name = "Release (App Store)";
};
4C1406651F11965A00C73D53 /* Release (App Store) */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "${PROJECT_DIR}/Configurations/Sandbox/App Store.entitlements";
GCC_PREFIX_HEADER = "${PROJECT_DIR}/Classes/Headers/Private/ICLProcessPCHPrivate.h";
INFOPLIST_FILE = "Resources/Property Lists/Info.plist";
PRODUCT_BUNDLE_IDENTIFIER = "com.codeux.app-utilities.Textual-InlineContentLoader";
PRODUCT_NAME = "Inline Content Loader";
};
name = "Release (App Store)";
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@@ -740,7 +704,6 @@
buildConfigurations = (
4C14064C1F11942B00C73D53 /* Debug */,
4C14064D1F11942B00C73D53 /* Release */,
4C1406641F11965A00C73D53 /* Release (App Store) */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@@ -750,7 +713,6 @@
buildConfigurations = (
4C14064F1F11942B00C73D53 /* Debug */,
4C1406501F11942B00C73D53 /* Release */,
4C1406651F11965A00C73D53 /* Release (App Store) */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;